blob: ede1038662e9fc0d553c5b6be6f51ed54b2017ab [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 Pitroue43f9d02010-08-08 23:24:50 +00001577 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1578 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001579 # ...but we can create another socket using the (still open)
1580 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001581 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001582 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001583 msg = sock.recv(1024)
1584 self.assertEqual(msg, MSG)
1585
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001586 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001587 self.serv_conn.send(MSG)
1588
Victor Stinner45df8202010-04-28 22:31:17 +00001589@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001590class BasicUDPTest(ThreadedUDPSocketTest):
1591
1592 def __init__(self, methodName='runTest'):
1593 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1594
1595 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001596 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001597 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001598 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001599
1600 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001601 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001602
Guido van Rossum1c938012002-06-12 21:17:20 +00001603 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001604 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001605 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001606 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001607
Guido van Rossum1c938012002-06-12 21:17:20 +00001608 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001609 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001610
Guido van Rossumd8faa362007-04-27 19:54:29 +00001611 def testRecvFromNegative(self):
1612 # Negative lengths passed to recvfrom should give ValueError.
1613 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1614
1615 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001616 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001617
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001618# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1619# same test code is used with different families and types of socket
1620# (e.g. stream, datagram), and tests using recvmsg() are repeated
1621# using recvmsg_into().
1622#
1623# The generic test classes such as SendmsgTests and
1624# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1625# supplied with sockets cli_sock and serv_sock representing the
1626# client's and the server's end of the connection respectively, and
1627# attributes cli_addr and serv_addr holding their (numeric where
1628# appropriate) addresses.
1629#
1630# The final concrete test classes combine these with subclasses of
1631# SocketTestBase which set up client and server sockets of a specific
1632# type, and with subclasses of SendrecvmsgBase such as
1633# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1634# sockets to cli_sock and serv_sock and override the methods and
1635# attributes of SendrecvmsgBase to fill in destination addresses if
1636# needed when sending, check for specific flags in msg_flags, etc.
1637#
1638# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1639# recvmsg_into().
1640
1641# XXX: like the other datagram (UDP) tests in this module, the code
1642# here assumes that datagram delivery on the local machine will be
1643# reliable.
1644
1645class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1646 # Base class for sendmsg()/recvmsg() tests.
1647
1648 # Time in seconds to wait before considering a test failed, or
1649 # None for no timeout. Not all tests actually set a timeout.
1650 fail_timeout = 3.0
1651
1652 def setUp(self):
1653 self.misc_event = threading.Event()
1654 super().setUp()
1655
1656 def sendToServer(self, msg):
1657 # Send msg to the server.
1658 return self.cli_sock.send(msg)
1659
1660 # Tuple of alternative default arguments for sendmsg() when called
1661 # via sendmsgToServer() (e.g. to include a destination address).
1662 sendmsg_to_server_defaults = ()
1663
1664 def sendmsgToServer(self, *args):
1665 # Call sendmsg() on self.cli_sock with the given arguments,
1666 # filling in any arguments which are not supplied with the
1667 # corresponding items of self.sendmsg_to_server_defaults, if
1668 # any.
1669 return self.cli_sock.sendmsg(
1670 *(args + self.sendmsg_to_server_defaults[len(args):]))
1671
1672 def doRecvmsg(self, sock, bufsize, *args):
1673 # Call recvmsg() on sock with given arguments and return its
1674 # result. Should be used for tests which can use either
1675 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1676 # this method with one which emulates it using recvmsg_into(),
1677 # thus allowing the same test to be used for both methods.
1678 result = sock.recvmsg(bufsize, *args)
1679 self.registerRecvmsgResult(result)
1680 return result
1681
1682 def registerRecvmsgResult(self, result):
1683 # Called by doRecvmsg() with the return value of recvmsg() or
1684 # recvmsg_into(). Can be overridden to arrange cleanup based
1685 # on the returned ancillary data, for instance.
1686 pass
1687
1688 def checkRecvmsgAddress(self, addr1, addr2):
1689 # Called to compare the received address with the address of
1690 # the peer.
1691 self.assertEqual(addr1, addr2)
1692
1693 # Flags that are normally unset in msg_flags
1694 msg_flags_common_unset = 0
1695 for name in ("MSG_CTRUNC", "MSG_OOB"):
1696 msg_flags_common_unset |= getattr(socket, name, 0)
1697
1698 # Flags that are normally set
1699 msg_flags_common_set = 0
1700
1701 # Flags set when a complete record has been received (e.g. MSG_EOR
1702 # for SCTP)
1703 msg_flags_eor_indicator = 0
1704
1705 # Flags set when a complete record has not been received
1706 # (e.g. MSG_TRUNC for datagram sockets)
1707 msg_flags_non_eor_indicator = 0
1708
1709 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1710 # Method to check the value of msg_flags returned by recvmsg[_into]().
1711 #
1712 # Checks that all bits in msg_flags_common_set attribute are
1713 # set in "flags" and all bits in msg_flags_common_unset are
1714 # unset.
1715 #
1716 # The "eor" argument specifies whether the flags should
1717 # indicate that a full record (or datagram) has been received.
1718 # If "eor" is None, no checks are done; otherwise, checks
1719 # that:
1720 #
1721 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1722 # set and all bits in msg_flags_non_eor_indicator are unset
1723 #
1724 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1725 # are set and all bits in msg_flags_eor_indicator are unset
1726 #
1727 # If "checkset" and/or "checkunset" are supplied, they require
1728 # the given bits to be set or unset respectively, overriding
1729 # what the attributes require for those bits.
1730 #
1731 # If any bits are set in "ignore", they will not be checked,
1732 # regardless of the other inputs.
1733 #
1734 # Will raise Exception if the inputs require a bit to be both
1735 # set and unset, and it is not ignored.
1736
1737 defaultset = self.msg_flags_common_set
1738 defaultunset = self.msg_flags_common_unset
1739
1740 if eor:
1741 defaultset |= self.msg_flags_eor_indicator
1742 defaultunset |= self.msg_flags_non_eor_indicator
1743 elif eor is not None:
1744 defaultset |= self.msg_flags_non_eor_indicator
1745 defaultunset |= self.msg_flags_eor_indicator
1746
1747 # Function arguments override defaults
1748 defaultset &= ~checkunset
1749 defaultunset &= ~checkset
1750
1751 # Merge arguments with remaining defaults, and check for conflicts
1752 checkset |= defaultset
1753 checkunset |= defaultunset
1754 inboth = checkset & checkunset & ~ignore
1755 if inboth:
1756 raise Exception("contradictory set, unset requirements for flags "
1757 "{0:#x}".format(inboth))
1758
1759 # Compare with given msg_flags value
1760 mask = (checkset | checkunset) & ~ignore
1761 self.assertEqual(flags & mask, checkset & mask)
1762
1763
1764class RecvmsgIntoMixin(SendrecvmsgBase):
1765 # Mixin to implement doRecvmsg() using recvmsg_into().
1766
1767 def doRecvmsg(self, sock, bufsize, *args):
1768 buf = bytearray(bufsize)
1769 result = sock.recvmsg_into([buf], *args)
1770 self.registerRecvmsgResult(result)
1771 self.assertGreaterEqual(result[0], 0)
1772 self.assertLessEqual(result[0], bufsize)
1773 return (bytes(buf[:result[0]]),) + result[1:]
1774
1775
1776class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1777 # Defines flags to be checked in msg_flags for datagram sockets.
1778
1779 @property
1780 def msg_flags_non_eor_indicator(self):
1781 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1782
1783
1784class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1785 # Defines flags to be checked in msg_flags for SCTP sockets.
1786
1787 @property
1788 def msg_flags_eor_indicator(self):
1789 return super().msg_flags_eor_indicator | socket.MSG_EOR
1790
1791
1792class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1793 # Base class for tests on connectionless-mode sockets. Users must
1794 # supply sockets on attributes cli and serv to be mapped to
1795 # cli_sock and serv_sock respectively.
1796
1797 @property
1798 def serv_sock(self):
1799 return self.serv
1800
1801 @property
1802 def cli_sock(self):
1803 return self.cli
1804
1805 @property
1806 def sendmsg_to_server_defaults(self):
1807 return ([], [], 0, self.serv_addr)
1808
1809 def sendToServer(self, msg):
1810 return self.cli_sock.sendto(msg, self.serv_addr)
1811
1812
1813class SendrecvmsgConnectedBase(SendrecvmsgBase):
1814 # Base class for tests on connected sockets. Users must supply
1815 # sockets on attributes serv_conn and cli_conn (representing the
1816 # connections *to* the server and the client), to be mapped to
1817 # cli_sock and serv_sock respectively.
1818
1819 @property
1820 def serv_sock(self):
1821 return self.cli_conn
1822
1823 @property
1824 def cli_sock(self):
1825 return self.serv_conn
1826
1827 def checkRecvmsgAddress(self, addr1, addr2):
1828 # Address is currently "unspecified" for a connected socket,
1829 # so we don't examine it
1830 pass
1831
1832
1833class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1834 # Base class to set a timeout on server's socket.
1835
1836 def setUp(self):
1837 super().setUp()
1838 self.serv_sock.settimeout(self.fail_timeout)
1839
1840
1841class SendmsgTests(SendrecvmsgServerTimeoutBase):
1842 # Tests for sendmsg() which can use any socket type and do not
1843 # involve recvmsg() or recvmsg_into().
1844
1845 def testSendmsg(self):
1846 # Send a simple message with sendmsg().
1847 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1848
1849 def _testSendmsg(self):
1850 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1851
1852 def testSendmsgDataGenerator(self):
1853 # Send from buffer obtained from a generator (not a sequence).
1854 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1855
1856 def _testSendmsgDataGenerator(self):
1857 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1858 len(MSG))
1859
1860 def testSendmsgAncillaryGenerator(self):
1861 # Gather (empty) ancillary data from a generator.
1862 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1863
1864 def _testSendmsgAncillaryGenerator(self):
1865 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1866 len(MSG))
1867
1868 def testSendmsgArray(self):
1869 # Send data from an array instead of the usual bytes object.
1870 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1871
1872 def _testSendmsgArray(self):
1873 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1874 len(MSG))
1875
1876 def testSendmsgGather(self):
1877 # Send message data from more than one buffer (gather write).
1878 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1879
1880 def _testSendmsgGather(self):
1881 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1882
1883 def testSendmsgBadArgs(self):
1884 # Check that sendmsg() rejects invalid arguments.
1885 self.assertEqual(self.serv_sock.recv(1000), b"done")
1886
1887 def _testSendmsgBadArgs(self):
1888 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1889 self.assertRaises(TypeError, self.sendmsgToServer,
1890 b"not in an iterable")
1891 self.assertRaises(TypeError, self.sendmsgToServer,
1892 object())
1893 self.assertRaises(TypeError, self.sendmsgToServer,
1894 [object()])
1895 self.assertRaises(TypeError, self.sendmsgToServer,
1896 [MSG, object()])
1897 self.assertRaises(TypeError, self.sendmsgToServer,
1898 [MSG], object())
1899 self.assertRaises(TypeError, self.sendmsgToServer,
1900 [MSG], [], object())
1901 self.assertRaises(TypeError, self.sendmsgToServer,
1902 [MSG], [], 0, object())
1903 self.sendToServer(b"done")
1904
1905 def testSendmsgBadCmsg(self):
1906 # Check that invalid ancillary data items are rejected.
1907 self.assertEqual(self.serv_sock.recv(1000), b"done")
1908
1909 def _testSendmsgBadCmsg(self):
1910 self.assertRaises(TypeError, self.sendmsgToServer,
1911 [MSG], [object()])
1912 self.assertRaises(TypeError, self.sendmsgToServer,
1913 [MSG], [(object(), 0, b"data")])
1914 self.assertRaises(TypeError, self.sendmsgToServer,
1915 [MSG], [(0, object(), b"data")])
1916 self.assertRaises(TypeError, self.sendmsgToServer,
1917 [MSG], [(0, 0, object())])
1918 self.assertRaises(TypeError, self.sendmsgToServer,
1919 [MSG], [(0, 0)])
1920 self.assertRaises(TypeError, self.sendmsgToServer,
1921 [MSG], [(0, 0, b"data", 42)])
1922 self.sendToServer(b"done")
1923
1924 @requireAttrs(socket, "CMSG_SPACE")
1925 def testSendmsgBadMultiCmsg(self):
1926 # Check that invalid ancillary data items are rejected when
1927 # more than one item is present.
1928 self.assertEqual(self.serv_sock.recv(1000), b"done")
1929
1930 @testSendmsgBadMultiCmsg.client_skip
1931 def _testSendmsgBadMultiCmsg(self):
1932 self.assertRaises(TypeError, self.sendmsgToServer,
1933 [MSG], [0, 0, b""])
1934 self.assertRaises(TypeError, self.sendmsgToServer,
1935 [MSG], [(0, 0, b""), object()])
1936 self.sendToServer(b"done")
1937
1938 def testSendmsgExcessCmsgReject(self):
1939 # Check that sendmsg() rejects excess ancillary data items
1940 # when the number that can be sent is limited.
1941 self.assertEqual(self.serv_sock.recv(1000), b"done")
1942
1943 def _testSendmsgExcessCmsgReject(self):
1944 if not hasattr(socket, "CMSG_SPACE"):
1945 # Can only send one item
1946 with self.assertRaises(socket.error) as cm:
1947 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1948 self.assertIsNone(cm.exception.errno)
1949 self.sendToServer(b"done")
1950
1951 def testSendmsgAfterClose(self):
1952 # Check that sendmsg() fails on a closed socket.
1953 pass
1954
1955 def _testSendmsgAfterClose(self):
1956 self.cli_sock.close()
1957 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1958
1959
1960class SendmsgStreamTests(SendmsgTests):
1961 # Tests for sendmsg() which require a stream socket and do not
1962 # involve recvmsg() or recvmsg_into().
1963
1964 def testSendmsgExplicitNoneAddr(self):
1965 # Check that peer address can be specified as None.
1966 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1967
1968 def _testSendmsgExplicitNoneAddr(self):
1969 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1970
1971 def testSendmsgTimeout(self):
1972 # Check that timeout works with sendmsg().
1973 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1974 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1975
1976 def _testSendmsgTimeout(self):
1977 try:
1978 self.cli_sock.settimeout(0.03)
1979 with self.assertRaises(socket.timeout):
1980 while True:
1981 self.sendmsgToServer([b"a"*512])
1982 finally:
1983 self.misc_event.set()
1984
1985 # XXX: would be nice to have more tests for sendmsg flags argument.
1986
1987 # Linux supports MSG_DONTWAIT when sending, but in general, it
1988 # only works when receiving. Could add other platforms if they
1989 # support it too.
1990 @skipWithClientIf(sys.platform not in {"linux2"},
1991 "MSG_DONTWAIT not known to work on this platform when "
1992 "sending")
1993 def testSendmsgDontWait(self):
1994 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
1995 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1996 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1997
1998 @testSendmsgDontWait.client_skip
1999 def _testSendmsgDontWait(self):
2000 try:
2001 with self.assertRaises(socket.error) as cm:
2002 while True:
2003 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2004 self.assertIn(cm.exception.errno,
2005 (errno.EAGAIN, errno.EWOULDBLOCK))
2006 finally:
2007 self.misc_event.set()
2008
2009
2010class SendmsgConnectionlessTests(SendmsgTests):
2011 # Tests for sendmsg() which require a connectionless-mode
2012 # (e.g. datagram) socket, and do not involve recvmsg() or
2013 # recvmsg_into().
2014
2015 def testSendmsgNoDestAddr(self):
2016 # Check that sendmsg() fails when no destination address is
2017 # given for unconnected socket.
2018 pass
2019
2020 def _testSendmsgNoDestAddr(self):
2021 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2022 [MSG])
2023 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2024 [MSG], [], 0, None)
2025
2026
2027class RecvmsgGenericTests(SendrecvmsgBase):
2028 # Tests for recvmsg() which can also be emulated using
2029 # recvmsg_into(), and can use any socket type.
2030
2031 def testRecvmsg(self):
2032 # Receive a simple message with recvmsg[_into]().
2033 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2034 self.assertEqual(msg, MSG)
2035 self.checkRecvmsgAddress(addr, self.cli_addr)
2036 self.assertEqual(ancdata, [])
2037 self.checkFlags(flags, eor=True)
2038
2039 def _testRecvmsg(self):
2040 self.sendToServer(MSG)
2041
2042 def testRecvmsgExplicitDefaults(self):
2043 # Test recvmsg[_into]() with default arguments provided explicitly.
2044 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2045 len(MSG), 0, 0)
2046 self.assertEqual(msg, MSG)
2047 self.checkRecvmsgAddress(addr, self.cli_addr)
2048 self.assertEqual(ancdata, [])
2049 self.checkFlags(flags, eor=True)
2050
2051 def _testRecvmsgExplicitDefaults(self):
2052 self.sendToServer(MSG)
2053
2054 def testRecvmsgShorter(self):
2055 # Receive a message smaller than buffer.
2056 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2057 len(MSG) + 42)
2058 self.assertEqual(msg, MSG)
2059 self.checkRecvmsgAddress(addr, self.cli_addr)
2060 self.assertEqual(ancdata, [])
2061 self.checkFlags(flags, eor=True)
2062
2063 def _testRecvmsgShorter(self):
2064 self.sendToServer(MSG)
2065
Charles-François Natali8619cd72011-10-03 19:43:15 +02002066 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2067 # datagram is received (issue #13001).
2068 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002069 def testRecvmsgTrunc(self):
2070 # Receive part of message, check for truncation indicators.
2071 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2072 len(MSG) - 3)
2073 self.assertEqual(msg, MSG[:-3])
2074 self.checkRecvmsgAddress(addr, self.cli_addr)
2075 self.assertEqual(ancdata, [])
2076 self.checkFlags(flags, eor=False)
2077
Charles-François Natali8619cd72011-10-03 19:43:15 +02002078 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002079 def _testRecvmsgTrunc(self):
2080 self.sendToServer(MSG)
2081
2082 def testRecvmsgShortAncillaryBuf(self):
2083 # Test ancillary data buffer too small to hold any ancillary data.
2084 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2085 len(MSG), 1)
2086 self.assertEqual(msg, MSG)
2087 self.checkRecvmsgAddress(addr, self.cli_addr)
2088 self.assertEqual(ancdata, [])
2089 self.checkFlags(flags, eor=True)
2090
2091 def _testRecvmsgShortAncillaryBuf(self):
2092 self.sendToServer(MSG)
2093
2094 def testRecvmsgLongAncillaryBuf(self):
2095 # Test large ancillary data buffer.
2096 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2097 len(MSG), 10240)
2098 self.assertEqual(msg, MSG)
2099 self.checkRecvmsgAddress(addr, self.cli_addr)
2100 self.assertEqual(ancdata, [])
2101 self.checkFlags(flags, eor=True)
2102
2103 def _testRecvmsgLongAncillaryBuf(self):
2104 self.sendToServer(MSG)
2105
2106 def testRecvmsgAfterClose(self):
2107 # Check that recvmsg[_into]() fails on a closed socket.
2108 self.serv_sock.close()
2109 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2110
2111 def _testRecvmsgAfterClose(self):
2112 pass
2113
2114 def testRecvmsgTimeout(self):
2115 # Check that timeout works.
2116 try:
2117 self.serv_sock.settimeout(0.03)
2118 self.assertRaises(socket.timeout,
2119 self.doRecvmsg, self.serv_sock, len(MSG))
2120 finally:
2121 self.misc_event.set()
2122
2123 def _testRecvmsgTimeout(self):
2124 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2125
2126 @requireAttrs(socket, "MSG_PEEK")
2127 def testRecvmsgPeek(self):
2128 # Check that MSG_PEEK in flags enables examination of pending
2129 # data without consuming it.
2130
2131 # Receive part of data with MSG_PEEK.
2132 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2133 len(MSG) - 3, 0,
2134 socket.MSG_PEEK)
2135 self.assertEqual(msg, MSG[:-3])
2136 self.checkRecvmsgAddress(addr, self.cli_addr)
2137 self.assertEqual(ancdata, [])
2138 # Ignoring MSG_TRUNC here (so this test is the same for stream
2139 # and datagram sockets). Some wording in POSIX seems to
2140 # suggest that it needn't be set when peeking, but that may
2141 # just be a slip.
2142 self.checkFlags(flags, eor=False,
2143 ignore=getattr(socket, "MSG_TRUNC", 0))
2144
2145 # Receive all data with MSG_PEEK.
2146 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2147 len(MSG), 0,
2148 socket.MSG_PEEK)
2149 self.assertEqual(msg, MSG)
2150 self.checkRecvmsgAddress(addr, self.cli_addr)
2151 self.assertEqual(ancdata, [])
2152 self.checkFlags(flags, eor=True)
2153
2154 # Check that the same data can still be received normally.
2155 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2156 self.assertEqual(msg, MSG)
2157 self.checkRecvmsgAddress(addr, self.cli_addr)
2158 self.assertEqual(ancdata, [])
2159 self.checkFlags(flags, eor=True)
2160
2161 @testRecvmsgPeek.client_skip
2162 def _testRecvmsgPeek(self):
2163 self.sendToServer(MSG)
2164
2165 @requireAttrs(socket.socket, "sendmsg")
2166 def testRecvmsgFromSendmsg(self):
2167 # Test receiving with recvmsg[_into]() when message is sent
2168 # using sendmsg().
2169 self.serv_sock.settimeout(self.fail_timeout)
2170 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2171 self.assertEqual(msg, MSG)
2172 self.checkRecvmsgAddress(addr, self.cli_addr)
2173 self.assertEqual(ancdata, [])
2174 self.checkFlags(flags, eor=True)
2175
2176 @testRecvmsgFromSendmsg.client_skip
2177 def _testRecvmsgFromSendmsg(self):
2178 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2179
2180
2181class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2182 # Tests which require a stream socket and can use either recvmsg()
2183 # or recvmsg_into().
2184
2185 def testRecvmsgEOF(self):
2186 # Receive end-of-stream indicator (b"", peer socket closed).
2187 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2188 self.assertEqual(msg, b"")
2189 self.checkRecvmsgAddress(addr, self.cli_addr)
2190 self.assertEqual(ancdata, [])
2191 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2192
2193 def _testRecvmsgEOF(self):
2194 self.cli_sock.close()
2195
2196 def testRecvmsgOverflow(self):
2197 # Receive a message in more than one chunk.
2198 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2199 len(MSG) - 3)
2200 self.checkRecvmsgAddress(addr, self.cli_addr)
2201 self.assertEqual(ancdata, [])
2202 self.checkFlags(flags, eor=False)
2203
2204 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2205 self.checkRecvmsgAddress(addr, self.cli_addr)
2206 self.assertEqual(ancdata, [])
2207 self.checkFlags(flags, eor=True)
2208
2209 msg = seg1 + seg2
2210 self.assertEqual(msg, MSG)
2211
2212 def _testRecvmsgOverflow(self):
2213 self.sendToServer(MSG)
2214
2215
2216class RecvmsgTests(RecvmsgGenericTests):
2217 # Tests for recvmsg() which can use any socket type.
2218
2219 def testRecvmsgBadArgs(self):
2220 # Check that recvmsg() rejects invalid arguments.
2221 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2222 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2223 -1, 0, 0)
2224 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2225 len(MSG), -1, 0)
2226 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2227 [bytearray(10)], 0, 0)
2228 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2229 object(), 0, 0)
2230 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2231 len(MSG), object(), 0)
2232 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2233 len(MSG), 0, object())
2234
2235 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2236 self.assertEqual(msg, MSG)
2237 self.checkRecvmsgAddress(addr, self.cli_addr)
2238 self.assertEqual(ancdata, [])
2239 self.checkFlags(flags, eor=True)
2240
2241 def _testRecvmsgBadArgs(self):
2242 self.sendToServer(MSG)
2243
2244
2245class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2246 # Tests for recvmsg_into() which can use any socket type.
2247
2248 def testRecvmsgIntoBadArgs(self):
2249 # Check that recvmsg_into() rejects invalid arguments.
2250 buf = bytearray(len(MSG))
2251 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2252 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2253 len(MSG), 0, 0)
2254 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2255 buf, 0, 0)
2256 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2257 [object()], 0, 0)
2258 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2259 [b"I'm not writable"], 0, 0)
2260 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2261 [buf, object()], 0, 0)
2262 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2263 [buf], -1, 0)
2264 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2265 [buf], object(), 0)
2266 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2267 [buf], 0, object())
2268
2269 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2270 self.assertEqual(nbytes, len(MSG))
2271 self.assertEqual(buf, bytearray(MSG))
2272 self.checkRecvmsgAddress(addr, self.cli_addr)
2273 self.assertEqual(ancdata, [])
2274 self.checkFlags(flags, eor=True)
2275
2276 def _testRecvmsgIntoBadArgs(self):
2277 self.sendToServer(MSG)
2278
2279 def testRecvmsgIntoGenerator(self):
2280 # Receive into buffer obtained from a generator (not a sequence).
2281 buf = bytearray(len(MSG))
2282 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2283 (o for o in [buf]))
2284 self.assertEqual(nbytes, len(MSG))
2285 self.assertEqual(buf, bytearray(MSG))
2286 self.checkRecvmsgAddress(addr, self.cli_addr)
2287 self.assertEqual(ancdata, [])
2288 self.checkFlags(flags, eor=True)
2289
2290 def _testRecvmsgIntoGenerator(self):
2291 self.sendToServer(MSG)
2292
2293 def testRecvmsgIntoArray(self):
2294 # Receive into an array rather than the usual bytearray.
2295 buf = array.array("B", [0] * len(MSG))
2296 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2297 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002298 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002299 self.checkRecvmsgAddress(addr, self.cli_addr)
2300 self.assertEqual(ancdata, [])
2301 self.checkFlags(flags, eor=True)
2302
2303 def _testRecvmsgIntoArray(self):
2304 self.sendToServer(MSG)
2305
2306 def testRecvmsgIntoScatter(self):
2307 # Receive into multiple buffers (scatter write).
2308 b1 = bytearray(b"----")
2309 b2 = bytearray(b"0123456789")
2310 b3 = bytearray(b"--------------")
2311 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2312 [b1, memoryview(b2)[2:9], b3])
2313 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2314 self.assertEqual(b1, bytearray(b"Mary"))
2315 self.assertEqual(b2, bytearray(b"01 had a 9"))
2316 self.assertEqual(b3, bytearray(b"little lamb---"))
2317 self.checkRecvmsgAddress(addr, self.cli_addr)
2318 self.assertEqual(ancdata, [])
2319 self.checkFlags(flags, eor=True)
2320
2321 def _testRecvmsgIntoScatter(self):
2322 self.sendToServer(b"Mary had a little lamb")
2323
2324
2325class CmsgMacroTests(unittest.TestCase):
2326 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2327 # assumptions used by sendmsg() and recvmsg[_into](), which share
2328 # code with these functions.
2329
2330 # Match the definition in socketmodule.c
2331 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2332
2333 @requireAttrs(socket, "CMSG_LEN")
2334 def testCMSG_LEN(self):
2335 # Test CMSG_LEN() with various valid and invalid values,
2336 # checking the assumptions used by recvmsg() and sendmsg().
2337 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2338 values = list(range(257)) + list(range(toobig - 257, toobig))
2339
2340 # struct cmsghdr has at least three members, two of which are ints
2341 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2342 for n in values:
2343 ret = socket.CMSG_LEN(n)
2344 # This is how recvmsg() calculates the data size
2345 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2346 self.assertLessEqual(ret, self.socklen_t_limit)
2347
2348 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2349 # sendmsg() shares code with these functions, and requires
2350 # that it reject values over the limit.
2351 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2352 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2353
2354 @requireAttrs(socket, "CMSG_SPACE")
2355 def testCMSG_SPACE(self):
2356 # Test CMSG_SPACE() with various valid and invalid values,
2357 # checking the assumptions used by sendmsg().
2358 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2359 values = list(range(257)) + list(range(toobig - 257, toobig))
2360
2361 last = socket.CMSG_SPACE(0)
2362 # struct cmsghdr has at least three members, two of which are ints
2363 self.assertGreater(last, array.array("i").itemsize * 2)
2364 for n in values:
2365 ret = socket.CMSG_SPACE(n)
2366 self.assertGreaterEqual(ret, last)
2367 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2368 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2369 self.assertLessEqual(ret, self.socklen_t_limit)
2370 last = ret
2371
2372 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2373 # sendmsg() shares code with these functions, and requires
2374 # that it reject values over the limit.
2375 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2376 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2377
2378
2379class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2380 # Tests for file descriptor passing on Unix-domain sockets.
2381
2382 # Invalid file descriptor value that's unlikely to evaluate to a
2383 # real FD even if one of its bytes is replaced with a different
2384 # value (which shouldn't actually happen).
2385 badfd = -0x5555
2386
2387 def newFDs(self, n):
2388 # Return a list of n file descriptors for newly-created files
2389 # containing their list indices as ASCII numbers.
2390 fds = []
2391 for i in range(n):
2392 fd, path = tempfile.mkstemp()
2393 self.addCleanup(os.unlink, path)
2394 self.addCleanup(os.close, fd)
2395 os.write(fd, str(i).encode())
2396 fds.append(fd)
2397 return fds
2398
2399 def checkFDs(self, fds):
2400 # Check that the file descriptors in the given list contain
2401 # their correct list indices as ASCII numbers.
2402 for n, fd in enumerate(fds):
2403 os.lseek(fd, 0, os.SEEK_SET)
2404 self.assertEqual(os.read(fd, 1024), str(n).encode())
2405
2406 def registerRecvmsgResult(self, result):
2407 self.addCleanup(self.closeRecvmsgFDs, result)
2408
2409 def closeRecvmsgFDs(self, recvmsg_result):
2410 # Close all file descriptors specified in the ancillary data
2411 # of the given return value from recvmsg() or recvmsg_into().
2412 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2413 if (cmsg_level == socket.SOL_SOCKET and
2414 cmsg_type == socket.SCM_RIGHTS):
2415 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002416 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002417 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2418 for fd in fds:
2419 os.close(fd)
2420
2421 def createAndSendFDs(self, n):
2422 # Send n new file descriptors created by newFDs() to the
2423 # server, with the constant MSG as the non-ancillary data.
2424 self.assertEqual(
2425 self.sendmsgToServer([MSG],
2426 [(socket.SOL_SOCKET,
2427 socket.SCM_RIGHTS,
2428 array.array("i", self.newFDs(n)))]),
2429 len(MSG))
2430
2431 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2432 # Check that constant MSG was received with numfds file
2433 # descriptors in a maximum of maxcmsgs control messages (which
2434 # must contain only complete integers). By default, check
2435 # that MSG_CTRUNC is unset, but ignore any flags in
2436 # ignoreflags.
2437 msg, ancdata, flags, addr = result
2438 self.assertEqual(msg, MSG)
2439 self.checkRecvmsgAddress(addr, self.cli_addr)
2440 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2441 ignore=ignoreflags)
2442
2443 self.assertIsInstance(ancdata, list)
2444 self.assertLessEqual(len(ancdata), maxcmsgs)
2445 fds = array.array("i")
2446 for item in ancdata:
2447 self.assertIsInstance(item, tuple)
2448 cmsg_level, cmsg_type, cmsg_data = item
2449 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2450 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2451 self.assertIsInstance(cmsg_data, bytes)
2452 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002453 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002454
2455 self.assertEqual(len(fds), numfds)
2456 self.checkFDs(fds)
2457
2458 def testFDPassSimple(self):
2459 # Pass a single FD (array read from bytes object).
2460 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2461 len(MSG), 10240))
2462
2463 def _testFDPassSimple(self):
2464 self.assertEqual(
2465 self.sendmsgToServer(
2466 [MSG],
2467 [(socket.SOL_SOCKET,
2468 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002469 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002470 len(MSG))
2471
2472 def testMultipleFDPass(self):
2473 # Pass multiple FDs in a single array.
2474 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2475 len(MSG), 10240))
2476
2477 def _testMultipleFDPass(self):
2478 self.createAndSendFDs(4)
2479
2480 @requireAttrs(socket, "CMSG_SPACE")
2481 def testFDPassCMSG_SPACE(self):
2482 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2483 self.checkRecvmsgFDs(
2484 4, self.doRecvmsg(self.serv_sock, len(MSG),
2485 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2486
2487 @testFDPassCMSG_SPACE.client_skip
2488 def _testFDPassCMSG_SPACE(self):
2489 self.createAndSendFDs(4)
2490
2491 def testFDPassCMSG_LEN(self):
2492 # Test using CMSG_LEN() to calculate ancillary buffer size.
2493 self.checkRecvmsgFDs(1,
2494 self.doRecvmsg(self.serv_sock, len(MSG),
2495 socket.CMSG_LEN(4 * SIZEOF_INT)),
2496 # RFC 3542 says implementations may set
2497 # MSG_CTRUNC if there isn't enough space
2498 # for trailing padding.
2499 ignoreflags=socket.MSG_CTRUNC)
2500
2501 def _testFDPassCMSG_LEN(self):
2502 self.createAndSendFDs(1)
2503
Nick Coghlan2496f332011-09-19 20:26:31 +10002504 # Issue #12958: The following test has problems on Mac OS X
2505 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002506 @requireAttrs(socket, "CMSG_SPACE")
2507 def testFDPassSeparate(self):
2508 # Pass two FDs in two separate arrays. Arrays may be combined
2509 # into a single control message by the OS.
2510 self.checkRecvmsgFDs(2,
2511 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2512 maxcmsgs=2)
2513
2514 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002515 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002516 def _testFDPassSeparate(self):
2517 fd0, fd1 = self.newFDs(2)
2518 self.assertEqual(
2519 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2520 socket.SCM_RIGHTS,
2521 array.array("i", [fd0])),
2522 (socket.SOL_SOCKET,
2523 socket.SCM_RIGHTS,
2524 array.array("i", [fd1]))]),
2525 len(MSG))
2526
Nick Coghlan2496f332011-09-19 20:26:31 +10002527 # Issue #12958: The following test has problems on Mac OS X
2528 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002529 @requireAttrs(socket, "CMSG_SPACE")
2530 def testFDPassSeparateMinSpace(self):
2531 # Pass two FDs in two separate arrays, receiving them into the
2532 # minimum space for two arrays.
2533 self.checkRecvmsgFDs(2,
2534 self.doRecvmsg(self.serv_sock, len(MSG),
2535 socket.CMSG_SPACE(SIZEOF_INT) +
2536 socket.CMSG_LEN(SIZEOF_INT)),
2537 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2538
2539 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002540 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002541 def _testFDPassSeparateMinSpace(self):
2542 fd0, fd1 = self.newFDs(2)
2543 self.assertEqual(
2544 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2545 socket.SCM_RIGHTS,
2546 array.array("i", [fd0])),
2547 (socket.SOL_SOCKET,
2548 socket.SCM_RIGHTS,
2549 array.array("i", [fd1]))]),
2550 len(MSG))
2551
2552 def sendAncillaryIfPossible(self, msg, ancdata):
2553 # Try to send msg and ancdata to server, but if the system
2554 # call fails, just send msg with no ancillary data.
2555 try:
2556 nbytes = self.sendmsgToServer([msg], ancdata)
2557 except socket.error as e:
2558 # Check that it was the system call that failed
2559 self.assertIsInstance(e.errno, int)
2560 nbytes = self.sendmsgToServer([msg])
2561 self.assertEqual(nbytes, len(msg))
2562
2563 def testFDPassEmpty(self):
2564 # Try to pass an empty FD array. Can receive either no array
2565 # or an empty array.
2566 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2567 len(MSG), 10240),
2568 ignoreflags=socket.MSG_CTRUNC)
2569
2570 def _testFDPassEmpty(self):
2571 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2572 socket.SCM_RIGHTS,
2573 b"")])
2574
2575 def testFDPassPartialInt(self):
2576 # Try to pass a truncated FD array.
2577 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2578 len(MSG), 10240)
2579 self.assertEqual(msg, MSG)
2580 self.checkRecvmsgAddress(addr, self.cli_addr)
2581 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2582 self.assertLessEqual(len(ancdata), 1)
2583 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2584 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2585 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2586 self.assertLess(len(cmsg_data), SIZEOF_INT)
2587
2588 def _testFDPassPartialInt(self):
2589 self.sendAncillaryIfPossible(
2590 MSG,
2591 [(socket.SOL_SOCKET,
2592 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002593 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002594
2595 @requireAttrs(socket, "CMSG_SPACE")
2596 def testFDPassPartialIntInMiddle(self):
2597 # Try to pass two FD arrays, the first of which is truncated.
2598 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2599 len(MSG), 10240)
2600 self.assertEqual(msg, MSG)
2601 self.checkRecvmsgAddress(addr, self.cli_addr)
2602 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2603 self.assertLessEqual(len(ancdata), 2)
2604 fds = array.array("i")
2605 # Arrays may have been combined in a single control message
2606 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2607 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2608 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002609 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002610 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2611 self.assertLessEqual(len(fds), 2)
2612 self.checkFDs(fds)
2613
2614 @testFDPassPartialIntInMiddle.client_skip
2615 def _testFDPassPartialIntInMiddle(self):
2616 fd0, fd1 = self.newFDs(2)
2617 self.sendAncillaryIfPossible(
2618 MSG,
2619 [(socket.SOL_SOCKET,
2620 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002621 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002622 (socket.SOL_SOCKET,
2623 socket.SCM_RIGHTS,
2624 array.array("i", [fd1]))])
2625
2626 def checkTruncatedHeader(self, result, ignoreflags=0):
2627 # Check that no ancillary data items are returned when data is
2628 # truncated inside the cmsghdr structure.
2629 msg, ancdata, flags, addr = result
2630 self.assertEqual(msg, MSG)
2631 self.checkRecvmsgAddress(addr, self.cli_addr)
2632 self.assertEqual(ancdata, [])
2633 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2634 ignore=ignoreflags)
2635
2636 def testCmsgTruncNoBufSize(self):
2637 # Check that no ancillary data is received when no buffer size
2638 # is specified.
2639 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2640 # BSD seems to set MSG_CTRUNC only
2641 # if an item has been partially
2642 # received.
2643 ignoreflags=socket.MSG_CTRUNC)
2644
2645 def _testCmsgTruncNoBufSize(self):
2646 self.createAndSendFDs(1)
2647
2648 def testCmsgTrunc0(self):
2649 # Check that no ancillary data is received when buffer size is 0.
2650 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2651 ignoreflags=socket.MSG_CTRUNC)
2652
2653 def _testCmsgTrunc0(self):
2654 self.createAndSendFDs(1)
2655
2656 # Check that no ancillary data is returned for various non-zero
2657 # (but still too small) buffer sizes.
2658
2659 def testCmsgTrunc1(self):
2660 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2661
2662 def _testCmsgTrunc1(self):
2663 self.createAndSendFDs(1)
2664
2665 def testCmsgTrunc2Int(self):
2666 # The cmsghdr structure has at least three members, two of
2667 # which are ints, so we still shouldn't see any ancillary
2668 # data.
2669 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2670 SIZEOF_INT * 2))
2671
2672 def _testCmsgTrunc2Int(self):
2673 self.createAndSendFDs(1)
2674
2675 def testCmsgTruncLen0Minus1(self):
2676 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2677 socket.CMSG_LEN(0) - 1))
2678
2679 def _testCmsgTruncLen0Minus1(self):
2680 self.createAndSendFDs(1)
2681
2682 # The following tests try to truncate the control message in the
2683 # middle of the FD array.
2684
2685 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2686 # Check that file descriptor data is truncated to between
2687 # mindata and maxdata bytes when received with buffer size
2688 # ancbuf, and that any complete file descriptor numbers are
2689 # valid.
2690 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2691 len(MSG), ancbuf)
2692 self.assertEqual(msg, MSG)
2693 self.checkRecvmsgAddress(addr, self.cli_addr)
2694 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2695
2696 if mindata == 0 and ancdata == []:
2697 return
2698 self.assertEqual(len(ancdata), 1)
2699 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2700 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2701 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2702 self.assertGreaterEqual(len(cmsg_data), mindata)
2703 self.assertLessEqual(len(cmsg_data), maxdata)
2704 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002705 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002706 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2707 self.checkFDs(fds)
2708
2709 def testCmsgTruncLen0(self):
2710 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2711
2712 def _testCmsgTruncLen0(self):
2713 self.createAndSendFDs(1)
2714
2715 def testCmsgTruncLen0Plus1(self):
2716 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2717
2718 def _testCmsgTruncLen0Plus1(self):
2719 self.createAndSendFDs(2)
2720
2721 def testCmsgTruncLen1(self):
2722 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2723 maxdata=SIZEOF_INT)
2724
2725 def _testCmsgTruncLen1(self):
2726 self.createAndSendFDs(2)
2727
2728 def testCmsgTruncLen2Minus1(self):
2729 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2730 maxdata=(2 * SIZEOF_INT) - 1)
2731
2732 def _testCmsgTruncLen2Minus1(self):
2733 self.createAndSendFDs(2)
2734
2735
2736class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2737 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2738 # features of the RFC 3542 Advanced Sockets API for IPv6.
2739 # Currently we can only handle certain data items (e.g. traffic
2740 # class, hop limit, MTU discovery and fragmentation settings)
2741 # without resorting to unportable means such as the struct module,
2742 # but the tests here are aimed at testing the ancillary data
2743 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2744 # itself.
2745
2746 # Test value to use when setting hop limit of packet
2747 hop_limit = 2
2748
2749 # Test value to use when setting traffic class of packet.
2750 # -1 means "use kernel default".
2751 traffic_class = -1
2752
2753 def ancillaryMapping(self, ancdata):
2754 # Given ancillary data list ancdata, return a mapping from
2755 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2756 # Check that no (level, type) pair appears more than once.
2757 d = {}
2758 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2759 self.assertNotIn((cmsg_level, cmsg_type), d)
2760 d[(cmsg_level, cmsg_type)] = cmsg_data
2761 return d
2762
2763 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2764 # Receive hop limit into ancbufsize bytes of ancillary data
2765 # space. Check that data is MSG, ancillary data is not
2766 # truncated (but ignore any flags in ignoreflags), and hop
2767 # limit is between 0 and maxhop inclusive.
2768 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2769 socket.IPV6_RECVHOPLIMIT, 1)
2770 self.misc_event.set()
2771 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2772 len(MSG), ancbufsize)
2773
2774 self.assertEqual(msg, MSG)
2775 self.checkRecvmsgAddress(addr, self.cli_addr)
2776 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2777 ignore=ignoreflags)
2778
2779 self.assertEqual(len(ancdata), 1)
2780 self.assertIsInstance(ancdata[0], tuple)
2781 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2782 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2783 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2784 self.assertIsInstance(cmsg_data, bytes)
2785 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2786 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002787 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002788 self.assertGreaterEqual(a[0], 0)
2789 self.assertLessEqual(a[0], maxhop)
2790
2791 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2792 def testRecvHopLimit(self):
2793 # Test receiving the packet hop limit as ancillary data.
2794 self.checkHopLimit(ancbufsize=10240)
2795
2796 @testRecvHopLimit.client_skip
2797 def _testRecvHopLimit(self):
2798 # Need to wait until server has asked to receive ancillary
2799 # data, as implementations are not required to buffer it
2800 # otherwise.
2801 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2802 self.sendToServer(MSG)
2803
2804 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2805 def testRecvHopLimitCMSG_SPACE(self):
2806 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2807 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2808
2809 @testRecvHopLimitCMSG_SPACE.client_skip
2810 def _testRecvHopLimitCMSG_SPACE(self):
2811 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2812 self.sendToServer(MSG)
2813
2814 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2815 # 3542 says portable applications must provide space for trailing
2816 # padding. Implementations may set MSG_CTRUNC if there isn't
2817 # enough space for the padding.
2818
2819 @requireAttrs(socket.socket, "sendmsg")
2820 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2821 def testSetHopLimit(self):
2822 # Test setting hop limit on outgoing packet and receiving it
2823 # at the other end.
2824 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2825
2826 @testSetHopLimit.client_skip
2827 def _testSetHopLimit(self):
2828 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2829 self.assertEqual(
2830 self.sendmsgToServer([MSG],
2831 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2832 array.array("i", [self.hop_limit]))]),
2833 len(MSG))
2834
2835 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2836 ignoreflags=0):
2837 # Receive traffic class and hop limit into ancbufsize bytes of
2838 # ancillary data space. Check that data is MSG, ancillary
2839 # data is not truncated (but ignore any flags in ignoreflags),
2840 # and traffic class and hop limit are in range (hop limit no
2841 # more than maxhop).
2842 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2843 socket.IPV6_RECVHOPLIMIT, 1)
2844 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2845 socket.IPV6_RECVTCLASS, 1)
2846 self.misc_event.set()
2847 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2848 len(MSG), ancbufsize)
2849
2850 self.assertEqual(msg, MSG)
2851 self.checkRecvmsgAddress(addr, self.cli_addr)
2852 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2853 ignore=ignoreflags)
2854 self.assertEqual(len(ancdata), 2)
2855 ancmap = self.ancillaryMapping(ancdata)
2856
2857 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2858 self.assertEqual(len(tcdata), SIZEOF_INT)
2859 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002860 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002861 self.assertGreaterEqual(a[0], 0)
2862 self.assertLessEqual(a[0], 255)
2863
2864 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2865 self.assertEqual(len(hldata), SIZEOF_INT)
2866 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002867 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002868 self.assertGreaterEqual(a[0], 0)
2869 self.assertLessEqual(a[0], maxhop)
2870
2871 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2872 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2873 def testRecvTrafficClassAndHopLimit(self):
2874 # Test receiving traffic class and hop limit as ancillary data.
2875 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2876
2877 @testRecvTrafficClassAndHopLimit.client_skip
2878 def _testRecvTrafficClassAndHopLimit(self):
2879 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2880 self.sendToServer(MSG)
2881
2882 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2883 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2884 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2885 # Test receiving traffic class and hop limit, using
2886 # CMSG_SPACE() to calculate buffer size.
2887 self.checkTrafficClassAndHopLimit(
2888 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2889
2890 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2891 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2892 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2893 self.sendToServer(MSG)
2894
2895 @requireAttrs(socket.socket, "sendmsg")
2896 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2897 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2898 def testSetTrafficClassAndHopLimit(self):
2899 # Test setting traffic class and hop limit on outgoing packet,
2900 # and receiving them at the other end.
2901 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2902 maxhop=self.hop_limit)
2903
2904 @testSetTrafficClassAndHopLimit.client_skip
2905 def _testSetTrafficClassAndHopLimit(self):
2906 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2907 self.assertEqual(
2908 self.sendmsgToServer([MSG],
2909 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2910 array.array("i", [self.traffic_class])),
2911 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2912 array.array("i", [self.hop_limit]))]),
2913 len(MSG))
2914
2915 @requireAttrs(socket.socket, "sendmsg")
2916 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2917 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2918 def testOddCmsgSize(self):
2919 # Try to send ancillary data with first item one byte too
2920 # long. Fall back to sending with correct size if this fails,
2921 # and check that second item was handled correctly.
2922 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2923 maxhop=self.hop_limit)
2924
2925 @testOddCmsgSize.client_skip
2926 def _testOddCmsgSize(self):
2927 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2928 try:
2929 nbytes = self.sendmsgToServer(
2930 [MSG],
2931 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002932 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002933 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2934 array.array("i", [self.hop_limit]))])
2935 except socket.error as e:
2936 self.assertIsInstance(e.errno, int)
2937 nbytes = self.sendmsgToServer(
2938 [MSG],
2939 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2940 array.array("i", [self.traffic_class])),
2941 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2942 array.array("i", [self.hop_limit]))])
2943 self.assertEqual(nbytes, len(MSG))
2944
2945 # Tests for proper handling of truncated ancillary data
2946
2947 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2948 # Receive hop limit into ancbufsize bytes of ancillary data
2949 # space, which should be too small to contain the ancillary
2950 # data header (if ancbufsize is None, pass no second argument
2951 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2952 # (unless included in ignoreflags), and no ancillary data is
2953 # returned.
2954 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2955 socket.IPV6_RECVHOPLIMIT, 1)
2956 self.misc_event.set()
2957 args = () if ancbufsize is None else (ancbufsize,)
2958 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2959 len(MSG), *args)
2960
2961 self.assertEqual(msg, MSG)
2962 self.checkRecvmsgAddress(addr, self.cli_addr)
2963 self.assertEqual(ancdata, [])
2964 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2965 ignore=ignoreflags)
2966
2967 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2968 def testCmsgTruncNoBufSize(self):
2969 # Check that no ancillary data is received when no ancillary
2970 # buffer size is provided.
2971 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2972 # BSD seems to set
2973 # MSG_CTRUNC only if an item
2974 # has been partially
2975 # received.
2976 ignoreflags=socket.MSG_CTRUNC)
2977
2978 @testCmsgTruncNoBufSize.client_skip
2979 def _testCmsgTruncNoBufSize(self):
2980 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2981 self.sendToServer(MSG)
2982
2983 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2984 def testSingleCmsgTrunc0(self):
2985 # Check that no ancillary data is received when ancillary
2986 # buffer size is zero.
2987 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2988 ignoreflags=socket.MSG_CTRUNC)
2989
2990 @testSingleCmsgTrunc0.client_skip
2991 def _testSingleCmsgTrunc0(self):
2992 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2993 self.sendToServer(MSG)
2994
2995 # Check that no ancillary data is returned for various non-zero
2996 # (but still too small) buffer sizes.
2997
2998 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2999 def testSingleCmsgTrunc1(self):
3000 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3001
3002 @testSingleCmsgTrunc1.client_skip
3003 def _testSingleCmsgTrunc1(self):
3004 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3005 self.sendToServer(MSG)
3006
3007 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3008 def testSingleCmsgTrunc2Int(self):
3009 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3010
3011 @testSingleCmsgTrunc2Int.client_skip
3012 def _testSingleCmsgTrunc2Int(self):
3013 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3014 self.sendToServer(MSG)
3015
3016 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3017 def testSingleCmsgTruncLen0Minus1(self):
3018 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3019
3020 @testSingleCmsgTruncLen0Minus1.client_skip
3021 def _testSingleCmsgTruncLen0Minus1(self):
3022 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3023 self.sendToServer(MSG)
3024
3025 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3026 def testSingleCmsgTruncInData(self):
3027 # Test truncation of a control message inside its associated
3028 # data. The message may be returned with its data truncated,
3029 # or not returned at all.
3030 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3031 socket.IPV6_RECVHOPLIMIT, 1)
3032 self.misc_event.set()
3033 msg, ancdata, flags, addr = self.doRecvmsg(
3034 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3035
3036 self.assertEqual(msg, MSG)
3037 self.checkRecvmsgAddress(addr, self.cli_addr)
3038 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3039
3040 self.assertLessEqual(len(ancdata), 1)
3041 if ancdata:
3042 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3043 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3044 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3045 self.assertLess(len(cmsg_data), SIZEOF_INT)
3046
3047 @testSingleCmsgTruncInData.client_skip
3048 def _testSingleCmsgTruncInData(self):
3049 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3050 self.sendToServer(MSG)
3051
3052 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3053 # Receive traffic class and hop limit into ancbufsize bytes of
3054 # ancillary data space, which should be large enough to
3055 # contain the first item, but too small to contain the header
3056 # of the second. Check that data is MSG, MSG_CTRUNC is set
3057 # (unless included in ignoreflags), and only one ancillary
3058 # data item is returned.
3059 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3060 socket.IPV6_RECVHOPLIMIT, 1)
3061 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3062 socket.IPV6_RECVTCLASS, 1)
3063 self.misc_event.set()
3064 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3065 len(MSG), ancbufsize)
3066
3067 self.assertEqual(msg, MSG)
3068 self.checkRecvmsgAddress(addr, self.cli_addr)
3069 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3070 ignore=ignoreflags)
3071
3072 self.assertEqual(len(ancdata), 1)
3073 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3074 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3075 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3076 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3077 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003078 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003079 self.assertGreaterEqual(a[0], 0)
3080 self.assertLessEqual(a[0], 255)
3081
3082 # Try the above test with various buffer sizes.
3083
3084 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3085 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3086 def testSecondCmsgTrunc0(self):
3087 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3088 ignoreflags=socket.MSG_CTRUNC)
3089
3090 @testSecondCmsgTrunc0.client_skip
3091 def _testSecondCmsgTrunc0(self):
3092 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3093 self.sendToServer(MSG)
3094
3095 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3096 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3097 def testSecondCmsgTrunc1(self):
3098 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3099
3100 @testSecondCmsgTrunc1.client_skip
3101 def _testSecondCmsgTrunc1(self):
3102 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3103 self.sendToServer(MSG)
3104
3105 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3106 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3107 def testSecondCmsgTrunc2Int(self):
3108 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3109 2 * SIZEOF_INT)
3110
3111 @testSecondCmsgTrunc2Int.client_skip
3112 def _testSecondCmsgTrunc2Int(self):
3113 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3114 self.sendToServer(MSG)
3115
3116 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3117 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3118 def testSecondCmsgTruncLen0Minus1(self):
3119 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3120 socket.CMSG_LEN(0) - 1)
3121
3122 @testSecondCmsgTruncLen0Minus1.client_skip
3123 def _testSecondCmsgTruncLen0Minus1(self):
3124 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3125 self.sendToServer(MSG)
3126
3127 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3128 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3129 def testSecomdCmsgTruncInData(self):
3130 # Test truncation of the second of two control messages inside
3131 # its associated data.
3132 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3133 socket.IPV6_RECVHOPLIMIT, 1)
3134 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3135 socket.IPV6_RECVTCLASS, 1)
3136 self.misc_event.set()
3137 msg, ancdata, flags, addr = self.doRecvmsg(
3138 self.serv_sock, len(MSG),
3139 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3140
3141 self.assertEqual(msg, MSG)
3142 self.checkRecvmsgAddress(addr, self.cli_addr)
3143 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3144
3145 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3146
3147 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3148 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3149 cmsg_types.remove(cmsg_type)
3150 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3151 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003152 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003153 self.assertGreaterEqual(a[0], 0)
3154 self.assertLessEqual(a[0], 255)
3155
3156 if ancdata:
3157 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3158 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3159 cmsg_types.remove(cmsg_type)
3160 self.assertLess(len(cmsg_data), SIZEOF_INT)
3161
3162 self.assertEqual(ancdata, [])
3163
3164 @testSecomdCmsgTruncInData.client_skip
3165 def _testSecomdCmsgTruncInData(self):
3166 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3167 self.sendToServer(MSG)
3168
3169
3170# Derive concrete test classes for different socket types.
3171
3172class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3173 SendrecvmsgConnectionlessBase,
3174 ThreadedSocketTestMixin, UDPTestBase):
3175 pass
3176
3177@requireAttrs(socket.socket, "sendmsg")
3178@unittest.skipUnless(thread, 'Threading required for this test.')
3179class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3180 pass
3181
3182@requireAttrs(socket.socket, "recvmsg")
3183@unittest.skipUnless(thread, 'Threading required for this test.')
3184class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3185 pass
3186
3187@requireAttrs(socket.socket, "recvmsg_into")
3188@unittest.skipUnless(thread, 'Threading required for this test.')
3189class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3190 pass
3191
3192
3193class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3194 SendrecvmsgConnectionlessBase,
3195 ThreadedSocketTestMixin, UDP6TestBase):
3196 pass
3197
3198@requireAttrs(socket.socket, "sendmsg")
3199@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3200@requireSocket("AF_INET6", "SOCK_DGRAM")
3201@unittest.skipUnless(thread, 'Threading required for this test.')
3202class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3203 pass
3204
3205@requireAttrs(socket.socket, "recvmsg")
3206@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3207@requireSocket("AF_INET6", "SOCK_DGRAM")
3208@unittest.skipUnless(thread, 'Threading required for this test.')
3209class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3210 pass
3211
3212@requireAttrs(socket.socket, "recvmsg_into")
3213@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3214@requireSocket("AF_INET6", "SOCK_DGRAM")
3215@unittest.skipUnless(thread, 'Threading required for this test.')
3216class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3217 pass
3218
3219@requireAttrs(socket.socket, "recvmsg")
3220@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3221@requireAttrs(socket, "IPPROTO_IPV6")
3222@requireSocket("AF_INET6", "SOCK_DGRAM")
3223@unittest.skipUnless(thread, 'Threading required for this test.')
3224class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3225 SendrecvmsgUDP6TestBase):
3226 pass
3227
3228@requireAttrs(socket.socket, "recvmsg_into")
3229@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3230@requireAttrs(socket, "IPPROTO_IPV6")
3231@requireSocket("AF_INET6", "SOCK_DGRAM")
3232@unittest.skipUnless(thread, 'Threading required for this test.')
3233class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3234 RFC3542AncillaryTest,
3235 SendrecvmsgUDP6TestBase):
3236 pass
3237
3238
3239class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3240 ConnectedStreamTestMixin, TCPTestBase):
3241 pass
3242
3243@requireAttrs(socket.socket, "sendmsg")
3244@unittest.skipUnless(thread, 'Threading required for this test.')
3245class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3246 pass
3247
3248@requireAttrs(socket.socket, "recvmsg")
3249@unittest.skipUnless(thread, 'Threading required for this test.')
3250class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3251 SendrecvmsgTCPTestBase):
3252 pass
3253
3254@requireAttrs(socket.socket, "recvmsg_into")
3255@unittest.skipUnless(thread, 'Threading required for this test.')
3256class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3257 SendrecvmsgTCPTestBase):
3258 pass
3259
3260
3261class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3262 SendrecvmsgConnectedBase,
3263 ConnectedStreamTestMixin, SCTPStreamBase):
3264 pass
3265
3266@requireAttrs(socket.socket, "sendmsg")
3267@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3268@unittest.skipUnless(thread, 'Threading required for this test.')
3269class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3270 pass
3271
3272@requireAttrs(socket.socket, "recvmsg")
3273@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3274@unittest.skipUnless(thread, 'Threading required for this test.')
3275class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3276 SendrecvmsgSCTPStreamTestBase):
3277 pass
3278
3279@requireAttrs(socket.socket, "recvmsg_into")
3280@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3281@unittest.skipUnless(thread, 'Threading required for this test.')
3282class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3283 SendrecvmsgSCTPStreamTestBase):
3284 pass
3285
3286
3287class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3288 ConnectedStreamTestMixin, UnixStreamBase):
3289 pass
3290
3291@requireAttrs(socket.socket, "sendmsg")
3292@requireAttrs(socket, "AF_UNIX")
3293@unittest.skipUnless(thread, 'Threading required for this test.')
3294class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3295 pass
3296
3297@requireAttrs(socket.socket, "recvmsg")
3298@requireAttrs(socket, "AF_UNIX")
3299@unittest.skipUnless(thread, 'Threading required for this test.')
3300class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3301 SendrecvmsgUnixStreamTestBase):
3302 pass
3303
3304@requireAttrs(socket.socket, "recvmsg_into")
3305@requireAttrs(socket, "AF_UNIX")
3306@unittest.skipUnless(thread, 'Threading required for this test.')
3307class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3308 SendrecvmsgUnixStreamTestBase):
3309 pass
3310
3311@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3312@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3313@unittest.skipUnless(thread, 'Threading required for this test.')
3314class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3315 pass
3316
3317@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3318@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3319@unittest.skipUnless(thread, 'Threading required for this test.')
3320class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3321 SendrecvmsgUnixStreamTestBase):
3322 pass
3323
3324
3325# Test interrupting the interruptible send/receive methods with a
3326# signal when a timeout is set. These tests avoid having multiple
3327# threads alive during the test so that the OS cannot deliver the
3328# signal to the wrong one.
3329
3330class InterruptedTimeoutBase(unittest.TestCase):
3331 # Base class for interrupted send/receive tests. Installs an
3332 # empty handler for SIGALRM and removes it on teardown, along with
3333 # any scheduled alarms.
3334
3335 def setUp(self):
3336 super().setUp()
3337 orig_alrm_handler = signal.signal(signal.SIGALRM,
3338 lambda signum, frame: None)
3339 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3340 self.addCleanup(self.setAlarm, 0)
3341
3342 # Timeout for socket operations
3343 timeout = 4.0
3344
3345 # Provide setAlarm() method to schedule delivery of SIGALRM after
3346 # given number of seconds, or cancel it if zero, and an
3347 # appropriate time value to use. Use setitimer() if available.
3348 if hasattr(signal, "setitimer"):
3349 alarm_time = 0.05
3350
3351 def setAlarm(self, seconds):
3352 signal.setitimer(signal.ITIMER_REAL, seconds)
3353 else:
3354 # Old systems may deliver the alarm up to one second early
3355 alarm_time = 2
3356
3357 def setAlarm(self, seconds):
3358 signal.alarm(seconds)
3359
3360
3361# Require siginterrupt() in order to ensure that system calls are
3362# interrupted by default.
3363@requireAttrs(signal, "siginterrupt")
3364@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3365 "Don't have signal.alarm or signal.setitimer")
3366class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3367 # Test interrupting the recv*() methods with signals when a
3368 # timeout is set.
3369
3370 def setUp(self):
3371 super().setUp()
3372 self.serv.settimeout(self.timeout)
3373
3374 def checkInterruptedRecv(self, func, *args, **kwargs):
3375 # Check that func(*args, **kwargs) raises socket.error with an
3376 # errno of EINTR when interrupted by a signal.
3377 self.setAlarm(self.alarm_time)
3378 with self.assertRaises(socket.error) as cm:
3379 func(*args, **kwargs)
3380 self.assertNotIsInstance(cm.exception, socket.timeout)
3381 self.assertEqual(cm.exception.errno, errno.EINTR)
3382
3383 def testInterruptedRecvTimeout(self):
3384 self.checkInterruptedRecv(self.serv.recv, 1024)
3385
3386 def testInterruptedRecvIntoTimeout(self):
3387 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3388
3389 def testInterruptedRecvfromTimeout(self):
3390 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3391
3392 def testInterruptedRecvfromIntoTimeout(self):
3393 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3394
3395 @requireAttrs(socket.socket, "recvmsg")
3396 def testInterruptedRecvmsgTimeout(self):
3397 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3398
3399 @requireAttrs(socket.socket, "recvmsg_into")
3400 def testInterruptedRecvmsgIntoTimeout(self):
3401 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3402
3403
3404# Require siginterrupt() in order to ensure that system calls are
3405# interrupted by default.
3406@requireAttrs(signal, "siginterrupt")
3407@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3408 "Don't have signal.alarm or signal.setitimer")
3409@unittest.skipUnless(thread, 'Threading required for this test.')
3410class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3411 ThreadSafeCleanupTestCase,
3412 SocketListeningTestMixin, TCPTestBase):
3413 # Test interrupting the interruptible send*() methods with signals
3414 # when a timeout is set.
3415
3416 def setUp(self):
3417 super().setUp()
3418 self.serv_conn = self.newSocket()
3419 self.addCleanup(self.serv_conn.close)
3420 # Use a thread to complete the connection, but wait for it to
3421 # terminate before running the test, so that there is only one
3422 # thread to accept the signal.
3423 cli_thread = threading.Thread(target=self.doConnect)
3424 cli_thread.start()
3425 self.cli_conn, addr = self.serv.accept()
3426 self.addCleanup(self.cli_conn.close)
3427 cli_thread.join()
3428 self.serv_conn.settimeout(self.timeout)
3429
3430 def doConnect(self):
3431 self.serv_conn.connect(self.serv_addr)
3432
3433 def checkInterruptedSend(self, func, *args, **kwargs):
3434 # Check that func(*args, **kwargs), run in a loop, raises
3435 # socket.error with an errno of EINTR when interrupted by a
3436 # signal.
3437 with self.assertRaises(socket.error) as cm:
3438 while True:
3439 self.setAlarm(self.alarm_time)
3440 func(*args, **kwargs)
3441 self.assertNotIsInstance(cm.exception, socket.timeout)
3442 self.assertEqual(cm.exception.errno, errno.EINTR)
3443
Nick Coghlan2496f332011-09-19 20:26:31 +10003444 # Issue #12958: The following tests have problems on Mac OS X
3445 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003446 def testInterruptedSendTimeout(self):
3447 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3448
Nick Coghlan2496f332011-09-19 20:26:31 +10003449 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003450 def testInterruptedSendtoTimeout(self):
3451 # Passing an actual address here as Python's wrapper for
3452 # sendto() doesn't allow passing a zero-length one; POSIX
3453 # requires that the address is ignored since the socket is
3454 # connection-mode, however.
3455 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3456 self.serv_addr)
3457
Nick Coghlan2496f332011-09-19 20:26:31 +10003458 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003459 @requireAttrs(socket.socket, "sendmsg")
3460 def testInterruptedSendmsgTimeout(self):
3461 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3462
3463
Victor Stinner45df8202010-04-28 22:31:17 +00003464@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003465class TCPCloserTest(ThreadedTCPSocketTest):
3466
3467 def testClose(self):
3468 conn, addr = self.serv.accept()
3469 conn.close()
3470
3471 sd = self.cli
3472 read, write, err = select.select([sd], [], [], 1.0)
3473 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003474 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003475
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003476 # Calling close() many times should be safe.
3477 conn.close()
3478 conn.close()
3479
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003480 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003481 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003482 time.sleep(1.0)
3483
Victor Stinner45df8202010-04-28 22:31:17 +00003484@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003485class BasicSocketPairTest(SocketPairTest):
3486
3487 def __init__(self, methodName='runTest'):
3488 SocketPairTest.__init__(self, methodName=methodName)
3489
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003490 def _check_defaults(self, sock):
3491 self.assertIsInstance(sock, socket.socket)
3492 if hasattr(socket, 'AF_UNIX'):
3493 self.assertEqual(sock.family, socket.AF_UNIX)
3494 else:
3495 self.assertEqual(sock.family, socket.AF_INET)
3496 self.assertEqual(sock.type, socket.SOCK_STREAM)
3497 self.assertEqual(sock.proto, 0)
3498
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003499 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003500 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003501
3502 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003503 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003504
Dave Cole331708b2004-08-09 04:51:41 +00003505 def testRecv(self):
3506 msg = self.serv.recv(1024)
3507 self.assertEqual(msg, MSG)
3508
3509 def _testRecv(self):
3510 self.cli.send(MSG)
3511
3512 def testSend(self):
3513 self.serv.send(MSG)
3514
3515 def _testSend(self):
3516 msg = self.cli.recv(1024)
3517 self.assertEqual(msg, MSG)
3518
Victor Stinner45df8202010-04-28 22:31:17 +00003519@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003520class NonBlockingTCPTests(ThreadedTCPSocketTest):
3521
3522 def __init__(self, methodName='runTest'):
3523 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3524
3525 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003526 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003527 self.serv.setblocking(0)
3528 start = time.time()
3529 try:
3530 self.serv.accept()
3531 except socket.error:
3532 pass
3533 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003534 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003535
3536 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003537 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003538
Antoine Pitroub1c54962010-10-14 15:05:38 +00003539 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003540 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003541 def testInitNonBlocking(self):
3542 # reinit server socket
3543 self.serv.close()
3544 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003545 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003546 self.port = support.bind_port(self.serv)
3547 self.serv.listen(1)
3548 # actual testing
3549 start = time.time()
3550 try:
3551 self.serv.accept()
3552 except socket.error:
3553 pass
3554 end = time.time()
3555 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3556
3557 def _testInitNonBlocking(self):
3558 pass
3559
Antoine Pitrou600232b2011-01-05 21:03:42 +00003560 def testInheritFlags(self):
3561 # Issue #7995: when calling accept() on a listening socket with a
3562 # timeout, the resulting socket should not be non-blocking.
3563 self.serv.settimeout(10)
3564 try:
3565 conn, addr = self.serv.accept()
3566 message = conn.recv(len(MSG))
3567 finally:
3568 conn.close()
3569 self.serv.settimeout(None)
3570
3571 def _testInheritFlags(self):
3572 time.sleep(0.1)
3573 self.cli.connect((HOST, self.port))
3574 time.sleep(0.5)
3575 self.cli.send(MSG)
3576
Guido van Rossum24e4af82002-06-12 19:18:08 +00003577 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003578 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003579 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003580 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003581 conn, addr = self.serv.accept()
3582 except socket.error:
3583 pass
3584 else:
3585 self.fail("Error trying to do non-blocking accept.")
3586 read, write, err = select.select([self.serv], [], [])
3587 if self.serv in read:
3588 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003589 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003590 else:
3591 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003592
Guido van Rossum24e4af82002-06-12 19:18:08 +00003593 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003594 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003595 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003596
3597 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003598 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003599 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003600 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003601
3602 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003603 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003604 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003605
3606 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003607 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003608 conn, addr = self.serv.accept()
3609 conn.setblocking(0)
3610 try:
3611 msg = conn.recv(len(MSG))
3612 except socket.error:
3613 pass
3614 else:
3615 self.fail("Error trying to do non-blocking recv.")
3616 read, write, err = select.select([conn], [], [])
3617 if conn in read:
3618 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003619 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003620 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003621 else:
3622 self.fail("Error during select call to non-blocking socket.")
3623
3624 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003625 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003626 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003627 self.cli.send(MSG)
3628
Victor Stinner45df8202010-04-28 22:31:17 +00003629@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003630class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003631 """Unit tests for the object returned by socket.makefile()
3632
Antoine Pitrou834bd812010-10-13 16:17:14 +00003633 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003634 the client connection. You can read from this file to
3635 get output from the server.
3636
Antoine Pitrou834bd812010-10-13 16:17:14 +00003637 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003638 server connection. You can write to this file to send output
3639 to the client.
3640 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003641
Guido van Rossume9f66142002-08-07 15:46:19 +00003642 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003643 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003644 errors = 'strict'
3645 newline = None
3646
3647 read_mode = 'rb'
3648 read_msg = MSG
3649 write_mode = 'wb'
3650 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003651
Guido van Rossum24e4af82002-06-12 19:18:08 +00003652 def __init__(self, methodName='runTest'):
3653 SocketConnectedTest.__init__(self, methodName=methodName)
3654
3655 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003656 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3657 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003658 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003659 self.read_file = self.cli_conn.makefile(
3660 self.read_mode, self.bufsize,
3661 encoding = self.encoding,
3662 errors = self.errors,
3663 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003664
3665 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003666 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003667 self.read_file.close()
3668 self.assertTrue(self.read_file.closed)
3669 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003670 SocketConnectedTest.tearDown(self)
3671
3672 def clientSetUp(self):
3673 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003674 self.write_file = self.serv_conn.makefile(
3675 self.write_mode, self.bufsize,
3676 encoding = self.encoding,
3677 errors = self.errors,
3678 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003679
3680 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003681 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003682 self.write_file.close()
3683 self.assertTrue(self.write_file.closed)
3684 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003685 SocketConnectedTest.clientTearDown(self)
3686
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003687 def testReadAfterTimeout(self):
3688 # Issue #7322: A file object must disallow further reads
3689 # after a timeout has occurred.
3690 self.cli_conn.settimeout(1)
3691 self.read_file.read(3)
3692 # First read raises a timeout
3693 self.assertRaises(socket.timeout, self.read_file.read, 1)
3694 # Second read is disallowed
3695 with self.assertRaises(IOError) as ctx:
3696 self.read_file.read(1)
3697 self.assertIn("cannot read from timed out object", str(ctx.exception))
3698
3699 def _testReadAfterTimeout(self):
3700 self.write_file.write(self.write_msg[0:3])
3701 self.write_file.flush()
3702 self.serv_finished.wait()
3703
Guido van Rossum24e4af82002-06-12 19:18:08 +00003704 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003705 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003706 first_seg = self.read_file.read(len(self.read_msg)-3)
3707 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003708 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003709 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003710
3711 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003712 self.write_file.write(self.write_msg)
3713 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003714
Guido van Rossum8c943832002-08-08 01:00:28 +00003715 def testFullRead(self):
3716 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003717 msg = self.read_file.read()
3718 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003719
3720 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003721 self.write_file.write(self.write_msg)
3722 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003723
Guido van Rossum24e4af82002-06-12 19:18:08 +00003724 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003725 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003726 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003727 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003728 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003729 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003730 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003731 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003732 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003733
3734 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003735 self.write_file.write(self.write_msg)
3736 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003737
3738 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003739 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003740 line = self.read_file.readline()
3741 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003742
3743 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003744 self.write_file.write(self.write_msg)
3745 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003746
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003747 def testCloseAfterMakefile(self):
3748 # The file returned by makefile should keep the socket open.
3749 self.cli_conn.close()
3750 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003751 msg = self.read_file.read()
3752 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003753
3754 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003755 self.write_file.write(self.write_msg)
3756 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003757
3758 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003759 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003760 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003761 if isinstance(self.read_msg, str):
3762 msg = msg.decode()
3763 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003764
3765 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003766 self.write_file.write(self.write_msg)
3767 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003768
Tim Peters116d83c2004-03-28 02:20:45 +00003769 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003770 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003771
3772 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003773 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003774
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003775 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003776 self.assertEqual(self.read_file.mode, self.read_mode)
3777 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003778
3779 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003780 self.assertEqual(self.write_file.mode, self.write_mode)
3781 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003782
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003783 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003784 self.read_file.close()
3785 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003786 self.cli_conn.close()
3787 self.assertRaises(socket.error, self.cli_conn.getsockname)
3788
3789 def _testRealClose(self):
3790 pass
3791
3792
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003793class FileObjectInterruptedTestCase(unittest.TestCase):
3794 """Test that the file object correctly handles EINTR internally."""
3795
3796 class MockSocket(object):
3797 def __init__(self, recv_funcs=()):
3798 # A generator that returns callables that we'll call for each
3799 # call to recv().
3800 self._recv_step = iter(recv_funcs)
3801
3802 def recv_into(self, buffer):
3803 data = next(self._recv_step)()
3804 assert len(buffer) >= len(data)
3805 buffer[:len(data)] = data
3806 return len(data)
3807
3808 def _decref_socketios(self):
3809 pass
3810
3811 def _textiowrap_for_test(self, buffering=-1):
3812 raw = socket.SocketIO(self, "r")
3813 if buffering < 0:
3814 buffering = io.DEFAULT_BUFFER_SIZE
3815 if buffering == 0:
3816 return raw
3817 buffer = io.BufferedReader(raw, buffering)
3818 text = io.TextIOWrapper(buffer, None, None)
3819 text.mode = "rb"
3820 return text
3821
3822 @staticmethod
3823 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003824 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003825
3826 def _textiowrap_mock_socket(self, mock, buffering=-1):
3827 raw = socket.SocketIO(mock, "r")
3828 if buffering < 0:
3829 buffering = io.DEFAULT_BUFFER_SIZE
3830 if buffering == 0:
3831 return raw
3832 buffer = io.BufferedReader(raw, buffering)
3833 text = io.TextIOWrapper(buffer, None, None)
3834 text.mode = "rb"
3835 return text
3836
3837 def _test_readline(self, size=-1, buffering=-1):
3838 mock_sock = self.MockSocket(recv_funcs=[
3839 lambda : b"This is the first line\nAnd the sec",
3840 self._raise_eintr,
3841 lambda : b"ond line is here\n",
3842 lambda : b"",
3843 lambda : b"", # XXX(gps): io library does an extra EOF read
3844 ])
3845 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003846 self.assertEqual(fo.readline(size), "This is the first line\n")
3847 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003848
3849 def _test_read(self, size=-1, buffering=-1):
3850 mock_sock = self.MockSocket(recv_funcs=[
3851 lambda : b"This is the first line\nAnd the sec",
3852 self._raise_eintr,
3853 lambda : b"ond line is here\n",
3854 lambda : b"",
3855 lambda : b"", # XXX(gps): io library does an extra EOF read
3856 ])
3857 expecting = (b"This is the first line\n"
3858 b"And the second line is here\n")
3859 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3860 if buffering == 0:
3861 data = b''
3862 else:
3863 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003864 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003865 while len(data) != len(expecting):
3866 part = fo.read(size)
3867 if not part:
3868 break
3869 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003870 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003871
3872 def test_default(self):
3873 self._test_readline()
3874 self._test_readline(size=100)
3875 self._test_read()
3876 self._test_read(size=100)
3877
3878 def test_with_1k_buffer(self):
3879 self._test_readline(buffering=1024)
3880 self._test_readline(size=100, buffering=1024)
3881 self._test_read(buffering=1024)
3882 self._test_read(size=100, buffering=1024)
3883
3884 def _test_readline_no_buffer(self, size=-1):
3885 mock_sock = self.MockSocket(recv_funcs=[
3886 lambda : b"a",
3887 lambda : b"\n",
3888 lambda : b"B",
3889 self._raise_eintr,
3890 lambda : b"b",
3891 lambda : b"",
3892 ])
3893 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003894 self.assertEqual(fo.readline(size), b"a\n")
3895 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003896
3897 def test_no_buffer(self):
3898 self._test_readline_no_buffer()
3899 self._test_readline_no_buffer(size=4)
3900 self._test_read(buffering=0)
3901 self._test_read(size=100, buffering=0)
3902
3903
Guido van Rossume9f66142002-08-07 15:46:19 +00003904class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3905
3906 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003907
Guido van Rossume9f66142002-08-07 15:46:19 +00003908 In this case (and in this case only), it should be possible to
3909 create a file object, read a line from it, create another file
3910 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003911 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003912 when reading multiple requests from the same socket."""
3913
3914 bufsize = 0 # Use unbuffered mode
3915
3916 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003917 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003918 line = self.read_file.readline() # first line
3919 self.assertEqual(line, b"A. " + self.write_msg) # first line
3920 self.read_file = self.cli_conn.makefile('rb', 0)
3921 line = self.read_file.readline() # second line
3922 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003923
3924 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003925 self.write_file.write(b"A. " + self.write_msg)
3926 self.write_file.write(b"B. " + self.write_msg)
3927 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003928
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003929 def testMakefileClose(self):
3930 # The file returned by makefile should keep the socket open...
3931 self.cli_conn.close()
3932 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003933 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003934 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003935 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003936 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3937
3938 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003939 self.write_file.write(self.write_msg)
3940 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003941
3942 def testMakefileCloseSocketDestroy(self):
3943 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003944 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003945 refcount_after = sys.getrefcount(self.cli_conn)
3946 self.assertEqual(refcount_before - 1, refcount_after)
3947
3948 def _testMakefileCloseSocketDestroy(self):
3949 pass
3950
Antoine Pitrou98b46702010-09-18 22:59:00 +00003951 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003952 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003953 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3954
3955 def testSmallReadNonBlocking(self):
3956 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003957 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3958 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003959 self.evt1.set()
3960 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003961 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003962 if first_seg is None:
3963 # Data not arrived (can happen under Windows), wait a bit
3964 time.sleep(0.5)
3965 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003966 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003967 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003968 self.assertEqual(n, 3)
3969 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003970 self.assertEqual(msg, self.read_msg)
3971 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3972 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003973
3974 def _testSmallReadNonBlocking(self):
3975 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003976 self.write_file.write(self.write_msg)
3977 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003978 self.evt2.set()
3979 # Avoid cloding the socket before the server test has finished,
3980 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3981 self.serv_finished.wait(5.0)
3982
3983 def testWriteNonBlocking(self):
3984 self.cli_finished.wait(5.0)
3985 # The client thread can't skip directly - the SkipTest exception
3986 # would appear as a failure.
3987 if self.serv_skipped:
3988 self.skipTest(self.serv_skipped)
3989
3990 def _testWriteNonBlocking(self):
3991 self.serv_skipped = None
3992 self.serv_conn.setblocking(False)
3993 # Try to saturate the socket buffer pipe with repeated large writes.
3994 BIG = b"x" * (1024 ** 2)
3995 LIMIT = 10
3996 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00003997 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003998 self.assertGreater(n, 0)
3999 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004000 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004001 if n is None:
4002 # Succeeded
4003 break
4004 self.assertGreater(n, 0)
4005 else:
4006 # Let us know that this test didn't manage to establish
4007 # the expected conditions. This is not a failure in itself but,
4008 # if it happens repeatedly, the test should be fixed.
4009 self.serv_skipped = "failed to saturate the socket buffer"
4010
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004011
Guido van Rossum8c943832002-08-08 01:00:28 +00004012class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4013
4014 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4015
4016
4017class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4018
4019 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004020
Thomas Woutersb2137042007-02-01 18:02:27 +00004021
Antoine Pitrou834bd812010-10-13 16:17:14 +00004022class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4023 """Tests for socket.makefile() in text mode (rather than binary)"""
4024
4025 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004026 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004027 write_mode = 'wb'
4028 write_msg = MSG
4029 newline = ''
4030
4031
4032class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4033 """Tests for socket.makefile() in text mode (rather than binary)"""
4034
4035 read_mode = 'rb'
4036 read_msg = MSG
4037 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004038 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004039 newline = ''
4040
4041
4042class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4043 """Tests for socket.makefile() in text mode (rather than binary)"""
4044
4045 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004046 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004047 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004048 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004049 newline = ''
4050
4051
Guido van Rossumd8faa362007-04-27 19:54:29 +00004052class NetworkConnectionTest(object):
4053 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004054
Guido van Rossumd8faa362007-04-27 19:54:29 +00004055 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004056 # We're inherited below by BasicTCPTest2, which also inherits
4057 # BasicTCPTest, which defines self.port referenced below.
4058 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004059 self.serv_conn = self.cli
4060
4061class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4062 """Tests that NetworkConnection does not break existing TCP functionality.
4063 """
4064
4065class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004066
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004067 class MockSocket(socket.socket):
4068 def connect(self, *args):
4069 raise socket.timeout('timed out')
4070
4071 @contextlib.contextmanager
4072 def mocked_socket_module(self):
4073 """Return a socket which times out on connect"""
4074 old_socket = socket.socket
4075 socket.socket = self.MockSocket
4076 try:
4077 yield
4078 finally:
4079 socket.socket = old_socket
4080
4081 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004082 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004083 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004084 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004085 with self.assertRaises(socket.error) as cm:
4086 cli.connect((HOST, port))
4087 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4088
4089 def test_create_connection(self):
4090 # Issue #9792: errors raised by create_connection() should have
4091 # a proper errno attribute.
4092 port = support.find_unused_port()
4093 with self.assertRaises(socket.error) as cm:
4094 socket.create_connection((HOST, port))
4095 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4096
4097 def test_create_connection_timeout(self):
4098 # Issue #9792: create_connection() should not recast timeout errors
4099 # as generic socket errors.
4100 with self.mocked_socket_module():
4101 with self.assertRaises(socket.timeout):
4102 socket.create_connection((HOST, 1234))
4103
Guido van Rossumd8faa362007-04-27 19:54:29 +00004104
Victor Stinner45df8202010-04-28 22:31:17 +00004105@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004106class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4107
4108 def __init__(self, methodName='runTest'):
4109 SocketTCPTest.__init__(self, methodName=methodName)
4110 ThreadableTest.__init__(self)
4111
4112 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004113 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004114
4115 def clientTearDown(self):
4116 self.cli.close()
4117 self.cli = None
4118 ThreadableTest.clientTearDown(self)
4119
4120 def _justAccept(self):
4121 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004122 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004123
4124 testFamily = _justAccept
4125 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004126 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004127 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004128 self.assertEqual(self.cli.family, 2)
4129
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004130 testSourceAddress = _justAccept
4131 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004132 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4133 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004134 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004135 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004136 # The port number being used is sufficient to show that the bind()
4137 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004138
Guido van Rossumd8faa362007-04-27 19:54:29 +00004139 testTimeoutDefault = _justAccept
4140 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004141 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004142 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004143 socket.setdefaulttimeout(42)
4144 try:
4145 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004146 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004147 finally:
4148 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004149 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004150
4151 testTimeoutNone = _justAccept
4152 def _testTimeoutNone(self):
4153 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004154 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004155 socket.setdefaulttimeout(30)
4156 try:
4157 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004158 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004159 finally:
4160 socket.setdefaulttimeout(None)
4161 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004162
4163 testTimeoutValueNamed = _justAccept
4164 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004165 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004166 self.assertEqual(self.cli.gettimeout(), 30)
4167
4168 testTimeoutValueNonamed = _justAccept
4169 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004170 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004171 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004172 self.assertEqual(self.cli.gettimeout(), 30)
4173
Victor Stinner45df8202010-04-28 22:31:17 +00004174@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004175class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4176
4177 def __init__(self, methodName='runTest'):
4178 SocketTCPTest.__init__(self, methodName=methodName)
4179 ThreadableTest.__init__(self)
4180
4181 def clientSetUp(self):
4182 pass
4183
4184 def clientTearDown(self):
4185 self.cli.close()
4186 self.cli = None
4187 ThreadableTest.clientTearDown(self)
4188
4189 def testInsideTimeout(self):
4190 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004191 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004192 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004193 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004194 testOutsideTimeout = testInsideTimeout
4195
4196 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004197 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004198 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004199 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004200
4201 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004202 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004203 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004204
4205
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004206class TCPTimeoutTest(SocketTCPTest):
4207
4208 def testTCPTimeout(self):
4209 def raise_timeout(*args, **kwargs):
4210 self.serv.settimeout(1.0)
4211 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004212 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004213 "Error generating a timeout exception (TCP)")
4214
4215 def testTimeoutZero(self):
4216 ok = False
4217 try:
4218 self.serv.settimeout(0.0)
4219 foo = self.serv.accept()
4220 except socket.timeout:
4221 self.fail("caught timeout instead of error (TCP)")
4222 except socket.error:
4223 ok = True
4224 except:
4225 self.fail("caught unexpected exception (TCP)")
4226 if not ok:
4227 self.fail("accept() returned success when we did not expect it")
4228
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004229 def testInterruptedTimeout(self):
4230 # XXX I don't know how to do this test on MSWindows or any other
4231 # plaform that doesn't support signal.alarm() or os.kill(), though
4232 # the bug should have existed on all platforms.
4233 if not hasattr(signal, "alarm"):
4234 return # can only test on *nix
4235 self.serv.settimeout(5.0) # must be longer than alarm
4236 class Alarm(Exception):
4237 pass
4238 def alarm_handler(signal, frame):
4239 raise Alarm
4240 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4241 try:
4242 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4243 try:
4244 foo = self.serv.accept()
4245 except socket.timeout:
4246 self.fail("caught timeout instead of Alarm")
4247 except Alarm:
4248 pass
4249 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004250 self.fail("caught other exception instead of Alarm:"
4251 " %s(%s):\n%s" %
4252 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004253 else:
4254 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004255 finally:
4256 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004257 except Alarm:
4258 self.fail("got Alarm in wrong place")
4259 finally:
4260 # no alarm can be pending. Safe to restore old handler.
4261 signal.signal(signal.SIGALRM, old_alarm)
4262
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004263class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004264
4265 def testUDPTimeout(self):
4266 def raise_timeout(*args, **kwargs):
4267 self.serv.settimeout(1.0)
4268 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004269 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004270 "Error generating a timeout exception (UDP)")
4271
4272 def testTimeoutZero(self):
4273 ok = False
4274 try:
4275 self.serv.settimeout(0.0)
4276 foo = self.serv.recv(1024)
4277 except socket.timeout:
4278 self.fail("caught timeout instead of error (UDP)")
4279 except socket.error:
4280 ok = True
4281 except:
4282 self.fail("caught unexpected exception (UDP)")
4283 if not ok:
4284 self.fail("recv() returned success when we did not expect it")
4285
4286class TestExceptions(unittest.TestCase):
4287
4288 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004289 self.assertTrue(issubclass(socket.error, Exception))
4290 self.assertTrue(issubclass(socket.herror, socket.error))
4291 self.assertTrue(issubclass(socket.gaierror, socket.error))
4292 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004293
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004294class TestLinuxAbstractNamespace(unittest.TestCase):
4295
4296 UNIX_PATH_MAX = 108
4297
4298 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004299 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004300 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4301 s1.bind(address)
4302 s1.listen(1)
4303 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4304 s2.connect(s1.getsockname())
4305 with s1.accept()[0] as s3:
4306 self.assertEqual(s1.getsockname(), address)
4307 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004308
4309 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004310 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004311 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4312 s.bind(address)
4313 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004314
4315 def testNameOverflow(self):
4316 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004317 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4318 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004319
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004320 def testStrName(self):
4321 # Check that an abstract name can be passed as a string.
4322 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4323 try:
4324 s.bind("\x00python\x00test\x00")
4325 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4326 finally:
4327 s.close()
4328
4329class TestUnixDomain(unittest.TestCase):
4330
4331 def setUp(self):
4332 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4333
4334 def tearDown(self):
4335 self.sock.close()
4336
4337 def encoded(self, path):
4338 # Return the given path encoded in the file system encoding,
4339 # or skip the test if this is not possible.
4340 try:
4341 return os.fsencode(path)
4342 except UnicodeEncodeError:
4343 self.skipTest(
4344 "Pathname {0!a} cannot be represented in file "
4345 "system encoding {1!r}".format(
4346 path, sys.getfilesystemencoding()))
4347
Antoine Pitrou16374872011-12-16 15:04:12 +01004348 def bind(self, sock, path):
4349 # Bind the socket
4350 try:
4351 sock.bind(path)
4352 except OSError as e:
4353 if str(e) == "AF_UNIX path too long":
4354 self.skipTest(
4355 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4356 .format(path))
4357 else:
4358 raise
4359
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004360 def testStrAddr(self):
4361 # Test binding to and retrieving a normal string pathname.
4362 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004363 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004364 self.addCleanup(support.unlink, path)
4365 self.assertEqual(self.sock.getsockname(), path)
4366
4367 def testBytesAddr(self):
4368 # Test binding to a bytes pathname.
4369 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004370 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004371 self.addCleanup(support.unlink, path)
4372 self.assertEqual(self.sock.getsockname(), path)
4373
4374 def testSurrogateescapeBind(self):
4375 # Test binding to a valid non-ASCII pathname, with the
4376 # non-ASCII bytes supplied using surrogateescape encoding.
4377 path = os.path.abspath(support.TESTFN_UNICODE)
4378 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004379 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004380 self.addCleanup(support.unlink, path)
4381 self.assertEqual(self.sock.getsockname(), path)
4382
4383 def testUnencodableAddr(self):
4384 # Test binding to a pathname that cannot be encoded in the
4385 # file system encoding.
4386 if support.TESTFN_UNENCODABLE is None:
4387 self.skipTest("No unencodable filename available")
4388 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004389 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004390 self.addCleanup(support.unlink, path)
4391 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004392
Victor Stinner45df8202010-04-28 22:31:17 +00004393@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004394class BufferIOTest(SocketConnectedTest):
4395 """
4396 Test the buffer versions of socket.recv() and socket.send().
4397 """
4398 def __init__(self, methodName='runTest'):
4399 SocketConnectedTest.__init__(self, methodName=methodName)
4400
Antoine Pitrou25480782010-03-17 22:50:28 +00004401 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004402 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004403 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004404 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004405 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004406 self.assertEqual(msg, MSG)
4407
Antoine Pitrou25480782010-03-17 22:50:28 +00004408 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004409 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004410 self.serv_conn.send(buf)
4411
Antoine Pitrou25480782010-03-17 22:50:28 +00004412 def testRecvIntoBytearray(self):
4413 buf = bytearray(1024)
4414 nbytes = self.cli_conn.recv_into(buf)
4415 self.assertEqual(nbytes, len(MSG))
4416 msg = buf[:len(MSG)]
4417 self.assertEqual(msg, MSG)
4418
4419 _testRecvIntoBytearray = _testRecvIntoArray
4420
4421 def testRecvIntoMemoryview(self):
4422 buf = bytearray(1024)
4423 nbytes = self.cli_conn.recv_into(memoryview(buf))
4424 self.assertEqual(nbytes, len(MSG))
4425 msg = buf[:len(MSG)]
4426 self.assertEqual(msg, MSG)
4427
4428 _testRecvIntoMemoryview = _testRecvIntoArray
4429
4430 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004431 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004432 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004433 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004434 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004435 self.assertEqual(msg, MSG)
4436
Antoine Pitrou25480782010-03-17 22:50:28 +00004437 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004438 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004439 self.serv_conn.send(buf)
4440
Antoine Pitrou25480782010-03-17 22:50:28 +00004441 def testRecvFromIntoBytearray(self):
4442 buf = bytearray(1024)
4443 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4444 self.assertEqual(nbytes, len(MSG))
4445 msg = buf[:len(MSG)]
4446 self.assertEqual(msg, MSG)
4447
4448 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4449
4450 def testRecvFromIntoMemoryview(self):
4451 buf = bytearray(1024)
4452 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4453 self.assertEqual(nbytes, len(MSG))
4454 msg = buf[:len(MSG)]
4455 self.assertEqual(msg, MSG)
4456
4457 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4458
Christian Heimes043d6f62008-01-07 17:19:16 +00004459
4460TIPC_STYPE = 2000
4461TIPC_LOWER = 200
4462TIPC_UPPER = 210
4463
4464def isTipcAvailable():
4465 """Check if the TIPC module is loaded
4466
4467 The TIPC module is not loaded automatically on Ubuntu and probably
4468 other Linux distros.
4469 """
4470 if not hasattr(socket, "AF_TIPC"):
4471 return False
4472 if not os.path.isfile("/proc/modules"):
4473 return False
4474 with open("/proc/modules") as f:
4475 for line in f:
4476 if line.startswith("tipc "):
4477 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004478 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004479 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4480 return False
4481
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004482class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004483 def testRDM(self):
4484 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4485 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004486 self.addCleanup(srv.close)
4487 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004488
4489 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4490 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4491 TIPC_LOWER, TIPC_UPPER)
4492 srv.bind(srvaddr)
4493
4494 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4495 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4496 cli.sendto(MSG, sendaddr)
4497
4498 msg, recvaddr = srv.recvfrom(1024)
4499
4500 self.assertEqual(cli.getsockname(), recvaddr)
4501 self.assertEqual(msg, MSG)
4502
4503
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004504class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004505 def __init__(self, methodName = 'runTest'):
4506 unittest.TestCase.__init__(self, methodName = methodName)
4507 ThreadableTest.__init__(self)
4508
4509 def setUp(self):
4510 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004511 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004512 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4513 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4514 TIPC_LOWER, TIPC_UPPER)
4515 self.srv.bind(srvaddr)
4516 self.srv.listen(5)
4517 self.serverExplicitReady()
4518 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004519 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004520
4521 def clientSetUp(self):
4522 # The is a hittable race between serverExplicitReady() and the
4523 # accept() call; sleep a little while to avoid it, otherwise
4524 # we could get an exception
4525 time.sleep(0.1)
4526 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004527 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004528 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4529 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4530 self.cli.connect(addr)
4531 self.cliaddr = self.cli.getsockname()
4532
4533 def testStream(self):
4534 msg = self.conn.recv(1024)
4535 self.assertEqual(msg, MSG)
4536 self.assertEqual(self.cliaddr, self.connaddr)
4537
4538 def _testStream(self):
4539 self.cli.send(MSG)
4540 self.cli.close()
4541
4542
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004543@unittest.skipUnless(thread, 'Threading required for this test.')
4544class ContextManagersTest(ThreadedTCPSocketTest):
4545
4546 def _testSocketClass(self):
4547 # base test
4548 with socket.socket() as sock:
4549 self.assertFalse(sock._closed)
4550 self.assertTrue(sock._closed)
4551 # close inside with block
4552 with socket.socket() as sock:
4553 sock.close()
4554 self.assertTrue(sock._closed)
4555 # exception inside with block
4556 with socket.socket() as sock:
4557 self.assertRaises(socket.error, sock.sendall, b'foo')
4558 self.assertTrue(sock._closed)
4559
4560 def testCreateConnectionBase(self):
4561 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004562 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004563 data = conn.recv(1024)
4564 conn.sendall(data)
4565
4566 def _testCreateConnectionBase(self):
4567 address = self.serv.getsockname()
4568 with socket.create_connection(address) as sock:
4569 self.assertFalse(sock._closed)
4570 sock.sendall(b'foo')
4571 self.assertEqual(sock.recv(1024), b'foo')
4572 self.assertTrue(sock._closed)
4573
4574 def testCreateConnectionClose(self):
4575 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004576 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004577 data = conn.recv(1024)
4578 conn.sendall(data)
4579
4580 def _testCreateConnectionClose(self):
4581 address = self.serv.getsockname()
4582 with socket.create_connection(address) as sock:
4583 sock.close()
4584 self.assertTrue(sock._closed)
4585 self.assertRaises(socket.error, sock.sendall, b'foo')
4586
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004587
Antoine Pitroub1c54962010-10-14 15:05:38 +00004588@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4589 "SOCK_CLOEXEC not defined")
4590@unittest.skipUnless(fcntl, "module fcntl not available")
4591class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004592 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004593 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004594 with socket.socket(socket.AF_INET,
4595 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4596 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4597 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004598
4599
4600@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4601 "SOCK_NONBLOCK not defined")
4602class NonblockConstantTest(unittest.TestCase):
4603 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4604 if nonblock:
4605 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4606 self.assertEqual(s.gettimeout(), timeout)
4607 else:
4608 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4609 self.assertEqual(s.gettimeout(), None)
4610
Charles-François Natali239bb962011-06-03 12:55:15 +02004611 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004612 def test_SOCK_NONBLOCK(self):
4613 # a lot of it seems silly and redundant, but I wanted to test that
4614 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004615 with socket.socket(socket.AF_INET,
4616 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4617 self.checkNonblock(s)
4618 s.setblocking(1)
4619 self.checkNonblock(s, False)
4620 s.setblocking(0)
4621 self.checkNonblock(s)
4622 s.settimeout(None)
4623 self.checkNonblock(s, False)
4624 s.settimeout(2.0)
4625 self.checkNonblock(s, timeout=2.0)
4626 s.setblocking(1)
4627 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004628 # defaulttimeout
4629 t = socket.getdefaulttimeout()
4630 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004631 with socket.socket() as s:
4632 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004633 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004634 with socket.socket() as s:
4635 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004636 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004637 with socket.socket() as s:
4638 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004639 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004640 with socket.socket() as s:
4641 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004642 socket.setdefaulttimeout(t)
4643
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004644
Guido van Rossumb995eb72002-07-31 16:08:40 +00004645def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004646 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004647 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004648
4649 tests.extend([
4650 NonBlockingTCPTests,
4651 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004652 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004653 UnbufferedFileObjectClassTestCase,
4654 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004655 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004656 UnicodeReadFileObjectClassTestCase,
4657 UnicodeWriteFileObjectClassTestCase,
4658 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004659 NetworkConnectionNoServer,
4660 NetworkConnectionAttributesTest,
4661 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004662 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004663 CloexecConstantTest,
4664 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004665 ])
Dave Cole331708b2004-08-09 04:51:41 +00004666 if hasattr(socket, "socketpair"):
4667 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004668 if hasattr(socket, "AF_UNIX"):
4669 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004670 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004671 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004672 if isTipcAvailable():
4673 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004674 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004675 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004676 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004677 tests.extend([
4678 CmsgMacroTests,
4679 SendmsgUDPTest,
4680 RecvmsgUDPTest,
4681 RecvmsgIntoUDPTest,
4682 SendmsgUDP6Test,
4683 RecvmsgUDP6Test,
4684 RecvmsgRFC3542AncillaryUDP6Test,
4685 RecvmsgIntoRFC3542AncillaryUDP6Test,
4686 RecvmsgIntoUDP6Test,
4687 SendmsgTCPTest,
4688 RecvmsgTCPTest,
4689 RecvmsgIntoTCPTest,
4690 SendmsgSCTPStreamTest,
4691 RecvmsgSCTPStreamTest,
4692 RecvmsgIntoSCTPStreamTest,
4693 SendmsgUnixStreamTest,
4694 RecvmsgUnixStreamTest,
4695 RecvmsgIntoUnixStreamTest,
4696 RecvmsgSCMRightsStreamTest,
4697 RecvmsgIntoSCMRightsStreamTest,
4698 # These are slow when setitimer() is not available
4699 InterruptedRecvTimeoutTest,
4700 InterruptedSendTimeoutTest,
4701 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004702
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004703 thread_info = support.threading_setup()
4704 support.run_unittest(*tests)
4705 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004706
4707if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004708 test_main()