blob: 17c5486430a1beb8106d4e12e28409a079a1c4f6 [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):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001171 # Check for internet access before running test (issue #12804).
1172 try:
1173 socket.gethostbyname('python.org')
1174 except socket.gaierror as e:
1175 if e.errno == socket.EAI_NODATA:
1176 self.skipTest('internet access required for this test')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001177 # these should all be successful
1178 socket.gethostbyname('испытание.python.org')
1179 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001180 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1181 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1182 # have a reverse entry yet
1183 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001184
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001185 def check_sendall_interrupted(self, with_timeout):
1186 # socketpair() is not stricly required, but it makes things easier.
1187 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1188 self.skipTest("signal.alarm and socket.socketpair required for this test")
1189 # Our signal handlers clobber the C errno by calling a math function
1190 # with an invalid domain value.
1191 def ok_handler(*args):
1192 self.assertRaises(ValueError, math.acosh, 0)
1193 def raising_handler(*args):
1194 self.assertRaises(ValueError, math.acosh, 0)
1195 1 // 0
1196 c, s = socket.socketpair()
1197 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1198 try:
1199 if with_timeout:
1200 # Just above the one second minimum for signal.alarm
1201 c.settimeout(1.5)
1202 with self.assertRaises(ZeroDivisionError):
1203 signal.alarm(1)
1204 c.sendall(b"x" * (1024**2))
1205 if with_timeout:
1206 signal.signal(signal.SIGALRM, ok_handler)
1207 signal.alarm(1)
1208 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1209 finally:
1210 signal.signal(signal.SIGALRM, old_alarm)
1211 c.close()
1212 s.close()
1213
1214 def test_sendall_interrupted(self):
1215 self.check_sendall_interrupted(False)
1216
1217 def test_sendall_interrupted_with_timeout(self):
1218 self.check_sendall_interrupted(True)
1219
Antoine Pitroue033e062010-10-29 10:38:18 +00001220 def test_dealloc_warn(self):
1221 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1222 r = repr(sock)
1223 with self.assertWarns(ResourceWarning) as cm:
1224 sock = None
1225 support.gc_collect()
1226 self.assertIn(r, str(cm.warning.args[0]))
1227 # An open socket file object gets dereferenced after the socket
1228 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1229 f = sock.makefile('rb')
1230 r = repr(sock)
1231 sock = None
1232 support.gc_collect()
1233 with self.assertWarns(ResourceWarning):
1234 f = None
1235 support.gc_collect()
1236
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001237 def test_name_closed_socketio(self):
1238 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1239 fp = sock.makefile("rb")
1240 fp.close()
1241 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1242
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001243 def test_pickle(self):
1244 sock = socket.socket()
1245 with sock:
1246 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1247 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1248
Antoine Pitrou3cade992011-05-10 19:19:13 +02001249 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001250 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1251 srv.bind((HOST, 0))
1252 # backlog = 0
1253 srv.listen(0)
1254 srv.close()
1255
Charles-François Natali42663332012-01-02 15:57:30 +01001256 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001257 def test_flowinfo(self):
1258 self.assertRaises(OverflowError, socket.getnameinfo,
1259 ('::1',0, 0xffffffff), 0)
1260 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1261 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1262
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001263
Charles-François Natali47413c12011-10-06 19:47:44 +02001264@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1265class BasicCANTest(unittest.TestCase):
1266
1267 def testCrucialConstants(self):
1268 socket.AF_CAN
1269 socket.PF_CAN
1270 socket.CAN_RAW
1271
1272 def testCreateSocket(self):
1273 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1274 pass
1275
1276 def testBindAny(self):
1277 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1278 s.bind(('', ))
1279
1280 def testTooLongInterfaceName(self):
1281 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1282 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001283 self.assertRaisesRegex(socket.error, 'interface name too long',
1284 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001285
1286 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1287 'socket.CAN_RAW_LOOPBACK required for this test.')
1288 def testLoopback(self):
1289 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1290 for loopback in (0, 1):
1291 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1292 loopback)
1293 self.assertEqual(loopback,
1294 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1295
1296 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1297 'socket.CAN_RAW_FILTER required for this test.')
1298 def testFilter(self):
1299 can_id, can_mask = 0x200, 0x700
1300 can_filter = struct.pack("=II", can_id, can_mask)
1301 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1302 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1303 self.assertEqual(can_filter,
1304 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1305
1306
1307@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1308@unittest.skipUnless(thread, 'Threading required for this test.')
1309class CANTest(ThreadedCANSocketTest):
1310
1311 """The CAN frame structure is defined in <linux/can.h>:
1312
1313 struct can_frame {
1314 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1315 __u8 can_dlc; /* data length code: 0 .. 8 */
1316 __u8 data[8] __attribute__((aligned(8)));
1317 };
1318 """
1319 can_frame_fmt = "=IB3x8s"
1320
1321 def __init__(self, methodName='runTest'):
1322 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1323
1324 @classmethod
1325 def build_can_frame(cls, can_id, data):
1326 """Build a CAN frame."""
1327 can_dlc = len(data)
1328 data = data.ljust(8, b'\x00')
1329 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1330
1331 @classmethod
1332 def dissect_can_frame(cls, frame):
1333 """Dissect a CAN frame."""
1334 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1335 return (can_id, can_dlc, data[:can_dlc])
1336
1337 def testSendFrame(self):
1338 cf, addr = self.s.recvfrom(self.bufsize)
1339 self.assertEqual(self.cf, cf)
1340 self.assertEqual(addr[0], self.interface)
1341 self.assertEqual(addr[1], socket.AF_CAN)
1342
1343 def _testSendFrame(self):
1344 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1345 self.cli.send(self.cf)
1346
1347 def testSendMaxFrame(self):
1348 cf, addr = self.s.recvfrom(self.bufsize)
1349 self.assertEqual(self.cf, cf)
1350
1351 def _testSendMaxFrame(self):
1352 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1353 self.cli.send(self.cf)
1354
1355 def testSendMultiFrames(self):
1356 cf, addr = self.s.recvfrom(self.bufsize)
1357 self.assertEqual(self.cf1, cf)
1358
1359 cf, addr = self.s.recvfrom(self.bufsize)
1360 self.assertEqual(self.cf2, cf)
1361
1362 def _testSendMultiFrames(self):
1363 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1364 self.cli.send(self.cf1)
1365
1366 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1367 self.cli.send(self.cf2)
1368
1369
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001370@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1371class BasicRDSTest(unittest.TestCase):
1372
1373 def testCrucialConstants(self):
1374 socket.AF_RDS
1375 socket.PF_RDS
1376
1377 def testCreateSocket(self):
1378 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1379 pass
1380
1381 def testSocketBufferSize(self):
1382 bufsize = 16384
1383 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1384 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1385 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1386
1387
1388@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1389@unittest.skipUnless(thread, 'Threading required for this test.')
1390class RDSTest(ThreadedRDSSocketTest):
1391
1392 def __init__(self, methodName='runTest'):
1393 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1394
Charles-François Natali240c55f2011-11-10 20:33:36 +01001395 def setUp(self):
1396 super().setUp()
1397 self.evt = threading.Event()
1398
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001399 def testSendAndRecv(self):
1400 data, addr = self.serv.recvfrom(self.bufsize)
1401 self.assertEqual(self.data, data)
1402 self.assertEqual(self.cli_addr, addr)
1403
1404 def _testSendAndRecv(self):
1405 self.data = b'spam'
1406 self.cli.sendto(self.data, 0, (HOST, self.port))
1407
1408 def testPeek(self):
1409 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1410 self.assertEqual(self.data, data)
1411 data, addr = self.serv.recvfrom(self.bufsize)
1412 self.assertEqual(self.data, data)
1413
1414 def _testPeek(self):
1415 self.data = b'spam'
1416 self.cli.sendto(self.data, 0, (HOST, self.port))
1417
1418 @requireAttrs(socket.socket, 'recvmsg')
1419 def testSendAndRecvMsg(self):
1420 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1421 self.assertEqual(self.data, data)
1422
1423 @requireAttrs(socket.socket, 'sendmsg')
1424 def _testSendAndRecvMsg(self):
1425 self.data = b'hello ' * 10
1426 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1427
1428 def testSendAndRecvMulti(self):
1429 data, addr = self.serv.recvfrom(self.bufsize)
1430 self.assertEqual(self.data1, data)
1431
1432 data, addr = self.serv.recvfrom(self.bufsize)
1433 self.assertEqual(self.data2, data)
1434
1435 def _testSendAndRecvMulti(self):
1436 self.data1 = b'bacon'
1437 self.cli.sendto(self.data1, 0, (HOST, self.port))
1438
1439 self.data2 = b'egg'
1440 self.cli.sendto(self.data2, 0, (HOST, self.port))
1441
1442 def testSelect(self):
1443 r, w, x = select.select([self.serv], [], [], 3.0)
1444 self.assertIn(self.serv, r)
1445 data, addr = self.serv.recvfrom(self.bufsize)
1446 self.assertEqual(self.data, data)
1447
1448 def _testSelect(self):
1449 self.data = b'select'
1450 self.cli.sendto(self.data, 0, (HOST, self.port))
1451
1452 def testCongestion(self):
1453 # wait until the sender is done
1454 self.evt.wait()
1455
1456 def _testCongestion(self):
1457 # test the behavior in case of congestion
1458 self.data = b'fill'
1459 self.cli.setblocking(False)
1460 try:
1461 # try to lower the receiver's socket buffer size
1462 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1463 except OSError:
1464 pass
1465 with self.assertRaises(OSError) as cm:
1466 try:
1467 # fill the receiver's socket buffer
1468 while True:
1469 self.cli.sendto(self.data, 0, (HOST, self.port))
1470 finally:
1471 # signal the receiver we're done
1472 self.evt.set()
1473 # sendto() should have failed with ENOBUFS
1474 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1475 # and we should have received a congestion notification through poll
1476 r, w, x = select.select([self.serv], [], [], 3.0)
1477 self.assertIn(self.serv, r)
1478
1479
Victor Stinner45df8202010-04-28 22:31:17 +00001480@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001481class BasicTCPTest(SocketConnectedTest):
1482
1483 def __init__(self, methodName='runTest'):
1484 SocketConnectedTest.__init__(self, methodName=methodName)
1485
1486 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001487 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001488 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001489 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001490
1491 def _testRecv(self):
1492 self.serv_conn.send(MSG)
1493
1494 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001495 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001496 seg1 = self.cli_conn.recv(len(MSG) - 3)
1497 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001498 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001499 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001500
1501 def _testOverFlowRecv(self):
1502 self.serv_conn.send(MSG)
1503
1504 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001505 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001506 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001507 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001508
1509 def _testRecvFrom(self):
1510 self.serv_conn.send(MSG)
1511
1512 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001513 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001514 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1515 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001516 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001517 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001518
1519 def _testOverFlowRecvFrom(self):
1520 self.serv_conn.send(MSG)
1521
1522 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001523 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001524 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001525 while 1:
1526 read = self.cli_conn.recv(1024)
1527 if not read:
1528 break
Guido van Rossume531e292002-08-08 20:28:34 +00001529 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001530 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001531
1532 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001533 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001534 self.serv_conn.sendall(big_chunk)
1535
1536 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001537 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001538 fd = self.cli_conn.fileno()
1539 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001540 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001541 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001542 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001543 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001544
1545 def _testFromFd(self):
1546 self.serv_conn.send(MSG)
1547
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001548 def testDup(self):
1549 # Testing dup()
1550 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001551 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001552 msg = sock.recv(1024)
1553 self.assertEqual(msg, MSG)
1554
1555 def _testDup(self):
1556 self.serv_conn.send(MSG)
1557
Guido van Rossum24e4af82002-06-12 19:18:08 +00001558 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001559 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001560 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001561 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001562 # wait for _testShutdown to finish: on OS X, when the server
1563 # closes the connection the client also becomes disconnected,
1564 # and the client's shutdown call will fail. (Issue #4397.)
1565 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001566
1567 def _testShutdown(self):
1568 self.serv_conn.send(MSG)
1569 self.serv_conn.shutdown(2)
1570
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001571 def testDetach(self):
1572 # Testing detach()
1573 fileno = self.cli_conn.fileno()
1574 f = self.cli_conn.detach()
1575 self.assertEqual(f, fileno)
1576 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02001577 self.assertTrue(self.cli_conn._closed)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001578 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1579 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001580 # ...but we can create another socket using the (still open)
1581 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001582 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001583 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001584 msg = sock.recv(1024)
1585 self.assertEqual(msg, MSG)
1586
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001587 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001588 self.serv_conn.send(MSG)
1589
Victor Stinner45df8202010-04-28 22:31:17 +00001590@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001591class BasicUDPTest(ThreadedUDPSocketTest):
1592
1593 def __init__(self, methodName='runTest'):
1594 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1595
1596 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001597 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001598 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001599 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001600
1601 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001602 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001603
Guido van Rossum1c938012002-06-12 21:17:20 +00001604 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001605 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001606 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001607 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001608
Guido van Rossum1c938012002-06-12 21:17:20 +00001609 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001610 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001611
Guido van Rossumd8faa362007-04-27 19:54:29 +00001612 def testRecvFromNegative(self):
1613 # Negative lengths passed to recvfrom should give ValueError.
1614 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1615
1616 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001617 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001618
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001619# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1620# same test code is used with different families and types of socket
1621# (e.g. stream, datagram), and tests using recvmsg() are repeated
1622# using recvmsg_into().
1623#
1624# The generic test classes such as SendmsgTests and
1625# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1626# supplied with sockets cli_sock and serv_sock representing the
1627# client's and the server's end of the connection respectively, and
1628# attributes cli_addr and serv_addr holding their (numeric where
1629# appropriate) addresses.
1630#
1631# The final concrete test classes combine these with subclasses of
1632# SocketTestBase which set up client and server sockets of a specific
1633# type, and with subclasses of SendrecvmsgBase such as
1634# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1635# sockets to cli_sock and serv_sock and override the methods and
1636# attributes of SendrecvmsgBase to fill in destination addresses if
1637# needed when sending, check for specific flags in msg_flags, etc.
1638#
1639# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1640# recvmsg_into().
1641
1642# XXX: like the other datagram (UDP) tests in this module, the code
1643# here assumes that datagram delivery on the local machine will be
1644# reliable.
1645
1646class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1647 # Base class for sendmsg()/recvmsg() tests.
1648
1649 # Time in seconds to wait before considering a test failed, or
1650 # None for no timeout. Not all tests actually set a timeout.
1651 fail_timeout = 3.0
1652
1653 def setUp(self):
1654 self.misc_event = threading.Event()
1655 super().setUp()
1656
1657 def sendToServer(self, msg):
1658 # Send msg to the server.
1659 return self.cli_sock.send(msg)
1660
1661 # Tuple of alternative default arguments for sendmsg() when called
1662 # via sendmsgToServer() (e.g. to include a destination address).
1663 sendmsg_to_server_defaults = ()
1664
1665 def sendmsgToServer(self, *args):
1666 # Call sendmsg() on self.cli_sock with the given arguments,
1667 # filling in any arguments which are not supplied with the
1668 # corresponding items of self.sendmsg_to_server_defaults, if
1669 # any.
1670 return self.cli_sock.sendmsg(
1671 *(args + self.sendmsg_to_server_defaults[len(args):]))
1672
1673 def doRecvmsg(self, sock, bufsize, *args):
1674 # Call recvmsg() on sock with given arguments and return its
1675 # result. Should be used for tests which can use either
1676 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1677 # this method with one which emulates it using recvmsg_into(),
1678 # thus allowing the same test to be used for both methods.
1679 result = sock.recvmsg(bufsize, *args)
1680 self.registerRecvmsgResult(result)
1681 return result
1682
1683 def registerRecvmsgResult(self, result):
1684 # Called by doRecvmsg() with the return value of recvmsg() or
1685 # recvmsg_into(). Can be overridden to arrange cleanup based
1686 # on the returned ancillary data, for instance.
1687 pass
1688
1689 def checkRecvmsgAddress(self, addr1, addr2):
1690 # Called to compare the received address with the address of
1691 # the peer.
1692 self.assertEqual(addr1, addr2)
1693
1694 # Flags that are normally unset in msg_flags
1695 msg_flags_common_unset = 0
1696 for name in ("MSG_CTRUNC", "MSG_OOB"):
1697 msg_flags_common_unset |= getattr(socket, name, 0)
1698
1699 # Flags that are normally set
1700 msg_flags_common_set = 0
1701
1702 # Flags set when a complete record has been received (e.g. MSG_EOR
1703 # for SCTP)
1704 msg_flags_eor_indicator = 0
1705
1706 # Flags set when a complete record has not been received
1707 # (e.g. MSG_TRUNC for datagram sockets)
1708 msg_flags_non_eor_indicator = 0
1709
1710 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1711 # Method to check the value of msg_flags returned by recvmsg[_into]().
1712 #
1713 # Checks that all bits in msg_flags_common_set attribute are
1714 # set in "flags" and all bits in msg_flags_common_unset are
1715 # unset.
1716 #
1717 # The "eor" argument specifies whether the flags should
1718 # indicate that a full record (or datagram) has been received.
1719 # If "eor" is None, no checks are done; otherwise, checks
1720 # that:
1721 #
1722 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1723 # set and all bits in msg_flags_non_eor_indicator are unset
1724 #
1725 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1726 # are set and all bits in msg_flags_eor_indicator are unset
1727 #
1728 # If "checkset" and/or "checkunset" are supplied, they require
1729 # the given bits to be set or unset respectively, overriding
1730 # what the attributes require for those bits.
1731 #
1732 # If any bits are set in "ignore", they will not be checked,
1733 # regardless of the other inputs.
1734 #
1735 # Will raise Exception if the inputs require a bit to be both
1736 # set and unset, and it is not ignored.
1737
1738 defaultset = self.msg_flags_common_set
1739 defaultunset = self.msg_flags_common_unset
1740
1741 if eor:
1742 defaultset |= self.msg_flags_eor_indicator
1743 defaultunset |= self.msg_flags_non_eor_indicator
1744 elif eor is not None:
1745 defaultset |= self.msg_flags_non_eor_indicator
1746 defaultunset |= self.msg_flags_eor_indicator
1747
1748 # Function arguments override defaults
1749 defaultset &= ~checkunset
1750 defaultunset &= ~checkset
1751
1752 # Merge arguments with remaining defaults, and check for conflicts
1753 checkset |= defaultset
1754 checkunset |= defaultunset
1755 inboth = checkset & checkunset & ~ignore
1756 if inboth:
1757 raise Exception("contradictory set, unset requirements for flags "
1758 "{0:#x}".format(inboth))
1759
1760 # Compare with given msg_flags value
1761 mask = (checkset | checkunset) & ~ignore
1762 self.assertEqual(flags & mask, checkset & mask)
1763
1764
1765class RecvmsgIntoMixin(SendrecvmsgBase):
1766 # Mixin to implement doRecvmsg() using recvmsg_into().
1767
1768 def doRecvmsg(self, sock, bufsize, *args):
1769 buf = bytearray(bufsize)
1770 result = sock.recvmsg_into([buf], *args)
1771 self.registerRecvmsgResult(result)
1772 self.assertGreaterEqual(result[0], 0)
1773 self.assertLessEqual(result[0], bufsize)
1774 return (bytes(buf[:result[0]]),) + result[1:]
1775
1776
1777class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1778 # Defines flags to be checked in msg_flags for datagram sockets.
1779
1780 @property
1781 def msg_flags_non_eor_indicator(self):
1782 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1783
1784
1785class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1786 # Defines flags to be checked in msg_flags for SCTP sockets.
1787
1788 @property
1789 def msg_flags_eor_indicator(self):
1790 return super().msg_flags_eor_indicator | socket.MSG_EOR
1791
1792
1793class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1794 # Base class for tests on connectionless-mode sockets. Users must
1795 # supply sockets on attributes cli and serv to be mapped to
1796 # cli_sock and serv_sock respectively.
1797
1798 @property
1799 def serv_sock(self):
1800 return self.serv
1801
1802 @property
1803 def cli_sock(self):
1804 return self.cli
1805
1806 @property
1807 def sendmsg_to_server_defaults(self):
1808 return ([], [], 0, self.serv_addr)
1809
1810 def sendToServer(self, msg):
1811 return self.cli_sock.sendto(msg, self.serv_addr)
1812
1813
1814class SendrecvmsgConnectedBase(SendrecvmsgBase):
1815 # Base class for tests on connected sockets. Users must supply
1816 # sockets on attributes serv_conn and cli_conn (representing the
1817 # connections *to* the server and the client), to be mapped to
1818 # cli_sock and serv_sock respectively.
1819
1820 @property
1821 def serv_sock(self):
1822 return self.cli_conn
1823
1824 @property
1825 def cli_sock(self):
1826 return self.serv_conn
1827
1828 def checkRecvmsgAddress(self, addr1, addr2):
1829 # Address is currently "unspecified" for a connected socket,
1830 # so we don't examine it
1831 pass
1832
1833
1834class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1835 # Base class to set a timeout on server's socket.
1836
1837 def setUp(self):
1838 super().setUp()
1839 self.serv_sock.settimeout(self.fail_timeout)
1840
1841
1842class SendmsgTests(SendrecvmsgServerTimeoutBase):
1843 # Tests for sendmsg() which can use any socket type and do not
1844 # involve recvmsg() or recvmsg_into().
1845
1846 def testSendmsg(self):
1847 # Send a simple message with sendmsg().
1848 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1849
1850 def _testSendmsg(self):
1851 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1852
1853 def testSendmsgDataGenerator(self):
1854 # Send from buffer obtained from a generator (not a sequence).
1855 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1856
1857 def _testSendmsgDataGenerator(self):
1858 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1859 len(MSG))
1860
1861 def testSendmsgAncillaryGenerator(self):
1862 # Gather (empty) ancillary data from a generator.
1863 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1864
1865 def _testSendmsgAncillaryGenerator(self):
1866 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1867 len(MSG))
1868
1869 def testSendmsgArray(self):
1870 # Send data from an array instead of the usual bytes object.
1871 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1872
1873 def _testSendmsgArray(self):
1874 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1875 len(MSG))
1876
1877 def testSendmsgGather(self):
1878 # Send message data from more than one buffer (gather write).
1879 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1880
1881 def _testSendmsgGather(self):
1882 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1883
1884 def testSendmsgBadArgs(self):
1885 # Check that sendmsg() rejects invalid arguments.
1886 self.assertEqual(self.serv_sock.recv(1000), b"done")
1887
1888 def _testSendmsgBadArgs(self):
1889 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1890 self.assertRaises(TypeError, self.sendmsgToServer,
1891 b"not in an iterable")
1892 self.assertRaises(TypeError, self.sendmsgToServer,
1893 object())
1894 self.assertRaises(TypeError, self.sendmsgToServer,
1895 [object()])
1896 self.assertRaises(TypeError, self.sendmsgToServer,
1897 [MSG, object()])
1898 self.assertRaises(TypeError, self.sendmsgToServer,
1899 [MSG], object())
1900 self.assertRaises(TypeError, self.sendmsgToServer,
1901 [MSG], [], object())
1902 self.assertRaises(TypeError, self.sendmsgToServer,
1903 [MSG], [], 0, object())
1904 self.sendToServer(b"done")
1905
1906 def testSendmsgBadCmsg(self):
1907 # Check that invalid ancillary data items are rejected.
1908 self.assertEqual(self.serv_sock.recv(1000), b"done")
1909
1910 def _testSendmsgBadCmsg(self):
1911 self.assertRaises(TypeError, self.sendmsgToServer,
1912 [MSG], [object()])
1913 self.assertRaises(TypeError, self.sendmsgToServer,
1914 [MSG], [(object(), 0, b"data")])
1915 self.assertRaises(TypeError, self.sendmsgToServer,
1916 [MSG], [(0, object(), b"data")])
1917 self.assertRaises(TypeError, self.sendmsgToServer,
1918 [MSG], [(0, 0, object())])
1919 self.assertRaises(TypeError, self.sendmsgToServer,
1920 [MSG], [(0, 0)])
1921 self.assertRaises(TypeError, self.sendmsgToServer,
1922 [MSG], [(0, 0, b"data", 42)])
1923 self.sendToServer(b"done")
1924
1925 @requireAttrs(socket, "CMSG_SPACE")
1926 def testSendmsgBadMultiCmsg(self):
1927 # Check that invalid ancillary data items are rejected when
1928 # more than one item is present.
1929 self.assertEqual(self.serv_sock.recv(1000), b"done")
1930
1931 @testSendmsgBadMultiCmsg.client_skip
1932 def _testSendmsgBadMultiCmsg(self):
1933 self.assertRaises(TypeError, self.sendmsgToServer,
1934 [MSG], [0, 0, b""])
1935 self.assertRaises(TypeError, self.sendmsgToServer,
1936 [MSG], [(0, 0, b""), object()])
1937 self.sendToServer(b"done")
1938
1939 def testSendmsgExcessCmsgReject(self):
1940 # Check that sendmsg() rejects excess ancillary data items
1941 # when the number that can be sent is limited.
1942 self.assertEqual(self.serv_sock.recv(1000), b"done")
1943
1944 def _testSendmsgExcessCmsgReject(self):
1945 if not hasattr(socket, "CMSG_SPACE"):
1946 # Can only send one item
1947 with self.assertRaises(socket.error) as cm:
1948 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1949 self.assertIsNone(cm.exception.errno)
1950 self.sendToServer(b"done")
1951
1952 def testSendmsgAfterClose(self):
1953 # Check that sendmsg() fails on a closed socket.
1954 pass
1955
1956 def _testSendmsgAfterClose(self):
1957 self.cli_sock.close()
1958 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1959
1960
1961class SendmsgStreamTests(SendmsgTests):
1962 # Tests for sendmsg() which require a stream socket and do not
1963 # involve recvmsg() or recvmsg_into().
1964
1965 def testSendmsgExplicitNoneAddr(self):
1966 # Check that peer address can be specified as None.
1967 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1968
1969 def _testSendmsgExplicitNoneAddr(self):
1970 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1971
1972 def testSendmsgTimeout(self):
1973 # Check that timeout works with sendmsg().
1974 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1975 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1976
1977 def _testSendmsgTimeout(self):
1978 try:
1979 self.cli_sock.settimeout(0.03)
1980 with self.assertRaises(socket.timeout):
1981 while True:
1982 self.sendmsgToServer([b"a"*512])
1983 finally:
1984 self.misc_event.set()
1985
1986 # XXX: would be nice to have more tests for sendmsg flags argument.
1987
1988 # Linux supports MSG_DONTWAIT when sending, but in general, it
1989 # only works when receiving. Could add other platforms if they
1990 # support it too.
1991 @skipWithClientIf(sys.platform not in {"linux2"},
1992 "MSG_DONTWAIT not known to work on this platform when "
1993 "sending")
1994 def testSendmsgDontWait(self):
1995 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
1996 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1997 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1998
1999 @testSendmsgDontWait.client_skip
2000 def _testSendmsgDontWait(self):
2001 try:
2002 with self.assertRaises(socket.error) as cm:
2003 while True:
2004 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2005 self.assertIn(cm.exception.errno,
2006 (errno.EAGAIN, errno.EWOULDBLOCK))
2007 finally:
2008 self.misc_event.set()
2009
2010
2011class SendmsgConnectionlessTests(SendmsgTests):
2012 # Tests for sendmsg() which require a connectionless-mode
2013 # (e.g. datagram) socket, and do not involve recvmsg() or
2014 # recvmsg_into().
2015
2016 def testSendmsgNoDestAddr(self):
2017 # Check that sendmsg() fails when no destination address is
2018 # given for unconnected socket.
2019 pass
2020
2021 def _testSendmsgNoDestAddr(self):
2022 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2023 [MSG])
2024 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2025 [MSG], [], 0, None)
2026
2027
2028class RecvmsgGenericTests(SendrecvmsgBase):
2029 # Tests for recvmsg() which can also be emulated using
2030 # recvmsg_into(), and can use any socket type.
2031
2032 def testRecvmsg(self):
2033 # Receive a simple message with recvmsg[_into]().
2034 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2035 self.assertEqual(msg, MSG)
2036 self.checkRecvmsgAddress(addr, self.cli_addr)
2037 self.assertEqual(ancdata, [])
2038 self.checkFlags(flags, eor=True)
2039
2040 def _testRecvmsg(self):
2041 self.sendToServer(MSG)
2042
2043 def testRecvmsgExplicitDefaults(self):
2044 # Test recvmsg[_into]() with default arguments provided explicitly.
2045 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2046 len(MSG), 0, 0)
2047 self.assertEqual(msg, MSG)
2048 self.checkRecvmsgAddress(addr, self.cli_addr)
2049 self.assertEqual(ancdata, [])
2050 self.checkFlags(flags, eor=True)
2051
2052 def _testRecvmsgExplicitDefaults(self):
2053 self.sendToServer(MSG)
2054
2055 def testRecvmsgShorter(self):
2056 # Receive a message smaller than buffer.
2057 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2058 len(MSG) + 42)
2059 self.assertEqual(msg, MSG)
2060 self.checkRecvmsgAddress(addr, self.cli_addr)
2061 self.assertEqual(ancdata, [])
2062 self.checkFlags(flags, eor=True)
2063
2064 def _testRecvmsgShorter(self):
2065 self.sendToServer(MSG)
2066
Charles-François Natali8619cd72011-10-03 19:43:15 +02002067 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2068 # datagram is received (issue #13001).
2069 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002070 def testRecvmsgTrunc(self):
2071 # Receive part of message, check for truncation indicators.
2072 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2073 len(MSG) - 3)
2074 self.assertEqual(msg, MSG[:-3])
2075 self.checkRecvmsgAddress(addr, self.cli_addr)
2076 self.assertEqual(ancdata, [])
2077 self.checkFlags(flags, eor=False)
2078
Charles-François Natali8619cd72011-10-03 19:43:15 +02002079 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002080 def _testRecvmsgTrunc(self):
2081 self.sendToServer(MSG)
2082
2083 def testRecvmsgShortAncillaryBuf(self):
2084 # Test ancillary data buffer too small to hold any ancillary data.
2085 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2086 len(MSG), 1)
2087 self.assertEqual(msg, MSG)
2088 self.checkRecvmsgAddress(addr, self.cli_addr)
2089 self.assertEqual(ancdata, [])
2090 self.checkFlags(flags, eor=True)
2091
2092 def _testRecvmsgShortAncillaryBuf(self):
2093 self.sendToServer(MSG)
2094
2095 def testRecvmsgLongAncillaryBuf(self):
2096 # Test large ancillary data buffer.
2097 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2098 len(MSG), 10240)
2099 self.assertEqual(msg, MSG)
2100 self.checkRecvmsgAddress(addr, self.cli_addr)
2101 self.assertEqual(ancdata, [])
2102 self.checkFlags(flags, eor=True)
2103
2104 def _testRecvmsgLongAncillaryBuf(self):
2105 self.sendToServer(MSG)
2106
2107 def testRecvmsgAfterClose(self):
2108 # Check that recvmsg[_into]() fails on a closed socket.
2109 self.serv_sock.close()
2110 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2111
2112 def _testRecvmsgAfterClose(self):
2113 pass
2114
2115 def testRecvmsgTimeout(self):
2116 # Check that timeout works.
2117 try:
2118 self.serv_sock.settimeout(0.03)
2119 self.assertRaises(socket.timeout,
2120 self.doRecvmsg, self.serv_sock, len(MSG))
2121 finally:
2122 self.misc_event.set()
2123
2124 def _testRecvmsgTimeout(self):
2125 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2126
2127 @requireAttrs(socket, "MSG_PEEK")
2128 def testRecvmsgPeek(self):
2129 # Check that MSG_PEEK in flags enables examination of pending
2130 # data without consuming it.
2131
2132 # Receive part of data with MSG_PEEK.
2133 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2134 len(MSG) - 3, 0,
2135 socket.MSG_PEEK)
2136 self.assertEqual(msg, MSG[:-3])
2137 self.checkRecvmsgAddress(addr, self.cli_addr)
2138 self.assertEqual(ancdata, [])
2139 # Ignoring MSG_TRUNC here (so this test is the same for stream
2140 # and datagram sockets). Some wording in POSIX seems to
2141 # suggest that it needn't be set when peeking, but that may
2142 # just be a slip.
2143 self.checkFlags(flags, eor=False,
2144 ignore=getattr(socket, "MSG_TRUNC", 0))
2145
2146 # Receive all data with MSG_PEEK.
2147 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2148 len(MSG), 0,
2149 socket.MSG_PEEK)
2150 self.assertEqual(msg, MSG)
2151 self.checkRecvmsgAddress(addr, self.cli_addr)
2152 self.assertEqual(ancdata, [])
2153 self.checkFlags(flags, eor=True)
2154
2155 # Check that the same data can still be received normally.
2156 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2157 self.assertEqual(msg, MSG)
2158 self.checkRecvmsgAddress(addr, self.cli_addr)
2159 self.assertEqual(ancdata, [])
2160 self.checkFlags(flags, eor=True)
2161
2162 @testRecvmsgPeek.client_skip
2163 def _testRecvmsgPeek(self):
2164 self.sendToServer(MSG)
2165
2166 @requireAttrs(socket.socket, "sendmsg")
2167 def testRecvmsgFromSendmsg(self):
2168 # Test receiving with recvmsg[_into]() when message is sent
2169 # using sendmsg().
2170 self.serv_sock.settimeout(self.fail_timeout)
2171 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2172 self.assertEqual(msg, MSG)
2173 self.checkRecvmsgAddress(addr, self.cli_addr)
2174 self.assertEqual(ancdata, [])
2175 self.checkFlags(flags, eor=True)
2176
2177 @testRecvmsgFromSendmsg.client_skip
2178 def _testRecvmsgFromSendmsg(self):
2179 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2180
2181
2182class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2183 # Tests which require a stream socket and can use either recvmsg()
2184 # or recvmsg_into().
2185
2186 def testRecvmsgEOF(self):
2187 # Receive end-of-stream indicator (b"", peer socket closed).
2188 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2189 self.assertEqual(msg, b"")
2190 self.checkRecvmsgAddress(addr, self.cli_addr)
2191 self.assertEqual(ancdata, [])
2192 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2193
2194 def _testRecvmsgEOF(self):
2195 self.cli_sock.close()
2196
2197 def testRecvmsgOverflow(self):
2198 # Receive a message in more than one chunk.
2199 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2200 len(MSG) - 3)
2201 self.checkRecvmsgAddress(addr, self.cli_addr)
2202 self.assertEqual(ancdata, [])
2203 self.checkFlags(flags, eor=False)
2204
2205 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2206 self.checkRecvmsgAddress(addr, self.cli_addr)
2207 self.assertEqual(ancdata, [])
2208 self.checkFlags(flags, eor=True)
2209
2210 msg = seg1 + seg2
2211 self.assertEqual(msg, MSG)
2212
2213 def _testRecvmsgOverflow(self):
2214 self.sendToServer(MSG)
2215
2216
2217class RecvmsgTests(RecvmsgGenericTests):
2218 # Tests for recvmsg() which can use any socket type.
2219
2220 def testRecvmsgBadArgs(self):
2221 # Check that recvmsg() rejects invalid arguments.
2222 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2223 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2224 -1, 0, 0)
2225 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2226 len(MSG), -1, 0)
2227 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2228 [bytearray(10)], 0, 0)
2229 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2230 object(), 0, 0)
2231 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2232 len(MSG), object(), 0)
2233 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2234 len(MSG), 0, object())
2235
2236 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2237 self.assertEqual(msg, MSG)
2238 self.checkRecvmsgAddress(addr, self.cli_addr)
2239 self.assertEqual(ancdata, [])
2240 self.checkFlags(flags, eor=True)
2241
2242 def _testRecvmsgBadArgs(self):
2243 self.sendToServer(MSG)
2244
2245
2246class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2247 # Tests for recvmsg_into() which can use any socket type.
2248
2249 def testRecvmsgIntoBadArgs(self):
2250 # Check that recvmsg_into() rejects invalid arguments.
2251 buf = bytearray(len(MSG))
2252 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2253 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2254 len(MSG), 0, 0)
2255 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2256 buf, 0, 0)
2257 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2258 [object()], 0, 0)
2259 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2260 [b"I'm not writable"], 0, 0)
2261 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2262 [buf, object()], 0, 0)
2263 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2264 [buf], -1, 0)
2265 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2266 [buf], object(), 0)
2267 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2268 [buf], 0, object())
2269
2270 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2271 self.assertEqual(nbytes, len(MSG))
2272 self.assertEqual(buf, bytearray(MSG))
2273 self.checkRecvmsgAddress(addr, self.cli_addr)
2274 self.assertEqual(ancdata, [])
2275 self.checkFlags(flags, eor=True)
2276
2277 def _testRecvmsgIntoBadArgs(self):
2278 self.sendToServer(MSG)
2279
2280 def testRecvmsgIntoGenerator(self):
2281 # Receive into buffer obtained from a generator (not a sequence).
2282 buf = bytearray(len(MSG))
2283 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2284 (o for o in [buf]))
2285 self.assertEqual(nbytes, len(MSG))
2286 self.assertEqual(buf, bytearray(MSG))
2287 self.checkRecvmsgAddress(addr, self.cli_addr)
2288 self.assertEqual(ancdata, [])
2289 self.checkFlags(flags, eor=True)
2290
2291 def _testRecvmsgIntoGenerator(self):
2292 self.sendToServer(MSG)
2293
2294 def testRecvmsgIntoArray(self):
2295 # Receive into an array rather than the usual bytearray.
2296 buf = array.array("B", [0] * len(MSG))
2297 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2298 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002299 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002300 self.checkRecvmsgAddress(addr, self.cli_addr)
2301 self.assertEqual(ancdata, [])
2302 self.checkFlags(flags, eor=True)
2303
2304 def _testRecvmsgIntoArray(self):
2305 self.sendToServer(MSG)
2306
2307 def testRecvmsgIntoScatter(self):
2308 # Receive into multiple buffers (scatter write).
2309 b1 = bytearray(b"----")
2310 b2 = bytearray(b"0123456789")
2311 b3 = bytearray(b"--------------")
2312 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2313 [b1, memoryview(b2)[2:9], b3])
2314 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2315 self.assertEqual(b1, bytearray(b"Mary"))
2316 self.assertEqual(b2, bytearray(b"01 had a 9"))
2317 self.assertEqual(b3, bytearray(b"little lamb---"))
2318 self.checkRecvmsgAddress(addr, self.cli_addr)
2319 self.assertEqual(ancdata, [])
2320 self.checkFlags(flags, eor=True)
2321
2322 def _testRecvmsgIntoScatter(self):
2323 self.sendToServer(b"Mary had a little lamb")
2324
2325
2326class CmsgMacroTests(unittest.TestCase):
2327 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2328 # assumptions used by sendmsg() and recvmsg[_into](), which share
2329 # code with these functions.
2330
2331 # Match the definition in socketmodule.c
2332 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2333
2334 @requireAttrs(socket, "CMSG_LEN")
2335 def testCMSG_LEN(self):
2336 # Test CMSG_LEN() with various valid and invalid values,
2337 # checking the assumptions used by recvmsg() and sendmsg().
2338 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2339 values = list(range(257)) + list(range(toobig - 257, toobig))
2340
2341 # struct cmsghdr has at least three members, two of which are ints
2342 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2343 for n in values:
2344 ret = socket.CMSG_LEN(n)
2345 # This is how recvmsg() calculates the data size
2346 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2347 self.assertLessEqual(ret, self.socklen_t_limit)
2348
2349 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2350 # sendmsg() shares code with these functions, and requires
2351 # that it reject values over the limit.
2352 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2353 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2354
2355 @requireAttrs(socket, "CMSG_SPACE")
2356 def testCMSG_SPACE(self):
2357 # Test CMSG_SPACE() with various valid and invalid values,
2358 # checking the assumptions used by sendmsg().
2359 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2360 values = list(range(257)) + list(range(toobig - 257, toobig))
2361
2362 last = socket.CMSG_SPACE(0)
2363 # struct cmsghdr has at least three members, two of which are ints
2364 self.assertGreater(last, array.array("i").itemsize * 2)
2365 for n in values:
2366 ret = socket.CMSG_SPACE(n)
2367 self.assertGreaterEqual(ret, last)
2368 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2369 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2370 self.assertLessEqual(ret, self.socklen_t_limit)
2371 last = ret
2372
2373 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2374 # sendmsg() shares code with these functions, and requires
2375 # that it reject values over the limit.
2376 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2377 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2378
2379
2380class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2381 # Tests for file descriptor passing on Unix-domain sockets.
2382
2383 # Invalid file descriptor value that's unlikely to evaluate to a
2384 # real FD even if one of its bytes is replaced with a different
2385 # value (which shouldn't actually happen).
2386 badfd = -0x5555
2387
2388 def newFDs(self, n):
2389 # Return a list of n file descriptors for newly-created files
2390 # containing their list indices as ASCII numbers.
2391 fds = []
2392 for i in range(n):
2393 fd, path = tempfile.mkstemp()
2394 self.addCleanup(os.unlink, path)
2395 self.addCleanup(os.close, fd)
2396 os.write(fd, str(i).encode())
2397 fds.append(fd)
2398 return fds
2399
2400 def checkFDs(self, fds):
2401 # Check that the file descriptors in the given list contain
2402 # their correct list indices as ASCII numbers.
2403 for n, fd in enumerate(fds):
2404 os.lseek(fd, 0, os.SEEK_SET)
2405 self.assertEqual(os.read(fd, 1024), str(n).encode())
2406
2407 def registerRecvmsgResult(self, result):
2408 self.addCleanup(self.closeRecvmsgFDs, result)
2409
2410 def closeRecvmsgFDs(self, recvmsg_result):
2411 # Close all file descriptors specified in the ancillary data
2412 # of the given return value from recvmsg() or recvmsg_into().
2413 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2414 if (cmsg_level == socket.SOL_SOCKET and
2415 cmsg_type == socket.SCM_RIGHTS):
2416 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002417 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002418 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2419 for fd in fds:
2420 os.close(fd)
2421
2422 def createAndSendFDs(self, n):
2423 # Send n new file descriptors created by newFDs() to the
2424 # server, with the constant MSG as the non-ancillary data.
2425 self.assertEqual(
2426 self.sendmsgToServer([MSG],
2427 [(socket.SOL_SOCKET,
2428 socket.SCM_RIGHTS,
2429 array.array("i", self.newFDs(n)))]),
2430 len(MSG))
2431
2432 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2433 # Check that constant MSG was received with numfds file
2434 # descriptors in a maximum of maxcmsgs control messages (which
2435 # must contain only complete integers). By default, check
2436 # that MSG_CTRUNC is unset, but ignore any flags in
2437 # ignoreflags.
2438 msg, ancdata, flags, addr = result
2439 self.assertEqual(msg, MSG)
2440 self.checkRecvmsgAddress(addr, self.cli_addr)
2441 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2442 ignore=ignoreflags)
2443
2444 self.assertIsInstance(ancdata, list)
2445 self.assertLessEqual(len(ancdata), maxcmsgs)
2446 fds = array.array("i")
2447 for item in ancdata:
2448 self.assertIsInstance(item, tuple)
2449 cmsg_level, cmsg_type, cmsg_data = item
2450 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2451 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2452 self.assertIsInstance(cmsg_data, bytes)
2453 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002454 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002455
2456 self.assertEqual(len(fds), numfds)
2457 self.checkFDs(fds)
2458
2459 def testFDPassSimple(self):
2460 # Pass a single FD (array read from bytes object).
2461 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2462 len(MSG), 10240))
2463
2464 def _testFDPassSimple(self):
2465 self.assertEqual(
2466 self.sendmsgToServer(
2467 [MSG],
2468 [(socket.SOL_SOCKET,
2469 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002470 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002471 len(MSG))
2472
2473 def testMultipleFDPass(self):
2474 # Pass multiple FDs in a single array.
2475 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2476 len(MSG), 10240))
2477
2478 def _testMultipleFDPass(self):
2479 self.createAndSendFDs(4)
2480
2481 @requireAttrs(socket, "CMSG_SPACE")
2482 def testFDPassCMSG_SPACE(self):
2483 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2484 self.checkRecvmsgFDs(
2485 4, self.doRecvmsg(self.serv_sock, len(MSG),
2486 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2487
2488 @testFDPassCMSG_SPACE.client_skip
2489 def _testFDPassCMSG_SPACE(self):
2490 self.createAndSendFDs(4)
2491
2492 def testFDPassCMSG_LEN(self):
2493 # Test using CMSG_LEN() to calculate ancillary buffer size.
2494 self.checkRecvmsgFDs(1,
2495 self.doRecvmsg(self.serv_sock, len(MSG),
2496 socket.CMSG_LEN(4 * SIZEOF_INT)),
2497 # RFC 3542 says implementations may set
2498 # MSG_CTRUNC if there isn't enough space
2499 # for trailing padding.
2500 ignoreflags=socket.MSG_CTRUNC)
2501
2502 def _testFDPassCMSG_LEN(self):
2503 self.createAndSendFDs(1)
2504
Nick Coghlan2496f332011-09-19 20:26:31 +10002505 # Issue #12958: The following test has problems on Mac OS X
2506 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002507 @requireAttrs(socket, "CMSG_SPACE")
2508 def testFDPassSeparate(self):
2509 # Pass two FDs in two separate arrays. Arrays may be combined
2510 # into a single control message by the OS.
2511 self.checkRecvmsgFDs(2,
2512 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2513 maxcmsgs=2)
2514
2515 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002516 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002517 def _testFDPassSeparate(self):
2518 fd0, fd1 = self.newFDs(2)
2519 self.assertEqual(
2520 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2521 socket.SCM_RIGHTS,
2522 array.array("i", [fd0])),
2523 (socket.SOL_SOCKET,
2524 socket.SCM_RIGHTS,
2525 array.array("i", [fd1]))]),
2526 len(MSG))
2527
Nick Coghlan2496f332011-09-19 20:26:31 +10002528 # Issue #12958: The following test has problems on Mac OS X
2529 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002530 @requireAttrs(socket, "CMSG_SPACE")
2531 def testFDPassSeparateMinSpace(self):
2532 # Pass two FDs in two separate arrays, receiving them into the
2533 # minimum space for two arrays.
2534 self.checkRecvmsgFDs(2,
2535 self.doRecvmsg(self.serv_sock, len(MSG),
2536 socket.CMSG_SPACE(SIZEOF_INT) +
2537 socket.CMSG_LEN(SIZEOF_INT)),
2538 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2539
2540 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002541 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002542 def _testFDPassSeparateMinSpace(self):
2543 fd0, fd1 = self.newFDs(2)
2544 self.assertEqual(
2545 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2546 socket.SCM_RIGHTS,
2547 array.array("i", [fd0])),
2548 (socket.SOL_SOCKET,
2549 socket.SCM_RIGHTS,
2550 array.array("i", [fd1]))]),
2551 len(MSG))
2552
2553 def sendAncillaryIfPossible(self, msg, ancdata):
2554 # Try to send msg and ancdata to server, but if the system
2555 # call fails, just send msg with no ancillary data.
2556 try:
2557 nbytes = self.sendmsgToServer([msg], ancdata)
2558 except socket.error as e:
2559 # Check that it was the system call that failed
2560 self.assertIsInstance(e.errno, int)
2561 nbytes = self.sendmsgToServer([msg])
2562 self.assertEqual(nbytes, len(msg))
2563
2564 def testFDPassEmpty(self):
2565 # Try to pass an empty FD array. Can receive either no array
2566 # or an empty array.
2567 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2568 len(MSG), 10240),
2569 ignoreflags=socket.MSG_CTRUNC)
2570
2571 def _testFDPassEmpty(self):
2572 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2573 socket.SCM_RIGHTS,
2574 b"")])
2575
2576 def testFDPassPartialInt(self):
2577 # Try to pass a truncated FD array.
2578 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2579 len(MSG), 10240)
2580 self.assertEqual(msg, MSG)
2581 self.checkRecvmsgAddress(addr, self.cli_addr)
2582 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2583 self.assertLessEqual(len(ancdata), 1)
2584 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2585 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2586 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2587 self.assertLess(len(cmsg_data), SIZEOF_INT)
2588
2589 def _testFDPassPartialInt(self):
2590 self.sendAncillaryIfPossible(
2591 MSG,
2592 [(socket.SOL_SOCKET,
2593 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002594 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002595
2596 @requireAttrs(socket, "CMSG_SPACE")
2597 def testFDPassPartialIntInMiddle(self):
2598 # Try to pass two FD arrays, the first of which is truncated.
2599 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2600 len(MSG), 10240)
2601 self.assertEqual(msg, MSG)
2602 self.checkRecvmsgAddress(addr, self.cli_addr)
2603 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2604 self.assertLessEqual(len(ancdata), 2)
2605 fds = array.array("i")
2606 # Arrays may have been combined in a single control message
2607 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2608 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2609 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002610 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002611 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2612 self.assertLessEqual(len(fds), 2)
2613 self.checkFDs(fds)
2614
2615 @testFDPassPartialIntInMiddle.client_skip
2616 def _testFDPassPartialIntInMiddle(self):
2617 fd0, fd1 = self.newFDs(2)
2618 self.sendAncillaryIfPossible(
2619 MSG,
2620 [(socket.SOL_SOCKET,
2621 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002622 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002623 (socket.SOL_SOCKET,
2624 socket.SCM_RIGHTS,
2625 array.array("i", [fd1]))])
2626
2627 def checkTruncatedHeader(self, result, ignoreflags=0):
2628 # Check that no ancillary data items are returned when data is
2629 # truncated inside the cmsghdr structure.
2630 msg, ancdata, flags, addr = result
2631 self.assertEqual(msg, MSG)
2632 self.checkRecvmsgAddress(addr, self.cli_addr)
2633 self.assertEqual(ancdata, [])
2634 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2635 ignore=ignoreflags)
2636
2637 def testCmsgTruncNoBufSize(self):
2638 # Check that no ancillary data is received when no buffer size
2639 # is specified.
2640 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2641 # BSD seems to set MSG_CTRUNC only
2642 # if an item has been partially
2643 # received.
2644 ignoreflags=socket.MSG_CTRUNC)
2645
2646 def _testCmsgTruncNoBufSize(self):
2647 self.createAndSendFDs(1)
2648
2649 def testCmsgTrunc0(self):
2650 # Check that no ancillary data is received when buffer size is 0.
2651 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2652 ignoreflags=socket.MSG_CTRUNC)
2653
2654 def _testCmsgTrunc0(self):
2655 self.createAndSendFDs(1)
2656
2657 # Check that no ancillary data is returned for various non-zero
2658 # (but still too small) buffer sizes.
2659
2660 def testCmsgTrunc1(self):
2661 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2662
2663 def _testCmsgTrunc1(self):
2664 self.createAndSendFDs(1)
2665
2666 def testCmsgTrunc2Int(self):
2667 # The cmsghdr structure has at least three members, two of
2668 # which are ints, so we still shouldn't see any ancillary
2669 # data.
2670 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2671 SIZEOF_INT * 2))
2672
2673 def _testCmsgTrunc2Int(self):
2674 self.createAndSendFDs(1)
2675
2676 def testCmsgTruncLen0Minus1(self):
2677 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2678 socket.CMSG_LEN(0) - 1))
2679
2680 def _testCmsgTruncLen0Minus1(self):
2681 self.createAndSendFDs(1)
2682
2683 # The following tests try to truncate the control message in the
2684 # middle of the FD array.
2685
2686 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2687 # Check that file descriptor data is truncated to between
2688 # mindata and maxdata bytes when received with buffer size
2689 # ancbuf, and that any complete file descriptor numbers are
2690 # valid.
2691 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2692 len(MSG), ancbuf)
2693 self.assertEqual(msg, MSG)
2694 self.checkRecvmsgAddress(addr, self.cli_addr)
2695 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2696
2697 if mindata == 0 and ancdata == []:
2698 return
2699 self.assertEqual(len(ancdata), 1)
2700 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2701 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2702 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2703 self.assertGreaterEqual(len(cmsg_data), mindata)
2704 self.assertLessEqual(len(cmsg_data), maxdata)
2705 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002706 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002707 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2708 self.checkFDs(fds)
2709
2710 def testCmsgTruncLen0(self):
2711 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2712
2713 def _testCmsgTruncLen0(self):
2714 self.createAndSendFDs(1)
2715
2716 def testCmsgTruncLen0Plus1(self):
2717 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2718
2719 def _testCmsgTruncLen0Plus1(self):
2720 self.createAndSendFDs(2)
2721
2722 def testCmsgTruncLen1(self):
2723 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2724 maxdata=SIZEOF_INT)
2725
2726 def _testCmsgTruncLen1(self):
2727 self.createAndSendFDs(2)
2728
2729 def testCmsgTruncLen2Minus1(self):
2730 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2731 maxdata=(2 * SIZEOF_INT) - 1)
2732
2733 def _testCmsgTruncLen2Minus1(self):
2734 self.createAndSendFDs(2)
2735
2736
2737class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2738 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2739 # features of the RFC 3542 Advanced Sockets API for IPv6.
2740 # Currently we can only handle certain data items (e.g. traffic
2741 # class, hop limit, MTU discovery and fragmentation settings)
2742 # without resorting to unportable means such as the struct module,
2743 # but the tests here are aimed at testing the ancillary data
2744 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2745 # itself.
2746
2747 # Test value to use when setting hop limit of packet
2748 hop_limit = 2
2749
2750 # Test value to use when setting traffic class of packet.
2751 # -1 means "use kernel default".
2752 traffic_class = -1
2753
2754 def ancillaryMapping(self, ancdata):
2755 # Given ancillary data list ancdata, return a mapping from
2756 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2757 # Check that no (level, type) pair appears more than once.
2758 d = {}
2759 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2760 self.assertNotIn((cmsg_level, cmsg_type), d)
2761 d[(cmsg_level, cmsg_type)] = cmsg_data
2762 return d
2763
2764 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2765 # Receive hop limit into ancbufsize bytes of ancillary data
2766 # space. Check that data is MSG, ancillary data is not
2767 # truncated (but ignore any flags in ignoreflags), and hop
2768 # limit is between 0 and maxhop inclusive.
2769 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2770 socket.IPV6_RECVHOPLIMIT, 1)
2771 self.misc_event.set()
2772 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2773 len(MSG), ancbufsize)
2774
2775 self.assertEqual(msg, MSG)
2776 self.checkRecvmsgAddress(addr, self.cli_addr)
2777 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2778 ignore=ignoreflags)
2779
2780 self.assertEqual(len(ancdata), 1)
2781 self.assertIsInstance(ancdata[0], tuple)
2782 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2783 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2784 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2785 self.assertIsInstance(cmsg_data, bytes)
2786 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2787 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002788 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002789 self.assertGreaterEqual(a[0], 0)
2790 self.assertLessEqual(a[0], maxhop)
2791
2792 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2793 def testRecvHopLimit(self):
2794 # Test receiving the packet hop limit as ancillary data.
2795 self.checkHopLimit(ancbufsize=10240)
2796
2797 @testRecvHopLimit.client_skip
2798 def _testRecvHopLimit(self):
2799 # Need to wait until server has asked to receive ancillary
2800 # data, as implementations are not required to buffer it
2801 # otherwise.
2802 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2803 self.sendToServer(MSG)
2804
2805 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2806 def testRecvHopLimitCMSG_SPACE(self):
2807 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2808 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2809
2810 @testRecvHopLimitCMSG_SPACE.client_skip
2811 def _testRecvHopLimitCMSG_SPACE(self):
2812 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2813 self.sendToServer(MSG)
2814
2815 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2816 # 3542 says portable applications must provide space for trailing
2817 # padding. Implementations may set MSG_CTRUNC if there isn't
2818 # enough space for the padding.
2819
2820 @requireAttrs(socket.socket, "sendmsg")
2821 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2822 def testSetHopLimit(self):
2823 # Test setting hop limit on outgoing packet and receiving it
2824 # at the other end.
2825 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2826
2827 @testSetHopLimit.client_skip
2828 def _testSetHopLimit(self):
2829 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2830 self.assertEqual(
2831 self.sendmsgToServer([MSG],
2832 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2833 array.array("i", [self.hop_limit]))]),
2834 len(MSG))
2835
2836 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2837 ignoreflags=0):
2838 # Receive traffic class and hop limit into ancbufsize bytes of
2839 # ancillary data space. Check that data is MSG, ancillary
2840 # data is not truncated (but ignore any flags in ignoreflags),
2841 # and traffic class and hop limit are in range (hop limit no
2842 # more than maxhop).
2843 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2844 socket.IPV6_RECVHOPLIMIT, 1)
2845 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2846 socket.IPV6_RECVTCLASS, 1)
2847 self.misc_event.set()
2848 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2849 len(MSG), ancbufsize)
2850
2851 self.assertEqual(msg, MSG)
2852 self.checkRecvmsgAddress(addr, self.cli_addr)
2853 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2854 ignore=ignoreflags)
2855 self.assertEqual(len(ancdata), 2)
2856 ancmap = self.ancillaryMapping(ancdata)
2857
2858 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2859 self.assertEqual(len(tcdata), SIZEOF_INT)
2860 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002861 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002862 self.assertGreaterEqual(a[0], 0)
2863 self.assertLessEqual(a[0], 255)
2864
2865 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2866 self.assertEqual(len(hldata), SIZEOF_INT)
2867 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002868 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002869 self.assertGreaterEqual(a[0], 0)
2870 self.assertLessEqual(a[0], maxhop)
2871
2872 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2873 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2874 def testRecvTrafficClassAndHopLimit(self):
2875 # Test receiving traffic class and hop limit as ancillary data.
2876 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2877
2878 @testRecvTrafficClassAndHopLimit.client_skip
2879 def _testRecvTrafficClassAndHopLimit(self):
2880 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2881 self.sendToServer(MSG)
2882
2883 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2884 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2885 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2886 # Test receiving traffic class and hop limit, using
2887 # CMSG_SPACE() to calculate buffer size.
2888 self.checkTrafficClassAndHopLimit(
2889 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2890
2891 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2892 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2893 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2894 self.sendToServer(MSG)
2895
2896 @requireAttrs(socket.socket, "sendmsg")
2897 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2898 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2899 def testSetTrafficClassAndHopLimit(self):
2900 # Test setting traffic class and hop limit on outgoing packet,
2901 # and receiving them at the other end.
2902 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2903 maxhop=self.hop_limit)
2904
2905 @testSetTrafficClassAndHopLimit.client_skip
2906 def _testSetTrafficClassAndHopLimit(self):
2907 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2908 self.assertEqual(
2909 self.sendmsgToServer([MSG],
2910 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2911 array.array("i", [self.traffic_class])),
2912 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2913 array.array("i", [self.hop_limit]))]),
2914 len(MSG))
2915
2916 @requireAttrs(socket.socket, "sendmsg")
2917 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2918 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2919 def testOddCmsgSize(self):
2920 # Try to send ancillary data with first item one byte too
2921 # long. Fall back to sending with correct size if this fails,
2922 # and check that second item was handled correctly.
2923 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2924 maxhop=self.hop_limit)
2925
2926 @testOddCmsgSize.client_skip
2927 def _testOddCmsgSize(self):
2928 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2929 try:
2930 nbytes = self.sendmsgToServer(
2931 [MSG],
2932 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002933 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002934 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2935 array.array("i", [self.hop_limit]))])
2936 except socket.error as e:
2937 self.assertIsInstance(e.errno, int)
2938 nbytes = self.sendmsgToServer(
2939 [MSG],
2940 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2941 array.array("i", [self.traffic_class])),
2942 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2943 array.array("i", [self.hop_limit]))])
2944 self.assertEqual(nbytes, len(MSG))
2945
2946 # Tests for proper handling of truncated ancillary data
2947
2948 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2949 # Receive hop limit into ancbufsize bytes of ancillary data
2950 # space, which should be too small to contain the ancillary
2951 # data header (if ancbufsize is None, pass no second argument
2952 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2953 # (unless included in ignoreflags), and no ancillary data is
2954 # returned.
2955 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2956 socket.IPV6_RECVHOPLIMIT, 1)
2957 self.misc_event.set()
2958 args = () if ancbufsize is None else (ancbufsize,)
2959 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2960 len(MSG), *args)
2961
2962 self.assertEqual(msg, MSG)
2963 self.checkRecvmsgAddress(addr, self.cli_addr)
2964 self.assertEqual(ancdata, [])
2965 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2966 ignore=ignoreflags)
2967
2968 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2969 def testCmsgTruncNoBufSize(self):
2970 # Check that no ancillary data is received when no ancillary
2971 # buffer size is provided.
2972 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2973 # BSD seems to set
2974 # MSG_CTRUNC only if an item
2975 # has been partially
2976 # received.
2977 ignoreflags=socket.MSG_CTRUNC)
2978
2979 @testCmsgTruncNoBufSize.client_skip
2980 def _testCmsgTruncNoBufSize(self):
2981 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2982 self.sendToServer(MSG)
2983
2984 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2985 def testSingleCmsgTrunc0(self):
2986 # Check that no ancillary data is received when ancillary
2987 # buffer size is zero.
2988 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2989 ignoreflags=socket.MSG_CTRUNC)
2990
2991 @testSingleCmsgTrunc0.client_skip
2992 def _testSingleCmsgTrunc0(self):
2993 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2994 self.sendToServer(MSG)
2995
2996 # Check that no ancillary data is returned for various non-zero
2997 # (but still too small) buffer sizes.
2998
2999 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3000 def testSingleCmsgTrunc1(self):
3001 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3002
3003 @testSingleCmsgTrunc1.client_skip
3004 def _testSingleCmsgTrunc1(self):
3005 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3006 self.sendToServer(MSG)
3007
3008 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3009 def testSingleCmsgTrunc2Int(self):
3010 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3011
3012 @testSingleCmsgTrunc2Int.client_skip
3013 def _testSingleCmsgTrunc2Int(self):
3014 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3015 self.sendToServer(MSG)
3016
3017 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3018 def testSingleCmsgTruncLen0Minus1(self):
3019 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3020
3021 @testSingleCmsgTruncLen0Minus1.client_skip
3022 def _testSingleCmsgTruncLen0Minus1(self):
3023 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3024 self.sendToServer(MSG)
3025
3026 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3027 def testSingleCmsgTruncInData(self):
3028 # Test truncation of a control message inside its associated
3029 # data. The message may be returned with its data truncated,
3030 # or not returned at all.
3031 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3032 socket.IPV6_RECVHOPLIMIT, 1)
3033 self.misc_event.set()
3034 msg, ancdata, flags, addr = self.doRecvmsg(
3035 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3036
3037 self.assertEqual(msg, MSG)
3038 self.checkRecvmsgAddress(addr, self.cli_addr)
3039 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3040
3041 self.assertLessEqual(len(ancdata), 1)
3042 if ancdata:
3043 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3044 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3045 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3046 self.assertLess(len(cmsg_data), SIZEOF_INT)
3047
3048 @testSingleCmsgTruncInData.client_skip
3049 def _testSingleCmsgTruncInData(self):
3050 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3051 self.sendToServer(MSG)
3052
3053 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3054 # Receive traffic class and hop limit into ancbufsize bytes of
3055 # ancillary data space, which should be large enough to
3056 # contain the first item, but too small to contain the header
3057 # of the second. Check that data is MSG, MSG_CTRUNC is set
3058 # (unless included in ignoreflags), and only one ancillary
3059 # data item is returned.
3060 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3061 socket.IPV6_RECVHOPLIMIT, 1)
3062 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3063 socket.IPV6_RECVTCLASS, 1)
3064 self.misc_event.set()
3065 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3066 len(MSG), ancbufsize)
3067
3068 self.assertEqual(msg, MSG)
3069 self.checkRecvmsgAddress(addr, self.cli_addr)
3070 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3071 ignore=ignoreflags)
3072
3073 self.assertEqual(len(ancdata), 1)
3074 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3075 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3076 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3077 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3078 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003079 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003080 self.assertGreaterEqual(a[0], 0)
3081 self.assertLessEqual(a[0], 255)
3082
3083 # Try the above test with various buffer sizes.
3084
3085 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3086 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3087 def testSecondCmsgTrunc0(self):
3088 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3089 ignoreflags=socket.MSG_CTRUNC)
3090
3091 @testSecondCmsgTrunc0.client_skip
3092 def _testSecondCmsgTrunc0(self):
3093 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3094 self.sendToServer(MSG)
3095
3096 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3097 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3098 def testSecondCmsgTrunc1(self):
3099 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3100
3101 @testSecondCmsgTrunc1.client_skip
3102 def _testSecondCmsgTrunc1(self):
3103 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3104 self.sendToServer(MSG)
3105
3106 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3107 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3108 def testSecondCmsgTrunc2Int(self):
3109 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3110 2 * SIZEOF_INT)
3111
3112 @testSecondCmsgTrunc2Int.client_skip
3113 def _testSecondCmsgTrunc2Int(self):
3114 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3115 self.sendToServer(MSG)
3116
3117 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3118 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3119 def testSecondCmsgTruncLen0Minus1(self):
3120 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3121 socket.CMSG_LEN(0) - 1)
3122
3123 @testSecondCmsgTruncLen0Minus1.client_skip
3124 def _testSecondCmsgTruncLen0Minus1(self):
3125 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3126 self.sendToServer(MSG)
3127
3128 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3129 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3130 def testSecomdCmsgTruncInData(self):
3131 # Test truncation of the second of two control messages inside
3132 # its associated data.
3133 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3134 socket.IPV6_RECVHOPLIMIT, 1)
3135 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3136 socket.IPV6_RECVTCLASS, 1)
3137 self.misc_event.set()
3138 msg, ancdata, flags, addr = self.doRecvmsg(
3139 self.serv_sock, len(MSG),
3140 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3141
3142 self.assertEqual(msg, MSG)
3143 self.checkRecvmsgAddress(addr, self.cli_addr)
3144 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3145
3146 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3147
3148 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3149 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3150 cmsg_types.remove(cmsg_type)
3151 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3152 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003153 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003154 self.assertGreaterEqual(a[0], 0)
3155 self.assertLessEqual(a[0], 255)
3156
3157 if ancdata:
3158 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3159 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3160 cmsg_types.remove(cmsg_type)
3161 self.assertLess(len(cmsg_data), SIZEOF_INT)
3162
3163 self.assertEqual(ancdata, [])
3164
3165 @testSecomdCmsgTruncInData.client_skip
3166 def _testSecomdCmsgTruncInData(self):
3167 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3168 self.sendToServer(MSG)
3169
3170
3171# Derive concrete test classes for different socket types.
3172
3173class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3174 SendrecvmsgConnectionlessBase,
3175 ThreadedSocketTestMixin, UDPTestBase):
3176 pass
3177
3178@requireAttrs(socket.socket, "sendmsg")
3179@unittest.skipUnless(thread, 'Threading required for this test.')
3180class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3181 pass
3182
3183@requireAttrs(socket.socket, "recvmsg")
3184@unittest.skipUnless(thread, 'Threading required for this test.')
3185class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3186 pass
3187
3188@requireAttrs(socket.socket, "recvmsg_into")
3189@unittest.skipUnless(thread, 'Threading required for this test.')
3190class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3191 pass
3192
3193
3194class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3195 SendrecvmsgConnectionlessBase,
3196 ThreadedSocketTestMixin, UDP6TestBase):
3197 pass
3198
3199@requireAttrs(socket.socket, "sendmsg")
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 SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3204 pass
3205
3206@requireAttrs(socket.socket, "recvmsg")
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 RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3211 pass
3212
3213@requireAttrs(socket.socket, "recvmsg_into")
3214@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3215@requireSocket("AF_INET6", "SOCK_DGRAM")
3216@unittest.skipUnless(thread, 'Threading required for this test.')
3217class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3218 pass
3219
3220@requireAttrs(socket.socket, "recvmsg")
3221@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3222@requireAttrs(socket, "IPPROTO_IPV6")
3223@requireSocket("AF_INET6", "SOCK_DGRAM")
3224@unittest.skipUnless(thread, 'Threading required for this test.')
3225class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3226 SendrecvmsgUDP6TestBase):
3227 pass
3228
3229@requireAttrs(socket.socket, "recvmsg_into")
3230@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3231@requireAttrs(socket, "IPPROTO_IPV6")
3232@requireSocket("AF_INET6", "SOCK_DGRAM")
3233@unittest.skipUnless(thread, 'Threading required for this test.')
3234class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3235 RFC3542AncillaryTest,
3236 SendrecvmsgUDP6TestBase):
3237 pass
3238
3239
3240class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3241 ConnectedStreamTestMixin, TCPTestBase):
3242 pass
3243
3244@requireAttrs(socket.socket, "sendmsg")
3245@unittest.skipUnless(thread, 'Threading required for this test.')
3246class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3247 pass
3248
3249@requireAttrs(socket.socket, "recvmsg")
3250@unittest.skipUnless(thread, 'Threading required for this test.')
3251class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3252 SendrecvmsgTCPTestBase):
3253 pass
3254
3255@requireAttrs(socket.socket, "recvmsg_into")
3256@unittest.skipUnless(thread, 'Threading required for this test.')
3257class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3258 SendrecvmsgTCPTestBase):
3259 pass
3260
3261
3262class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3263 SendrecvmsgConnectedBase,
3264 ConnectedStreamTestMixin, SCTPStreamBase):
3265 pass
3266
3267@requireAttrs(socket.socket, "sendmsg")
3268@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3269@unittest.skipUnless(thread, 'Threading required for this test.')
3270class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3271 pass
3272
3273@requireAttrs(socket.socket, "recvmsg")
3274@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3275@unittest.skipUnless(thread, 'Threading required for this test.')
3276class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3277 SendrecvmsgSCTPStreamTestBase):
3278 pass
3279
3280@requireAttrs(socket.socket, "recvmsg_into")
3281@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3282@unittest.skipUnless(thread, 'Threading required for this test.')
3283class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3284 SendrecvmsgSCTPStreamTestBase):
3285 pass
3286
3287
3288class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3289 ConnectedStreamTestMixin, UnixStreamBase):
3290 pass
3291
3292@requireAttrs(socket.socket, "sendmsg")
3293@requireAttrs(socket, "AF_UNIX")
3294@unittest.skipUnless(thread, 'Threading required for this test.')
3295class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3296 pass
3297
3298@requireAttrs(socket.socket, "recvmsg")
3299@requireAttrs(socket, "AF_UNIX")
3300@unittest.skipUnless(thread, 'Threading required for this test.')
3301class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3302 SendrecvmsgUnixStreamTestBase):
3303 pass
3304
3305@requireAttrs(socket.socket, "recvmsg_into")
3306@requireAttrs(socket, "AF_UNIX")
3307@unittest.skipUnless(thread, 'Threading required for this test.')
3308class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3309 SendrecvmsgUnixStreamTestBase):
3310 pass
3311
3312@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3313@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3314@unittest.skipUnless(thread, 'Threading required for this test.')
3315class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3316 pass
3317
3318@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3319@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3320@unittest.skipUnless(thread, 'Threading required for this test.')
3321class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3322 SendrecvmsgUnixStreamTestBase):
3323 pass
3324
3325
3326# Test interrupting the interruptible send/receive methods with a
3327# signal when a timeout is set. These tests avoid having multiple
3328# threads alive during the test so that the OS cannot deliver the
3329# signal to the wrong one.
3330
3331class InterruptedTimeoutBase(unittest.TestCase):
3332 # Base class for interrupted send/receive tests. Installs an
3333 # empty handler for SIGALRM and removes it on teardown, along with
3334 # any scheduled alarms.
3335
3336 def setUp(self):
3337 super().setUp()
3338 orig_alrm_handler = signal.signal(signal.SIGALRM,
3339 lambda signum, frame: None)
3340 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3341 self.addCleanup(self.setAlarm, 0)
3342
3343 # Timeout for socket operations
3344 timeout = 4.0
3345
3346 # Provide setAlarm() method to schedule delivery of SIGALRM after
3347 # given number of seconds, or cancel it if zero, and an
3348 # appropriate time value to use. Use setitimer() if available.
3349 if hasattr(signal, "setitimer"):
3350 alarm_time = 0.05
3351
3352 def setAlarm(self, seconds):
3353 signal.setitimer(signal.ITIMER_REAL, seconds)
3354 else:
3355 # Old systems may deliver the alarm up to one second early
3356 alarm_time = 2
3357
3358 def setAlarm(self, seconds):
3359 signal.alarm(seconds)
3360
3361
3362# Require siginterrupt() in order to ensure that system calls are
3363# interrupted by default.
3364@requireAttrs(signal, "siginterrupt")
3365@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3366 "Don't have signal.alarm or signal.setitimer")
3367class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3368 # Test interrupting the recv*() methods with signals when a
3369 # timeout is set.
3370
3371 def setUp(self):
3372 super().setUp()
3373 self.serv.settimeout(self.timeout)
3374
3375 def checkInterruptedRecv(self, func, *args, **kwargs):
3376 # Check that func(*args, **kwargs) raises socket.error with an
3377 # errno of EINTR when interrupted by a signal.
3378 self.setAlarm(self.alarm_time)
3379 with self.assertRaises(socket.error) as cm:
3380 func(*args, **kwargs)
3381 self.assertNotIsInstance(cm.exception, socket.timeout)
3382 self.assertEqual(cm.exception.errno, errno.EINTR)
3383
3384 def testInterruptedRecvTimeout(self):
3385 self.checkInterruptedRecv(self.serv.recv, 1024)
3386
3387 def testInterruptedRecvIntoTimeout(self):
3388 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3389
3390 def testInterruptedRecvfromTimeout(self):
3391 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3392
3393 def testInterruptedRecvfromIntoTimeout(self):
3394 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3395
3396 @requireAttrs(socket.socket, "recvmsg")
3397 def testInterruptedRecvmsgTimeout(self):
3398 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3399
3400 @requireAttrs(socket.socket, "recvmsg_into")
3401 def testInterruptedRecvmsgIntoTimeout(self):
3402 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3403
3404
3405# Require siginterrupt() in order to ensure that system calls are
3406# interrupted by default.
3407@requireAttrs(signal, "siginterrupt")
3408@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3409 "Don't have signal.alarm or signal.setitimer")
3410@unittest.skipUnless(thread, 'Threading required for this test.')
3411class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3412 ThreadSafeCleanupTestCase,
3413 SocketListeningTestMixin, TCPTestBase):
3414 # Test interrupting the interruptible send*() methods with signals
3415 # when a timeout is set.
3416
3417 def setUp(self):
3418 super().setUp()
3419 self.serv_conn = self.newSocket()
3420 self.addCleanup(self.serv_conn.close)
3421 # Use a thread to complete the connection, but wait for it to
3422 # terminate before running the test, so that there is only one
3423 # thread to accept the signal.
3424 cli_thread = threading.Thread(target=self.doConnect)
3425 cli_thread.start()
3426 self.cli_conn, addr = self.serv.accept()
3427 self.addCleanup(self.cli_conn.close)
3428 cli_thread.join()
3429 self.serv_conn.settimeout(self.timeout)
3430
3431 def doConnect(self):
3432 self.serv_conn.connect(self.serv_addr)
3433
3434 def checkInterruptedSend(self, func, *args, **kwargs):
3435 # Check that func(*args, **kwargs), run in a loop, raises
3436 # socket.error with an errno of EINTR when interrupted by a
3437 # signal.
3438 with self.assertRaises(socket.error) as cm:
3439 while True:
3440 self.setAlarm(self.alarm_time)
3441 func(*args, **kwargs)
3442 self.assertNotIsInstance(cm.exception, socket.timeout)
3443 self.assertEqual(cm.exception.errno, errno.EINTR)
3444
Nick Coghlan2496f332011-09-19 20:26:31 +10003445 # Issue #12958: The following tests have problems on Mac OS X
3446 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003447 def testInterruptedSendTimeout(self):
3448 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3449
Nick Coghlan2496f332011-09-19 20:26:31 +10003450 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003451 def testInterruptedSendtoTimeout(self):
3452 # Passing an actual address here as Python's wrapper for
3453 # sendto() doesn't allow passing a zero-length one; POSIX
3454 # requires that the address is ignored since the socket is
3455 # connection-mode, however.
3456 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3457 self.serv_addr)
3458
Nick Coghlan2496f332011-09-19 20:26:31 +10003459 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003460 @requireAttrs(socket.socket, "sendmsg")
3461 def testInterruptedSendmsgTimeout(self):
3462 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3463
3464
Victor Stinner45df8202010-04-28 22:31:17 +00003465@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003466class TCPCloserTest(ThreadedTCPSocketTest):
3467
3468 def testClose(self):
3469 conn, addr = self.serv.accept()
3470 conn.close()
3471
3472 sd = self.cli
3473 read, write, err = select.select([sd], [], [], 1.0)
3474 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003475 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003476
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003477 # Calling close() many times should be safe.
3478 conn.close()
3479 conn.close()
3480
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003481 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003482 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003483 time.sleep(1.0)
3484
Victor Stinner45df8202010-04-28 22:31:17 +00003485@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003486class BasicSocketPairTest(SocketPairTest):
3487
3488 def __init__(self, methodName='runTest'):
3489 SocketPairTest.__init__(self, methodName=methodName)
3490
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003491 def _check_defaults(self, sock):
3492 self.assertIsInstance(sock, socket.socket)
3493 if hasattr(socket, 'AF_UNIX'):
3494 self.assertEqual(sock.family, socket.AF_UNIX)
3495 else:
3496 self.assertEqual(sock.family, socket.AF_INET)
3497 self.assertEqual(sock.type, socket.SOCK_STREAM)
3498 self.assertEqual(sock.proto, 0)
3499
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003500 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003501 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003502
3503 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003504 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003505
Dave Cole331708b2004-08-09 04:51:41 +00003506 def testRecv(self):
3507 msg = self.serv.recv(1024)
3508 self.assertEqual(msg, MSG)
3509
3510 def _testRecv(self):
3511 self.cli.send(MSG)
3512
3513 def testSend(self):
3514 self.serv.send(MSG)
3515
3516 def _testSend(self):
3517 msg = self.cli.recv(1024)
3518 self.assertEqual(msg, MSG)
3519
Victor Stinner45df8202010-04-28 22:31:17 +00003520@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003521class NonBlockingTCPTests(ThreadedTCPSocketTest):
3522
3523 def __init__(self, methodName='runTest'):
3524 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3525
3526 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003527 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003528 self.serv.setblocking(0)
3529 start = time.time()
3530 try:
3531 self.serv.accept()
3532 except socket.error:
3533 pass
3534 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003535 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003536
3537 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003538 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003539
Antoine Pitroub1c54962010-10-14 15:05:38 +00003540 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003541 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003542 def testInitNonBlocking(self):
3543 # reinit server socket
3544 self.serv.close()
3545 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003546 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003547 self.port = support.bind_port(self.serv)
3548 self.serv.listen(1)
3549 # actual testing
3550 start = time.time()
3551 try:
3552 self.serv.accept()
3553 except socket.error:
3554 pass
3555 end = time.time()
3556 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3557
3558 def _testInitNonBlocking(self):
3559 pass
3560
Antoine Pitrou600232b2011-01-05 21:03:42 +00003561 def testInheritFlags(self):
3562 # Issue #7995: when calling accept() on a listening socket with a
3563 # timeout, the resulting socket should not be non-blocking.
3564 self.serv.settimeout(10)
3565 try:
3566 conn, addr = self.serv.accept()
3567 message = conn.recv(len(MSG))
3568 finally:
3569 conn.close()
3570 self.serv.settimeout(None)
3571
3572 def _testInheritFlags(self):
3573 time.sleep(0.1)
3574 self.cli.connect((HOST, self.port))
3575 time.sleep(0.5)
3576 self.cli.send(MSG)
3577
Guido van Rossum24e4af82002-06-12 19:18:08 +00003578 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003579 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003580 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003581 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003582 conn, addr = self.serv.accept()
3583 except socket.error:
3584 pass
3585 else:
3586 self.fail("Error trying to do non-blocking accept.")
3587 read, write, err = select.select([self.serv], [], [])
3588 if self.serv in read:
3589 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003590 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003591 else:
3592 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003593
Guido van Rossum24e4af82002-06-12 19:18:08 +00003594 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003595 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003596 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003597
3598 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003599 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003600 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003601 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003602
3603 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003604 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003605 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003606
3607 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003608 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003609 conn, addr = self.serv.accept()
3610 conn.setblocking(0)
3611 try:
3612 msg = conn.recv(len(MSG))
3613 except socket.error:
3614 pass
3615 else:
3616 self.fail("Error trying to do non-blocking recv.")
3617 read, write, err = select.select([conn], [], [])
3618 if conn in read:
3619 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003620 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003621 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003622 else:
3623 self.fail("Error during select call to non-blocking socket.")
3624
3625 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003626 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003627 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003628 self.cli.send(MSG)
3629
Victor Stinner45df8202010-04-28 22:31:17 +00003630@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003631class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003632 """Unit tests for the object returned by socket.makefile()
3633
Antoine Pitrou834bd812010-10-13 16:17:14 +00003634 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003635 the client connection. You can read from this file to
3636 get output from the server.
3637
Antoine Pitrou834bd812010-10-13 16:17:14 +00003638 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003639 server connection. You can write to this file to send output
3640 to the client.
3641 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003642
Guido van Rossume9f66142002-08-07 15:46:19 +00003643 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003644 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003645 errors = 'strict'
3646 newline = None
3647
3648 read_mode = 'rb'
3649 read_msg = MSG
3650 write_mode = 'wb'
3651 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003652
Guido van Rossum24e4af82002-06-12 19:18:08 +00003653 def __init__(self, methodName='runTest'):
3654 SocketConnectedTest.__init__(self, methodName=methodName)
3655
3656 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003657 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3658 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003659 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003660 self.read_file = self.cli_conn.makefile(
3661 self.read_mode, self.bufsize,
3662 encoding = self.encoding,
3663 errors = self.errors,
3664 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003665
3666 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003667 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003668 self.read_file.close()
3669 self.assertTrue(self.read_file.closed)
3670 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003671 SocketConnectedTest.tearDown(self)
3672
3673 def clientSetUp(self):
3674 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003675 self.write_file = self.serv_conn.makefile(
3676 self.write_mode, self.bufsize,
3677 encoding = self.encoding,
3678 errors = self.errors,
3679 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003680
3681 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003682 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003683 self.write_file.close()
3684 self.assertTrue(self.write_file.closed)
3685 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003686 SocketConnectedTest.clientTearDown(self)
3687
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003688 def testReadAfterTimeout(self):
3689 # Issue #7322: A file object must disallow further reads
3690 # after a timeout has occurred.
3691 self.cli_conn.settimeout(1)
3692 self.read_file.read(3)
3693 # First read raises a timeout
3694 self.assertRaises(socket.timeout, self.read_file.read, 1)
3695 # Second read is disallowed
3696 with self.assertRaises(IOError) as ctx:
3697 self.read_file.read(1)
3698 self.assertIn("cannot read from timed out object", str(ctx.exception))
3699
3700 def _testReadAfterTimeout(self):
3701 self.write_file.write(self.write_msg[0:3])
3702 self.write_file.flush()
3703 self.serv_finished.wait()
3704
Guido van Rossum24e4af82002-06-12 19:18:08 +00003705 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003706 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003707 first_seg = self.read_file.read(len(self.read_msg)-3)
3708 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003709 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003710 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003711
3712 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003713 self.write_file.write(self.write_msg)
3714 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003715
Guido van Rossum8c943832002-08-08 01:00:28 +00003716 def testFullRead(self):
3717 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003718 msg = self.read_file.read()
3719 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003720
3721 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003722 self.write_file.write(self.write_msg)
3723 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003724
Guido van Rossum24e4af82002-06-12 19:18:08 +00003725 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003726 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003727 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003728 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003729 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003730 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003731 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003732 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003733 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003734
3735 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003736 self.write_file.write(self.write_msg)
3737 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003738
3739 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003740 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003741 line = self.read_file.readline()
3742 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003743
3744 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003745 self.write_file.write(self.write_msg)
3746 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003747
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003748 def testCloseAfterMakefile(self):
3749 # The file returned by makefile should keep the socket open.
3750 self.cli_conn.close()
3751 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003752 msg = self.read_file.read()
3753 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003754
3755 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003756 self.write_file.write(self.write_msg)
3757 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003758
3759 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003760 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003761 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003762 if isinstance(self.read_msg, str):
3763 msg = msg.decode()
3764 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003765
3766 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003767 self.write_file.write(self.write_msg)
3768 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003769
Tim Peters116d83c2004-03-28 02:20:45 +00003770 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003771 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003772
3773 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003774 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003775
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003776 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003777 self.assertEqual(self.read_file.mode, self.read_mode)
3778 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003779
3780 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003781 self.assertEqual(self.write_file.mode, self.write_mode)
3782 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003783
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003784 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003785 self.read_file.close()
3786 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003787 self.cli_conn.close()
3788 self.assertRaises(socket.error, self.cli_conn.getsockname)
3789
3790 def _testRealClose(self):
3791 pass
3792
3793
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003794class FileObjectInterruptedTestCase(unittest.TestCase):
3795 """Test that the file object correctly handles EINTR internally."""
3796
3797 class MockSocket(object):
3798 def __init__(self, recv_funcs=()):
3799 # A generator that returns callables that we'll call for each
3800 # call to recv().
3801 self._recv_step = iter(recv_funcs)
3802
3803 def recv_into(self, buffer):
3804 data = next(self._recv_step)()
3805 assert len(buffer) >= len(data)
3806 buffer[:len(data)] = data
3807 return len(data)
3808
3809 def _decref_socketios(self):
3810 pass
3811
3812 def _textiowrap_for_test(self, buffering=-1):
3813 raw = socket.SocketIO(self, "r")
3814 if buffering < 0:
3815 buffering = io.DEFAULT_BUFFER_SIZE
3816 if buffering == 0:
3817 return raw
3818 buffer = io.BufferedReader(raw, buffering)
3819 text = io.TextIOWrapper(buffer, None, None)
3820 text.mode = "rb"
3821 return text
3822
3823 @staticmethod
3824 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003825 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003826
3827 def _textiowrap_mock_socket(self, mock, buffering=-1):
3828 raw = socket.SocketIO(mock, "r")
3829 if buffering < 0:
3830 buffering = io.DEFAULT_BUFFER_SIZE
3831 if buffering == 0:
3832 return raw
3833 buffer = io.BufferedReader(raw, buffering)
3834 text = io.TextIOWrapper(buffer, None, None)
3835 text.mode = "rb"
3836 return text
3837
3838 def _test_readline(self, size=-1, buffering=-1):
3839 mock_sock = self.MockSocket(recv_funcs=[
3840 lambda : b"This is the first line\nAnd the sec",
3841 self._raise_eintr,
3842 lambda : b"ond line is here\n",
3843 lambda : b"",
3844 lambda : b"", # XXX(gps): io library does an extra EOF read
3845 ])
3846 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003847 self.assertEqual(fo.readline(size), "This is the first line\n")
3848 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003849
3850 def _test_read(self, size=-1, buffering=-1):
3851 mock_sock = self.MockSocket(recv_funcs=[
3852 lambda : b"This is the first line\nAnd the sec",
3853 self._raise_eintr,
3854 lambda : b"ond line is here\n",
3855 lambda : b"",
3856 lambda : b"", # XXX(gps): io library does an extra EOF read
3857 ])
3858 expecting = (b"This is the first line\n"
3859 b"And the second line is here\n")
3860 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3861 if buffering == 0:
3862 data = b''
3863 else:
3864 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003865 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003866 while len(data) != len(expecting):
3867 part = fo.read(size)
3868 if not part:
3869 break
3870 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003871 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003872
3873 def test_default(self):
3874 self._test_readline()
3875 self._test_readline(size=100)
3876 self._test_read()
3877 self._test_read(size=100)
3878
3879 def test_with_1k_buffer(self):
3880 self._test_readline(buffering=1024)
3881 self._test_readline(size=100, buffering=1024)
3882 self._test_read(buffering=1024)
3883 self._test_read(size=100, buffering=1024)
3884
3885 def _test_readline_no_buffer(self, size=-1):
3886 mock_sock = self.MockSocket(recv_funcs=[
3887 lambda : b"a",
3888 lambda : b"\n",
3889 lambda : b"B",
3890 self._raise_eintr,
3891 lambda : b"b",
3892 lambda : b"",
3893 ])
3894 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003895 self.assertEqual(fo.readline(size), b"a\n")
3896 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003897
3898 def test_no_buffer(self):
3899 self._test_readline_no_buffer()
3900 self._test_readline_no_buffer(size=4)
3901 self._test_read(buffering=0)
3902 self._test_read(size=100, buffering=0)
3903
3904
Guido van Rossume9f66142002-08-07 15:46:19 +00003905class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3906
3907 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003908
Guido van Rossume9f66142002-08-07 15:46:19 +00003909 In this case (and in this case only), it should be possible to
3910 create a file object, read a line from it, create another file
3911 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003912 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003913 when reading multiple requests from the same socket."""
3914
3915 bufsize = 0 # Use unbuffered mode
3916
3917 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003918 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003919 line = self.read_file.readline() # first line
3920 self.assertEqual(line, b"A. " + self.write_msg) # first line
3921 self.read_file = self.cli_conn.makefile('rb', 0)
3922 line = self.read_file.readline() # second line
3923 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003924
3925 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003926 self.write_file.write(b"A. " + self.write_msg)
3927 self.write_file.write(b"B. " + self.write_msg)
3928 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003929
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003930 def testMakefileClose(self):
3931 # The file returned by makefile should keep the socket open...
3932 self.cli_conn.close()
3933 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003934 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003935 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003936 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003937 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3938
3939 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003940 self.write_file.write(self.write_msg)
3941 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003942
3943 def testMakefileCloseSocketDestroy(self):
3944 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003945 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003946 refcount_after = sys.getrefcount(self.cli_conn)
3947 self.assertEqual(refcount_before - 1, refcount_after)
3948
3949 def _testMakefileCloseSocketDestroy(self):
3950 pass
3951
Antoine Pitrou98b46702010-09-18 22:59:00 +00003952 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003953 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003954 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3955
3956 def testSmallReadNonBlocking(self):
3957 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003958 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3959 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003960 self.evt1.set()
3961 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003962 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003963 if first_seg is None:
3964 # Data not arrived (can happen under Windows), wait a bit
3965 time.sleep(0.5)
3966 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003967 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003968 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003969 self.assertEqual(n, 3)
3970 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003971 self.assertEqual(msg, self.read_msg)
3972 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3973 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003974
3975 def _testSmallReadNonBlocking(self):
3976 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003977 self.write_file.write(self.write_msg)
3978 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003979 self.evt2.set()
3980 # Avoid cloding the socket before the server test has finished,
3981 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3982 self.serv_finished.wait(5.0)
3983
3984 def testWriteNonBlocking(self):
3985 self.cli_finished.wait(5.0)
3986 # The client thread can't skip directly - the SkipTest exception
3987 # would appear as a failure.
3988 if self.serv_skipped:
3989 self.skipTest(self.serv_skipped)
3990
3991 def _testWriteNonBlocking(self):
3992 self.serv_skipped = None
3993 self.serv_conn.setblocking(False)
3994 # Try to saturate the socket buffer pipe with repeated large writes.
3995 BIG = b"x" * (1024 ** 2)
3996 LIMIT = 10
3997 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00003998 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003999 self.assertGreater(n, 0)
4000 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004001 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004002 if n is None:
4003 # Succeeded
4004 break
4005 self.assertGreater(n, 0)
4006 else:
4007 # Let us know that this test didn't manage to establish
4008 # the expected conditions. This is not a failure in itself but,
4009 # if it happens repeatedly, the test should be fixed.
4010 self.serv_skipped = "failed to saturate the socket buffer"
4011
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004012
Guido van Rossum8c943832002-08-08 01:00:28 +00004013class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4014
4015 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4016
4017
4018class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4019
4020 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004021
Thomas Woutersb2137042007-02-01 18:02:27 +00004022
Antoine Pitrou834bd812010-10-13 16:17:14 +00004023class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4024 """Tests for socket.makefile() in text mode (rather than binary)"""
4025
4026 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004027 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004028 write_mode = 'wb'
4029 write_msg = MSG
4030 newline = ''
4031
4032
4033class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4034 """Tests for socket.makefile() in text mode (rather than binary)"""
4035
4036 read_mode = 'rb'
4037 read_msg = MSG
4038 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004039 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004040 newline = ''
4041
4042
4043class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4044 """Tests for socket.makefile() in text mode (rather than binary)"""
4045
4046 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004047 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004048 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004049 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004050 newline = ''
4051
4052
Guido van Rossumd8faa362007-04-27 19:54:29 +00004053class NetworkConnectionTest(object):
4054 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004055
Guido van Rossumd8faa362007-04-27 19:54:29 +00004056 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004057 # We're inherited below by BasicTCPTest2, which also inherits
4058 # BasicTCPTest, which defines self.port referenced below.
4059 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004060 self.serv_conn = self.cli
4061
4062class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4063 """Tests that NetworkConnection does not break existing TCP functionality.
4064 """
4065
4066class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004067
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004068 class MockSocket(socket.socket):
4069 def connect(self, *args):
4070 raise socket.timeout('timed out')
4071
4072 @contextlib.contextmanager
4073 def mocked_socket_module(self):
4074 """Return a socket which times out on connect"""
4075 old_socket = socket.socket
4076 socket.socket = self.MockSocket
4077 try:
4078 yield
4079 finally:
4080 socket.socket = old_socket
4081
4082 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004083 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004084 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004085 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004086 with self.assertRaises(socket.error) as cm:
4087 cli.connect((HOST, port))
4088 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4089
4090 def test_create_connection(self):
4091 # Issue #9792: errors raised by create_connection() should have
4092 # a proper errno attribute.
4093 port = support.find_unused_port()
4094 with self.assertRaises(socket.error) as cm:
4095 socket.create_connection((HOST, port))
4096 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4097
4098 def test_create_connection_timeout(self):
4099 # Issue #9792: create_connection() should not recast timeout errors
4100 # as generic socket errors.
4101 with self.mocked_socket_module():
4102 with self.assertRaises(socket.timeout):
4103 socket.create_connection((HOST, 1234))
4104
Guido van Rossumd8faa362007-04-27 19:54:29 +00004105
Victor Stinner45df8202010-04-28 22:31:17 +00004106@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004107class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4108
4109 def __init__(self, methodName='runTest'):
4110 SocketTCPTest.__init__(self, methodName=methodName)
4111 ThreadableTest.__init__(self)
4112
4113 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004114 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004115
4116 def clientTearDown(self):
4117 self.cli.close()
4118 self.cli = None
4119 ThreadableTest.clientTearDown(self)
4120
4121 def _justAccept(self):
4122 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004123 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004124
4125 testFamily = _justAccept
4126 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004127 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004128 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004129 self.assertEqual(self.cli.family, 2)
4130
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004131 testSourceAddress = _justAccept
4132 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004133 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4134 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004135 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004136 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004137 # The port number being used is sufficient to show that the bind()
4138 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004139
Guido van Rossumd8faa362007-04-27 19:54:29 +00004140 testTimeoutDefault = _justAccept
4141 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004142 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004143 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004144 socket.setdefaulttimeout(42)
4145 try:
4146 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004147 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004148 finally:
4149 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004150 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004151
4152 testTimeoutNone = _justAccept
4153 def _testTimeoutNone(self):
4154 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004155 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004156 socket.setdefaulttimeout(30)
4157 try:
4158 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004159 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004160 finally:
4161 socket.setdefaulttimeout(None)
4162 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004163
4164 testTimeoutValueNamed = _justAccept
4165 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004166 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004167 self.assertEqual(self.cli.gettimeout(), 30)
4168
4169 testTimeoutValueNonamed = _justAccept
4170 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004171 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004172 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004173 self.assertEqual(self.cli.gettimeout(), 30)
4174
Victor Stinner45df8202010-04-28 22:31:17 +00004175@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004176class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4177
4178 def __init__(self, methodName='runTest'):
4179 SocketTCPTest.__init__(self, methodName=methodName)
4180 ThreadableTest.__init__(self)
4181
4182 def clientSetUp(self):
4183 pass
4184
4185 def clientTearDown(self):
4186 self.cli.close()
4187 self.cli = None
4188 ThreadableTest.clientTearDown(self)
4189
4190 def testInsideTimeout(self):
4191 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004192 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004193 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004194 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004195 testOutsideTimeout = testInsideTimeout
4196
4197 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004198 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004199 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004200 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004201
4202 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004203 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004204 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004205
4206
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004207class TCPTimeoutTest(SocketTCPTest):
4208
4209 def testTCPTimeout(self):
4210 def raise_timeout(*args, **kwargs):
4211 self.serv.settimeout(1.0)
4212 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004213 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004214 "Error generating a timeout exception (TCP)")
4215
4216 def testTimeoutZero(self):
4217 ok = False
4218 try:
4219 self.serv.settimeout(0.0)
4220 foo = self.serv.accept()
4221 except socket.timeout:
4222 self.fail("caught timeout instead of error (TCP)")
4223 except socket.error:
4224 ok = True
4225 except:
4226 self.fail("caught unexpected exception (TCP)")
4227 if not ok:
4228 self.fail("accept() returned success when we did not expect it")
4229
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004230 def testInterruptedTimeout(self):
4231 # XXX I don't know how to do this test on MSWindows or any other
4232 # plaform that doesn't support signal.alarm() or os.kill(), though
4233 # the bug should have existed on all platforms.
4234 if not hasattr(signal, "alarm"):
4235 return # can only test on *nix
4236 self.serv.settimeout(5.0) # must be longer than alarm
4237 class Alarm(Exception):
4238 pass
4239 def alarm_handler(signal, frame):
4240 raise Alarm
4241 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4242 try:
4243 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4244 try:
4245 foo = self.serv.accept()
4246 except socket.timeout:
4247 self.fail("caught timeout instead of Alarm")
4248 except Alarm:
4249 pass
4250 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004251 self.fail("caught other exception instead of Alarm:"
4252 " %s(%s):\n%s" %
4253 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004254 else:
4255 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004256 finally:
4257 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004258 except Alarm:
4259 self.fail("got Alarm in wrong place")
4260 finally:
4261 # no alarm can be pending. Safe to restore old handler.
4262 signal.signal(signal.SIGALRM, old_alarm)
4263
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004264class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004265
4266 def testUDPTimeout(self):
4267 def raise_timeout(*args, **kwargs):
4268 self.serv.settimeout(1.0)
4269 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004270 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004271 "Error generating a timeout exception (UDP)")
4272
4273 def testTimeoutZero(self):
4274 ok = False
4275 try:
4276 self.serv.settimeout(0.0)
4277 foo = self.serv.recv(1024)
4278 except socket.timeout:
4279 self.fail("caught timeout instead of error (UDP)")
4280 except socket.error:
4281 ok = True
4282 except:
4283 self.fail("caught unexpected exception (UDP)")
4284 if not ok:
4285 self.fail("recv() returned success when we did not expect it")
4286
4287class TestExceptions(unittest.TestCase):
4288
4289 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004290 self.assertTrue(issubclass(socket.error, Exception))
4291 self.assertTrue(issubclass(socket.herror, socket.error))
4292 self.assertTrue(issubclass(socket.gaierror, socket.error))
4293 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004294
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004295class TestLinuxAbstractNamespace(unittest.TestCase):
4296
4297 UNIX_PATH_MAX = 108
4298
4299 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004300 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004301 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4302 s1.bind(address)
4303 s1.listen(1)
4304 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4305 s2.connect(s1.getsockname())
4306 with s1.accept()[0] as s3:
4307 self.assertEqual(s1.getsockname(), address)
4308 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004309
4310 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004311 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004312 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4313 s.bind(address)
4314 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004315
4316 def testNameOverflow(self):
4317 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004318 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4319 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004320
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004321 def testStrName(self):
4322 # Check that an abstract name can be passed as a string.
4323 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4324 try:
4325 s.bind("\x00python\x00test\x00")
4326 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4327 finally:
4328 s.close()
4329
4330class TestUnixDomain(unittest.TestCase):
4331
4332 def setUp(self):
4333 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4334
4335 def tearDown(self):
4336 self.sock.close()
4337
4338 def encoded(self, path):
4339 # Return the given path encoded in the file system encoding,
4340 # or skip the test if this is not possible.
4341 try:
4342 return os.fsencode(path)
4343 except UnicodeEncodeError:
4344 self.skipTest(
4345 "Pathname {0!a} cannot be represented in file "
4346 "system encoding {1!r}".format(
4347 path, sys.getfilesystemencoding()))
4348
Antoine Pitrou16374872011-12-16 15:04:12 +01004349 def bind(self, sock, path):
4350 # Bind the socket
4351 try:
4352 sock.bind(path)
4353 except OSError as e:
4354 if str(e) == "AF_UNIX path too long":
4355 self.skipTest(
4356 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4357 .format(path))
4358 else:
4359 raise
4360
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004361 def testStrAddr(self):
4362 # Test binding to and retrieving a normal string pathname.
4363 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004364 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004365 self.addCleanup(support.unlink, path)
4366 self.assertEqual(self.sock.getsockname(), path)
4367
4368 def testBytesAddr(self):
4369 # Test binding to a bytes pathname.
4370 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004371 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004372 self.addCleanup(support.unlink, path)
4373 self.assertEqual(self.sock.getsockname(), path)
4374
4375 def testSurrogateescapeBind(self):
4376 # Test binding to a valid non-ASCII pathname, with the
4377 # non-ASCII bytes supplied using surrogateescape encoding.
4378 path = os.path.abspath(support.TESTFN_UNICODE)
4379 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004380 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004381 self.addCleanup(support.unlink, path)
4382 self.assertEqual(self.sock.getsockname(), path)
4383
4384 def testUnencodableAddr(self):
4385 # Test binding to a pathname that cannot be encoded in the
4386 # file system encoding.
4387 if support.TESTFN_UNENCODABLE is None:
4388 self.skipTest("No unencodable filename available")
4389 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004390 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004391 self.addCleanup(support.unlink, path)
4392 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004393
Victor Stinner45df8202010-04-28 22:31:17 +00004394@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004395class BufferIOTest(SocketConnectedTest):
4396 """
4397 Test the buffer versions of socket.recv() and socket.send().
4398 """
4399 def __init__(self, methodName='runTest'):
4400 SocketConnectedTest.__init__(self, methodName=methodName)
4401
Antoine Pitrou25480782010-03-17 22:50:28 +00004402 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004403 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004404 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004405 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004406 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004407 self.assertEqual(msg, MSG)
4408
Antoine Pitrou25480782010-03-17 22:50:28 +00004409 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004410 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004411 self.serv_conn.send(buf)
4412
Antoine Pitrou25480782010-03-17 22:50:28 +00004413 def testRecvIntoBytearray(self):
4414 buf = bytearray(1024)
4415 nbytes = self.cli_conn.recv_into(buf)
4416 self.assertEqual(nbytes, len(MSG))
4417 msg = buf[:len(MSG)]
4418 self.assertEqual(msg, MSG)
4419
4420 _testRecvIntoBytearray = _testRecvIntoArray
4421
4422 def testRecvIntoMemoryview(self):
4423 buf = bytearray(1024)
4424 nbytes = self.cli_conn.recv_into(memoryview(buf))
4425 self.assertEqual(nbytes, len(MSG))
4426 msg = buf[:len(MSG)]
4427 self.assertEqual(msg, MSG)
4428
4429 _testRecvIntoMemoryview = _testRecvIntoArray
4430
4431 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004432 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004433 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004434 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004435 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004436 self.assertEqual(msg, MSG)
4437
Antoine Pitrou25480782010-03-17 22:50:28 +00004438 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004439 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004440 self.serv_conn.send(buf)
4441
Antoine Pitrou25480782010-03-17 22:50:28 +00004442 def testRecvFromIntoBytearray(self):
4443 buf = bytearray(1024)
4444 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4445 self.assertEqual(nbytes, len(MSG))
4446 msg = buf[:len(MSG)]
4447 self.assertEqual(msg, MSG)
4448
4449 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4450
4451 def testRecvFromIntoMemoryview(self):
4452 buf = bytearray(1024)
4453 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4454 self.assertEqual(nbytes, len(MSG))
4455 msg = buf[:len(MSG)]
4456 self.assertEqual(msg, MSG)
4457
4458 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4459
Christian Heimes043d6f62008-01-07 17:19:16 +00004460
4461TIPC_STYPE = 2000
4462TIPC_LOWER = 200
4463TIPC_UPPER = 210
4464
4465def isTipcAvailable():
4466 """Check if the TIPC module is loaded
4467
4468 The TIPC module is not loaded automatically on Ubuntu and probably
4469 other Linux distros.
4470 """
4471 if not hasattr(socket, "AF_TIPC"):
4472 return False
4473 if not os.path.isfile("/proc/modules"):
4474 return False
4475 with open("/proc/modules") as f:
4476 for line in f:
4477 if line.startswith("tipc "):
4478 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004479 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004480 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4481 return False
4482
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004483class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004484 def testRDM(self):
4485 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4486 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004487 self.addCleanup(srv.close)
4488 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004489
4490 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4491 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4492 TIPC_LOWER, TIPC_UPPER)
4493 srv.bind(srvaddr)
4494
4495 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4496 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4497 cli.sendto(MSG, sendaddr)
4498
4499 msg, recvaddr = srv.recvfrom(1024)
4500
4501 self.assertEqual(cli.getsockname(), recvaddr)
4502 self.assertEqual(msg, MSG)
4503
4504
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004505class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004506 def __init__(self, methodName = 'runTest'):
4507 unittest.TestCase.__init__(self, methodName = methodName)
4508 ThreadableTest.__init__(self)
4509
4510 def setUp(self):
4511 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004512 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004513 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4514 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4515 TIPC_LOWER, TIPC_UPPER)
4516 self.srv.bind(srvaddr)
4517 self.srv.listen(5)
4518 self.serverExplicitReady()
4519 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004520 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004521
4522 def clientSetUp(self):
4523 # The is a hittable race between serverExplicitReady() and the
4524 # accept() call; sleep a little while to avoid it, otherwise
4525 # we could get an exception
4526 time.sleep(0.1)
4527 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004528 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004529 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4530 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4531 self.cli.connect(addr)
4532 self.cliaddr = self.cli.getsockname()
4533
4534 def testStream(self):
4535 msg = self.conn.recv(1024)
4536 self.assertEqual(msg, MSG)
4537 self.assertEqual(self.cliaddr, self.connaddr)
4538
4539 def _testStream(self):
4540 self.cli.send(MSG)
4541 self.cli.close()
4542
4543
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004544@unittest.skipUnless(thread, 'Threading required for this test.')
4545class ContextManagersTest(ThreadedTCPSocketTest):
4546
4547 def _testSocketClass(self):
4548 # base test
4549 with socket.socket() as sock:
4550 self.assertFalse(sock._closed)
4551 self.assertTrue(sock._closed)
4552 # close inside with block
4553 with socket.socket() as sock:
4554 sock.close()
4555 self.assertTrue(sock._closed)
4556 # exception inside with block
4557 with socket.socket() as sock:
4558 self.assertRaises(socket.error, sock.sendall, b'foo')
4559 self.assertTrue(sock._closed)
4560
4561 def testCreateConnectionBase(self):
4562 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004563 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004564 data = conn.recv(1024)
4565 conn.sendall(data)
4566
4567 def _testCreateConnectionBase(self):
4568 address = self.serv.getsockname()
4569 with socket.create_connection(address) as sock:
4570 self.assertFalse(sock._closed)
4571 sock.sendall(b'foo')
4572 self.assertEqual(sock.recv(1024), b'foo')
4573 self.assertTrue(sock._closed)
4574
4575 def testCreateConnectionClose(self):
4576 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004577 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004578 data = conn.recv(1024)
4579 conn.sendall(data)
4580
4581 def _testCreateConnectionClose(self):
4582 address = self.serv.getsockname()
4583 with socket.create_connection(address) as sock:
4584 sock.close()
4585 self.assertTrue(sock._closed)
4586 self.assertRaises(socket.error, sock.sendall, b'foo')
4587
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004588
Antoine Pitroub1c54962010-10-14 15:05:38 +00004589@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4590 "SOCK_CLOEXEC not defined")
4591@unittest.skipUnless(fcntl, "module fcntl not available")
4592class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004593 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004594 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004595 with socket.socket(socket.AF_INET,
4596 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4597 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4598 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004599
4600
4601@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4602 "SOCK_NONBLOCK not defined")
4603class NonblockConstantTest(unittest.TestCase):
4604 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4605 if nonblock:
4606 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4607 self.assertEqual(s.gettimeout(), timeout)
4608 else:
4609 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4610 self.assertEqual(s.gettimeout(), None)
4611
Charles-François Natali239bb962011-06-03 12:55:15 +02004612 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004613 def test_SOCK_NONBLOCK(self):
4614 # a lot of it seems silly and redundant, but I wanted to test that
4615 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004616 with socket.socket(socket.AF_INET,
4617 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4618 self.checkNonblock(s)
4619 s.setblocking(1)
4620 self.checkNonblock(s, False)
4621 s.setblocking(0)
4622 self.checkNonblock(s)
4623 s.settimeout(None)
4624 self.checkNonblock(s, False)
4625 s.settimeout(2.0)
4626 self.checkNonblock(s, timeout=2.0)
4627 s.setblocking(1)
4628 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004629 # defaulttimeout
4630 t = socket.getdefaulttimeout()
4631 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004632 with socket.socket() as s:
4633 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004634 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004635 with socket.socket() as s:
4636 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004637 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004638 with socket.socket() as s:
4639 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004640 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004641 with socket.socket() as s:
4642 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004643 socket.setdefaulttimeout(t)
4644
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004645
Guido van Rossumb995eb72002-07-31 16:08:40 +00004646def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004647 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004648 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004649
4650 tests.extend([
4651 NonBlockingTCPTests,
4652 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004653 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004654 UnbufferedFileObjectClassTestCase,
4655 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004656 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004657 UnicodeReadFileObjectClassTestCase,
4658 UnicodeWriteFileObjectClassTestCase,
4659 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004660 NetworkConnectionNoServer,
4661 NetworkConnectionAttributesTest,
4662 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004663 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004664 CloexecConstantTest,
4665 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004666 ])
Dave Cole331708b2004-08-09 04:51:41 +00004667 if hasattr(socket, "socketpair"):
4668 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004669 if hasattr(socket, "AF_UNIX"):
4670 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004671 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004672 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004673 if isTipcAvailable():
4674 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004675 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004676 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004677 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004678 tests.extend([
4679 CmsgMacroTests,
4680 SendmsgUDPTest,
4681 RecvmsgUDPTest,
4682 RecvmsgIntoUDPTest,
4683 SendmsgUDP6Test,
4684 RecvmsgUDP6Test,
4685 RecvmsgRFC3542AncillaryUDP6Test,
4686 RecvmsgIntoRFC3542AncillaryUDP6Test,
4687 RecvmsgIntoUDP6Test,
4688 SendmsgTCPTest,
4689 RecvmsgTCPTest,
4690 RecvmsgIntoTCPTest,
4691 SendmsgSCTPStreamTest,
4692 RecvmsgSCTPStreamTest,
4693 RecvmsgIntoSCTPStreamTest,
4694 SendmsgUnixStreamTest,
4695 RecvmsgUnixStreamTest,
4696 RecvmsgIntoUnixStreamTest,
4697 RecvmsgSCMRightsStreamTest,
4698 RecvmsgIntoSCMRightsStreamTest,
4699 # These are slow when setitimer() is not available
4700 InterruptedRecvTimeoutTest,
4701 InterruptedSendTimeoutTest,
4702 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004703
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004704 thread_info = support.threading_setup()
4705 support.run_unittest(*tests)
4706 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004707
4708if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004709 test_main()