blob: b5c16ca5120cddf6d68ab77f39010a7e504b4557 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100010import tempfile
11import _testcapi
Christian Heimesbbe741d2008-03-28 10:53:29 +000012import time
13import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000014import queue
Jack Jansen522e7692002-09-06 21:57:50 +000015import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000016import os
17import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000018import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000019import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000020from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000021import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000022import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010023import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020024import struct
Antoine Pitroub1c54962010-10-14 15:05:38 +000025try:
26 import fcntl
27except ImportError:
28 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Benjamin Petersonee8712c2008-05-20 21:35:26 +000030HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000031MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Victor Stinner45df8202010-04-28 22:31:17 +000033try:
34 import _thread as thread
35 import threading
36except ImportError:
37 thread = None
38 threading = None
39
Charles-François Natali47413c12011-10-06 19:47:44 +020040def _have_socket_can():
41 """Check whether CAN sockets are supported on this host."""
42 try:
43 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
44 except (AttributeError, socket.error, OSError):
45 return False
46 else:
47 s.close()
48 return True
49
Charles-François Natali10b8cf42011-11-10 19:21:37 +010050def _have_socket_rds():
51 """Check whether RDS sockets are supported on this host."""
52 try:
53 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
54 except (AttributeError, OSError):
55 return False
56 else:
57 s.close()
58 return True
59
Charles-François Natali47413c12011-10-06 19:47:44 +020060HAVE_SOCKET_CAN = _have_socket_can()
61
Charles-François Natali10b8cf42011-11-10 19:21:37 +010062HAVE_SOCKET_RDS = _have_socket_rds()
63
Nick Coghlan96fe56a2011-08-22 11:55:57 +100064# Size in bytes of the int type
65SIZEOF_INT = array.array("i").itemsize
66
Guido van Rossum24e4af82002-06-12 19:18:08 +000067class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000068
Guido van Rossum24e4af82002-06-12 19:18:08 +000069 def setUp(self):
70 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000071 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000072 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000073
Guido van Rossum24e4af82002-06-12 19:18:08 +000074 def tearDown(self):
75 self.serv.close()
76 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000077
Guido van Rossum24e4af82002-06-12 19:18:08 +000078class SocketUDPTest(unittest.TestCase):
79
80 def setUp(self):
81 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000082 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000083
84 def tearDown(self):
85 self.serv.close()
86 self.serv = None
87
Nick Coghlan96fe56a2011-08-22 11:55:57 +100088class ThreadSafeCleanupTestCase(unittest.TestCase):
89 """Subclass of unittest.TestCase with thread-safe cleanup methods.
90
91 This subclass protects the addCleanup() and doCleanups() methods
92 with a recursive lock.
93 """
94
95 if threading:
96 def __init__(self, *args, **kwargs):
97 super().__init__(*args, **kwargs)
98 self._cleanup_lock = threading.RLock()
99
100 def addCleanup(self, *args, **kwargs):
101 with self._cleanup_lock:
102 return super().addCleanup(*args, **kwargs)
103
104 def doCleanups(self, *args, **kwargs):
105 with self._cleanup_lock:
106 return super().doCleanups(*args, **kwargs)
107
Charles-François Natali47413c12011-10-06 19:47:44 +0200108class SocketCANTest(unittest.TestCase):
109
110 """To be able to run this test, a `vcan0` CAN interface can be created with
111 the following commands:
112 # modprobe vcan
113 # ip link add dev vcan0 type vcan
114 # ifconfig vcan0 up
115 """
116 interface = 'vcan0'
117 bufsize = 128
118
119 def setUp(self):
120 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200121 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200122 try:
123 self.s.bind((self.interface,))
124 except socket.error:
125 self.skipTest('network interface `%s` does not exist' %
126 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200127
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100128
129class SocketRDSTest(unittest.TestCase):
130
131 """To be able to run this test, the `rds` kernel module must be loaded:
132 # modprobe rds
133 """
134 bufsize = 8192
135
136 def setUp(self):
137 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
138 self.addCleanup(self.serv.close)
139 try:
140 self.port = support.bind_port(self.serv)
141 except OSError:
142 self.skipTest('unable to bind RDS socket')
143
144
Guido van Rossum24e4af82002-06-12 19:18:08 +0000145class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000146 """Threadable Test class
147
148 The ThreadableTest class makes it easy to create a threaded
149 client/server pair from an existing unit test. To create a
150 new threaded class from an existing unit test, use multiple
151 inheritance:
152
153 class NewClass (OldClass, ThreadableTest):
154 pass
155
156 This class defines two new fixture functions with obvious
157 purposes for overriding:
158
159 clientSetUp ()
160 clientTearDown ()
161
162 Any new test functions within the class must then define
163 tests in pairs, where the test name is preceeded with a
164 '_' to indicate the client portion of the test. Ex:
165
166 def testFoo(self):
167 # Server portion
168
169 def _testFoo(self):
170 # Client portion
171
172 Any exceptions raised by the clients during their tests
173 are caught and transferred to the main thread to alert
174 the testing framework.
175
176 Note, the server setup function cannot call any blocking
177 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000178 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000179 the blocking call (such as in setting up a client/server
180 connection and performing the accept() in setUp().
181 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000182
183 def __init__(self):
184 # Swap the true setup function
185 self.__setUp = self.setUp
186 self.__tearDown = self.tearDown
187 self.setUp = self._setUp
188 self.tearDown = self._tearDown
189
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000190 def serverExplicitReady(self):
191 """This method allows the server to explicitly indicate that
192 it wants the client thread to proceed. This is useful if the
193 server is about to execute a blocking routine that is
194 dependent upon the client thread during its setup routine."""
195 self.server_ready.set()
196
Guido van Rossum24e4af82002-06-12 19:18:08 +0000197 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000198 self.server_ready = threading.Event()
199 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000200 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000201 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200202 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000203
204 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000205 methodname = self.id()
206 i = methodname.rfind('.')
207 methodname = methodname[i+1:]
208 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000209 self.client_thread = thread.start_new_thread(
210 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000211
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200212 try:
213 self.__setUp()
214 except:
215 self.server_crashed = True
216 raise
217 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000218 self.server_ready.set()
219 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000220
221 def _tearDown(self):
222 self.__tearDown()
223 self.done.wait()
224
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000225 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000226 exc = self.queue.get()
227 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000228
229 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000230 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000231 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200232 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200233 if self.server_crashed:
234 self.clientTearDown()
235 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000236 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000237 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000238 try:
239 test_func()
Nick Coghlan2496f332011-09-19 20:26:31 +1000240 except unittest._ExpectedFailure:
241 # We deliberately ignore expected failures
242 pass
Antoine Pitrou98b46702010-09-18 22:59:00 +0000243 except BaseException as e:
244 self.queue.put(e)
245 finally:
246 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000247
248 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000249 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000250
251 def clientTearDown(self):
252 self.done.set()
253 thread.exit()
254
255class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
256
257 def __init__(self, methodName='runTest'):
258 SocketTCPTest.__init__(self, methodName=methodName)
259 ThreadableTest.__init__(self)
260
261 def clientSetUp(self):
262 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
263
264 def clientTearDown(self):
265 self.cli.close()
266 self.cli = None
267 ThreadableTest.clientTearDown(self)
268
269class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
270
271 def __init__(self, methodName='runTest'):
272 SocketUDPTest.__init__(self, methodName=methodName)
273 ThreadableTest.__init__(self)
274
275 def clientSetUp(self):
276 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
277
Brian Curtin3beb38f2010-11-04 03:41:43 +0000278 def clientTearDown(self):
279 self.cli.close()
280 self.cli = None
281 ThreadableTest.clientTearDown(self)
282
Charles-François Natali47413c12011-10-06 19:47:44 +0200283class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
284
285 def __init__(self, methodName='runTest'):
286 SocketCANTest.__init__(self, methodName=methodName)
287 ThreadableTest.__init__(self)
288
289 def clientSetUp(self):
290 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
291 try:
292 self.cli.bind((self.interface,))
293 except socket.error:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200294 # skipTest should not be called here, and will be called in the
295 # server instead
296 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200297
298 def clientTearDown(self):
299 self.cli.close()
300 self.cli = None
301 ThreadableTest.clientTearDown(self)
302
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100303class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
304
305 def __init__(self, methodName='runTest'):
306 SocketRDSTest.__init__(self, methodName=methodName)
307 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100308
309 def clientSetUp(self):
310 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
311 try:
312 # RDS sockets must be bound explicitly to send or receive data
313 self.cli.bind((HOST, 0))
314 self.cli_addr = self.cli.getsockname()
315 except OSError:
316 # skipTest should not be called here, and will be called in the
317 # server instead
318 pass
319
320 def clientTearDown(self):
321 self.cli.close()
322 self.cli = None
323 ThreadableTest.clientTearDown(self)
324
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000326 """Socket tests for client-server connection.
327
328 self.cli_conn is a client socket connected to the server. The
329 setUp() method guarantees that it is connected to the server.
330 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000331
332 def __init__(self, methodName='runTest'):
333 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
334
335 def setUp(self):
336 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000337 # Indicate explicitly we're ready for the client thread to
338 # proceed and then perform the blocking call to accept
339 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000340 conn, addr = self.serv.accept()
341 self.cli_conn = conn
342
343 def tearDown(self):
344 self.cli_conn.close()
345 self.cli_conn = None
346 ThreadedTCPSocketTest.tearDown(self)
347
348 def clientSetUp(self):
349 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000350 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000351 self.serv_conn = self.cli
352
353 def clientTearDown(self):
354 self.serv_conn.close()
355 self.serv_conn = None
356 ThreadedTCPSocketTest.clientTearDown(self)
357
Dave Cole331708b2004-08-09 04:51:41 +0000358class SocketPairTest(unittest.TestCase, ThreadableTest):
359
360 def __init__(self, methodName='runTest'):
361 unittest.TestCase.__init__(self, methodName=methodName)
362 ThreadableTest.__init__(self)
363
364 def setUp(self):
365 self.serv, self.cli = socket.socketpair()
366
367 def tearDown(self):
368 self.serv.close()
369 self.serv = None
370
371 def clientSetUp(self):
372 pass
373
374 def clientTearDown(self):
375 self.cli.close()
376 self.cli = None
377 ThreadableTest.clientTearDown(self)
378
Tim Peters494aaee2004-08-09 18:54:11 +0000379
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000380# The following classes are used by the sendmsg()/recvmsg() tests.
381# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
382# gives a drop-in replacement for SocketConnectedTest, but different
383# address families can be used, and the attributes serv_addr and
384# cli_addr will be set to the addresses of the endpoints.
385
386class SocketTestBase(unittest.TestCase):
387 """A base class for socket tests.
388
389 Subclasses must provide methods newSocket() to return a new socket
390 and bindSock(sock) to bind it to an unused address.
391
392 Creates a socket self.serv and sets self.serv_addr to its address.
393 """
394
395 def setUp(self):
396 self.serv = self.newSocket()
397 self.bindServer()
398
399 def bindServer(self):
400 """Bind server socket and set self.serv_addr to its address."""
401 self.bindSock(self.serv)
402 self.serv_addr = self.serv.getsockname()
403
404 def tearDown(self):
405 self.serv.close()
406 self.serv = None
407
408
409class SocketListeningTestMixin(SocketTestBase):
410 """Mixin to listen on the server socket."""
411
412 def setUp(self):
413 super().setUp()
414 self.serv.listen(1)
415
416
417class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
418 ThreadableTest):
419 """Mixin to add client socket and allow client/server tests.
420
421 Client socket is self.cli and its address is self.cli_addr. See
422 ThreadableTest for usage information.
423 """
424
425 def __init__(self, *args, **kwargs):
426 super().__init__(*args, **kwargs)
427 ThreadableTest.__init__(self)
428
429 def clientSetUp(self):
430 self.cli = self.newClientSocket()
431 self.bindClient()
432
433 def newClientSocket(self):
434 """Return a new socket for use as client."""
435 return self.newSocket()
436
437 def bindClient(self):
438 """Bind client socket and set self.cli_addr to its address."""
439 self.bindSock(self.cli)
440 self.cli_addr = self.cli.getsockname()
441
442 def clientTearDown(self):
443 self.cli.close()
444 self.cli = None
445 ThreadableTest.clientTearDown(self)
446
447
448class ConnectedStreamTestMixin(SocketListeningTestMixin,
449 ThreadedSocketTestMixin):
450 """Mixin to allow client/server stream tests with connected client.
451
452 Server's socket representing connection to client is self.cli_conn
453 and client's connection to server is self.serv_conn. (Based on
454 SocketConnectedTest.)
455 """
456
457 def setUp(self):
458 super().setUp()
459 # Indicate explicitly we're ready for the client thread to
460 # proceed and then perform the blocking call to accept
461 self.serverExplicitReady()
462 conn, addr = self.serv.accept()
463 self.cli_conn = conn
464
465 def tearDown(self):
466 self.cli_conn.close()
467 self.cli_conn = None
468 super().tearDown()
469
470 def clientSetUp(self):
471 super().clientSetUp()
472 self.cli.connect(self.serv_addr)
473 self.serv_conn = self.cli
474
475 def clientTearDown(self):
476 self.serv_conn.close()
477 self.serv_conn = None
478 super().clientTearDown()
479
480
481class UnixSocketTestBase(SocketTestBase):
482 """Base class for Unix-domain socket tests."""
483
484 # This class is used for file descriptor passing tests, so we
485 # create the sockets in a private directory so that other users
486 # can't send anything that might be problematic for a privileged
487 # user running the tests.
488
489 def setUp(self):
490 self.dir_path = tempfile.mkdtemp()
491 self.addCleanup(os.rmdir, self.dir_path)
492 super().setUp()
493
494 def bindSock(self, sock):
495 path = tempfile.mktemp(dir=self.dir_path)
496 sock.bind(path)
497 self.addCleanup(support.unlink, path)
498
499class UnixStreamBase(UnixSocketTestBase):
500 """Base class for Unix-domain SOCK_STREAM tests."""
501
502 def newSocket(self):
503 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
504
505
506class InetTestBase(SocketTestBase):
507 """Base class for IPv4 socket tests."""
508
509 host = HOST
510
511 def setUp(self):
512 super().setUp()
513 self.port = self.serv_addr[1]
514
515 def bindSock(self, sock):
516 support.bind_port(sock, host=self.host)
517
518class TCPTestBase(InetTestBase):
519 """Base class for TCP-over-IPv4 tests."""
520
521 def newSocket(self):
522 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
523
524class UDPTestBase(InetTestBase):
525 """Base class for UDP-over-IPv4 tests."""
526
527 def newSocket(self):
528 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
529
530class SCTPStreamBase(InetTestBase):
531 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
532
533 def newSocket(self):
534 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
535 socket.IPPROTO_SCTP)
536
537
538class Inet6TestBase(InetTestBase):
539 """Base class for IPv6 socket tests."""
540
541 # Don't use "localhost" here - it may not have an IPv6 address
542 # assigned to it by default (e.g. in /etc/hosts), and if someone
543 # has assigned it an IPv4-mapped address, then it's unlikely to
544 # work with the full IPv6 API.
545 host = "::1"
546
547class UDP6TestBase(Inet6TestBase):
548 """Base class for UDP-over-IPv6 tests."""
549
550 def newSocket(self):
551 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
552
553
554# Test-skipping decorators for use with ThreadableTest.
555
556def skipWithClientIf(condition, reason):
557 """Skip decorated test if condition is true, add client_skip decorator.
558
559 If the decorated object is not a class, sets its attribute
560 "client_skip" to a decorator which will return an empty function
561 if the test is to be skipped, or the original function if it is
562 not. This can be used to avoid running the client part of a
563 skipped test when using ThreadableTest.
564 """
565 def client_pass(*args, **kwargs):
566 pass
567 def skipdec(obj):
568 retval = unittest.skip(reason)(obj)
569 if not isinstance(obj, type):
570 retval.client_skip = lambda f: client_pass
571 return retval
572 def noskipdec(obj):
573 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
574 obj.client_skip = lambda f: f
575 return obj
576 return skipdec if condition else noskipdec
577
578
579def requireAttrs(obj, *attributes):
580 """Skip decorated test if obj is missing any of the given attributes.
581
582 Sets client_skip attribute as skipWithClientIf() does.
583 """
584 missing = [name for name in attributes if not hasattr(obj, name)]
585 return skipWithClientIf(
586 missing, "don't have " + ", ".join(name for name in missing))
587
588
589def requireSocket(*args):
590 """Skip decorated test if a socket cannot be created with given arguments.
591
592 When an argument is given as a string, will use the value of that
593 attribute of the socket module, or skip the test if it doesn't
594 exist. Sets client_skip attribute as skipWithClientIf() does.
595 """
596 err = None
597 missing = [obj for obj in args if
598 isinstance(obj, str) and not hasattr(socket, obj)]
599 if missing:
600 err = "don't have " + ", ".join(name for name in missing)
601 else:
602 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
603 for obj in args]
604 try:
605 s = socket.socket(*callargs)
606 except socket.error as e:
607 # XXX: check errno?
608 err = str(e)
609 else:
610 s.close()
611 return skipWithClientIf(
612 err is not None,
613 "can't create socket({0}): {1}".format(
614 ", ".join(str(o) for o in args), err))
615
616
Guido van Rossum24e4af82002-06-12 19:18:08 +0000617#######################################################################
618## Begin Tests
619
620class GeneralModuleTests(unittest.TestCase):
621
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000622 def test_repr(self):
623 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000624 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000625 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000626
Raymond Hettinger027bb632004-05-31 03:09:25 +0000627 def test_weakref(self):
628 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
629 p = proxy(s)
630 self.assertEqual(p.fileno(), s.fileno())
631 s.close()
632 s = None
633 try:
634 p.fileno()
635 except ReferenceError:
636 pass
637 else:
638 self.fail('Socket proxy still exists')
639
Guido van Rossum24e4af82002-06-12 19:18:08 +0000640 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000641 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300642 msg = "Error raising socket exception (%s)."
643 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000644 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300645 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000646 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300647 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000648 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000649
Ezio Melotti63e42302011-05-07 19:47:48 +0300650 def testSendtoErrors(self):
651 # Testing that sendto doens't masks failures. See #10169.
652 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
653 self.addCleanup(s.close)
654 s.bind(('', 0))
655 sockname = s.getsockname()
656 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300657 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300658 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300659 self.assertEqual(str(cm.exception),
660 "'str' does not support the buffer interface")
661 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300662 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300663 self.assertEqual(str(cm.exception),
664 "'complex' does not support the buffer interface")
665 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300666 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300667 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300668 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300669 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300670 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300671 self.assertEqual(str(cm.exception),
672 "'str' does not support the buffer interface")
673 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300674 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300675 self.assertEqual(str(cm.exception),
676 "'complex' does not support the buffer interface")
677 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300678 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300679 self.assertIn('not NoneType', str(cm.exception))
680 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300681 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300682 self.assertIn('an integer is required', str(cm.exception))
683 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300684 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300685 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300686 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300687 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300688 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300689 self.assertIn('(1 given)', str(cm.exception))
690 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300691 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300692 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300693
Guido van Rossum24e4af82002-06-12 19:18:08 +0000694 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000695 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000696 socket.AF_INET
697 socket.SOCK_STREAM
698 socket.SOCK_DGRAM
699 socket.SOCK_RAW
700 socket.SOCK_RDM
701 socket.SOCK_SEQPACKET
702 socket.SOL_SOCKET
703 socket.SO_REUSEADDR
704
Guido van Rossum654c11e2002-06-13 20:24:17 +0000705 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000706 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000707 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000708 try:
709 ip = socket.gethostbyname(hostname)
710 except socket.error:
711 # Probably name lookup wasn't set up right; skip this test
712 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000713 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000714 try:
715 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
716 except socket.error:
717 # Probably a similar problem as above; skip this test
718 return
Brett Cannon01668a12005-03-11 00:04:17 +0000719 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000720 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000721 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000722 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000723
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000724 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
725 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
726 def test_sethostname(self):
727 oldhn = socket.gethostname()
728 try:
729 socket.sethostname('new')
730 except socket.error as e:
731 if e.errno == errno.EPERM:
732 self.skipTest("test should be run as root")
733 else:
734 raise
735 try:
736 # running test as root!
737 self.assertEqual(socket.gethostname(), 'new')
738 # Should work with bytes objects too
739 socket.sethostname(b'bar')
740 self.assertEqual(socket.gethostname(), 'bar')
741 finally:
742 socket.sethostname(oldhn)
743
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700744 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
745 'socket.if_nameindex() not available.')
746 def testInterfaceNameIndex(self):
747 interfaces = socket.if_nameindex()
748 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200749 self.assertIsInstance(index, int)
750 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700751 # interface indices are non-zero integers
752 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200753 _index = socket.if_nametoindex(name)
754 self.assertIsInstance(_index, int)
755 self.assertEqual(index, _index)
756 _name = socket.if_indextoname(index)
757 self.assertIsInstance(_name, str)
758 self.assertEqual(name, _name)
759
760 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
761 'socket.if_nameindex() not available.')
762 def testInvalidInterfaceNameIndex(self):
763 # test nonexistent interface index/name
764 self.assertRaises(socket.error, socket.if_indextoname, 0)
765 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
766 # test with invalid values
767 self.assertRaises(TypeError, socket.if_nametoindex, 0)
768 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700769
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000770 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000771 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000772 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000773 try:
774 # On some versions, this loses a reference
775 orig = sys.getrefcount(__name__)
776 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000777 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000778 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000779 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000780
Guido van Rossum24e4af82002-06-12 19:18:08 +0000781 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000782 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000783 try:
784 # On some versions, this crashes the interpreter.
785 socket.getnameinfo(('x', 0, 0, 0), 0)
786 except socket.error:
787 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000788
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000789 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000790 # This just checks that htons etc. are their own inverse,
791 # when looking at the lower 16 or 32 bits.
792 sizes = {socket.htonl: 32, socket.ntohl: 32,
793 socket.htons: 16, socket.ntohs: 16}
794 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000795 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000796 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
797 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000798
Guido van Rossuma2627af2002-09-14 00:58:46 +0000799 swapped = func(mask)
800 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000801 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000802
Guido van Rossum018919a2007-01-15 00:07:32 +0000803 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000804 good_values = [ 1, 2, 3, 1, 2, 3 ]
805 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000806 for k in good_values:
807 socket.ntohl(k)
808 socket.ntohs(k)
809 socket.htonl(k)
810 socket.htons(k)
811 for k in bad_values:
812 self.assertRaises(OverflowError, socket.ntohl, k)
813 self.assertRaises(OverflowError, socket.ntohs, k)
814 self.assertRaises(OverflowError, socket.htonl, k)
815 self.assertRaises(OverflowError, socket.htons, k)
816
Barry Warsaw11b91a02004-06-28 00:50:43 +0000817 def testGetServBy(self):
818 eq = self.assertEqual
819 # Find one service that exists, then check all the related interfaces.
820 # I've ordered this by protocols that have both a tcp and udp
821 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200822 if (sys.platform.startswith(('freebsd', 'netbsd'))
823 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000824 # avoid the 'echo' service on this platform, as there is an
825 # assumption breaking non-standard port/protocol entry
826 services = ('daytime', 'qotd', 'domain')
827 else:
828 services = ('echo', 'daytime', 'domain')
829 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000830 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000831 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000832 break
833 except socket.error:
834 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000835 else:
836 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000837 # Try same call with optional protocol omitted
838 port2 = socket.getservbyname(service)
839 eq(port, port2)
840 # Try udp, but don't barf it it doesn't exist
841 try:
842 udpport = socket.getservbyname(service, 'udp')
843 except socket.error:
844 udpport = None
845 else:
846 eq(udpport, port)
847 # Now make sure the lookup by port returns the same service name
848 eq(socket.getservbyport(port2), service)
849 eq(socket.getservbyport(port, 'tcp'), service)
850 if udpport is not None:
851 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000852 # Make sure getservbyport does not accept out of range ports.
853 self.assertRaises(OverflowError, socket.getservbyport, -1)
854 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000855
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000856 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000857 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000858 # The default timeout should initially be None
859 self.assertEqual(socket.getdefaulttimeout(), None)
860 s = socket.socket()
861 self.assertEqual(s.gettimeout(), None)
862 s.close()
863
864 # Set the default timeout to 10, and see if it propagates
865 socket.setdefaulttimeout(10)
866 self.assertEqual(socket.getdefaulttimeout(), 10)
867 s = socket.socket()
868 self.assertEqual(s.gettimeout(), 10)
869 s.close()
870
871 # Reset the default timeout to None, and see if it propagates
872 socket.setdefaulttimeout(None)
873 self.assertEqual(socket.getdefaulttimeout(), None)
874 s = socket.socket()
875 self.assertEqual(s.gettimeout(), None)
876 s.close()
877
878 # Check that setting it to an invalid value raises ValueError
879 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
880
881 # Check that setting it to an invalid type raises TypeError
882 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
883
Benjamin Petersonf91df042009-02-13 02:50:59 +0000884 def testIPv4_inet_aton_fourbytes(self):
885 if not hasattr(socket, 'inet_aton'):
886 return # No inet_aton, nothing to check
887 # Test that issue1008086 and issue767150 are fixed.
888 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000889 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
890 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000891
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000892 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000893 if not hasattr(socket, 'inet_pton'):
894 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000895 from socket import inet_aton as f, inet_pton, AF_INET
896 g = lambda a: inet_pton(AF_INET, a)
897
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100898 assertInvalid = lambda func,a: self.assertRaises(
899 (socket.error, ValueError), func, a
900 )
901
Ezio Melottib3aedd42010-11-20 19:04:17 +0000902 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
903 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
904 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
905 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
906 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100907 assertInvalid(f, '0.0.0.')
908 assertInvalid(f, '300.0.0.0')
909 assertInvalid(f, 'a.0.0.0')
910 assertInvalid(f, '1.2.3.4.5')
911 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000912
Ezio Melottib3aedd42010-11-20 19:04:17 +0000913 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
914 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
915 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
916 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100917 assertInvalid(g, '0.0.0.')
918 assertInvalid(g, '300.0.0.0')
919 assertInvalid(g, 'a.0.0.0')
920 assertInvalid(g, '1.2.3.4.5')
921 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +0000922
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000923 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000924 if not hasattr(socket, 'inet_pton'):
925 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000926 try:
927 from socket import inet_pton, AF_INET6, has_ipv6
928 if not has_ipv6:
929 return
930 except ImportError:
931 return
932 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100933 assertInvalid = lambda a: self.assertRaises(
934 (socket.error, ValueError), f, a
935 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000936
Ezio Melottib3aedd42010-11-20 19:04:17 +0000937 self.assertEqual(b'\x00' * 16, f('::'))
938 self.assertEqual(b'\x00' * 16, f('0::0'))
939 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
940 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000941 b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000942 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
943 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100944 self.assertEqual(
945 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
946 f('ad42:abc::127:0:254:2')
947 )
948 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
949 assertInvalid('0x20::')
950 assertInvalid(':::')
951 assertInvalid('::0::')
952 assertInvalid('1::abc::')
953 assertInvalid('1::abc::def')
954 assertInvalid('1:2:3:4:5:6:')
955 assertInvalid('1:2:3:4:5:6')
956 assertInvalid('1:2:3:4:5:6:7:8:')
957 assertInvalid('1:2:3:4:5:6:7:8:0')
958
959 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
960 f('::254.42.23.64')
961 )
962 self.assertEqual(
963 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
964 f('42::a29b:254.42.23.64')
965 )
966 self.assertEqual(
967 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
968 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
969 )
970 assertInvalid('255.254.253.252')
971 assertInvalid('1::260.2.3.0')
972 assertInvalid('1::0.be.e.0')
973 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
974 assertInvalid('::1.2.3.4:0')
975 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +0000976
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000977 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000978 if not hasattr(socket, 'inet_ntop'):
979 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000980 from socket import inet_ntoa as f, inet_ntop, AF_INET
981 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100982 assertInvalid = lambda func,a: self.assertRaises(
983 (socket.error, ValueError), func, a
984 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000985
Ezio Melottib3aedd42010-11-20 19:04:17 +0000986 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
987 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
988 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
989 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100990 assertInvalid(f, b'\x00' * 3)
991 assertInvalid(f, b'\x00' * 5)
992 assertInvalid(f, b'\x00' * 16)
Tim Petersc2659cf2003-05-12 20:19:37 +0000993
Ezio Melottib3aedd42010-11-20 19:04:17 +0000994 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
995 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
996 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +0100997 assertInvalid(g, b'\x00' * 3)
998 assertInvalid(g, b'\x00' * 5)
999 assertInvalid(g, b'\x00' * 16)
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001000
1001 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +00001002 if not hasattr(socket, 'inet_ntop'):
1003 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001004 try:
1005 from socket import inet_ntop, AF_INET6, has_ipv6
1006 if not has_ipv6:
1007 return
1008 except ImportError:
1009 return
1010 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001011 assertInvalid = lambda a: self.assertRaises(
1012 (socket.error, ValueError), f, a
1013 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001014
Ezio Melottib3aedd42010-11-20 19:04:17 +00001015 self.assertEqual('::', f(b'\x00' * 16))
1016 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1017 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001018 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001019 f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001020 )
1021
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001022 assertInvalid(b'\x12' * 15)
1023 assertInvalid(b'\x12' * 17)
1024 assertInvalid(b'\x12' * 4)
1025
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001026 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001027
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001028 def testSockName(self):
1029 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001030 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001031 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001032 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001033 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001034 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001035 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1036 # it reasonable to get the host's addr in addition to 0.0.0.0.
1037 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001038 try:
1039 my_ip_addr = socket.gethostbyname(socket.gethostname())
1040 except socket.error:
1041 # Probably name lookup wasn't set up right; skip this test
1042 return
Benjamin Peterson577473f2010-01-19 00:09:57 +00001043 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001044 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001045
1046 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001047 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001048 # We know a socket should start without reuse==0
1049 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001050 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001051 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001052 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001053
1054 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001055 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001056 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001057 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001058 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1059 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001060 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001061
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001062 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001063 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001064 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1065 sock.settimeout(1)
1066 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +00001067 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001068
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001069 def testNewAttributes(self):
1070 # testing .family, .type and .protocol
1071 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1072 self.assertEqual(sock.family, socket.AF_INET)
1073 self.assertEqual(sock.type, socket.SOCK_STREAM)
1074 self.assertEqual(sock.proto, 0)
1075 sock.close()
1076
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001077 def test_getsockaddrarg(self):
1078 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001079 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001080 big_port = port + 65536
1081 neg_port = port - 65536
1082 sock = socket.socket()
1083 try:
1084 self.assertRaises(OverflowError, sock.bind, (host, big_port))
1085 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
1086 sock.bind((host, port))
1087 finally:
1088 sock.close()
1089
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001090 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001091 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001092 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1093 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1094 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1095 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001096 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1097 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001098 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001099 self.assertRaises(ValueError, s.ioctl, -1, None)
1100 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001101
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001102 def testGetaddrinfo(self):
1103 try:
1104 socket.getaddrinfo('localhost', 80)
1105 except socket.gaierror as err:
1106 if err.errno == socket.EAI_SERVICE:
1107 # see http://bugs.python.org/issue1282647
1108 self.skipTest("buggy libc version")
1109 raise
1110 # len of every sequence is supposed to be == 5
1111 for info in socket.getaddrinfo(HOST, None):
1112 self.assertEqual(len(info), 5)
1113 # host can be a domain name, a string representation of an
1114 # IPv4/v6 address or None
1115 socket.getaddrinfo('localhost', 80)
1116 socket.getaddrinfo('127.0.0.1', 80)
1117 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001118 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001119 socket.getaddrinfo('::1', 80)
1120 # port can be a string service name such as "http", a numeric
1121 # port number or None
1122 socket.getaddrinfo(HOST, "http")
1123 socket.getaddrinfo(HOST, 80)
1124 socket.getaddrinfo(HOST, None)
1125 # test family and socktype filters
1126 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1127 for family, _, _, _, _ in infos:
1128 self.assertEqual(family, socket.AF_INET)
1129 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1130 for _, socktype, _, _, _ in infos:
1131 self.assertEqual(socktype, socket.SOCK_STREAM)
1132 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001133 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001134 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1135 # a server willing to support both IPv4 and IPv6 will
1136 # usually do this
1137 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1138 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001139 # test keyword arguments
1140 a = socket.getaddrinfo(HOST, None)
1141 b = socket.getaddrinfo(host=HOST, port=None)
1142 self.assertEqual(a, b)
1143 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1144 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1145 self.assertEqual(a, b)
1146 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1147 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1148 self.assertEqual(a, b)
1149 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1150 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1151 self.assertEqual(a, b)
1152 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1153 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1154 self.assertEqual(a, b)
1155 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1156 socket.AI_PASSIVE)
1157 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1158 type=socket.SOCK_STREAM, proto=0,
1159 flags=socket.AI_PASSIVE)
1160 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001161 # Issue #6697.
1162 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001163
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001164 def test_getnameinfo(self):
1165 # only IP addresses are allowed
1166 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
1167
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001168 @unittest.skipUnless(support.is_resource_enabled('network'),
1169 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001170 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +00001171 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001172 # these should all be successful
1173 socket.gethostbyname('испытание.python.org')
1174 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001175 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1176 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1177 # have a reverse entry yet
1178 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001179
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001180 def check_sendall_interrupted(self, with_timeout):
1181 # socketpair() is not stricly required, but it makes things easier.
1182 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1183 self.skipTest("signal.alarm and socket.socketpair required for this test")
1184 # Our signal handlers clobber the C errno by calling a math function
1185 # with an invalid domain value.
1186 def ok_handler(*args):
1187 self.assertRaises(ValueError, math.acosh, 0)
1188 def raising_handler(*args):
1189 self.assertRaises(ValueError, math.acosh, 0)
1190 1 // 0
1191 c, s = socket.socketpair()
1192 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1193 try:
1194 if with_timeout:
1195 # Just above the one second minimum for signal.alarm
1196 c.settimeout(1.5)
1197 with self.assertRaises(ZeroDivisionError):
1198 signal.alarm(1)
1199 c.sendall(b"x" * (1024**2))
1200 if with_timeout:
1201 signal.signal(signal.SIGALRM, ok_handler)
1202 signal.alarm(1)
1203 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1204 finally:
1205 signal.signal(signal.SIGALRM, old_alarm)
1206 c.close()
1207 s.close()
1208
1209 def test_sendall_interrupted(self):
1210 self.check_sendall_interrupted(False)
1211
1212 def test_sendall_interrupted_with_timeout(self):
1213 self.check_sendall_interrupted(True)
1214
Antoine Pitroue033e062010-10-29 10:38:18 +00001215 def test_dealloc_warn(self):
1216 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1217 r = repr(sock)
1218 with self.assertWarns(ResourceWarning) as cm:
1219 sock = None
1220 support.gc_collect()
1221 self.assertIn(r, str(cm.warning.args[0]))
1222 # An open socket file object gets dereferenced after the socket
1223 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1224 f = sock.makefile('rb')
1225 r = repr(sock)
1226 sock = None
1227 support.gc_collect()
1228 with self.assertWarns(ResourceWarning):
1229 f = None
1230 support.gc_collect()
1231
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001232 def test_name_closed_socketio(self):
1233 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1234 fp = sock.makefile("rb")
1235 fp.close()
1236 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1237
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001238 def test_pickle(self):
1239 sock = socket.socket()
1240 with sock:
1241 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1242 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1243
Antoine Pitrou3cade992011-05-10 19:19:13 +02001244 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001245 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1246 srv.bind((HOST, 0))
1247 # backlog = 0
1248 srv.listen(0)
1249 srv.close()
1250
Charles-François Natali42663332012-01-02 15:57:30 +01001251 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001252 def test_flowinfo(self):
1253 self.assertRaises(OverflowError, socket.getnameinfo,
1254 ('::1',0, 0xffffffff), 0)
1255 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
1256 self.assertRaises(OverflowError, s.bind, ('::1', 0, -10))
1257
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001258
Charles-François Natali47413c12011-10-06 19:47:44 +02001259@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1260class BasicCANTest(unittest.TestCase):
1261
1262 def testCrucialConstants(self):
1263 socket.AF_CAN
1264 socket.PF_CAN
1265 socket.CAN_RAW
1266
1267 def testCreateSocket(self):
1268 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1269 pass
1270
1271 def testBindAny(self):
1272 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1273 s.bind(('', ))
1274
1275 def testTooLongInterfaceName(self):
1276 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1277 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001278 self.assertRaisesRegex(socket.error, 'interface name too long',
1279 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001280
1281 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1282 'socket.CAN_RAW_LOOPBACK required for this test.')
1283 def testLoopback(self):
1284 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1285 for loopback in (0, 1):
1286 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1287 loopback)
1288 self.assertEqual(loopback,
1289 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1290
1291 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1292 'socket.CAN_RAW_FILTER required for this test.')
1293 def testFilter(self):
1294 can_id, can_mask = 0x200, 0x700
1295 can_filter = struct.pack("=II", can_id, can_mask)
1296 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1297 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1298 self.assertEqual(can_filter,
1299 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1300
1301
1302@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1303@unittest.skipUnless(thread, 'Threading required for this test.')
1304class CANTest(ThreadedCANSocketTest):
1305
1306 """The CAN frame structure is defined in <linux/can.h>:
1307
1308 struct can_frame {
1309 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1310 __u8 can_dlc; /* data length code: 0 .. 8 */
1311 __u8 data[8] __attribute__((aligned(8)));
1312 };
1313 """
1314 can_frame_fmt = "=IB3x8s"
1315
1316 def __init__(self, methodName='runTest'):
1317 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1318
1319 @classmethod
1320 def build_can_frame(cls, can_id, data):
1321 """Build a CAN frame."""
1322 can_dlc = len(data)
1323 data = data.ljust(8, b'\x00')
1324 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1325
1326 @classmethod
1327 def dissect_can_frame(cls, frame):
1328 """Dissect a CAN frame."""
1329 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1330 return (can_id, can_dlc, data[:can_dlc])
1331
1332 def testSendFrame(self):
1333 cf, addr = self.s.recvfrom(self.bufsize)
1334 self.assertEqual(self.cf, cf)
1335 self.assertEqual(addr[0], self.interface)
1336 self.assertEqual(addr[1], socket.AF_CAN)
1337
1338 def _testSendFrame(self):
1339 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1340 self.cli.send(self.cf)
1341
1342 def testSendMaxFrame(self):
1343 cf, addr = self.s.recvfrom(self.bufsize)
1344 self.assertEqual(self.cf, cf)
1345
1346 def _testSendMaxFrame(self):
1347 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1348 self.cli.send(self.cf)
1349
1350 def testSendMultiFrames(self):
1351 cf, addr = self.s.recvfrom(self.bufsize)
1352 self.assertEqual(self.cf1, cf)
1353
1354 cf, addr = self.s.recvfrom(self.bufsize)
1355 self.assertEqual(self.cf2, cf)
1356
1357 def _testSendMultiFrames(self):
1358 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1359 self.cli.send(self.cf1)
1360
1361 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1362 self.cli.send(self.cf2)
1363
1364
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001365@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1366class BasicRDSTest(unittest.TestCase):
1367
1368 def testCrucialConstants(self):
1369 socket.AF_RDS
1370 socket.PF_RDS
1371
1372 def testCreateSocket(self):
1373 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1374 pass
1375
1376 def testSocketBufferSize(self):
1377 bufsize = 16384
1378 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1379 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1380 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1381
1382
1383@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1384@unittest.skipUnless(thread, 'Threading required for this test.')
1385class RDSTest(ThreadedRDSSocketTest):
1386
1387 def __init__(self, methodName='runTest'):
1388 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1389
Charles-François Natali240c55f2011-11-10 20:33:36 +01001390 def setUp(self):
1391 super().setUp()
1392 self.evt = threading.Event()
1393
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001394 def testSendAndRecv(self):
1395 data, addr = self.serv.recvfrom(self.bufsize)
1396 self.assertEqual(self.data, data)
1397 self.assertEqual(self.cli_addr, addr)
1398
1399 def _testSendAndRecv(self):
1400 self.data = b'spam'
1401 self.cli.sendto(self.data, 0, (HOST, self.port))
1402
1403 def testPeek(self):
1404 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1405 self.assertEqual(self.data, data)
1406 data, addr = self.serv.recvfrom(self.bufsize)
1407 self.assertEqual(self.data, data)
1408
1409 def _testPeek(self):
1410 self.data = b'spam'
1411 self.cli.sendto(self.data, 0, (HOST, self.port))
1412
1413 @requireAttrs(socket.socket, 'recvmsg')
1414 def testSendAndRecvMsg(self):
1415 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1416 self.assertEqual(self.data, data)
1417
1418 @requireAttrs(socket.socket, 'sendmsg')
1419 def _testSendAndRecvMsg(self):
1420 self.data = b'hello ' * 10
1421 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1422
1423 def testSendAndRecvMulti(self):
1424 data, addr = self.serv.recvfrom(self.bufsize)
1425 self.assertEqual(self.data1, data)
1426
1427 data, addr = self.serv.recvfrom(self.bufsize)
1428 self.assertEqual(self.data2, data)
1429
1430 def _testSendAndRecvMulti(self):
1431 self.data1 = b'bacon'
1432 self.cli.sendto(self.data1, 0, (HOST, self.port))
1433
1434 self.data2 = b'egg'
1435 self.cli.sendto(self.data2, 0, (HOST, self.port))
1436
1437 def testSelect(self):
1438 r, w, x = select.select([self.serv], [], [], 3.0)
1439 self.assertIn(self.serv, r)
1440 data, addr = self.serv.recvfrom(self.bufsize)
1441 self.assertEqual(self.data, data)
1442
1443 def _testSelect(self):
1444 self.data = b'select'
1445 self.cli.sendto(self.data, 0, (HOST, self.port))
1446
1447 def testCongestion(self):
1448 # wait until the sender is done
1449 self.evt.wait()
1450
1451 def _testCongestion(self):
1452 # test the behavior in case of congestion
1453 self.data = b'fill'
1454 self.cli.setblocking(False)
1455 try:
1456 # try to lower the receiver's socket buffer size
1457 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1458 except OSError:
1459 pass
1460 with self.assertRaises(OSError) as cm:
1461 try:
1462 # fill the receiver's socket buffer
1463 while True:
1464 self.cli.sendto(self.data, 0, (HOST, self.port))
1465 finally:
1466 # signal the receiver we're done
1467 self.evt.set()
1468 # sendto() should have failed with ENOBUFS
1469 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1470 # and we should have received a congestion notification through poll
1471 r, w, x = select.select([self.serv], [], [], 3.0)
1472 self.assertIn(self.serv, r)
1473
1474
Victor Stinner45df8202010-04-28 22:31:17 +00001475@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001476class BasicTCPTest(SocketConnectedTest):
1477
1478 def __init__(self, methodName='runTest'):
1479 SocketConnectedTest.__init__(self, methodName=methodName)
1480
1481 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001482 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001483 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001484 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001485
1486 def _testRecv(self):
1487 self.serv_conn.send(MSG)
1488
1489 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001490 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001491 seg1 = self.cli_conn.recv(len(MSG) - 3)
1492 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001493 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001494 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001495
1496 def _testOverFlowRecv(self):
1497 self.serv_conn.send(MSG)
1498
1499 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001500 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001501 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001502 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001503
1504 def _testRecvFrom(self):
1505 self.serv_conn.send(MSG)
1506
1507 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001508 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001509 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1510 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001511 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001512 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001513
1514 def _testOverFlowRecvFrom(self):
1515 self.serv_conn.send(MSG)
1516
1517 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001518 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001519 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001520 while 1:
1521 read = self.cli_conn.recv(1024)
1522 if not read:
1523 break
Guido van Rossume531e292002-08-08 20:28:34 +00001524 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001525 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001526
1527 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001528 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001529 self.serv_conn.sendall(big_chunk)
1530
1531 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001532 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001533 fd = self.cli_conn.fileno()
1534 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001535 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001536 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001537 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001538 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001539
1540 def _testFromFd(self):
1541 self.serv_conn.send(MSG)
1542
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001543 def testDup(self):
1544 # Testing dup()
1545 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001546 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001547 msg = sock.recv(1024)
1548 self.assertEqual(msg, MSG)
1549
1550 def _testDup(self):
1551 self.serv_conn.send(MSG)
1552
Guido van Rossum24e4af82002-06-12 19:18:08 +00001553 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001554 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001555 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001556 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001557 # wait for _testShutdown to finish: on OS X, when the server
1558 # closes the connection the client also becomes disconnected,
1559 # and the client's shutdown call will fail. (Issue #4397.)
1560 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001561
1562 def _testShutdown(self):
1563 self.serv_conn.send(MSG)
1564 self.serv_conn.shutdown(2)
1565
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001566 def testDetach(self):
1567 # Testing detach()
1568 fileno = self.cli_conn.fileno()
1569 f = self.cli_conn.detach()
1570 self.assertEqual(f, fileno)
1571 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001572 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1573 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001574 # ...but we can create another socket using the (still open)
1575 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001576 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001577 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001578 msg = sock.recv(1024)
1579 self.assertEqual(msg, MSG)
1580
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001581 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001582 self.serv_conn.send(MSG)
1583
Victor Stinner45df8202010-04-28 22:31:17 +00001584@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001585class BasicUDPTest(ThreadedUDPSocketTest):
1586
1587 def __init__(self, methodName='runTest'):
1588 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1589
1590 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001591 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001592 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001593 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001594
1595 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001596 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001597
Guido van Rossum1c938012002-06-12 21:17:20 +00001598 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001599 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001600 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001601 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001602
Guido van Rossum1c938012002-06-12 21:17:20 +00001603 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001604 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001605
Guido van Rossumd8faa362007-04-27 19:54:29 +00001606 def testRecvFromNegative(self):
1607 # Negative lengths passed to recvfrom should give ValueError.
1608 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1609
1610 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001611 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001612
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001613# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1614# same test code is used with different families and types of socket
1615# (e.g. stream, datagram), and tests using recvmsg() are repeated
1616# using recvmsg_into().
1617#
1618# The generic test classes such as SendmsgTests and
1619# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1620# supplied with sockets cli_sock and serv_sock representing the
1621# client's and the server's end of the connection respectively, and
1622# attributes cli_addr and serv_addr holding their (numeric where
1623# appropriate) addresses.
1624#
1625# The final concrete test classes combine these with subclasses of
1626# SocketTestBase which set up client and server sockets of a specific
1627# type, and with subclasses of SendrecvmsgBase such as
1628# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1629# sockets to cli_sock and serv_sock and override the methods and
1630# attributes of SendrecvmsgBase to fill in destination addresses if
1631# needed when sending, check for specific flags in msg_flags, etc.
1632#
1633# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1634# recvmsg_into().
1635
1636# XXX: like the other datagram (UDP) tests in this module, the code
1637# here assumes that datagram delivery on the local machine will be
1638# reliable.
1639
1640class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1641 # Base class for sendmsg()/recvmsg() tests.
1642
1643 # Time in seconds to wait before considering a test failed, or
1644 # None for no timeout. Not all tests actually set a timeout.
1645 fail_timeout = 3.0
1646
1647 def setUp(self):
1648 self.misc_event = threading.Event()
1649 super().setUp()
1650
1651 def sendToServer(self, msg):
1652 # Send msg to the server.
1653 return self.cli_sock.send(msg)
1654
1655 # Tuple of alternative default arguments for sendmsg() when called
1656 # via sendmsgToServer() (e.g. to include a destination address).
1657 sendmsg_to_server_defaults = ()
1658
1659 def sendmsgToServer(self, *args):
1660 # Call sendmsg() on self.cli_sock with the given arguments,
1661 # filling in any arguments which are not supplied with the
1662 # corresponding items of self.sendmsg_to_server_defaults, if
1663 # any.
1664 return self.cli_sock.sendmsg(
1665 *(args + self.sendmsg_to_server_defaults[len(args):]))
1666
1667 def doRecvmsg(self, sock, bufsize, *args):
1668 # Call recvmsg() on sock with given arguments and return its
1669 # result. Should be used for tests which can use either
1670 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1671 # this method with one which emulates it using recvmsg_into(),
1672 # thus allowing the same test to be used for both methods.
1673 result = sock.recvmsg(bufsize, *args)
1674 self.registerRecvmsgResult(result)
1675 return result
1676
1677 def registerRecvmsgResult(self, result):
1678 # Called by doRecvmsg() with the return value of recvmsg() or
1679 # recvmsg_into(). Can be overridden to arrange cleanup based
1680 # on the returned ancillary data, for instance.
1681 pass
1682
1683 def checkRecvmsgAddress(self, addr1, addr2):
1684 # Called to compare the received address with the address of
1685 # the peer.
1686 self.assertEqual(addr1, addr2)
1687
1688 # Flags that are normally unset in msg_flags
1689 msg_flags_common_unset = 0
1690 for name in ("MSG_CTRUNC", "MSG_OOB"):
1691 msg_flags_common_unset |= getattr(socket, name, 0)
1692
1693 # Flags that are normally set
1694 msg_flags_common_set = 0
1695
1696 # Flags set when a complete record has been received (e.g. MSG_EOR
1697 # for SCTP)
1698 msg_flags_eor_indicator = 0
1699
1700 # Flags set when a complete record has not been received
1701 # (e.g. MSG_TRUNC for datagram sockets)
1702 msg_flags_non_eor_indicator = 0
1703
1704 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1705 # Method to check the value of msg_flags returned by recvmsg[_into]().
1706 #
1707 # Checks that all bits in msg_flags_common_set attribute are
1708 # set in "flags" and all bits in msg_flags_common_unset are
1709 # unset.
1710 #
1711 # The "eor" argument specifies whether the flags should
1712 # indicate that a full record (or datagram) has been received.
1713 # If "eor" is None, no checks are done; otherwise, checks
1714 # that:
1715 #
1716 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1717 # set and all bits in msg_flags_non_eor_indicator are unset
1718 #
1719 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1720 # are set and all bits in msg_flags_eor_indicator are unset
1721 #
1722 # If "checkset" and/or "checkunset" are supplied, they require
1723 # the given bits to be set or unset respectively, overriding
1724 # what the attributes require for those bits.
1725 #
1726 # If any bits are set in "ignore", they will not be checked,
1727 # regardless of the other inputs.
1728 #
1729 # Will raise Exception if the inputs require a bit to be both
1730 # set and unset, and it is not ignored.
1731
1732 defaultset = self.msg_flags_common_set
1733 defaultunset = self.msg_flags_common_unset
1734
1735 if eor:
1736 defaultset |= self.msg_flags_eor_indicator
1737 defaultunset |= self.msg_flags_non_eor_indicator
1738 elif eor is not None:
1739 defaultset |= self.msg_flags_non_eor_indicator
1740 defaultunset |= self.msg_flags_eor_indicator
1741
1742 # Function arguments override defaults
1743 defaultset &= ~checkunset
1744 defaultunset &= ~checkset
1745
1746 # Merge arguments with remaining defaults, and check for conflicts
1747 checkset |= defaultset
1748 checkunset |= defaultunset
1749 inboth = checkset & checkunset & ~ignore
1750 if inboth:
1751 raise Exception("contradictory set, unset requirements for flags "
1752 "{0:#x}".format(inboth))
1753
1754 # Compare with given msg_flags value
1755 mask = (checkset | checkunset) & ~ignore
1756 self.assertEqual(flags & mask, checkset & mask)
1757
1758
1759class RecvmsgIntoMixin(SendrecvmsgBase):
1760 # Mixin to implement doRecvmsg() using recvmsg_into().
1761
1762 def doRecvmsg(self, sock, bufsize, *args):
1763 buf = bytearray(bufsize)
1764 result = sock.recvmsg_into([buf], *args)
1765 self.registerRecvmsgResult(result)
1766 self.assertGreaterEqual(result[0], 0)
1767 self.assertLessEqual(result[0], bufsize)
1768 return (bytes(buf[:result[0]]),) + result[1:]
1769
1770
1771class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1772 # Defines flags to be checked in msg_flags for datagram sockets.
1773
1774 @property
1775 def msg_flags_non_eor_indicator(self):
1776 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1777
1778
1779class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1780 # Defines flags to be checked in msg_flags for SCTP sockets.
1781
1782 @property
1783 def msg_flags_eor_indicator(self):
1784 return super().msg_flags_eor_indicator | socket.MSG_EOR
1785
1786
1787class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1788 # Base class for tests on connectionless-mode sockets. Users must
1789 # supply sockets on attributes cli and serv to be mapped to
1790 # cli_sock and serv_sock respectively.
1791
1792 @property
1793 def serv_sock(self):
1794 return self.serv
1795
1796 @property
1797 def cli_sock(self):
1798 return self.cli
1799
1800 @property
1801 def sendmsg_to_server_defaults(self):
1802 return ([], [], 0, self.serv_addr)
1803
1804 def sendToServer(self, msg):
1805 return self.cli_sock.sendto(msg, self.serv_addr)
1806
1807
1808class SendrecvmsgConnectedBase(SendrecvmsgBase):
1809 # Base class for tests on connected sockets. Users must supply
1810 # sockets on attributes serv_conn and cli_conn (representing the
1811 # connections *to* the server and the client), to be mapped to
1812 # cli_sock and serv_sock respectively.
1813
1814 @property
1815 def serv_sock(self):
1816 return self.cli_conn
1817
1818 @property
1819 def cli_sock(self):
1820 return self.serv_conn
1821
1822 def checkRecvmsgAddress(self, addr1, addr2):
1823 # Address is currently "unspecified" for a connected socket,
1824 # so we don't examine it
1825 pass
1826
1827
1828class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1829 # Base class to set a timeout on server's socket.
1830
1831 def setUp(self):
1832 super().setUp()
1833 self.serv_sock.settimeout(self.fail_timeout)
1834
1835
1836class SendmsgTests(SendrecvmsgServerTimeoutBase):
1837 # Tests for sendmsg() which can use any socket type and do not
1838 # involve recvmsg() or recvmsg_into().
1839
1840 def testSendmsg(self):
1841 # Send a simple message with sendmsg().
1842 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1843
1844 def _testSendmsg(self):
1845 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1846
1847 def testSendmsgDataGenerator(self):
1848 # Send from buffer obtained from a generator (not a sequence).
1849 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1850
1851 def _testSendmsgDataGenerator(self):
1852 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1853 len(MSG))
1854
1855 def testSendmsgAncillaryGenerator(self):
1856 # Gather (empty) ancillary data from a generator.
1857 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1858
1859 def _testSendmsgAncillaryGenerator(self):
1860 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1861 len(MSG))
1862
1863 def testSendmsgArray(self):
1864 # Send data from an array instead of the usual bytes object.
1865 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1866
1867 def _testSendmsgArray(self):
1868 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1869 len(MSG))
1870
1871 def testSendmsgGather(self):
1872 # Send message data from more than one buffer (gather write).
1873 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1874
1875 def _testSendmsgGather(self):
1876 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1877
1878 def testSendmsgBadArgs(self):
1879 # Check that sendmsg() rejects invalid arguments.
1880 self.assertEqual(self.serv_sock.recv(1000), b"done")
1881
1882 def _testSendmsgBadArgs(self):
1883 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1884 self.assertRaises(TypeError, self.sendmsgToServer,
1885 b"not in an iterable")
1886 self.assertRaises(TypeError, self.sendmsgToServer,
1887 object())
1888 self.assertRaises(TypeError, self.sendmsgToServer,
1889 [object()])
1890 self.assertRaises(TypeError, self.sendmsgToServer,
1891 [MSG, object()])
1892 self.assertRaises(TypeError, self.sendmsgToServer,
1893 [MSG], object())
1894 self.assertRaises(TypeError, self.sendmsgToServer,
1895 [MSG], [], object())
1896 self.assertRaises(TypeError, self.sendmsgToServer,
1897 [MSG], [], 0, object())
1898 self.sendToServer(b"done")
1899
1900 def testSendmsgBadCmsg(self):
1901 # Check that invalid ancillary data items are rejected.
1902 self.assertEqual(self.serv_sock.recv(1000), b"done")
1903
1904 def _testSendmsgBadCmsg(self):
1905 self.assertRaises(TypeError, self.sendmsgToServer,
1906 [MSG], [object()])
1907 self.assertRaises(TypeError, self.sendmsgToServer,
1908 [MSG], [(object(), 0, b"data")])
1909 self.assertRaises(TypeError, self.sendmsgToServer,
1910 [MSG], [(0, object(), b"data")])
1911 self.assertRaises(TypeError, self.sendmsgToServer,
1912 [MSG], [(0, 0, object())])
1913 self.assertRaises(TypeError, self.sendmsgToServer,
1914 [MSG], [(0, 0)])
1915 self.assertRaises(TypeError, self.sendmsgToServer,
1916 [MSG], [(0, 0, b"data", 42)])
1917 self.sendToServer(b"done")
1918
1919 @requireAttrs(socket, "CMSG_SPACE")
1920 def testSendmsgBadMultiCmsg(self):
1921 # Check that invalid ancillary data items are rejected when
1922 # more than one item is present.
1923 self.assertEqual(self.serv_sock.recv(1000), b"done")
1924
1925 @testSendmsgBadMultiCmsg.client_skip
1926 def _testSendmsgBadMultiCmsg(self):
1927 self.assertRaises(TypeError, self.sendmsgToServer,
1928 [MSG], [0, 0, b""])
1929 self.assertRaises(TypeError, self.sendmsgToServer,
1930 [MSG], [(0, 0, b""), object()])
1931 self.sendToServer(b"done")
1932
1933 def testSendmsgExcessCmsgReject(self):
1934 # Check that sendmsg() rejects excess ancillary data items
1935 # when the number that can be sent is limited.
1936 self.assertEqual(self.serv_sock.recv(1000), b"done")
1937
1938 def _testSendmsgExcessCmsgReject(self):
1939 if not hasattr(socket, "CMSG_SPACE"):
1940 # Can only send one item
1941 with self.assertRaises(socket.error) as cm:
1942 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1943 self.assertIsNone(cm.exception.errno)
1944 self.sendToServer(b"done")
1945
1946 def testSendmsgAfterClose(self):
1947 # Check that sendmsg() fails on a closed socket.
1948 pass
1949
1950 def _testSendmsgAfterClose(self):
1951 self.cli_sock.close()
1952 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1953
1954
1955class SendmsgStreamTests(SendmsgTests):
1956 # Tests for sendmsg() which require a stream socket and do not
1957 # involve recvmsg() or recvmsg_into().
1958
1959 def testSendmsgExplicitNoneAddr(self):
1960 # Check that peer address can be specified as None.
1961 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1962
1963 def _testSendmsgExplicitNoneAddr(self):
1964 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1965
1966 def testSendmsgTimeout(self):
1967 # Check that timeout works with sendmsg().
1968 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1969 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1970
1971 def _testSendmsgTimeout(self):
1972 try:
1973 self.cli_sock.settimeout(0.03)
1974 with self.assertRaises(socket.timeout):
1975 while True:
1976 self.sendmsgToServer([b"a"*512])
1977 finally:
1978 self.misc_event.set()
1979
1980 # XXX: would be nice to have more tests for sendmsg flags argument.
1981
1982 # Linux supports MSG_DONTWAIT when sending, but in general, it
1983 # only works when receiving. Could add other platforms if they
1984 # support it too.
1985 @skipWithClientIf(sys.platform not in {"linux2"},
1986 "MSG_DONTWAIT not known to work on this platform when "
1987 "sending")
1988 def testSendmsgDontWait(self):
1989 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
1990 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1991 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1992
1993 @testSendmsgDontWait.client_skip
1994 def _testSendmsgDontWait(self):
1995 try:
1996 with self.assertRaises(socket.error) as cm:
1997 while True:
1998 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
1999 self.assertIn(cm.exception.errno,
2000 (errno.EAGAIN, errno.EWOULDBLOCK))
2001 finally:
2002 self.misc_event.set()
2003
2004
2005class SendmsgConnectionlessTests(SendmsgTests):
2006 # Tests for sendmsg() which require a connectionless-mode
2007 # (e.g. datagram) socket, and do not involve recvmsg() or
2008 # recvmsg_into().
2009
2010 def testSendmsgNoDestAddr(self):
2011 # Check that sendmsg() fails when no destination address is
2012 # given for unconnected socket.
2013 pass
2014
2015 def _testSendmsgNoDestAddr(self):
2016 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2017 [MSG])
2018 self.assertRaises(socket.error, self.cli_sock.sendmsg,
2019 [MSG], [], 0, None)
2020
2021
2022class RecvmsgGenericTests(SendrecvmsgBase):
2023 # Tests for recvmsg() which can also be emulated using
2024 # recvmsg_into(), and can use any socket type.
2025
2026 def testRecvmsg(self):
2027 # Receive a simple message with recvmsg[_into]().
2028 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2029 self.assertEqual(msg, MSG)
2030 self.checkRecvmsgAddress(addr, self.cli_addr)
2031 self.assertEqual(ancdata, [])
2032 self.checkFlags(flags, eor=True)
2033
2034 def _testRecvmsg(self):
2035 self.sendToServer(MSG)
2036
2037 def testRecvmsgExplicitDefaults(self):
2038 # Test recvmsg[_into]() with default arguments provided explicitly.
2039 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2040 len(MSG), 0, 0)
2041 self.assertEqual(msg, MSG)
2042 self.checkRecvmsgAddress(addr, self.cli_addr)
2043 self.assertEqual(ancdata, [])
2044 self.checkFlags(flags, eor=True)
2045
2046 def _testRecvmsgExplicitDefaults(self):
2047 self.sendToServer(MSG)
2048
2049 def testRecvmsgShorter(self):
2050 # Receive a message smaller than buffer.
2051 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2052 len(MSG) + 42)
2053 self.assertEqual(msg, MSG)
2054 self.checkRecvmsgAddress(addr, self.cli_addr)
2055 self.assertEqual(ancdata, [])
2056 self.checkFlags(flags, eor=True)
2057
2058 def _testRecvmsgShorter(self):
2059 self.sendToServer(MSG)
2060
Charles-François Natali8619cd72011-10-03 19:43:15 +02002061 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2062 # datagram is received (issue #13001).
2063 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002064 def testRecvmsgTrunc(self):
2065 # Receive part of message, check for truncation indicators.
2066 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2067 len(MSG) - 3)
2068 self.assertEqual(msg, MSG[:-3])
2069 self.checkRecvmsgAddress(addr, self.cli_addr)
2070 self.assertEqual(ancdata, [])
2071 self.checkFlags(flags, eor=False)
2072
Charles-François Natali8619cd72011-10-03 19:43:15 +02002073 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002074 def _testRecvmsgTrunc(self):
2075 self.sendToServer(MSG)
2076
2077 def testRecvmsgShortAncillaryBuf(self):
2078 # Test ancillary data buffer too small to hold any ancillary data.
2079 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2080 len(MSG), 1)
2081 self.assertEqual(msg, MSG)
2082 self.checkRecvmsgAddress(addr, self.cli_addr)
2083 self.assertEqual(ancdata, [])
2084 self.checkFlags(flags, eor=True)
2085
2086 def _testRecvmsgShortAncillaryBuf(self):
2087 self.sendToServer(MSG)
2088
2089 def testRecvmsgLongAncillaryBuf(self):
2090 # Test large ancillary data buffer.
2091 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2092 len(MSG), 10240)
2093 self.assertEqual(msg, MSG)
2094 self.checkRecvmsgAddress(addr, self.cli_addr)
2095 self.assertEqual(ancdata, [])
2096 self.checkFlags(flags, eor=True)
2097
2098 def _testRecvmsgLongAncillaryBuf(self):
2099 self.sendToServer(MSG)
2100
2101 def testRecvmsgAfterClose(self):
2102 # Check that recvmsg[_into]() fails on a closed socket.
2103 self.serv_sock.close()
2104 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
2105
2106 def _testRecvmsgAfterClose(self):
2107 pass
2108
2109 def testRecvmsgTimeout(self):
2110 # Check that timeout works.
2111 try:
2112 self.serv_sock.settimeout(0.03)
2113 self.assertRaises(socket.timeout,
2114 self.doRecvmsg, self.serv_sock, len(MSG))
2115 finally:
2116 self.misc_event.set()
2117
2118 def _testRecvmsgTimeout(self):
2119 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2120
2121 @requireAttrs(socket, "MSG_PEEK")
2122 def testRecvmsgPeek(self):
2123 # Check that MSG_PEEK in flags enables examination of pending
2124 # data without consuming it.
2125
2126 # Receive part of data with MSG_PEEK.
2127 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2128 len(MSG) - 3, 0,
2129 socket.MSG_PEEK)
2130 self.assertEqual(msg, MSG[:-3])
2131 self.checkRecvmsgAddress(addr, self.cli_addr)
2132 self.assertEqual(ancdata, [])
2133 # Ignoring MSG_TRUNC here (so this test is the same for stream
2134 # and datagram sockets). Some wording in POSIX seems to
2135 # suggest that it needn't be set when peeking, but that may
2136 # just be a slip.
2137 self.checkFlags(flags, eor=False,
2138 ignore=getattr(socket, "MSG_TRUNC", 0))
2139
2140 # Receive all data with MSG_PEEK.
2141 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2142 len(MSG), 0,
2143 socket.MSG_PEEK)
2144 self.assertEqual(msg, MSG)
2145 self.checkRecvmsgAddress(addr, self.cli_addr)
2146 self.assertEqual(ancdata, [])
2147 self.checkFlags(flags, eor=True)
2148
2149 # Check that the same data can still be received normally.
2150 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2151 self.assertEqual(msg, MSG)
2152 self.checkRecvmsgAddress(addr, self.cli_addr)
2153 self.assertEqual(ancdata, [])
2154 self.checkFlags(flags, eor=True)
2155
2156 @testRecvmsgPeek.client_skip
2157 def _testRecvmsgPeek(self):
2158 self.sendToServer(MSG)
2159
2160 @requireAttrs(socket.socket, "sendmsg")
2161 def testRecvmsgFromSendmsg(self):
2162 # Test receiving with recvmsg[_into]() when message is sent
2163 # using sendmsg().
2164 self.serv_sock.settimeout(self.fail_timeout)
2165 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2166 self.assertEqual(msg, MSG)
2167 self.checkRecvmsgAddress(addr, self.cli_addr)
2168 self.assertEqual(ancdata, [])
2169 self.checkFlags(flags, eor=True)
2170
2171 @testRecvmsgFromSendmsg.client_skip
2172 def _testRecvmsgFromSendmsg(self):
2173 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2174
2175
2176class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2177 # Tests which require a stream socket and can use either recvmsg()
2178 # or recvmsg_into().
2179
2180 def testRecvmsgEOF(self):
2181 # Receive end-of-stream indicator (b"", peer socket closed).
2182 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2183 self.assertEqual(msg, b"")
2184 self.checkRecvmsgAddress(addr, self.cli_addr)
2185 self.assertEqual(ancdata, [])
2186 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2187
2188 def _testRecvmsgEOF(self):
2189 self.cli_sock.close()
2190
2191 def testRecvmsgOverflow(self):
2192 # Receive a message in more than one chunk.
2193 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2194 len(MSG) - 3)
2195 self.checkRecvmsgAddress(addr, self.cli_addr)
2196 self.assertEqual(ancdata, [])
2197 self.checkFlags(flags, eor=False)
2198
2199 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2200 self.checkRecvmsgAddress(addr, self.cli_addr)
2201 self.assertEqual(ancdata, [])
2202 self.checkFlags(flags, eor=True)
2203
2204 msg = seg1 + seg2
2205 self.assertEqual(msg, MSG)
2206
2207 def _testRecvmsgOverflow(self):
2208 self.sendToServer(MSG)
2209
2210
2211class RecvmsgTests(RecvmsgGenericTests):
2212 # Tests for recvmsg() which can use any socket type.
2213
2214 def testRecvmsgBadArgs(self):
2215 # Check that recvmsg() rejects invalid arguments.
2216 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2217 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2218 -1, 0, 0)
2219 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2220 len(MSG), -1, 0)
2221 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2222 [bytearray(10)], 0, 0)
2223 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2224 object(), 0, 0)
2225 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2226 len(MSG), object(), 0)
2227 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2228 len(MSG), 0, object())
2229
2230 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2231 self.assertEqual(msg, MSG)
2232 self.checkRecvmsgAddress(addr, self.cli_addr)
2233 self.assertEqual(ancdata, [])
2234 self.checkFlags(flags, eor=True)
2235
2236 def _testRecvmsgBadArgs(self):
2237 self.sendToServer(MSG)
2238
2239
2240class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2241 # Tests for recvmsg_into() which can use any socket type.
2242
2243 def testRecvmsgIntoBadArgs(self):
2244 # Check that recvmsg_into() rejects invalid arguments.
2245 buf = bytearray(len(MSG))
2246 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2247 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2248 len(MSG), 0, 0)
2249 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2250 buf, 0, 0)
2251 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2252 [object()], 0, 0)
2253 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2254 [b"I'm not writable"], 0, 0)
2255 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2256 [buf, object()], 0, 0)
2257 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2258 [buf], -1, 0)
2259 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2260 [buf], object(), 0)
2261 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2262 [buf], 0, object())
2263
2264 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2265 self.assertEqual(nbytes, len(MSG))
2266 self.assertEqual(buf, bytearray(MSG))
2267 self.checkRecvmsgAddress(addr, self.cli_addr)
2268 self.assertEqual(ancdata, [])
2269 self.checkFlags(flags, eor=True)
2270
2271 def _testRecvmsgIntoBadArgs(self):
2272 self.sendToServer(MSG)
2273
2274 def testRecvmsgIntoGenerator(self):
2275 # Receive into buffer obtained from a generator (not a sequence).
2276 buf = bytearray(len(MSG))
2277 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2278 (o for o in [buf]))
2279 self.assertEqual(nbytes, len(MSG))
2280 self.assertEqual(buf, bytearray(MSG))
2281 self.checkRecvmsgAddress(addr, self.cli_addr)
2282 self.assertEqual(ancdata, [])
2283 self.checkFlags(flags, eor=True)
2284
2285 def _testRecvmsgIntoGenerator(self):
2286 self.sendToServer(MSG)
2287
2288 def testRecvmsgIntoArray(self):
2289 # Receive into an array rather than the usual bytearray.
2290 buf = array.array("B", [0] * len(MSG))
2291 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2292 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002293 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002294 self.checkRecvmsgAddress(addr, self.cli_addr)
2295 self.assertEqual(ancdata, [])
2296 self.checkFlags(flags, eor=True)
2297
2298 def _testRecvmsgIntoArray(self):
2299 self.sendToServer(MSG)
2300
2301 def testRecvmsgIntoScatter(self):
2302 # Receive into multiple buffers (scatter write).
2303 b1 = bytearray(b"----")
2304 b2 = bytearray(b"0123456789")
2305 b3 = bytearray(b"--------------")
2306 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2307 [b1, memoryview(b2)[2:9], b3])
2308 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2309 self.assertEqual(b1, bytearray(b"Mary"))
2310 self.assertEqual(b2, bytearray(b"01 had a 9"))
2311 self.assertEqual(b3, bytearray(b"little lamb---"))
2312 self.checkRecvmsgAddress(addr, self.cli_addr)
2313 self.assertEqual(ancdata, [])
2314 self.checkFlags(flags, eor=True)
2315
2316 def _testRecvmsgIntoScatter(self):
2317 self.sendToServer(b"Mary had a little lamb")
2318
2319
2320class CmsgMacroTests(unittest.TestCase):
2321 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2322 # assumptions used by sendmsg() and recvmsg[_into](), which share
2323 # code with these functions.
2324
2325 # Match the definition in socketmodule.c
2326 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2327
2328 @requireAttrs(socket, "CMSG_LEN")
2329 def testCMSG_LEN(self):
2330 # Test CMSG_LEN() with various valid and invalid values,
2331 # checking the assumptions used by recvmsg() and sendmsg().
2332 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2333 values = list(range(257)) + list(range(toobig - 257, toobig))
2334
2335 # struct cmsghdr has at least three members, two of which are ints
2336 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2337 for n in values:
2338 ret = socket.CMSG_LEN(n)
2339 # This is how recvmsg() calculates the data size
2340 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2341 self.assertLessEqual(ret, self.socklen_t_limit)
2342
2343 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2344 # sendmsg() shares code with these functions, and requires
2345 # that it reject values over the limit.
2346 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2347 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2348
2349 @requireAttrs(socket, "CMSG_SPACE")
2350 def testCMSG_SPACE(self):
2351 # Test CMSG_SPACE() with various valid and invalid values,
2352 # checking the assumptions used by sendmsg().
2353 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2354 values = list(range(257)) + list(range(toobig - 257, toobig))
2355
2356 last = socket.CMSG_SPACE(0)
2357 # struct cmsghdr has at least three members, two of which are ints
2358 self.assertGreater(last, array.array("i").itemsize * 2)
2359 for n in values:
2360 ret = socket.CMSG_SPACE(n)
2361 self.assertGreaterEqual(ret, last)
2362 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2363 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2364 self.assertLessEqual(ret, self.socklen_t_limit)
2365 last = ret
2366
2367 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2368 # sendmsg() shares code with these functions, and requires
2369 # that it reject values over the limit.
2370 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2371 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2372
2373
2374class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2375 # Tests for file descriptor passing on Unix-domain sockets.
2376
2377 # Invalid file descriptor value that's unlikely to evaluate to a
2378 # real FD even if one of its bytes is replaced with a different
2379 # value (which shouldn't actually happen).
2380 badfd = -0x5555
2381
2382 def newFDs(self, n):
2383 # Return a list of n file descriptors for newly-created files
2384 # containing their list indices as ASCII numbers.
2385 fds = []
2386 for i in range(n):
2387 fd, path = tempfile.mkstemp()
2388 self.addCleanup(os.unlink, path)
2389 self.addCleanup(os.close, fd)
2390 os.write(fd, str(i).encode())
2391 fds.append(fd)
2392 return fds
2393
2394 def checkFDs(self, fds):
2395 # Check that the file descriptors in the given list contain
2396 # their correct list indices as ASCII numbers.
2397 for n, fd in enumerate(fds):
2398 os.lseek(fd, 0, os.SEEK_SET)
2399 self.assertEqual(os.read(fd, 1024), str(n).encode())
2400
2401 def registerRecvmsgResult(self, result):
2402 self.addCleanup(self.closeRecvmsgFDs, result)
2403
2404 def closeRecvmsgFDs(self, recvmsg_result):
2405 # Close all file descriptors specified in the ancillary data
2406 # of the given return value from recvmsg() or recvmsg_into().
2407 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2408 if (cmsg_level == socket.SOL_SOCKET and
2409 cmsg_type == socket.SCM_RIGHTS):
2410 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002411 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002412 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2413 for fd in fds:
2414 os.close(fd)
2415
2416 def createAndSendFDs(self, n):
2417 # Send n new file descriptors created by newFDs() to the
2418 # server, with the constant MSG as the non-ancillary data.
2419 self.assertEqual(
2420 self.sendmsgToServer([MSG],
2421 [(socket.SOL_SOCKET,
2422 socket.SCM_RIGHTS,
2423 array.array("i", self.newFDs(n)))]),
2424 len(MSG))
2425
2426 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2427 # Check that constant MSG was received with numfds file
2428 # descriptors in a maximum of maxcmsgs control messages (which
2429 # must contain only complete integers). By default, check
2430 # that MSG_CTRUNC is unset, but ignore any flags in
2431 # ignoreflags.
2432 msg, ancdata, flags, addr = result
2433 self.assertEqual(msg, MSG)
2434 self.checkRecvmsgAddress(addr, self.cli_addr)
2435 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2436 ignore=ignoreflags)
2437
2438 self.assertIsInstance(ancdata, list)
2439 self.assertLessEqual(len(ancdata), maxcmsgs)
2440 fds = array.array("i")
2441 for item in ancdata:
2442 self.assertIsInstance(item, tuple)
2443 cmsg_level, cmsg_type, cmsg_data = item
2444 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2445 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2446 self.assertIsInstance(cmsg_data, bytes)
2447 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002448 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002449
2450 self.assertEqual(len(fds), numfds)
2451 self.checkFDs(fds)
2452
2453 def testFDPassSimple(self):
2454 # Pass a single FD (array read from bytes object).
2455 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2456 len(MSG), 10240))
2457
2458 def _testFDPassSimple(self):
2459 self.assertEqual(
2460 self.sendmsgToServer(
2461 [MSG],
2462 [(socket.SOL_SOCKET,
2463 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002464 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002465 len(MSG))
2466
2467 def testMultipleFDPass(self):
2468 # Pass multiple FDs in a single array.
2469 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2470 len(MSG), 10240))
2471
2472 def _testMultipleFDPass(self):
2473 self.createAndSendFDs(4)
2474
2475 @requireAttrs(socket, "CMSG_SPACE")
2476 def testFDPassCMSG_SPACE(self):
2477 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2478 self.checkRecvmsgFDs(
2479 4, self.doRecvmsg(self.serv_sock, len(MSG),
2480 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2481
2482 @testFDPassCMSG_SPACE.client_skip
2483 def _testFDPassCMSG_SPACE(self):
2484 self.createAndSendFDs(4)
2485
2486 def testFDPassCMSG_LEN(self):
2487 # Test using CMSG_LEN() to calculate ancillary buffer size.
2488 self.checkRecvmsgFDs(1,
2489 self.doRecvmsg(self.serv_sock, len(MSG),
2490 socket.CMSG_LEN(4 * SIZEOF_INT)),
2491 # RFC 3542 says implementations may set
2492 # MSG_CTRUNC if there isn't enough space
2493 # for trailing padding.
2494 ignoreflags=socket.MSG_CTRUNC)
2495
2496 def _testFDPassCMSG_LEN(self):
2497 self.createAndSendFDs(1)
2498
Nick Coghlan2496f332011-09-19 20:26:31 +10002499 # Issue #12958: The following test has problems on Mac OS X
2500 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002501 @requireAttrs(socket, "CMSG_SPACE")
2502 def testFDPassSeparate(self):
2503 # Pass two FDs in two separate arrays. Arrays may be combined
2504 # into a single control message by the OS.
2505 self.checkRecvmsgFDs(2,
2506 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2507 maxcmsgs=2)
2508
2509 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002510 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002511 def _testFDPassSeparate(self):
2512 fd0, fd1 = self.newFDs(2)
2513 self.assertEqual(
2514 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2515 socket.SCM_RIGHTS,
2516 array.array("i", [fd0])),
2517 (socket.SOL_SOCKET,
2518 socket.SCM_RIGHTS,
2519 array.array("i", [fd1]))]),
2520 len(MSG))
2521
Nick Coghlan2496f332011-09-19 20:26:31 +10002522 # Issue #12958: The following test has problems on Mac OS X
2523 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002524 @requireAttrs(socket, "CMSG_SPACE")
2525 def testFDPassSeparateMinSpace(self):
2526 # Pass two FDs in two separate arrays, receiving them into the
2527 # minimum space for two arrays.
2528 self.checkRecvmsgFDs(2,
2529 self.doRecvmsg(self.serv_sock, len(MSG),
2530 socket.CMSG_SPACE(SIZEOF_INT) +
2531 socket.CMSG_LEN(SIZEOF_INT)),
2532 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2533
2534 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002535 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002536 def _testFDPassSeparateMinSpace(self):
2537 fd0, fd1 = self.newFDs(2)
2538 self.assertEqual(
2539 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2540 socket.SCM_RIGHTS,
2541 array.array("i", [fd0])),
2542 (socket.SOL_SOCKET,
2543 socket.SCM_RIGHTS,
2544 array.array("i", [fd1]))]),
2545 len(MSG))
2546
2547 def sendAncillaryIfPossible(self, msg, ancdata):
2548 # Try to send msg and ancdata to server, but if the system
2549 # call fails, just send msg with no ancillary data.
2550 try:
2551 nbytes = self.sendmsgToServer([msg], ancdata)
2552 except socket.error as e:
2553 # Check that it was the system call that failed
2554 self.assertIsInstance(e.errno, int)
2555 nbytes = self.sendmsgToServer([msg])
2556 self.assertEqual(nbytes, len(msg))
2557
2558 def testFDPassEmpty(self):
2559 # Try to pass an empty FD array. Can receive either no array
2560 # or an empty array.
2561 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2562 len(MSG), 10240),
2563 ignoreflags=socket.MSG_CTRUNC)
2564
2565 def _testFDPassEmpty(self):
2566 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2567 socket.SCM_RIGHTS,
2568 b"")])
2569
2570 def testFDPassPartialInt(self):
2571 # Try to pass a truncated FD array.
2572 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2573 len(MSG), 10240)
2574 self.assertEqual(msg, MSG)
2575 self.checkRecvmsgAddress(addr, self.cli_addr)
2576 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2577 self.assertLessEqual(len(ancdata), 1)
2578 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2579 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2580 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2581 self.assertLess(len(cmsg_data), SIZEOF_INT)
2582
2583 def _testFDPassPartialInt(self):
2584 self.sendAncillaryIfPossible(
2585 MSG,
2586 [(socket.SOL_SOCKET,
2587 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002588 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002589
2590 @requireAttrs(socket, "CMSG_SPACE")
2591 def testFDPassPartialIntInMiddle(self):
2592 # Try to pass two FD arrays, the first of which is truncated.
2593 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2594 len(MSG), 10240)
2595 self.assertEqual(msg, MSG)
2596 self.checkRecvmsgAddress(addr, self.cli_addr)
2597 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2598 self.assertLessEqual(len(ancdata), 2)
2599 fds = array.array("i")
2600 # Arrays may have been combined in a single control message
2601 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2602 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2603 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002604 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002605 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2606 self.assertLessEqual(len(fds), 2)
2607 self.checkFDs(fds)
2608
2609 @testFDPassPartialIntInMiddle.client_skip
2610 def _testFDPassPartialIntInMiddle(self):
2611 fd0, fd1 = self.newFDs(2)
2612 self.sendAncillaryIfPossible(
2613 MSG,
2614 [(socket.SOL_SOCKET,
2615 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002616 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002617 (socket.SOL_SOCKET,
2618 socket.SCM_RIGHTS,
2619 array.array("i", [fd1]))])
2620
2621 def checkTruncatedHeader(self, result, ignoreflags=0):
2622 # Check that no ancillary data items are returned when data is
2623 # truncated inside the cmsghdr structure.
2624 msg, ancdata, flags, addr = result
2625 self.assertEqual(msg, MSG)
2626 self.checkRecvmsgAddress(addr, self.cli_addr)
2627 self.assertEqual(ancdata, [])
2628 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2629 ignore=ignoreflags)
2630
2631 def testCmsgTruncNoBufSize(self):
2632 # Check that no ancillary data is received when no buffer size
2633 # is specified.
2634 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2635 # BSD seems to set MSG_CTRUNC only
2636 # if an item has been partially
2637 # received.
2638 ignoreflags=socket.MSG_CTRUNC)
2639
2640 def _testCmsgTruncNoBufSize(self):
2641 self.createAndSendFDs(1)
2642
2643 def testCmsgTrunc0(self):
2644 # Check that no ancillary data is received when buffer size is 0.
2645 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2646 ignoreflags=socket.MSG_CTRUNC)
2647
2648 def _testCmsgTrunc0(self):
2649 self.createAndSendFDs(1)
2650
2651 # Check that no ancillary data is returned for various non-zero
2652 # (but still too small) buffer sizes.
2653
2654 def testCmsgTrunc1(self):
2655 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2656
2657 def _testCmsgTrunc1(self):
2658 self.createAndSendFDs(1)
2659
2660 def testCmsgTrunc2Int(self):
2661 # The cmsghdr structure has at least three members, two of
2662 # which are ints, so we still shouldn't see any ancillary
2663 # data.
2664 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2665 SIZEOF_INT * 2))
2666
2667 def _testCmsgTrunc2Int(self):
2668 self.createAndSendFDs(1)
2669
2670 def testCmsgTruncLen0Minus1(self):
2671 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2672 socket.CMSG_LEN(0) - 1))
2673
2674 def _testCmsgTruncLen0Minus1(self):
2675 self.createAndSendFDs(1)
2676
2677 # The following tests try to truncate the control message in the
2678 # middle of the FD array.
2679
2680 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2681 # Check that file descriptor data is truncated to between
2682 # mindata and maxdata bytes when received with buffer size
2683 # ancbuf, and that any complete file descriptor numbers are
2684 # valid.
2685 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2686 len(MSG), ancbuf)
2687 self.assertEqual(msg, MSG)
2688 self.checkRecvmsgAddress(addr, self.cli_addr)
2689 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2690
2691 if mindata == 0 and ancdata == []:
2692 return
2693 self.assertEqual(len(ancdata), 1)
2694 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2695 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2696 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2697 self.assertGreaterEqual(len(cmsg_data), mindata)
2698 self.assertLessEqual(len(cmsg_data), maxdata)
2699 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002700 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002701 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2702 self.checkFDs(fds)
2703
2704 def testCmsgTruncLen0(self):
2705 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2706
2707 def _testCmsgTruncLen0(self):
2708 self.createAndSendFDs(1)
2709
2710 def testCmsgTruncLen0Plus1(self):
2711 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2712
2713 def _testCmsgTruncLen0Plus1(self):
2714 self.createAndSendFDs(2)
2715
2716 def testCmsgTruncLen1(self):
2717 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2718 maxdata=SIZEOF_INT)
2719
2720 def _testCmsgTruncLen1(self):
2721 self.createAndSendFDs(2)
2722
2723 def testCmsgTruncLen2Minus1(self):
2724 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2725 maxdata=(2 * SIZEOF_INT) - 1)
2726
2727 def _testCmsgTruncLen2Minus1(self):
2728 self.createAndSendFDs(2)
2729
2730
2731class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2732 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2733 # features of the RFC 3542 Advanced Sockets API for IPv6.
2734 # Currently we can only handle certain data items (e.g. traffic
2735 # class, hop limit, MTU discovery and fragmentation settings)
2736 # without resorting to unportable means such as the struct module,
2737 # but the tests here are aimed at testing the ancillary data
2738 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2739 # itself.
2740
2741 # Test value to use when setting hop limit of packet
2742 hop_limit = 2
2743
2744 # Test value to use when setting traffic class of packet.
2745 # -1 means "use kernel default".
2746 traffic_class = -1
2747
2748 def ancillaryMapping(self, ancdata):
2749 # Given ancillary data list ancdata, return a mapping from
2750 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2751 # Check that no (level, type) pair appears more than once.
2752 d = {}
2753 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2754 self.assertNotIn((cmsg_level, cmsg_type), d)
2755 d[(cmsg_level, cmsg_type)] = cmsg_data
2756 return d
2757
2758 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2759 # Receive hop limit into ancbufsize bytes of ancillary data
2760 # space. Check that data is MSG, ancillary data is not
2761 # truncated (but ignore any flags in ignoreflags), and hop
2762 # limit is between 0 and maxhop inclusive.
2763 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2764 socket.IPV6_RECVHOPLIMIT, 1)
2765 self.misc_event.set()
2766 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2767 len(MSG), ancbufsize)
2768
2769 self.assertEqual(msg, MSG)
2770 self.checkRecvmsgAddress(addr, self.cli_addr)
2771 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2772 ignore=ignoreflags)
2773
2774 self.assertEqual(len(ancdata), 1)
2775 self.assertIsInstance(ancdata[0], tuple)
2776 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2777 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2778 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2779 self.assertIsInstance(cmsg_data, bytes)
2780 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2781 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002782 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002783 self.assertGreaterEqual(a[0], 0)
2784 self.assertLessEqual(a[0], maxhop)
2785
2786 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2787 def testRecvHopLimit(self):
2788 # Test receiving the packet hop limit as ancillary data.
2789 self.checkHopLimit(ancbufsize=10240)
2790
2791 @testRecvHopLimit.client_skip
2792 def _testRecvHopLimit(self):
2793 # Need to wait until server has asked to receive ancillary
2794 # data, as implementations are not required to buffer it
2795 # otherwise.
2796 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2797 self.sendToServer(MSG)
2798
2799 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2800 def testRecvHopLimitCMSG_SPACE(self):
2801 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2802 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2803
2804 @testRecvHopLimitCMSG_SPACE.client_skip
2805 def _testRecvHopLimitCMSG_SPACE(self):
2806 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2807 self.sendToServer(MSG)
2808
2809 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2810 # 3542 says portable applications must provide space for trailing
2811 # padding. Implementations may set MSG_CTRUNC if there isn't
2812 # enough space for the padding.
2813
2814 @requireAttrs(socket.socket, "sendmsg")
2815 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2816 def testSetHopLimit(self):
2817 # Test setting hop limit on outgoing packet and receiving it
2818 # at the other end.
2819 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2820
2821 @testSetHopLimit.client_skip
2822 def _testSetHopLimit(self):
2823 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2824 self.assertEqual(
2825 self.sendmsgToServer([MSG],
2826 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2827 array.array("i", [self.hop_limit]))]),
2828 len(MSG))
2829
2830 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2831 ignoreflags=0):
2832 # Receive traffic class and hop limit into ancbufsize bytes of
2833 # ancillary data space. Check that data is MSG, ancillary
2834 # data is not truncated (but ignore any flags in ignoreflags),
2835 # and traffic class and hop limit are in range (hop limit no
2836 # more than maxhop).
2837 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2838 socket.IPV6_RECVHOPLIMIT, 1)
2839 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2840 socket.IPV6_RECVTCLASS, 1)
2841 self.misc_event.set()
2842 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2843 len(MSG), ancbufsize)
2844
2845 self.assertEqual(msg, MSG)
2846 self.checkRecvmsgAddress(addr, self.cli_addr)
2847 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2848 ignore=ignoreflags)
2849 self.assertEqual(len(ancdata), 2)
2850 ancmap = self.ancillaryMapping(ancdata)
2851
2852 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2853 self.assertEqual(len(tcdata), SIZEOF_INT)
2854 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002855 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002856 self.assertGreaterEqual(a[0], 0)
2857 self.assertLessEqual(a[0], 255)
2858
2859 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2860 self.assertEqual(len(hldata), SIZEOF_INT)
2861 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002862 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002863 self.assertGreaterEqual(a[0], 0)
2864 self.assertLessEqual(a[0], maxhop)
2865
2866 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2867 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2868 def testRecvTrafficClassAndHopLimit(self):
2869 # Test receiving traffic class and hop limit as ancillary data.
2870 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2871
2872 @testRecvTrafficClassAndHopLimit.client_skip
2873 def _testRecvTrafficClassAndHopLimit(self):
2874 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2875 self.sendToServer(MSG)
2876
2877 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2878 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2879 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2880 # Test receiving traffic class and hop limit, using
2881 # CMSG_SPACE() to calculate buffer size.
2882 self.checkTrafficClassAndHopLimit(
2883 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2884
2885 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2886 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2887 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2888 self.sendToServer(MSG)
2889
2890 @requireAttrs(socket.socket, "sendmsg")
2891 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2892 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2893 def testSetTrafficClassAndHopLimit(self):
2894 # Test setting traffic class and hop limit on outgoing packet,
2895 # and receiving them at the other end.
2896 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2897 maxhop=self.hop_limit)
2898
2899 @testSetTrafficClassAndHopLimit.client_skip
2900 def _testSetTrafficClassAndHopLimit(self):
2901 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2902 self.assertEqual(
2903 self.sendmsgToServer([MSG],
2904 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2905 array.array("i", [self.traffic_class])),
2906 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2907 array.array("i", [self.hop_limit]))]),
2908 len(MSG))
2909
2910 @requireAttrs(socket.socket, "sendmsg")
2911 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2912 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2913 def testOddCmsgSize(self):
2914 # Try to send ancillary data with first item one byte too
2915 # long. Fall back to sending with correct size if this fails,
2916 # and check that second item was handled correctly.
2917 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2918 maxhop=self.hop_limit)
2919
2920 @testOddCmsgSize.client_skip
2921 def _testOddCmsgSize(self):
2922 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2923 try:
2924 nbytes = self.sendmsgToServer(
2925 [MSG],
2926 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002927 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002928 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2929 array.array("i", [self.hop_limit]))])
2930 except socket.error as e:
2931 self.assertIsInstance(e.errno, int)
2932 nbytes = self.sendmsgToServer(
2933 [MSG],
2934 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2935 array.array("i", [self.traffic_class])),
2936 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2937 array.array("i", [self.hop_limit]))])
2938 self.assertEqual(nbytes, len(MSG))
2939
2940 # Tests for proper handling of truncated ancillary data
2941
2942 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2943 # Receive hop limit into ancbufsize bytes of ancillary data
2944 # space, which should be too small to contain the ancillary
2945 # data header (if ancbufsize is None, pass no second argument
2946 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2947 # (unless included in ignoreflags), and no ancillary data is
2948 # returned.
2949 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2950 socket.IPV6_RECVHOPLIMIT, 1)
2951 self.misc_event.set()
2952 args = () if ancbufsize is None else (ancbufsize,)
2953 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2954 len(MSG), *args)
2955
2956 self.assertEqual(msg, MSG)
2957 self.checkRecvmsgAddress(addr, self.cli_addr)
2958 self.assertEqual(ancdata, [])
2959 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2960 ignore=ignoreflags)
2961
2962 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2963 def testCmsgTruncNoBufSize(self):
2964 # Check that no ancillary data is received when no ancillary
2965 # buffer size is provided.
2966 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2967 # BSD seems to set
2968 # MSG_CTRUNC only if an item
2969 # has been partially
2970 # received.
2971 ignoreflags=socket.MSG_CTRUNC)
2972
2973 @testCmsgTruncNoBufSize.client_skip
2974 def _testCmsgTruncNoBufSize(self):
2975 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2976 self.sendToServer(MSG)
2977
2978 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2979 def testSingleCmsgTrunc0(self):
2980 # Check that no ancillary data is received when ancillary
2981 # buffer size is zero.
2982 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2983 ignoreflags=socket.MSG_CTRUNC)
2984
2985 @testSingleCmsgTrunc0.client_skip
2986 def _testSingleCmsgTrunc0(self):
2987 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2988 self.sendToServer(MSG)
2989
2990 # Check that no ancillary data is returned for various non-zero
2991 # (but still too small) buffer sizes.
2992
2993 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2994 def testSingleCmsgTrunc1(self):
2995 self.checkHopLimitTruncatedHeader(ancbufsize=1)
2996
2997 @testSingleCmsgTrunc1.client_skip
2998 def _testSingleCmsgTrunc1(self):
2999 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3000 self.sendToServer(MSG)
3001
3002 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3003 def testSingleCmsgTrunc2Int(self):
3004 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3005
3006 @testSingleCmsgTrunc2Int.client_skip
3007 def _testSingleCmsgTrunc2Int(self):
3008 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3009 self.sendToServer(MSG)
3010
3011 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3012 def testSingleCmsgTruncLen0Minus1(self):
3013 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3014
3015 @testSingleCmsgTruncLen0Minus1.client_skip
3016 def _testSingleCmsgTruncLen0Minus1(self):
3017 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3018 self.sendToServer(MSG)
3019
3020 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3021 def testSingleCmsgTruncInData(self):
3022 # Test truncation of a control message inside its associated
3023 # data. The message may be returned with its data truncated,
3024 # or not returned at all.
3025 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3026 socket.IPV6_RECVHOPLIMIT, 1)
3027 self.misc_event.set()
3028 msg, ancdata, flags, addr = self.doRecvmsg(
3029 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3030
3031 self.assertEqual(msg, MSG)
3032 self.checkRecvmsgAddress(addr, self.cli_addr)
3033 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3034
3035 self.assertLessEqual(len(ancdata), 1)
3036 if ancdata:
3037 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3038 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3039 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3040 self.assertLess(len(cmsg_data), SIZEOF_INT)
3041
3042 @testSingleCmsgTruncInData.client_skip
3043 def _testSingleCmsgTruncInData(self):
3044 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3045 self.sendToServer(MSG)
3046
3047 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3048 # Receive traffic class and hop limit into ancbufsize bytes of
3049 # ancillary data space, which should be large enough to
3050 # contain the first item, but too small to contain the header
3051 # of the second. Check that data is MSG, MSG_CTRUNC is set
3052 # (unless included in ignoreflags), and only one ancillary
3053 # data item is returned.
3054 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3055 socket.IPV6_RECVHOPLIMIT, 1)
3056 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3057 socket.IPV6_RECVTCLASS, 1)
3058 self.misc_event.set()
3059 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3060 len(MSG), ancbufsize)
3061
3062 self.assertEqual(msg, MSG)
3063 self.checkRecvmsgAddress(addr, self.cli_addr)
3064 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3065 ignore=ignoreflags)
3066
3067 self.assertEqual(len(ancdata), 1)
3068 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3069 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3070 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3071 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3072 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003073 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003074 self.assertGreaterEqual(a[0], 0)
3075 self.assertLessEqual(a[0], 255)
3076
3077 # Try the above test with various buffer sizes.
3078
3079 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3080 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3081 def testSecondCmsgTrunc0(self):
3082 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3083 ignoreflags=socket.MSG_CTRUNC)
3084
3085 @testSecondCmsgTrunc0.client_skip
3086 def _testSecondCmsgTrunc0(self):
3087 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3088 self.sendToServer(MSG)
3089
3090 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3091 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3092 def testSecondCmsgTrunc1(self):
3093 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3094
3095 @testSecondCmsgTrunc1.client_skip
3096 def _testSecondCmsgTrunc1(self):
3097 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3098 self.sendToServer(MSG)
3099
3100 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3101 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3102 def testSecondCmsgTrunc2Int(self):
3103 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3104 2 * SIZEOF_INT)
3105
3106 @testSecondCmsgTrunc2Int.client_skip
3107 def _testSecondCmsgTrunc2Int(self):
3108 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3109 self.sendToServer(MSG)
3110
3111 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3112 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3113 def testSecondCmsgTruncLen0Minus1(self):
3114 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3115 socket.CMSG_LEN(0) - 1)
3116
3117 @testSecondCmsgTruncLen0Minus1.client_skip
3118 def _testSecondCmsgTruncLen0Minus1(self):
3119 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3120 self.sendToServer(MSG)
3121
3122 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3123 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3124 def testSecomdCmsgTruncInData(self):
3125 # Test truncation of the second of two control messages inside
3126 # its associated data.
3127 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3128 socket.IPV6_RECVHOPLIMIT, 1)
3129 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3130 socket.IPV6_RECVTCLASS, 1)
3131 self.misc_event.set()
3132 msg, ancdata, flags, addr = self.doRecvmsg(
3133 self.serv_sock, len(MSG),
3134 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3135
3136 self.assertEqual(msg, MSG)
3137 self.checkRecvmsgAddress(addr, self.cli_addr)
3138 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3139
3140 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3141
3142 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3143 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3144 cmsg_types.remove(cmsg_type)
3145 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3146 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003147 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003148 self.assertGreaterEqual(a[0], 0)
3149 self.assertLessEqual(a[0], 255)
3150
3151 if ancdata:
3152 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3153 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3154 cmsg_types.remove(cmsg_type)
3155 self.assertLess(len(cmsg_data), SIZEOF_INT)
3156
3157 self.assertEqual(ancdata, [])
3158
3159 @testSecomdCmsgTruncInData.client_skip
3160 def _testSecomdCmsgTruncInData(self):
3161 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3162 self.sendToServer(MSG)
3163
3164
3165# Derive concrete test classes for different socket types.
3166
3167class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3168 SendrecvmsgConnectionlessBase,
3169 ThreadedSocketTestMixin, UDPTestBase):
3170 pass
3171
3172@requireAttrs(socket.socket, "sendmsg")
3173@unittest.skipUnless(thread, 'Threading required for this test.')
3174class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3175 pass
3176
3177@requireAttrs(socket.socket, "recvmsg")
3178@unittest.skipUnless(thread, 'Threading required for this test.')
3179class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3180 pass
3181
3182@requireAttrs(socket.socket, "recvmsg_into")
3183@unittest.skipUnless(thread, 'Threading required for this test.')
3184class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3185 pass
3186
3187
3188class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3189 SendrecvmsgConnectionlessBase,
3190 ThreadedSocketTestMixin, UDP6TestBase):
3191 pass
3192
3193@requireAttrs(socket.socket, "sendmsg")
3194@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3195@requireSocket("AF_INET6", "SOCK_DGRAM")
3196@unittest.skipUnless(thread, 'Threading required for this test.')
3197class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3198 pass
3199
3200@requireAttrs(socket.socket, "recvmsg")
3201@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3202@requireSocket("AF_INET6", "SOCK_DGRAM")
3203@unittest.skipUnless(thread, 'Threading required for this test.')
3204class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3205 pass
3206
3207@requireAttrs(socket.socket, "recvmsg_into")
3208@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3209@requireSocket("AF_INET6", "SOCK_DGRAM")
3210@unittest.skipUnless(thread, 'Threading required for this test.')
3211class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3212 pass
3213
3214@requireAttrs(socket.socket, "recvmsg")
3215@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3216@requireAttrs(socket, "IPPROTO_IPV6")
3217@requireSocket("AF_INET6", "SOCK_DGRAM")
3218@unittest.skipUnless(thread, 'Threading required for this test.')
3219class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3220 SendrecvmsgUDP6TestBase):
3221 pass
3222
3223@requireAttrs(socket.socket, "recvmsg_into")
3224@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
3225@requireAttrs(socket, "IPPROTO_IPV6")
3226@requireSocket("AF_INET6", "SOCK_DGRAM")
3227@unittest.skipUnless(thread, 'Threading required for this test.')
3228class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3229 RFC3542AncillaryTest,
3230 SendrecvmsgUDP6TestBase):
3231 pass
3232
3233
3234class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3235 ConnectedStreamTestMixin, TCPTestBase):
3236 pass
3237
3238@requireAttrs(socket.socket, "sendmsg")
3239@unittest.skipUnless(thread, 'Threading required for this test.')
3240class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3241 pass
3242
3243@requireAttrs(socket.socket, "recvmsg")
3244@unittest.skipUnless(thread, 'Threading required for this test.')
3245class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3246 SendrecvmsgTCPTestBase):
3247 pass
3248
3249@requireAttrs(socket.socket, "recvmsg_into")
3250@unittest.skipUnless(thread, 'Threading required for this test.')
3251class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3252 SendrecvmsgTCPTestBase):
3253 pass
3254
3255
3256class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3257 SendrecvmsgConnectedBase,
3258 ConnectedStreamTestMixin, SCTPStreamBase):
3259 pass
3260
3261@requireAttrs(socket.socket, "sendmsg")
3262@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3263@unittest.skipUnless(thread, 'Threading required for this test.')
3264class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3265 pass
3266
3267@requireAttrs(socket.socket, "recvmsg")
3268@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3269@unittest.skipUnless(thread, 'Threading required for this test.')
3270class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3271 SendrecvmsgSCTPStreamTestBase):
3272 pass
3273
3274@requireAttrs(socket.socket, "recvmsg_into")
3275@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3276@unittest.skipUnless(thread, 'Threading required for this test.')
3277class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3278 SendrecvmsgSCTPStreamTestBase):
3279 pass
3280
3281
3282class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3283 ConnectedStreamTestMixin, UnixStreamBase):
3284 pass
3285
3286@requireAttrs(socket.socket, "sendmsg")
3287@requireAttrs(socket, "AF_UNIX")
3288@unittest.skipUnless(thread, 'Threading required for this test.')
3289class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3290 pass
3291
3292@requireAttrs(socket.socket, "recvmsg")
3293@requireAttrs(socket, "AF_UNIX")
3294@unittest.skipUnless(thread, 'Threading required for this test.')
3295class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3296 SendrecvmsgUnixStreamTestBase):
3297 pass
3298
3299@requireAttrs(socket.socket, "recvmsg_into")
3300@requireAttrs(socket, "AF_UNIX")
3301@unittest.skipUnless(thread, 'Threading required for this test.')
3302class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3303 SendrecvmsgUnixStreamTestBase):
3304 pass
3305
3306@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3307@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3308@unittest.skipUnless(thread, 'Threading required for this test.')
3309class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3310 pass
3311
3312@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3313@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3314@unittest.skipUnless(thread, 'Threading required for this test.')
3315class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3316 SendrecvmsgUnixStreamTestBase):
3317 pass
3318
3319
3320# Test interrupting the interruptible send/receive methods with a
3321# signal when a timeout is set. These tests avoid having multiple
3322# threads alive during the test so that the OS cannot deliver the
3323# signal to the wrong one.
3324
3325class InterruptedTimeoutBase(unittest.TestCase):
3326 # Base class for interrupted send/receive tests. Installs an
3327 # empty handler for SIGALRM and removes it on teardown, along with
3328 # any scheduled alarms.
3329
3330 def setUp(self):
3331 super().setUp()
3332 orig_alrm_handler = signal.signal(signal.SIGALRM,
3333 lambda signum, frame: None)
3334 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3335 self.addCleanup(self.setAlarm, 0)
3336
3337 # Timeout for socket operations
3338 timeout = 4.0
3339
3340 # Provide setAlarm() method to schedule delivery of SIGALRM after
3341 # given number of seconds, or cancel it if zero, and an
3342 # appropriate time value to use. Use setitimer() if available.
3343 if hasattr(signal, "setitimer"):
3344 alarm_time = 0.05
3345
3346 def setAlarm(self, seconds):
3347 signal.setitimer(signal.ITIMER_REAL, seconds)
3348 else:
3349 # Old systems may deliver the alarm up to one second early
3350 alarm_time = 2
3351
3352 def setAlarm(self, seconds):
3353 signal.alarm(seconds)
3354
3355
3356# Require siginterrupt() in order to ensure that system calls are
3357# interrupted by default.
3358@requireAttrs(signal, "siginterrupt")
3359@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3360 "Don't have signal.alarm or signal.setitimer")
3361class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3362 # Test interrupting the recv*() methods with signals when a
3363 # timeout is set.
3364
3365 def setUp(self):
3366 super().setUp()
3367 self.serv.settimeout(self.timeout)
3368
3369 def checkInterruptedRecv(self, func, *args, **kwargs):
3370 # Check that func(*args, **kwargs) raises socket.error with an
3371 # errno of EINTR when interrupted by a signal.
3372 self.setAlarm(self.alarm_time)
3373 with self.assertRaises(socket.error) as cm:
3374 func(*args, **kwargs)
3375 self.assertNotIsInstance(cm.exception, socket.timeout)
3376 self.assertEqual(cm.exception.errno, errno.EINTR)
3377
3378 def testInterruptedRecvTimeout(self):
3379 self.checkInterruptedRecv(self.serv.recv, 1024)
3380
3381 def testInterruptedRecvIntoTimeout(self):
3382 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3383
3384 def testInterruptedRecvfromTimeout(self):
3385 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3386
3387 def testInterruptedRecvfromIntoTimeout(self):
3388 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3389
3390 @requireAttrs(socket.socket, "recvmsg")
3391 def testInterruptedRecvmsgTimeout(self):
3392 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3393
3394 @requireAttrs(socket.socket, "recvmsg_into")
3395 def testInterruptedRecvmsgIntoTimeout(self):
3396 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3397
3398
3399# Require siginterrupt() in order to ensure that system calls are
3400# interrupted by default.
3401@requireAttrs(signal, "siginterrupt")
3402@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3403 "Don't have signal.alarm or signal.setitimer")
3404@unittest.skipUnless(thread, 'Threading required for this test.')
3405class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3406 ThreadSafeCleanupTestCase,
3407 SocketListeningTestMixin, TCPTestBase):
3408 # Test interrupting the interruptible send*() methods with signals
3409 # when a timeout is set.
3410
3411 def setUp(self):
3412 super().setUp()
3413 self.serv_conn = self.newSocket()
3414 self.addCleanup(self.serv_conn.close)
3415 # Use a thread to complete the connection, but wait for it to
3416 # terminate before running the test, so that there is only one
3417 # thread to accept the signal.
3418 cli_thread = threading.Thread(target=self.doConnect)
3419 cli_thread.start()
3420 self.cli_conn, addr = self.serv.accept()
3421 self.addCleanup(self.cli_conn.close)
3422 cli_thread.join()
3423 self.serv_conn.settimeout(self.timeout)
3424
3425 def doConnect(self):
3426 self.serv_conn.connect(self.serv_addr)
3427
3428 def checkInterruptedSend(self, func, *args, **kwargs):
3429 # Check that func(*args, **kwargs), run in a loop, raises
3430 # socket.error with an errno of EINTR when interrupted by a
3431 # signal.
3432 with self.assertRaises(socket.error) as cm:
3433 while True:
3434 self.setAlarm(self.alarm_time)
3435 func(*args, **kwargs)
3436 self.assertNotIsInstance(cm.exception, socket.timeout)
3437 self.assertEqual(cm.exception.errno, errno.EINTR)
3438
Nick Coghlan2496f332011-09-19 20:26:31 +10003439 # Issue #12958: The following tests have problems on Mac OS X
3440 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003441 def testInterruptedSendTimeout(self):
3442 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3443
Nick Coghlan2496f332011-09-19 20:26:31 +10003444 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003445 def testInterruptedSendtoTimeout(self):
3446 # Passing an actual address here as Python's wrapper for
3447 # sendto() doesn't allow passing a zero-length one; POSIX
3448 # requires that the address is ignored since the socket is
3449 # connection-mode, however.
3450 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3451 self.serv_addr)
3452
Nick Coghlan2496f332011-09-19 20:26:31 +10003453 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003454 @requireAttrs(socket.socket, "sendmsg")
3455 def testInterruptedSendmsgTimeout(self):
3456 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3457
3458
Victor Stinner45df8202010-04-28 22:31:17 +00003459@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003460class TCPCloserTest(ThreadedTCPSocketTest):
3461
3462 def testClose(self):
3463 conn, addr = self.serv.accept()
3464 conn.close()
3465
3466 sd = self.cli
3467 read, write, err = select.select([sd], [], [], 1.0)
3468 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003469 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003470
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003471 # Calling close() many times should be safe.
3472 conn.close()
3473 conn.close()
3474
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003475 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003476 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003477 time.sleep(1.0)
3478
Victor Stinner45df8202010-04-28 22:31:17 +00003479@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003480class BasicSocketPairTest(SocketPairTest):
3481
3482 def __init__(self, methodName='runTest'):
3483 SocketPairTest.__init__(self, methodName=methodName)
3484
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003485 def _check_defaults(self, sock):
3486 self.assertIsInstance(sock, socket.socket)
3487 if hasattr(socket, 'AF_UNIX'):
3488 self.assertEqual(sock.family, socket.AF_UNIX)
3489 else:
3490 self.assertEqual(sock.family, socket.AF_INET)
3491 self.assertEqual(sock.type, socket.SOCK_STREAM)
3492 self.assertEqual(sock.proto, 0)
3493
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003494 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003495 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003496
3497 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003498 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003499
Dave Cole331708b2004-08-09 04:51:41 +00003500 def testRecv(self):
3501 msg = self.serv.recv(1024)
3502 self.assertEqual(msg, MSG)
3503
3504 def _testRecv(self):
3505 self.cli.send(MSG)
3506
3507 def testSend(self):
3508 self.serv.send(MSG)
3509
3510 def _testSend(self):
3511 msg = self.cli.recv(1024)
3512 self.assertEqual(msg, MSG)
3513
Victor Stinner45df8202010-04-28 22:31:17 +00003514@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003515class NonBlockingTCPTests(ThreadedTCPSocketTest):
3516
3517 def __init__(self, methodName='runTest'):
3518 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3519
3520 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003521 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003522 self.serv.setblocking(0)
3523 start = time.time()
3524 try:
3525 self.serv.accept()
3526 except socket.error:
3527 pass
3528 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003529 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003530
3531 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003532 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003533
Antoine Pitroub1c54962010-10-14 15:05:38 +00003534 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003535 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003536 def testInitNonBlocking(self):
3537 # reinit server socket
3538 self.serv.close()
3539 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003540 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003541 self.port = support.bind_port(self.serv)
3542 self.serv.listen(1)
3543 # actual testing
3544 start = time.time()
3545 try:
3546 self.serv.accept()
3547 except socket.error:
3548 pass
3549 end = time.time()
3550 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3551
3552 def _testInitNonBlocking(self):
3553 pass
3554
Antoine Pitrou600232b2011-01-05 21:03:42 +00003555 def testInheritFlags(self):
3556 # Issue #7995: when calling accept() on a listening socket with a
3557 # timeout, the resulting socket should not be non-blocking.
3558 self.serv.settimeout(10)
3559 try:
3560 conn, addr = self.serv.accept()
3561 message = conn.recv(len(MSG))
3562 finally:
3563 conn.close()
3564 self.serv.settimeout(None)
3565
3566 def _testInheritFlags(self):
3567 time.sleep(0.1)
3568 self.cli.connect((HOST, self.port))
3569 time.sleep(0.5)
3570 self.cli.send(MSG)
3571
Guido van Rossum24e4af82002-06-12 19:18:08 +00003572 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003573 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003574 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003575 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003576 conn, addr = self.serv.accept()
3577 except socket.error:
3578 pass
3579 else:
3580 self.fail("Error trying to do non-blocking accept.")
3581 read, write, err = select.select([self.serv], [], [])
3582 if self.serv in read:
3583 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003584 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003585 else:
3586 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003587
Guido van Rossum24e4af82002-06-12 19:18:08 +00003588 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003589 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003590 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003591
3592 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003593 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003594 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003595 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003596
3597 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003598 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003599 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003600
3601 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003602 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003603 conn, addr = self.serv.accept()
3604 conn.setblocking(0)
3605 try:
3606 msg = conn.recv(len(MSG))
3607 except socket.error:
3608 pass
3609 else:
3610 self.fail("Error trying to do non-blocking recv.")
3611 read, write, err = select.select([conn], [], [])
3612 if conn in read:
3613 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003614 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003615 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003616 else:
3617 self.fail("Error during select call to non-blocking socket.")
3618
3619 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003620 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003621 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003622 self.cli.send(MSG)
3623
Victor Stinner45df8202010-04-28 22:31:17 +00003624@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003625class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003626 """Unit tests for the object returned by socket.makefile()
3627
Antoine Pitrou834bd812010-10-13 16:17:14 +00003628 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003629 the client connection. You can read from this file to
3630 get output from the server.
3631
Antoine Pitrou834bd812010-10-13 16:17:14 +00003632 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003633 server connection. You can write to this file to send output
3634 to the client.
3635 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003636
Guido van Rossume9f66142002-08-07 15:46:19 +00003637 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003638 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003639 errors = 'strict'
3640 newline = None
3641
3642 read_mode = 'rb'
3643 read_msg = MSG
3644 write_mode = 'wb'
3645 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003646
Guido van Rossum24e4af82002-06-12 19:18:08 +00003647 def __init__(self, methodName='runTest'):
3648 SocketConnectedTest.__init__(self, methodName=methodName)
3649
3650 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003651 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3652 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003653 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003654 self.read_file = self.cli_conn.makefile(
3655 self.read_mode, self.bufsize,
3656 encoding = self.encoding,
3657 errors = self.errors,
3658 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003659
3660 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003661 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003662 self.read_file.close()
3663 self.assertTrue(self.read_file.closed)
3664 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003665 SocketConnectedTest.tearDown(self)
3666
3667 def clientSetUp(self):
3668 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003669 self.write_file = self.serv_conn.makefile(
3670 self.write_mode, self.bufsize,
3671 encoding = self.encoding,
3672 errors = self.errors,
3673 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003674
3675 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003676 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003677 self.write_file.close()
3678 self.assertTrue(self.write_file.closed)
3679 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003680 SocketConnectedTest.clientTearDown(self)
3681
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003682 def testReadAfterTimeout(self):
3683 # Issue #7322: A file object must disallow further reads
3684 # after a timeout has occurred.
3685 self.cli_conn.settimeout(1)
3686 self.read_file.read(3)
3687 # First read raises a timeout
3688 self.assertRaises(socket.timeout, self.read_file.read, 1)
3689 # Second read is disallowed
3690 with self.assertRaises(IOError) as ctx:
3691 self.read_file.read(1)
3692 self.assertIn("cannot read from timed out object", str(ctx.exception))
3693
3694 def _testReadAfterTimeout(self):
3695 self.write_file.write(self.write_msg[0:3])
3696 self.write_file.flush()
3697 self.serv_finished.wait()
3698
Guido van Rossum24e4af82002-06-12 19:18:08 +00003699 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003700 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003701 first_seg = self.read_file.read(len(self.read_msg)-3)
3702 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003703 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003704 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003705
3706 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003707 self.write_file.write(self.write_msg)
3708 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003709
Guido van Rossum8c943832002-08-08 01:00:28 +00003710 def testFullRead(self):
3711 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003712 msg = self.read_file.read()
3713 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003714
3715 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003716 self.write_file.write(self.write_msg)
3717 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003718
Guido van Rossum24e4af82002-06-12 19:18:08 +00003719 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003720 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003721 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003722 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003723 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003724 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003725 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003726 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003727 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003728
3729 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003730 self.write_file.write(self.write_msg)
3731 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003732
3733 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003734 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003735 line = self.read_file.readline()
3736 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003737
3738 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003739 self.write_file.write(self.write_msg)
3740 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003741
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003742 def testCloseAfterMakefile(self):
3743 # The file returned by makefile should keep the socket open.
3744 self.cli_conn.close()
3745 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003746 msg = self.read_file.read()
3747 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003748
3749 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003750 self.write_file.write(self.write_msg)
3751 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003752
3753 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003754 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003755 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003756 if isinstance(self.read_msg, str):
3757 msg = msg.decode()
3758 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003759
3760 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003761 self.write_file.write(self.write_msg)
3762 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003763
Tim Peters116d83c2004-03-28 02:20:45 +00003764 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003765 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003766
3767 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003768 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003769
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003770 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003771 self.assertEqual(self.read_file.mode, self.read_mode)
3772 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003773
3774 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003775 self.assertEqual(self.write_file.mode, self.write_mode)
3776 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003777
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003778 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003779 self.read_file.close()
3780 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003781 self.cli_conn.close()
3782 self.assertRaises(socket.error, self.cli_conn.getsockname)
3783
3784 def _testRealClose(self):
3785 pass
3786
3787
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003788class FileObjectInterruptedTestCase(unittest.TestCase):
3789 """Test that the file object correctly handles EINTR internally."""
3790
3791 class MockSocket(object):
3792 def __init__(self, recv_funcs=()):
3793 # A generator that returns callables that we'll call for each
3794 # call to recv().
3795 self._recv_step = iter(recv_funcs)
3796
3797 def recv_into(self, buffer):
3798 data = next(self._recv_step)()
3799 assert len(buffer) >= len(data)
3800 buffer[:len(data)] = data
3801 return len(data)
3802
3803 def _decref_socketios(self):
3804 pass
3805
3806 def _textiowrap_for_test(self, buffering=-1):
3807 raw = socket.SocketIO(self, "r")
3808 if buffering < 0:
3809 buffering = io.DEFAULT_BUFFER_SIZE
3810 if buffering == 0:
3811 return raw
3812 buffer = io.BufferedReader(raw, buffering)
3813 text = io.TextIOWrapper(buffer, None, None)
3814 text.mode = "rb"
3815 return text
3816
3817 @staticmethod
3818 def _raise_eintr():
Antoine Pitrou24d659d2011-10-23 23:49:42 +02003819 raise socket.error(errno.EINTR, "interrupted")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003820
3821 def _textiowrap_mock_socket(self, mock, buffering=-1):
3822 raw = socket.SocketIO(mock, "r")
3823 if buffering < 0:
3824 buffering = io.DEFAULT_BUFFER_SIZE
3825 if buffering == 0:
3826 return raw
3827 buffer = io.BufferedReader(raw, buffering)
3828 text = io.TextIOWrapper(buffer, None, None)
3829 text.mode = "rb"
3830 return text
3831
3832 def _test_readline(self, size=-1, buffering=-1):
3833 mock_sock = self.MockSocket(recv_funcs=[
3834 lambda : b"This is the first line\nAnd the sec",
3835 self._raise_eintr,
3836 lambda : b"ond line is here\n",
3837 lambda : b"",
3838 lambda : b"", # XXX(gps): io library does an extra EOF read
3839 ])
3840 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003841 self.assertEqual(fo.readline(size), "This is the first line\n")
3842 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003843
3844 def _test_read(self, size=-1, buffering=-1):
3845 mock_sock = self.MockSocket(recv_funcs=[
3846 lambda : b"This is the first line\nAnd the sec",
3847 self._raise_eintr,
3848 lambda : b"ond line is here\n",
3849 lambda : b"",
3850 lambda : b"", # XXX(gps): io library does an extra EOF read
3851 ])
3852 expecting = (b"This is the first line\n"
3853 b"And the second line is here\n")
3854 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3855 if buffering == 0:
3856 data = b''
3857 else:
3858 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003859 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003860 while len(data) != len(expecting):
3861 part = fo.read(size)
3862 if not part:
3863 break
3864 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003865 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003866
3867 def test_default(self):
3868 self._test_readline()
3869 self._test_readline(size=100)
3870 self._test_read()
3871 self._test_read(size=100)
3872
3873 def test_with_1k_buffer(self):
3874 self._test_readline(buffering=1024)
3875 self._test_readline(size=100, buffering=1024)
3876 self._test_read(buffering=1024)
3877 self._test_read(size=100, buffering=1024)
3878
3879 def _test_readline_no_buffer(self, size=-1):
3880 mock_sock = self.MockSocket(recv_funcs=[
3881 lambda : b"a",
3882 lambda : b"\n",
3883 lambda : b"B",
3884 self._raise_eintr,
3885 lambda : b"b",
3886 lambda : b"",
3887 ])
3888 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003889 self.assertEqual(fo.readline(size), b"a\n")
3890 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003891
3892 def test_no_buffer(self):
3893 self._test_readline_no_buffer()
3894 self._test_readline_no_buffer(size=4)
3895 self._test_read(buffering=0)
3896 self._test_read(size=100, buffering=0)
3897
3898
Guido van Rossume9f66142002-08-07 15:46:19 +00003899class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3900
3901 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003902
Guido van Rossume9f66142002-08-07 15:46:19 +00003903 In this case (and in this case only), it should be possible to
3904 create a file object, read a line from it, create another file
3905 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003906 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003907 when reading multiple requests from the same socket."""
3908
3909 bufsize = 0 # Use unbuffered mode
3910
3911 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003912 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003913 line = self.read_file.readline() # first line
3914 self.assertEqual(line, b"A. " + self.write_msg) # first line
3915 self.read_file = self.cli_conn.makefile('rb', 0)
3916 line = self.read_file.readline() # second line
3917 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003918
3919 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003920 self.write_file.write(b"A. " + self.write_msg)
3921 self.write_file.write(b"B. " + self.write_msg)
3922 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003923
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003924 def testMakefileClose(self):
3925 # The file returned by makefile should keep the socket open...
3926 self.cli_conn.close()
3927 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003928 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003929 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003930 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003931 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3932
3933 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003934 self.write_file.write(self.write_msg)
3935 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003936
3937 def testMakefileCloseSocketDestroy(self):
3938 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003939 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003940 refcount_after = sys.getrefcount(self.cli_conn)
3941 self.assertEqual(refcount_before - 1, refcount_after)
3942
3943 def _testMakefileCloseSocketDestroy(self):
3944 pass
3945
Antoine Pitrou98b46702010-09-18 22:59:00 +00003946 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003947 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003948 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3949
3950 def testSmallReadNonBlocking(self):
3951 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003952 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3953 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003954 self.evt1.set()
3955 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003956 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003957 if first_seg is None:
3958 # Data not arrived (can happen under Windows), wait a bit
3959 time.sleep(0.5)
3960 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003961 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003962 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003963 self.assertEqual(n, 3)
3964 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003965 self.assertEqual(msg, self.read_msg)
3966 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3967 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003968
3969 def _testSmallReadNonBlocking(self):
3970 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003971 self.write_file.write(self.write_msg)
3972 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003973 self.evt2.set()
3974 # Avoid cloding the socket before the server test has finished,
3975 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3976 self.serv_finished.wait(5.0)
3977
3978 def testWriteNonBlocking(self):
3979 self.cli_finished.wait(5.0)
3980 # The client thread can't skip directly - the SkipTest exception
3981 # would appear as a failure.
3982 if self.serv_skipped:
3983 self.skipTest(self.serv_skipped)
3984
3985 def _testWriteNonBlocking(self):
3986 self.serv_skipped = None
3987 self.serv_conn.setblocking(False)
3988 # Try to saturate the socket buffer pipe with repeated large writes.
3989 BIG = b"x" * (1024 ** 2)
3990 LIMIT = 10
3991 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00003992 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003993 self.assertGreater(n, 0)
3994 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003995 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003996 if n is None:
3997 # Succeeded
3998 break
3999 self.assertGreater(n, 0)
4000 else:
4001 # Let us know that this test didn't manage to establish
4002 # the expected conditions. This is not a failure in itself but,
4003 # if it happens repeatedly, the test should be fixed.
4004 self.serv_skipped = "failed to saturate the socket buffer"
4005
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004006
Guido van Rossum8c943832002-08-08 01:00:28 +00004007class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4008
4009 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4010
4011
4012class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4013
4014 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004015
Thomas Woutersb2137042007-02-01 18:02:27 +00004016
Antoine Pitrou834bd812010-10-13 16:17:14 +00004017class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4018 """Tests for socket.makefile() in text mode (rather than binary)"""
4019
4020 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004021 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004022 write_mode = 'wb'
4023 write_msg = MSG
4024 newline = ''
4025
4026
4027class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4028 """Tests for socket.makefile() in text mode (rather than binary)"""
4029
4030 read_mode = 'rb'
4031 read_msg = MSG
4032 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004033 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004034 newline = ''
4035
4036
4037class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4038 """Tests for socket.makefile() in text mode (rather than binary)"""
4039
4040 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004041 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004042 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004043 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004044 newline = ''
4045
4046
Guido van Rossumd8faa362007-04-27 19:54:29 +00004047class NetworkConnectionTest(object):
4048 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004049
Guido van Rossumd8faa362007-04-27 19:54:29 +00004050 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004051 # We're inherited below by BasicTCPTest2, which also inherits
4052 # BasicTCPTest, which defines self.port referenced below.
4053 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004054 self.serv_conn = self.cli
4055
4056class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4057 """Tests that NetworkConnection does not break existing TCP functionality.
4058 """
4059
4060class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004061
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004062 class MockSocket(socket.socket):
4063 def connect(self, *args):
4064 raise socket.timeout('timed out')
4065
4066 @contextlib.contextmanager
4067 def mocked_socket_module(self):
4068 """Return a socket which times out on connect"""
4069 old_socket = socket.socket
4070 socket.socket = self.MockSocket
4071 try:
4072 yield
4073 finally:
4074 socket.socket = old_socket
4075
4076 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004077 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004078 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004079 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004080 with self.assertRaises(socket.error) as cm:
4081 cli.connect((HOST, port))
4082 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4083
4084 def test_create_connection(self):
4085 # Issue #9792: errors raised by create_connection() should have
4086 # a proper errno attribute.
4087 port = support.find_unused_port()
4088 with self.assertRaises(socket.error) as cm:
4089 socket.create_connection((HOST, port))
4090 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4091
4092 def test_create_connection_timeout(self):
4093 # Issue #9792: create_connection() should not recast timeout errors
4094 # as generic socket errors.
4095 with self.mocked_socket_module():
4096 with self.assertRaises(socket.timeout):
4097 socket.create_connection((HOST, 1234))
4098
Guido van Rossumd8faa362007-04-27 19:54:29 +00004099
Victor Stinner45df8202010-04-28 22:31:17 +00004100@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004101class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4102
4103 def __init__(self, methodName='runTest'):
4104 SocketTCPTest.__init__(self, methodName=methodName)
4105 ThreadableTest.__init__(self)
4106
4107 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004108 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004109
4110 def clientTearDown(self):
4111 self.cli.close()
4112 self.cli = None
4113 ThreadableTest.clientTearDown(self)
4114
4115 def _justAccept(self):
4116 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004117 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004118
4119 testFamily = _justAccept
4120 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004121 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004122 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004123 self.assertEqual(self.cli.family, 2)
4124
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004125 testSourceAddress = _justAccept
4126 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004127 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4128 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004129 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004130 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004131 # The port number being used is sufficient to show that the bind()
4132 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004133
Guido van Rossumd8faa362007-04-27 19:54:29 +00004134 testTimeoutDefault = _justAccept
4135 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004136 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004137 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004138 socket.setdefaulttimeout(42)
4139 try:
4140 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004141 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004142 finally:
4143 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004144 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004145
4146 testTimeoutNone = _justAccept
4147 def _testTimeoutNone(self):
4148 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004149 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004150 socket.setdefaulttimeout(30)
4151 try:
4152 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004153 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004154 finally:
4155 socket.setdefaulttimeout(None)
4156 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004157
4158 testTimeoutValueNamed = _justAccept
4159 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004160 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004161 self.assertEqual(self.cli.gettimeout(), 30)
4162
4163 testTimeoutValueNonamed = _justAccept
4164 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004165 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004166 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004167 self.assertEqual(self.cli.gettimeout(), 30)
4168
Victor Stinner45df8202010-04-28 22:31:17 +00004169@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004170class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4171
4172 def __init__(self, methodName='runTest'):
4173 SocketTCPTest.__init__(self, methodName=methodName)
4174 ThreadableTest.__init__(self)
4175
4176 def clientSetUp(self):
4177 pass
4178
4179 def clientTearDown(self):
4180 self.cli.close()
4181 self.cli = None
4182 ThreadableTest.clientTearDown(self)
4183
4184 def testInsideTimeout(self):
4185 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004186 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004187 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004188 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004189 testOutsideTimeout = testInsideTimeout
4190
4191 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004192 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004193 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004194 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004195
4196 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004197 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004198 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004199
4200
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004201class TCPTimeoutTest(SocketTCPTest):
4202
4203 def testTCPTimeout(self):
4204 def raise_timeout(*args, **kwargs):
4205 self.serv.settimeout(1.0)
4206 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004207 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004208 "Error generating a timeout exception (TCP)")
4209
4210 def testTimeoutZero(self):
4211 ok = False
4212 try:
4213 self.serv.settimeout(0.0)
4214 foo = self.serv.accept()
4215 except socket.timeout:
4216 self.fail("caught timeout instead of error (TCP)")
4217 except socket.error:
4218 ok = True
4219 except:
4220 self.fail("caught unexpected exception (TCP)")
4221 if not ok:
4222 self.fail("accept() returned success when we did not expect it")
4223
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004224 def testInterruptedTimeout(self):
4225 # XXX I don't know how to do this test on MSWindows or any other
4226 # plaform that doesn't support signal.alarm() or os.kill(), though
4227 # the bug should have existed on all platforms.
4228 if not hasattr(signal, "alarm"):
4229 return # can only test on *nix
4230 self.serv.settimeout(5.0) # must be longer than alarm
4231 class Alarm(Exception):
4232 pass
4233 def alarm_handler(signal, frame):
4234 raise Alarm
4235 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4236 try:
4237 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4238 try:
4239 foo = self.serv.accept()
4240 except socket.timeout:
4241 self.fail("caught timeout instead of Alarm")
4242 except Alarm:
4243 pass
4244 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004245 self.fail("caught other exception instead of Alarm:"
4246 " %s(%s):\n%s" %
4247 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004248 else:
4249 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004250 finally:
4251 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004252 except Alarm:
4253 self.fail("got Alarm in wrong place")
4254 finally:
4255 # no alarm can be pending. Safe to restore old handler.
4256 signal.signal(signal.SIGALRM, old_alarm)
4257
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004258class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004259
4260 def testUDPTimeout(self):
4261 def raise_timeout(*args, **kwargs):
4262 self.serv.settimeout(1.0)
4263 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004264 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004265 "Error generating a timeout exception (UDP)")
4266
4267 def testTimeoutZero(self):
4268 ok = False
4269 try:
4270 self.serv.settimeout(0.0)
4271 foo = self.serv.recv(1024)
4272 except socket.timeout:
4273 self.fail("caught timeout instead of error (UDP)")
4274 except socket.error:
4275 ok = True
4276 except:
4277 self.fail("caught unexpected exception (UDP)")
4278 if not ok:
4279 self.fail("recv() returned success when we did not expect it")
4280
4281class TestExceptions(unittest.TestCase):
4282
4283 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004284 self.assertTrue(issubclass(socket.error, Exception))
4285 self.assertTrue(issubclass(socket.herror, socket.error))
4286 self.assertTrue(issubclass(socket.gaierror, socket.error))
4287 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004288
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004289class TestLinuxAbstractNamespace(unittest.TestCase):
4290
4291 UNIX_PATH_MAX = 108
4292
4293 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004294 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004295 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4296 s1.bind(address)
4297 s1.listen(1)
4298 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4299 s2.connect(s1.getsockname())
4300 with s1.accept()[0] as s3:
4301 self.assertEqual(s1.getsockname(), address)
4302 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004303
4304 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004305 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004306 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4307 s.bind(address)
4308 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004309
4310 def testNameOverflow(self):
4311 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004312 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4313 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004314
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004315 def testStrName(self):
4316 # Check that an abstract name can be passed as a string.
4317 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4318 try:
4319 s.bind("\x00python\x00test\x00")
4320 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4321 finally:
4322 s.close()
4323
4324class TestUnixDomain(unittest.TestCase):
4325
4326 def setUp(self):
4327 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4328
4329 def tearDown(self):
4330 self.sock.close()
4331
4332 def encoded(self, path):
4333 # Return the given path encoded in the file system encoding,
4334 # or skip the test if this is not possible.
4335 try:
4336 return os.fsencode(path)
4337 except UnicodeEncodeError:
4338 self.skipTest(
4339 "Pathname {0!a} cannot be represented in file "
4340 "system encoding {1!r}".format(
4341 path, sys.getfilesystemencoding()))
4342
Antoine Pitrou16374872011-12-16 15:04:12 +01004343 def bind(self, sock, path):
4344 # Bind the socket
4345 try:
4346 sock.bind(path)
4347 except OSError as e:
4348 if str(e) == "AF_UNIX path too long":
4349 self.skipTest(
4350 "Pathname {0!a} is too long to serve as a AF_UNIX path"
4351 .format(path))
4352 else:
4353 raise
4354
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004355 def testStrAddr(self):
4356 # Test binding to and retrieving a normal string pathname.
4357 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004358 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004359 self.addCleanup(support.unlink, path)
4360 self.assertEqual(self.sock.getsockname(), path)
4361
4362 def testBytesAddr(self):
4363 # Test binding to a bytes pathname.
4364 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004365 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004366 self.addCleanup(support.unlink, path)
4367 self.assertEqual(self.sock.getsockname(), path)
4368
4369 def testSurrogateescapeBind(self):
4370 # Test binding to a valid non-ASCII pathname, with the
4371 # non-ASCII bytes supplied using surrogateescape encoding.
4372 path = os.path.abspath(support.TESTFN_UNICODE)
4373 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004374 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004375 self.addCleanup(support.unlink, path)
4376 self.assertEqual(self.sock.getsockname(), path)
4377
4378 def testUnencodableAddr(self):
4379 # Test binding to a pathname that cannot be encoded in the
4380 # file system encoding.
4381 if support.TESTFN_UNENCODABLE is None:
4382 self.skipTest("No unencodable filename available")
4383 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004384 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004385 self.addCleanup(support.unlink, path)
4386 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004387
Victor Stinner45df8202010-04-28 22:31:17 +00004388@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004389class BufferIOTest(SocketConnectedTest):
4390 """
4391 Test the buffer versions of socket.recv() and socket.send().
4392 """
4393 def __init__(self, methodName='runTest'):
4394 SocketConnectedTest.__init__(self, methodName=methodName)
4395
Antoine Pitrou25480782010-03-17 22:50:28 +00004396 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004397 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004398 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004399 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004400 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004401 self.assertEqual(msg, MSG)
4402
Antoine Pitrou25480782010-03-17 22:50:28 +00004403 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004404 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004405 self.serv_conn.send(buf)
4406
Antoine Pitrou25480782010-03-17 22:50:28 +00004407 def testRecvIntoBytearray(self):
4408 buf = bytearray(1024)
4409 nbytes = self.cli_conn.recv_into(buf)
4410 self.assertEqual(nbytes, len(MSG))
4411 msg = buf[:len(MSG)]
4412 self.assertEqual(msg, MSG)
4413
4414 _testRecvIntoBytearray = _testRecvIntoArray
4415
4416 def testRecvIntoMemoryview(self):
4417 buf = bytearray(1024)
4418 nbytes = self.cli_conn.recv_into(memoryview(buf))
4419 self.assertEqual(nbytes, len(MSG))
4420 msg = buf[:len(MSG)]
4421 self.assertEqual(msg, MSG)
4422
4423 _testRecvIntoMemoryview = _testRecvIntoArray
4424
4425 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004426 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004427 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004428 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004429 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004430 self.assertEqual(msg, MSG)
4431
Antoine Pitrou25480782010-03-17 22:50:28 +00004432 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004433 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004434 self.serv_conn.send(buf)
4435
Antoine Pitrou25480782010-03-17 22:50:28 +00004436 def testRecvFromIntoBytearray(self):
4437 buf = bytearray(1024)
4438 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4439 self.assertEqual(nbytes, len(MSG))
4440 msg = buf[:len(MSG)]
4441 self.assertEqual(msg, MSG)
4442
4443 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4444
4445 def testRecvFromIntoMemoryview(self):
4446 buf = bytearray(1024)
4447 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4448 self.assertEqual(nbytes, len(MSG))
4449 msg = buf[:len(MSG)]
4450 self.assertEqual(msg, MSG)
4451
4452 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4453
Christian Heimes043d6f62008-01-07 17:19:16 +00004454
4455TIPC_STYPE = 2000
4456TIPC_LOWER = 200
4457TIPC_UPPER = 210
4458
4459def isTipcAvailable():
4460 """Check if the TIPC module is loaded
4461
4462 The TIPC module is not loaded automatically on Ubuntu and probably
4463 other Linux distros.
4464 """
4465 if not hasattr(socket, "AF_TIPC"):
4466 return False
4467 if not os.path.isfile("/proc/modules"):
4468 return False
4469 with open("/proc/modules") as f:
4470 for line in f:
4471 if line.startswith("tipc "):
4472 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004473 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004474 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4475 return False
4476
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004477class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004478 def testRDM(self):
4479 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4480 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004481 self.addCleanup(srv.close)
4482 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004483
4484 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4485 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4486 TIPC_LOWER, TIPC_UPPER)
4487 srv.bind(srvaddr)
4488
4489 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4490 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4491 cli.sendto(MSG, sendaddr)
4492
4493 msg, recvaddr = srv.recvfrom(1024)
4494
4495 self.assertEqual(cli.getsockname(), recvaddr)
4496 self.assertEqual(msg, MSG)
4497
4498
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004499class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004500 def __init__(self, methodName = 'runTest'):
4501 unittest.TestCase.__init__(self, methodName = methodName)
4502 ThreadableTest.__init__(self)
4503
4504 def setUp(self):
4505 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004506 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004507 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4508 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4509 TIPC_LOWER, TIPC_UPPER)
4510 self.srv.bind(srvaddr)
4511 self.srv.listen(5)
4512 self.serverExplicitReady()
4513 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004514 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004515
4516 def clientSetUp(self):
4517 # The is a hittable race between serverExplicitReady() and the
4518 # accept() call; sleep a little while to avoid it, otherwise
4519 # we could get an exception
4520 time.sleep(0.1)
4521 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004522 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004523 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4524 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4525 self.cli.connect(addr)
4526 self.cliaddr = self.cli.getsockname()
4527
4528 def testStream(self):
4529 msg = self.conn.recv(1024)
4530 self.assertEqual(msg, MSG)
4531 self.assertEqual(self.cliaddr, self.connaddr)
4532
4533 def _testStream(self):
4534 self.cli.send(MSG)
4535 self.cli.close()
4536
4537
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004538@unittest.skipUnless(thread, 'Threading required for this test.')
4539class ContextManagersTest(ThreadedTCPSocketTest):
4540
4541 def _testSocketClass(self):
4542 # base test
4543 with socket.socket() as sock:
4544 self.assertFalse(sock._closed)
4545 self.assertTrue(sock._closed)
4546 # close inside with block
4547 with socket.socket() as sock:
4548 sock.close()
4549 self.assertTrue(sock._closed)
4550 # exception inside with block
4551 with socket.socket() as sock:
4552 self.assertRaises(socket.error, sock.sendall, b'foo')
4553 self.assertTrue(sock._closed)
4554
4555 def testCreateConnectionBase(self):
4556 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004557 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004558 data = conn.recv(1024)
4559 conn.sendall(data)
4560
4561 def _testCreateConnectionBase(self):
4562 address = self.serv.getsockname()
4563 with socket.create_connection(address) as sock:
4564 self.assertFalse(sock._closed)
4565 sock.sendall(b'foo')
4566 self.assertEqual(sock.recv(1024), b'foo')
4567 self.assertTrue(sock._closed)
4568
4569 def testCreateConnectionClose(self):
4570 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004571 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004572 data = conn.recv(1024)
4573 conn.sendall(data)
4574
4575 def _testCreateConnectionClose(self):
4576 address = self.serv.getsockname()
4577 with socket.create_connection(address) as sock:
4578 sock.close()
4579 self.assertTrue(sock._closed)
4580 self.assertRaises(socket.error, sock.sendall, b'foo')
4581
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004582
Antoine Pitroub1c54962010-10-14 15:05:38 +00004583@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4584 "SOCK_CLOEXEC not defined")
4585@unittest.skipUnless(fcntl, "module fcntl not available")
4586class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004587 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004588 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004589 with socket.socket(socket.AF_INET,
4590 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4591 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4592 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004593
4594
4595@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4596 "SOCK_NONBLOCK not defined")
4597class NonblockConstantTest(unittest.TestCase):
4598 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4599 if nonblock:
4600 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4601 self.assertEqual(s.gettimeout(), timeout)
4602 else:
4603 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4604 self.assertEqual(s.gettimeout(), None)
4605
Charles-François Natali239bb962011-06-03 12:55:15 +02004606 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004607 def test_SOCK_NONBLOCK(self):
4608 # a lot of it seems silly and redundant, but I wanted to test that
4609 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004610 with socket.socket(socket.AF_INET,
4611 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4612 self.checkNonblock(s)
4613 s.setblocking(1)
4614 self.checkNonblock(s, False)
4615 s.setblocking(0)
4616 self.checkNonblock(s)
4617 s.settimeout(None)
4618 self.checkNonblock(s, False)
4619 s.settimeout(2.0)
4620 self.checkNonblock(s, timeout=2.0)
4621 s.setblocking(1)
4622 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004623 # defaulttimeout
4624 t = socket.getdefaulttimeout()
4625 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004626 with socket.socket() as s:
4627 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004628 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004629 with socket.socket() as s:
4630 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004631 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004632 with socket.socket() as s:
4633 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004634 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004635 with socket.socket() as s:
4636 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004637 socket.setdefaulttimeout(t)
4638
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004639
Guido van Rossumb995eb72002-07-31 16:08:40 +00004640def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004641 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004642 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004643
4644 tests.extend([
4645 NonBlockingTCPTests,
4646 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004647 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004648 UnbufferedFileObjectClassTestCase,
4649 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004650 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004651 UnicodeReadFileObjectClassTestCase,
4652 UnicodeWriteFileObjectClassTestCase,
4653 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004654 NetworkConnectionNoServer,
4655 NetworkConnectionAttributesTest,
4656 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004657 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004658 CloexecConstantTest,
4659 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004660 ])
Dave Cole331708b2004-08-09 04:51:41 +00004661 if hasattr(socket, "socketpair"):
4662 tests.append(BasicSocketPairTest)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004663 if hasattr(socket, "AF_UNIX"):
4664 tests.append(TestUnixDomain)
Victor Stinnere6747472011-08-21 00:39:18 +02004665 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004666 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004667 if isTipcAvailable():
4668 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004669 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004670 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01004671 tests.extend([BasicRDSTest, RDSTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004672 tests.extend([
4673 CmsgMacroTests,
4674 SendmsgUDPTest,
4675 RecvmsgUDPTest,
4676 RecvmsgIntoUDPTest,
4677 SendmsgUDP6Test,
4678 RecvmsgUDP6Test,
4679 RecvmsgRFC3542AncillaryUDP6Test,
4680 RecvmsgIntoRFC3542AncillaryUDP6Test,
4681 RecvmsgIntoUDP6Test,
4682 SendmsgTCPTest,
4683 RecvmsgTCPTest,
4684 RecvmsgIntoTCPTest,
4685 SendmsgSCTPStreamTest,
4686 RecvmsgSCTPStreamTest,
4687 RecvmsgIntoSCTPStreamTest,
4688 SendmsgUnixStreamTest,
4689 RecvmsgUnixStreamTest,
4690 RecvmsgIntoUnixStreamTest,
4691 RecvmsgSCMRightsStreamTest,
4692 RecvmsgIntoSCMRightsStreamTest,
4693 # These are slow when setitimer() is not available
4694 InterruptedRecvTimeoutTest,
4695 InterruptedSendTimeoutTest,
4696 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004697
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004698 thread_info = support.threading_setup()
4699 support.run_unittest(*tests)
4700 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004701
4702if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004703 test_main()