blob: 50016ab615a23b3f31b10e610b1b24fe6e0ce017 [file] [log] [blame]
Guido van Rossum24e4af82002-06-12 19:18:08 +00001import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00002from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003
Christian Heimes5e696852008-04-09 08:37:03 +00004import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00005import io
Charles-François Natali65708cf2014-07-25 18:44:30 +01006import itertools
Barry Warsawcf3d4b51997-01-03 20:03:32 +00007import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00008import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +10009import tempfile
Christian Heimesbbe741d2008-03-28 10:53:29 +000010import time
11import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000012import queue
Jack Jansen522e7692002-09-06 21:57:50 +000013import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000014import os
15import array
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000016import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000017from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000018import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000019import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010020import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020021import struct
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020022import random
23import string
Antoine Pitroub1c54962010-10-14 15:05:38 +000024try:
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000025 import multiprocessing
26except ImportError:
27 multiprocessing = False
Victor Stinnera3c18d02013-09-08 11:53:09 +020028try:
29 import fcntl
30except ImportError:
31 fcntl = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Benjamin Petersonee8712c2008-05-20 21:35:26 +000033HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000034MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000035
caaveryeffc12f2017-09-06 18:18:10 -040036VSOCKPORT = 1234
37
Victor Stinner45df8202010-04-28 22:31:17 +000038try:
39 import _thread as thread
40 import threading
41except ImportError:
42 thread = None
43 threading = None
Victor Stinnere254e532014-07-26 14:36:55 +020044try:
45 import _socket
46except ImportError:
47 _socket = None
48
caaveryeffc12f2017-09-06 18:18:10 -040049def get_cid():
50 if fcntl is None:
51 return None
52 try:
53 with open("/dev/vsock", "rb") as f:
54 r = fcntl.ioctl(f, socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID, " ")
55 except OSError:
56 return None
57 else:
58 return struct.unpack("I", r)[0]
Victor Stinner45df8202010-04-28 22:31:17 +000059
Charles-François Natali47413c12011-10-06 19:47:44 +020060def _have_socket_can():
61 """Check whether CAN sockets are supported on this host."""
62 try:
63 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Andrew Svetlov0832af62012-12-18 23:10:48 +020064 except (AttributeError, OSError):
Charles-François Natali47413c12011-10-06 19:47:44 +020065 return False
66 else:
67 s.close()
68 return True
69
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -040070def _have_socket_can_isotp():
71 """Check whether CAN ISOTP sockets are supported on this host."""
72 try:
73 s = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP)
74 except (AttributeError, OSError):
75 return False
76 else:
77 s.close()
78 return True
79
Charles-François Natali10b8cf42011-11-10 19:21:37 +010080def _have_socket_rds():
81 """Check whether RDS sockets are supported on this host."""
82 try:
83 s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
84 except (AttributeError, OSError):
85 return False
86 else:
87 s.close()
88 return True
89
Christian Heimes48371412016-09-06 00:37:46 +020090def _have_socket_alg():
91 """Check whether AF_ALG sockets are supported on this host."""
92 try:
93 s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
94 except (AttributeError, OSError):
95 return False
96 else:
97 s.close()
98 return True
99
caaveryeffc12f2017-09-06 18:18:10 -0400100def _have_socket_vsock():
101 """Check whether AF_VSOCK sockets are supported on this host."""
102 ret = get_cid() is not None
103 return ret
104
Charles-François Natali47413c12011-10-06 19:47:44 +0200105HAVE_SOCKET_CAN = _have_socket_can()
106
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -0400107HAVE_SOCKET_CAN_ISOTP = _have_socket_can_isotp()
108
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100109HAVE_SOCKET_RDS = _have_socket_rds()
110
Christian Heimes48371412016-09-06 00:37:46 +0200111HAVE_SOCKET_ALG = _have_socket_alg()
112
caaveryeffc12f2017-09-06 18:18:10 -0400113HAVE_SOCKET_VSOCK = _have_socket_vsock()
114
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000115# Size in bytes of the int type
116SIZEOF_INT = array.array("i").itemsize
117
Guido van Rossum24e4af82002-06-12 19:18:08 +0000118class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000119
Guido van Rossum24e4af82002-06-12 19:18:08 +0000120 def setUp(self):
121 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000122 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +0100123 self.serv.listen()
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000124
Guido van Rossum24e4af82002-06-12 19:18:08 +0000125 def tearDown(self):
126 self.serv.close()
127 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000128
Guido van Rossum24e4af82002-06-12 19:18:08 +0000129class SocketUDPTest(unittest.TestCase):
130
131 def setUp(self):
132 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000133 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000134
135 def tearDown(self):
136 self.serv.close()
137 self.serv = None
138
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000139class ThreadSafeCleanupTestCase(unittest.TestCase):
140 """Subclass of unittest.TestCase with thread-safe cleanup methods.
141
142 This subclass protects the addCleanup() and doCleanups() methods
143 with a recursive lock.
144 """
145
146 if threading:
147 def __init__(self, *args, **kwargs):
148 super().__init__(*args, **kwargs)
149 self._cleanup_lock = threading.RLock()
150
151 def addCleanup(self, *args, **kwargs):
152 with self._cleanup_lock:
153 return super().addCleanup(*args, **kwargs)
154
155 def doCleanups(self, *args, **kwargs):
156 with self._cleanup_lock:
157 return super().doCleanups(*args, **kwargs)
158
Charles-François Natali47413c12011-10-06 19:47:44 +0200159class SocketCANTest(unittest.TestCase):
160
161 """To be able to run this test, a `vcan0` CAN interface can be created with
162 the following commands:
163 # modprobe vcan
164 # ip link add dev vcan0 type vcan
165 # ifconfig vcan0 up
166 """
167 interface = 'vcan0'
168 bufsize = 128
169
Charles-François Natali773e42d2013-02-05 19:42:01 +0100170 """The CAN frame structure is defined in <linux/can.h>:
171
172 struct can_frame {
173 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
174 __u8 can_dlc; /* data length code: 0 .. 8 */
175 __u8 data[8] __attribute__((aligned(8)));
176 };
177 """
178 can_frame_fmt = "=IB3x8s"
179 can_frame_size = struct.calcsize(can_frame_fmt)
180
181 """The Broadcast Management Command frame structure is defined
182 in <linux/can/bcm.h>:
183
184 struct bcm_msg_head {
185 __u32 opcode;
186 __u32 flags;
187 __u32 count;
188 struct timeval ival1, ival2;
189 canid_t can_id;
190 __u32 nframes;
191 struct can_frame frames[0];
192 }
193
194 `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
195 `struct can_frame` definition). Must use native not standard types for packing.
196 """
197 bcm_cmd_msg_fmt = "@3I4l2I"
198 bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
199
Charles-François Natali47413c12011-10-06 19:47:44 +0200200 def setUp(self):
201 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200202 self.addCleanup(self.s.close)
Charles-François Natali47413c12011-10-06 19:47:44 +0200203 try:
204 self.s.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200205 except OSError:
Charles-François Natali47413c12011-10-06 19:47:44 +0200206 self.skipTest('network interface `%s` does not exist' %
207 self.interface)
Charles-François Natali47413c12011-10-06 19:47:44 +0200208
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100209
210class SocketRDSTest(unittest.TestCase):
211
212 """To be able to run this test, the `rds` kernel module must be loaded:
213 # modprobe rds
214 """
215 bufsize = 8192
216
217 def setUp(self):
218 self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
219 self.addCleanup(self.serv.close)
220 try:
221 self.port = support.bind_port(self.serv)
222 except OSError:
223 self.skipTest('unable to bind RDS socket')
224
225
Guido van Rossum24e4af82002-06-12 19:18:08 +0000226class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000227 """Threadable Test class
228
229 The ThreadableTest class makes it easy to create a threaded
230 client/server pair from an existing unit test. To create a
231 new threaded class from an existing unit test, use multiple
232 inheritance:
233
234 class NewClass (OldClass, ThreadableTest):
235 pass
236
237 This class defines two new fixture functions with obvious
238 purposes for overriding:
239
240 clientSetUp ()
241 clientTearDown ()
242
243 Any new test functions within the class must then define
Martin Panter46f50722016-05-26 05:35:26 +0000244 tests in pairs, where the test name is preceded with a
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000245 '_' to indicate the client portion of the test. Ex:
246
247 def testFoo(self):
248 # Server portion
249
250 def _testFoo(self):
251 # Client portion
252
253 Any exceptions raised by the clients during their tests
254 are caught and transferred to the main thread to alert
255 the testing framework.
256
257 Note, the server setup function cannot call any blocking
258 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000259 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000260 the blocking call (such as in setting up a client/server
261 connection and performing the accept() in setUp().
262 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000263
264 def __init__(self):
265 # Swap the true setup function
266 self.__setUp = self.setUp
267 self.__tearDown = self.tearDown
268 self.setUp = self._setUp
269 self.tearDown = self._tearDown
270
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000271 def serverExplicitReady(self):
272 """This method allows the server to explicitly indicate that
273 it wants the client thread to proceed. This is useful if the
274 server is about to execute a blocking routine that is
275 dependent upon the client thread during its setup routine."""
276 self.server_ready.set()
277
Guido van Rossum24e4af82002-06-12 19:18:08 +0000278 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000279 self.server_ready = threading.Event()
280 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000281 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000282 self.queue = queue.Queue(1)
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200283 self.server_crashed = False
Guido van Rossum24e4af82002-06-12 19:18:08 +0000284
285 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000286 methodname = self.id()
287 i = methodname.rfind('.')
288 methodname = methodname[i+1:]
289 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000290 self.client_thread = thread.start_new_thread(
291 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000292
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200293 try:
294 self.__setUp()
295 except:
296 self.server_crashed = True
297 raise
298 finally:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000299 self.server_ready.set()
300 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000301
302 def _tearDown(self):
303 self.__tearDown()
304 self.done.wait()
305
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000306 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000307 exc = self.queue.get()
308 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000309
310 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000311 self.server_ready.wait()
Xavier de Gayee88ed052016-12-14 11:52:28 +0100312 try:
313 self.clientSetUp()
314 except BaseException as e:
315 self.queue.put(e)
316 self.clientTearDown()
317 return
318 finally:
319 self.client_ready.set()
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200320 if self.server_crashed:
321 self.clientTearDown()
322 return
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000323 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000324 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000325 try:
326 test_func()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000327 except BaseException as e:
328 self.queue.put(e)
329 finally:
330 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000331
332 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000333 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000334
335 def clientTearDown(self):
336 self.done.set()
337 thread.exit()
338
339class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
340
341 def __init__(self, methodName='runTest'):
342 SocketTCPTest.__init__(self, methodName=methodName)
343 ThreadableTest.__init__(self)
344
345 def clientSetUp(self):
346 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
347
348 def clientTearDown(self):
349 self.cli.close()
350 self.cli = None
351 ThreadableTest.clientTearDown(self)
352
353class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
354
355 def __init__(self, methodName='runTest'):
356 SocketUDPTest.__init__(self, methodName=methodName)
357 ThreadableTest.__init__(self)
358
359 def clientSetUp(self):
360 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
361
Brian Curtin3beb38f2010-11-04 03:41:43 +0000362 def clientTearDown(self):
363 self.cli.close()
364 self.cli = None
365 ThreadableTest.clientTearDown(self)
366
Charles-François Natali47413c12011-10-06 19:47:44 +0200367class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
368
369 def __init__(self, methodName='runTest'):
370 SocketCANTest.__init__(self, methodName=methodName)
371 ThreadableTest.__init__(self)
372
373 def clientSetUp(self):
374 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
375 try:
376 self.cli.bind((self.interface,))
Andrew Svetlov0832af62012-12-18 23:10:48 +0200377 except OSError:
Antoine Pitrou86fe8602011-10-10 20:15:59 +0200378 # skipTest should not be called here, and will be called in the
379 # server instead
380 pass
Charles-François Natali47413c12011-10-06 19:47:44 +0200381
382 def clientTearDown(self):
383 self.cli.close()
384 self.cli = None
385 ThreadableTest.clientTearDown(self)
386
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100387class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
388
389 def __init__(self, methodName='runTest'):
390 SocketRDSTest.__init__(self, methodName=methodName)
391 ThreadableTest.__init__(self)
Charles-François Natali10b8cf42011-11-10 19:21:37 +0100392
393 def clientSetUp(self):
394 self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
395 try:
396 # RDS sockets must be bound explicitly to send or receive data
397 self.cli.bind((HOST, 0))
398 self.cli_addr = self.cli.getsockname()
399 except OSError:
400 # skipTest should not be called here, and will be called in the
401 # server instead
402 pass
403
404 def clientTearDown(self):
405 self.cli.close()
406 self.cli = None
407 ThreadableTest.clientTearDown(self)
408
caaveryeffc12f2017-09-06 18:18:10 -0400409@unittest.skipIf(fcntl is None, "need fcntl")
410@unittest.skipUnless(thread, 'Threading required for this test.')
411@unittest.skipUnless(HAVE_SOCKET_VSOCK,
412 'VSOCK sockets required for this test.')
413@unittest.skipUnless(get_cid() != 2,
414 "This test can only be run on a virtual guest.")
415class ThreadedVSOCKSocketStreamTest(unittest.TestCase, ThreadableTest):
416
417 def __init__(self, methodName='runTest'):
418 unittest.TestCase.__init__(self, methodName=methodName)
419 ThreadableTest.__init__(self)
420
421 def setUp(self):
422 self.serv = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
423 self.addCleanup(self.serv.close)
424 self.serv.bind((socket.VMADDR_CID_ANY, VSOCKPORT))
425 self.serv.listen()
426 self.serverExplicitReady()
427 self.conn, self.connaddr = self.serv.accept()
428 self.addCleanup(self.conn.close)
429
430 def clientSetUp(self):
431 time.sleep(0.1)
432 self.cli = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
433 self.addCleanup(self.cli.close)
434 cid = get_cid()
435 self.cli.connect((cid, VSOCKPORT))
436
437 def testStream(self):
438 msg = self.conn.recv(1024)
439 self.assertEqual(msg, MSG)
440
441 def _testStream(self):
442 self.cli.send(MSG)
443 self.cli.close()
444
Guido van Rossum24e4af82002-06-12 19:18:08 +0000445class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000446 """Socket tests for client-server connection.
447
448 self.cli_conn is a client socket connected to the server. The
449 setUp() method guarantees that it is connected to the server.
450 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000451
452 def __init__(self, methodName='runTest'):
453 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
454
455 def setUp(self):
456 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000457 # Indicate explicitly we're ready for the client thread to
458 # proceed and then perform the blocking call to accept
459 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000460 conn, addr = self.serv.accept()
461 self.cli_conn = conn
462
463 def tearDown(self):
464 self.cli_conn.close()
465 self.cli_conn = None
466 ThreadedTCPSocketTest.tearDown(self)
467
468 def clientSetUp(self):
469 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000470 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000471 self.serv_conn = self.cli
472
473 def clientTearDown(self):
474 self.serv_conn.close()
475 self.serv_conn = None
476 ThreadedTCPSocketTest.clientTearDown(self)
477
Dave Cole331708b2004-08-09 04:51:41 +0000478class SocketPairTest(unittest.TestCase, ThreadableTest):
479
480 def __init__(self, methodName='runTest'):
481 unittest.TestCase.__init__(self, methodName=methodName)
482 ThreadableTest.__init__(self)
483
484 def setUp(self):
485 self.serv, self.cli = socket.socketpair()
486
487 def tearDown(self):
488 self.serv.close()
489 self.serv = None
490
491 def clientSetUp(self):
492 pass
493
494 def clientTearDown(self):
495 self.cli.close()
496 self.cli = None
497 ThreadableTest.clientTearDown(self)
498
Tim Peters494aaee2004-08-09 18:54:11 +0000499
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000500# The following classes are used by the sendmsg()/recvmsg() tests.
501# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
502# gives a drop-in replacement for SocketConnectedTest, but different
503# address families can be used, and the attributes serv_addr and
504# cli_addr will be set to the addresses of the endpoints.
505
506class SocketTestBase(unittest.TestCase):
507 """A base class for socket tests.
508
509 Subclasses must provide methods newSocket() to return a new socket
510 and bindSock(sock) to bind it to an unused address.
511
512 Creates a socket self.serv and sets self.serv_addr to its address.
513 """
514
515 def setUp(self):
516 self.serv = self.newSocket()
517 self.bindServer()
518
519 def bindServer(self):
520 """Bind server socket and set self.serv_addr to its address."""
521 self.bindSock(self.serv)
522 self.serv_addr = self.serv.getsockname()
523
524 def tearDown(self):
525 self.serv.close()
526 self.serv = None
527
528
529class SocketListeningTestMixin(SocketTestBase):
530 """Mixin to listen on the server socket."""
531
532 def setUp(self):
533 super().setUp()
Charles-François Natali6e204602014-07-23 19:28:13 +0100534 self.serv.listen()
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000535
536
537class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
538 ThreadableTest):
539 """Mixin to add client socket and allow client/server tests.
540
541 Client socket is self.cli and its address is self.cli_addr. See
542 ThreadableTest for usage information.
543 """
544
545 def __init__(self, *args, **kwargs):
546 super().__init__(*args, **kwargs)
547 ThreadableTest.__init__(self)
548
549 def clientSetUp(self):
550 self.cli = self.newClientSocket()
551 self.bindClient()
552
553 def newClientSocket(self):
554 """Return a new socket for use as client."""
555 return self.newSocket()
556
557 def bindClient(self):
558 """Bind client socket and set self.cli_addr to its address."""
559 self.bindSock(self.cli)
560 self.cli_addr = self.cli.getsockname()
561
562 def clientTearDown(self):
563 self.cli.close()
564 self.cli = None
565 ThreadableTest.clientTearDown(self)
566
567
568class ConnectedStreamTestMixin(SocketListeningTestMixin,
569 ThreadedSocketTestMixin):
570 """Mixin to allow client/server stream tests with connected client.
571
572 Server's socket representing connection to client is self.cli_conn
573 and client's connection to server is self.serv_conn. (Based on
574 SocketConnectedTest.)
575 """
576
577 def setUp(self):
578 super().setUp()
579 # Indicate explicitly we're ready for the client thread to
580 # proceed and then perform the blocking call to accept
581 self.serverExplicitReady()
582 conn, addr = self.serv.accept()
583 self.cli_conn = conn
584
585 def tearDown(self):
586 self.cli_conn.close()
587 self.cli_conn = None
588 super().tearDown()
589
590 def clientSetUp(self):
591 super().clientSetUp()
592 self.cli.connect(self.serv_addr)
593 self.serv_conn = self.cli
594
595 def clientTearDown(self):
Xavier de Gayee88ed052016-12-14 11:52:28 +0100596 try:
597 self.serv_conn.close()
598 self.serv_conn = None
599 except AttributeError:
600 pass
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000601 super().clientTearDown()
602
603
604class UnixSocketTestBase(SocketTestBase):
605 """Base class for Unix-domain socket tests."""
606
607 # This class is used for file descriptor passing tests, so we
608 # create the sockets in a private directory so that other users
609 # can't send anything that might be problematic for a privileged
610 # user running the tests.
611
612 def setUp(self):
613 self.dir_path = tempfile.mkdtemp()
614 self.addCleanup(os.rmdir, self.dir_path)
615 super().setUp()
616
617 def bindSock(self, sock):
618 path = tempfile.mktemp(dir=self.dir_path)
Xavier de Gayee88ed052016-12-14 11:52:28 +0100619 support.bind_unix_socket(sock, path)
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000620 self.addCleanup(support.unlink, path)
621
622class UnixStreamBase(UnixSocketTestBase):
623 """Base class for Unix-domain SOCK_STREAM tests."""
624
625 def newSocket(self):
626 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
627
628
629class InetTestBase(SocketTestBase):
630 """Base class for IPv4 socket tests."""
631
632 host = HOST
633
634 def setUp(self):
635 super().setUp()
636 self.port = self.serv_addr[1]
637
638 def bindSock(self, sock):
639 support.bind_port(sock, host=self.host)
640
641class TCPTestBase(InetTestBase):
642 """Base class for TCP-over-IPv4 tests."""
643
644 def newSocket(self):
645 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
646
647class UDPTestBase(InetTestBase):
648 """Base class for UDP-over-IPv4 tests."""
649
650 def newSocket(self):
651 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
652
653class SCTPStreamBase(InetTestBase):
654 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
655
656 def newSocket(self):
657 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
658 socket.IPPROTO_SCTP)
659
660
661class Inet6TestBase(InetTestBase):
662 """Base class for IPv6 socket tests."""
663
Charles-François Natalifcfb3242013-08-31 14:40:49 +0200664 host = support.HOSTv6
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000665
666class UDP6TestBase(Inet6TestBase):
667 """Base class for UDP-over-IPv6 tests."""
668
669 def newSocket(self):
670 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
671
672
673# Test-skipping decorators for use with ThreadableTest.
674
675def skipWithClientIf(condition, reason):
676 """Skip decorated test if condition is true, add client_skip decorator.
677
678 If the decorated object is not a class, sets its attribute
679 "client_skip" to a decorator which will return an empty function
680 if the test is to be skipped, or the original function if it is
681 not. This can be used to avoid running the client part of a
682 skipped test when using ThreadableTest.
683 """
684 def client_pass(*args, **kwargs):
685 pass
686 def skipdec(obj):
687 retval = unittest.skip(reason)(obj)
688 if not isinstance(obj, type):
689 retval.client_skip = lambda f: client_pass
690 return retval
691 def noskipdec(obj):
692 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
693 obj.client_skip = lambda f: f
694 return obj
695 return skipdec if condition else noskipdec
696
697
698def requireAttrs(obj, *attributes):
699 """Skip decorated test if obj is missing any of the given attributes.
700
701 Sets client_skip attribute as skipWithClientIf() does.
702 """
703 missing = [name for name in attributes if not hasattr(obj, name)]
704 return skipWithClientIf(
705 missing, "don't have " + ", ".join(name for name in missing))
706
707
708def requireSocket(*args):
709 """Skip decorated test if a socket cannot be created with given arguments.
710
711 When an argument is given as a string, will use the value of that
712 attribute of the socket module, or skip the test if it doesn't
713 exist. Sets client_skip attribute as skipWithClientIf() does.
714 """
715 err = None
716 missing = [obj for obj in args if
717 isinstance(obj, str) and not hasattr(socket, obj)]
718 if missing:
719 err = "don't have " + ", ".join(name for name in missing)
720 else:
721 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
722 for obj in args]
723 try:
724 s = socket.socket(*callargs)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200725 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000726 # XXX: check errno?
727 err = str(e)
728 else:
729 s.close()
730 return skipWithClientIf(
731 err is not None,
732 "can't create socket({0}): {1}".format(
733 ", ".join(str(o) for o in args), err))
734
735
Guido van Rossum24e4af82002-06-12 19:18:08 +0000736#######################################################################
737## Begin Tests
738
739class GeneralModuleTests(unittest.TestCase):
740
Ethan Furman7184bac2014-10-14 18:56:53 -0700741 def test_SocketType_is_socketobject(self):
742 import _socket
743 self.assertTrue(socket.SocketType is _socket.socket)
744 s = socket.socket()
745 self.assertIsInstance(s, socket.SocketType)
746 s.close()
747
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000748 def test_repr(self):
749 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200750 with s:
751 self.assertIn('fd=%i' % s.fileno(), repr(s))
Nick Coghlanca351e62013-11-13 22:10:16 +1000752 self.assertIn('family=%s' % socket.AF_INET, repr(s))
753 self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200754 self.assertIn('proto=0', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200755 self.assertNotIn('raddr', repr(s))
756 s.bind(('127.0.0.1', 0))
Giampaolo Rodola'7ca49362013-04-12 18:28:15 +0200757 self.assertIn('laddr', repr(s))
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200758 self.assertIn(str(s.getsockname()), repr(s))
759 self.assertIn('[closed]', repr(s))
760 self.assertNotIn('laddr', repr(s))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000761
Victor Stinnere254e532014-07-26 14:36:55 +0200762 @unittest.skipUnless(_socket is not None, 'need _socket module')
763 def test_csocket_repr(self):
764 s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
765 try:
766 expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
767 % (s.fileno(), s.family, s.type, s.proto))
768 self.assertEqual(repr(s), expected)
769 finally:
770 s.close()
771 expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
772 % (s.family, s.type, s.proto))
773 self.assertEqual(repr(s), expected)
774
Raymond Hettinger027bb632004-05-31 03:09:25 +0000775 def test_weakref(self):
776 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
777 p = proxy(s)
778 self.assertEqual(p.fileno(), s.fileno())
779 s.close()
780 s = None
781 try:
782 p.fileno()
783 except ReferenceError:
784 pass
785 else:
786 self.fail('Socket proxy still exists')
787
Guido van Rossum24e4af82002-06-12 19:18:08 +0000788 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000789 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300790 msg = "Error raising socket exception (%s)."
Andrew Svetlov0832af62012-12-18 23:10:48 +0200791 with self.assertRaises(OSError, msg=msg % 'OSError'):
792 raise OSError
793 with self.assertRaises(OSError, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000794 raise socket.herror
Andrew Svetlov0832af62012-12-18 23:10:48 +0200795 with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000796 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000797
Ezio Melotti63e42302011-05-07 19:47:48 +0300798 def testSendtoErrors(self):
Martin Panter69332c12016-08-04 13:07:31 +0000799 # Testing that sendto doesn't mask failures. See #10169.
Ezio Melotti63e42302011-05-07 19:47:48 +0300800 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
801 self.addCleanup(s.close)
802 s.bind(('', 0))
803 sockname = s.getsockname()
804 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300805 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300806 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300807 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400808 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300809 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300810 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300811 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400812 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300813 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300814 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300815 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300816 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300817 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300818 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300819 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400820 "a bytes-like object is required, not 'str'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300821 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300822 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300823 self.assertEqual(str(cm.exception),
R David Murray861470c2014-10-05 11:47:01 -0400824 "a bytes-like object is required, not 'complex'")
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300825 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300826 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300827 self.assertIn('not NoneType', str(cm.exception))
828 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300829 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300830 self.assertIn('an integer is required', str(cm.exception))
831 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300832 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300833 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300834 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300835 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300836 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300837 self.assertIn('(1 given)', str(cm.exception))
838 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300839 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300840 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300841
Guido van Rossum24e4af82002-06-12 19:18:08 +0000842 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000843 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000844 socket.AF_INET
845 socket.SOCK_STREAM
846 socket.SOCK_DGRAM
847 socket.SOCK_RAW
848 socket.SOCK_RDM
849 socket.SOCK_SEQPACKET
850 socket.SOL_SOCKET
851 socket.SO_REUSEADDR
852
Guido van Rossum654c11e2002-06-13 20:24:17 +0000853 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000854 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000855 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000856 try:
857 ip = socket.gethostbyname(hostname)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200858 except OSError:
Guido van Rossum71e02942002-12-26 16:55:15 +0000859 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600860 self.skipTest('name lookup failure')
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000861 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000862 try:
863 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200864 except OSError:
Guido van Rossum9647b522002-12-26 17:04:45 +0000865 # Probably a similar problem as above; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -0600866 self.skipTest('name lookup failure')
Brett Cannon01668a12005-03-11 00:04:17 +0000867 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000868 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000869 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000870 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000871
Charles-François Natali0cc86852013-09-13 19:53:08 +0200872 def test_host_resolution(self):
Charles-François Natali0cc86852013-09-13 19:53:08 +0200873 for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
874 self.assertEqual(socket.gethostbyname(addr), addr)
875
876 # we don't test support.HOSTv6 because there's a chance it doesn't have
877 # a matching name entry (e.g. 'ip6-localhost')
878 for host in [support.HOST]:
879 self.assertIn(host, socket.gethostbyaddr(host)[2])
880
Xiang Zhangd36a7162017-03-07 11:06:09 +0800881 def test_host_resolution_bad_address(self):
882 # These are all malformed IP addresses and expected not to resolve to
883 # any result. But some ISPs, e.g. AWS, may successfully resolve these
884 # IPs.
885 explanation = (
886 "resolving an invalid IP address did not raise OSError; "
887 "can be caused by a broken DNS server"
888 )
889 for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
890 '1:1:1:1:1:1:1:1:1']:
891 with self.assertRaises(OSError):
892 socket.gethostbyname(addr)
893 with self.assertRaises(OSError, msg=explanation):
894 socket.gethostbyaddr(addr)
895
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000896 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
897 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
898 def test_sethostname(self):
899 oldhn = socket.gethostname()
900 try:
901 socket.sethostname('new')
Andrew Svetlov0832af62012-12-18 23:10:48 +0200902 except OSError as e:
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000903 if e.errno == errno.EPERM:
904 self.skipTest("test should be run as root")
905 else:
906 raise
907 try:
908 # running test as root!
909 self.assertEqual(socket.gethostname(), 'new')
910 # Should work with bytes objects too
911 socket.sethostname(b'bar')
912 self.assertEqual(socket.gethostname(), 'bar')
913 finally:
914 socket.sethostname(oldhn)
915
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700916 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
917 'socket.if_nameindex() not available.')
918 def testInterfaceNameIndex(self):
919 interfaces = socket.if_nameindex()
920 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200921 self.assertIsInstance(index, int)
922 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700923 # interface indices are non-zero integers
924 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200925 _index = socket.if_nametoindex(name)
926 self.assertIsInstance(_index, int)
927 self.assertEqual(index, _index)
928 _name = socket.if_indextoname(index)
929 self.assertIsInstance(_name, str)
930 self.assertEqual(name, _name)
931
932 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
933 'socket.if_nameindex() not available.')
934 def testInvalidInterfaceNameIndex(self):
935 # test nonexistent interface index/name
Andrew Svetlov0832af62012-12-18 23:10:48 +0200936 self.assertRaises(OSError, socket.if_indextoname, 0)
937 self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
Charles-François Natali60713592011-05-20 16:55:06 +0200938 # test with invalid values
939 self.assertRaises(TypeError, socket.if_nametoindex, 0)
940 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700941
Serhiy Storchaka43767632013-11-03 21:31:38 +0200942 @unittest.skipUnless(hasattr(sys, 'getrefcount'),
943 'test needs sys.getrefcount()')
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000944 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000945 # Testing reference count for getnameinfo
Serhiy Storchaka43767632013-11-03 21:31:38 +0200946 try:
947 # On some versions, this loses a reference
948 orig = sys.getrefcount(__name__)
949 socket.getnameinfo(__name__,0)
950 except TypeError:
951 if sys.getrefcount(__name__) != orig:
952 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000953
Guido van Rossum24e4af82002-06-12 19:18:08 +0000954 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000955 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000956 try:
957 # On some versions, this crashes the interpreter.
958 socket.getnameinfo(('x', 0, 0, 0), 0)
Andrew Svetlov0832af62012-12-18 23:10:48 +0200959 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000960 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000961
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000962 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000963 # This just checks that htons etc. are their own inverse,
964 # when looking at the lower 16 or 32 bits.
965 sizes = {socket.htonl: 32, socket.ntohl: 32,
966 socket.htons: 16, socket.ntohs: 16}
967 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000968 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000969 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
970 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000971
Guido van Rossuma2627af2002-09-14 00:58:46 +0000972 swapped = func(mask)
973 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000974 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000975
Serhiy Storchaka24c738a2017-03-19 20:20:10 +0200976 @support.cpython_only
Guido van Rossum018919a2007-01-15 00:07:32 +0000977 def testNtoHErrors(self):
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300978 import _testcapi
979 s_good_values = [0, 1, 2, 0xffff]
980 l_good_values = s_good_values + [0xffffffff]
981 l_bad_values = [-1, -2, 1<<32, 1<<1000]
982 s_bad_values = l_bad_values + [_testcapi.INT_MIN - 1,
983 _testcapi.INT_MAX + 1]
984 s_deprecated_values = [1<<16, _testcapi.INT_MAX]
985 for k in s_good_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000986 socket.ntohs(k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000987 socket.htons(k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300988 for k in l_good_values:
989 socket.ntohl(k)
990 socket.htonl(k)
991 for k in s_bad_values:
Guido van Rossum018919a2007-01-15 00:07:32 +0000992 self.assertRaises(OverflowError, socket.ntohs, k)
Guido van Rossum018919a2007-01-15 00:07:32 +0000993 self.assertRaises(OverflowError, socket.htons, k)
Serhiy Storchaka6a7d3482016-10-02 12:34:40 +0300994 for k in l_bad_values:
995 self.assertRaises(OverflowError, socket.ntohl, k)
996 self.assertRaises(OverflowError, socket.htonl, k)
997 for k in s_deprecated_values:
998 self.assertWarns(DeprecationWarning, socket.ntohs, k)
999 self.assertWarns(DeprecationWarning, socket.htons, k)
Guido van Rossum018919a2007-01-15 00:07:32 +00001000
Barry Warsaw11b91a02004-06-28 00:50:43 +00001001 def testGetServBy(self):
1002 eq = self.assertEqual
1003 # Find one service that exists, then check all the related interfaces.
1004 # I've ordered this by protocols that have both a tcp and udp
1005 # protocol, at least for modern Linuxes.
doko@ubuntu.com4a173bc2014-04-17 19:47:16 +02001006 if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
Victor Stinnere6747472011-08-21 00:39:18 +02001007 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +00001008 # avoid the 'echo' service on this platform, as there is an
1009 # assumption breaking non-standard port/protocol entry
1010 services = ('daytime', 'qotd', 'domain')
1011 else:
1012 services = ('echo', 'daytime', 'domain')
1013 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +00001014 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001015 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +00001016 break
Andrew Svetlov0832af62012-12-18 23:10:48 +02001017 except OSError:
Skip Montanarof4433302002-08-02 15:52:30 +00001018 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +00001019 else:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001020 raise OSError
Barry Warsaw11b91a02004-06-28 00:50:43 +00001021 # Try same call with optional protocol omitted
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001022 # Issue #26936: Android getservbyname() was broken before API 23.
1023 if (not hasattr(sys, 'getandroidapilevel') or
1024 sys.getandroidapilevel() >= 23):
1025 port2 = socket.getservbyname(service)
1026 eq(port, port2)
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001027 # Try udp, but don't barf if it doesn't exist
Barry Warsaw11b91a02004-06-28 00:50:43 +00001028 try:
1029 udpport = socket.getservbyname(service, 'udp')
Andrew Svetlov0832af62012-12-18 23:10:48 +02001030 except OSError:
Barry Warsaw11b91a02004-06-28 00:50:43 +00001031 udpport = None
1032 else:
1033 eq(udpport, port)
1034 # Now make sure the lookup by port returns the same service name
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001035 # Issue #26936: Android getservbyport() is broken.
1036 if not support.is_android:
1037 eq(socket.getservbyport(port2), service)
Barry Warsaw11b91a02004-06-28 00:50:43 +00001038 eq(socket.getservbyport(port, 'tcp'), service)
1039 if udpport is not None:
1040 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001041 # Make sure getservbyport does not accept out of range ports.
1042 self.assertRaises(OverflowError, socket.getservbyport, -1)
1043 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001044
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001045 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001046 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001047 # The default timeout should initially be None
1048 self.assertEqual(socket.getdefaulttimeout(), None)
1049 s = socket.socket()
1050 self.assertEqual(s.gettimeout(), None)
1051 s.close()
1052
1053 # Set the default timeout to 10, and see if it propagates
1054 socket.setdefaulttimeout(10)
1055 self.assertEqual(socket.getdefaulttimeout(), 10)
1056 s = socket.socket()
1057 self.assertEqual(s.gettimeout(), 10)
1058 s.close()
1059
1060 # Reset the default timeout to None, and see if it propagates
1061 socket.setdefaulttimeout(None)
1062 self.assertEqual(socket.getdefaulttimeout(), None)
1063 s = socket.socket()
1064 self.assertEqual(s.gettimeout(), None)
1065 s.close()
1066
1067 # Check that setting it to an invalid value raises ValueError
1068 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
1069
1070 # Check that setting it to an invalid type raises TypeError
1071 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
1072
Serhiy Storchaka43767632013-11-03 21:31:38 +02001073 @unittest.skipUnless(hasattr(socket, 'inet_aton'),
1074 'test needs socket.inet_aton()')
Benjamin Petersonf91df042009-02-13 02:50:59 +00001075 def testIPv4_inet_aton_fourbytes(self):
Benjamin Petersonf91df042009-02-13 02:50:59 +00001076 # Test that issue1008086 and issue767150 are fixed.
1077 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +00001078 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
1079 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +00001080
Serhiy Storchaka43767632013-11-03 21:31:38 +02001081 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1082 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001083 def testIPv4toString(self):
1084 from socket import inet_aton as f, inet_pton, AF_INET
1085 g = lambda a: inet_pton(AF_INET, a)
1086
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001087 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001088 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001089 )
1090
Ezio Melottib3aedd42010-11-20 19:04:17 +00001091 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
1092 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
1093 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
1094 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
1095 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Victor Stinner5de85a12017-04-04 10:35:15 +02001096 # bpo-29972: inet_pton() doesn't fail on AIX
1097 if not sys.platform.startswith('aix'):
1098 assertInvalid(f, '0.0.0.')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001099 assertInvalid(f, '300.0.0.0')
1100 assertInvalid(f, 'a.0.0.0')
1101 assertInvalid(f, '1.2.3.4.5')
1102 assertInvalid(f, '::1')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001103
Ezio Melottib3aedd42010-11-20 19:04:17 +00001104 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
1105 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
1106 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
1107 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001108 assertInvalid(g, '0.0.0.')
1109 assertInvalid(g, '300.0.0.0')
1110 assertInvalid(g, 'a.0.0.0')
1111 assertInvalid(g, '1.2.3.4.5')
1112 assertInvalid(g, '::1')
Tim Petersc2659cf2003-05-12 20:19:37 +00001113
Serhiy Storchaka43767632013-11-03 21:31:38 +02001114 @unittest.skipUnless(hasattr(socket, 'inet_pton'),
1115 'test needs socket.inet_pton()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001116 def testIPv6toString(self):
1117 try:
1118 from socket import inet_pton, AF_INET6, has_ipv6
1119 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001120 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001121 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001122 self.skipTest('could not import needed symbols from socket')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001123
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001124 if sys.platform == "win32":
1125 try:
1126 inet_pton(AF_INET6, '::')
1127 except OSError as e:
1128 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001129 self.skipTest('IPv6 might not be supported')
Jason R. Coombs6bdc4982013-11-10 14:02:04 -05001130
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001131 f = lambda a: inet_pton(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001132 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001133 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001134 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001135
Ezio Melottib3aedd42010-11-20 19:04:17 +00001136 self.assertEqual(b'\x00' * 16, f('::'))
1137 self.assertEqual(b'\x00' * 16, f('0::0'))
1138 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
1139 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +00001140 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 +00001141 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
1142 )
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001143 self.assertEqual(
1144 b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
1145 f('ad42:abc::127:0:254:2')
1146 )
1147 self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
1148 assertInvalid('0x20::')
1149 assertInvalid(':::')
1150 assertInvalid('::0::')
1151 assertInvalid('1::abc::')
1152 assertInvalid('1::abc::def')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001153 assertInvalid('1:2:3:4:5:6')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001154 assertInvalid('1:2:3:4:5:6:7:8:0')
Victor Stinner5de85a12017-04-04 10:35:15 +02001155 # bpo-29972: inet_pton() doesn't fail on AIX
1156 if not sys.platform.startswith('aix'):
1157 assertInvalid('1:2:3:4:5:6:')
1158 assertInvalid('1:2:3:4:5:6:7:8:')
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001159
1160 self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
1161 f('::254.42.23.64')
1162 )
1163 self.assertEqual(
1164 b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
1165 f('42::a29b:254.42.23.64')
1166 )
1167 self.assertEqual(
1168 b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
1169 f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
1170 )
1171 assertInvalid('255.254.253.252')
1172 assertInvalid('1::260.2.3.0')
1173 assertInvalid('1::0.be.e.0')
1174 assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
1175 assertInvalid('::1.2.3.4:0')
1176 assertInvalid('0.100.200.0:3:4:5:6:7:8')
Tim Petersc2659cf2003-05-12 20:19:37 +00001177
Serhiy Storchaka43767632013-11-03 21:31:38 +02001178 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1179 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001180 def testStringToIPv4(self):
1181 from socket import inet_ntoa as f, inet_ntop, AF_INET
1182 g = lambda a: inet_ntop(AF_INET, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001183 assertInvalid = lambda func,a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001184 (OSError, ValueError), func, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001185 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001186
Ezio Melottib3aedd42010-11-20 19:04:17 +00001187 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
1188 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
1189 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
1190 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001191 assertInvalid(f, b'\x00' * 3)
1192 assertInvalid(f, b'\x00' * 5)
1193 assertInvalid(f, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001194 self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
Tim Petersc2659cf2003-05-12 20:19:37 +00001195
Ezio Melottib3aedd42010-11-20 19:04:17 +00001196 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
1197 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
1198 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001199 assertInvalid(g, b'\x00' * 3)
1200 assertInvalid(g, b'\x00' * 5)
1201 assertInvalid(g, b'\x00' * 16)
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001202 self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001203
Serhiy Storchaka43767632013-11-03 21:31:38 +02001204 @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
1205 'test needs socket.inet_ntop()')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001206 def testStringToIPv6(self):
1207 try:
1208 from socket import inet_ntop, AF_INET6, has_ipv6
1209 if not has_ipv6:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001210 self.skipTest('IPv6 not available')
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001211 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -06001212 self.skipTest('could not import needed symbols from socket')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001213
1214 if sys.platform == "win32":
1215 try:
1216 inet_ntop(AF_INET6, b'\x00' * 16)
1217 except OSError as e:
1218 if e.winerror == 10022:
Zachary Ware101d9e72013-12-08 00:44:27 -06001219 self.skipTest('IPv6 might not be supported')
Atsuo Ishimotoda0fc142012-07-16 15:16:54 +09001220
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001221 f = lambda a: inet_ntop(AF_INET6, a)
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001222 assertInvalid = lambda a: self.assertRaises(
Andrew Svetlov0832af62012-12-18 23:10:48 +02001223 (OSError, ValueError), f, a
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001224 )
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001225
Ezio Melottib3aedd42010-11-20 19:04:17 +00001226 self.assertEqual('::', f(b'\x00' * 16))
1227 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
1228 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001229 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +00001230 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 +00001231 )
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001232 self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +00001233
Antoine Pitrou7ded21e2011-12-19 16:21:21 +01001234 assertInvalid(b'\x12' * 15)
1235 assertInvalid(b'\x12' * 17)
1236 assertInvalid(b'\x12' * 4)
1237
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001238 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +00001239
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001240 def testSockName(self):
1241 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001242 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001243 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001244 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +00001245 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001246 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001247 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
1248 # it reasonable to get the host's addr in addition to 0.0.0.0.
1249 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +00001250 try:
1251 my_ip_addr = socket.gethostbyname(socket.gethostname())
Andrew Svetlov0832af62012-12-18 23:10:48 +02001252 except OSError:
Georg Brandl89197fe2010-11-20 14:16:17 +00001253 # Probably name lookup wasn't set up right; skip this test
Zachary Ware9fe6d862013-12-08 00:20:35 -06001254 self.skipTest('name lookup failure')
Benjamin Peterson577473f2010-01-19 00:09:57 +00001255 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +00001256 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001257
1258 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001259 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001260 # We know a socket should start without reuse==0
1261 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001262 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001263 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001264 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001265
1266 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001267 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001268 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001269 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001270 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1271 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001272 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +00001273
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001274 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001275 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001276 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1277 sock.settimeout(1)
1278 sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02001279 self.assertRaises(OSError, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00001280
Martin Panter50ab1a32016-04-11 00:38:12 +00001281 def testCloseException(self):
1282 sock = socket.socket()
1283 socket.socket(fileno=sock.fileno()).close()
1284 try:
1285 sock.close()
1286 except OSError as err:
1287 # Winsock apparently raises ENOTSOCK
1288 self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
1289 else:
1290 self.fail("close() should raise EBADF/ENOTSOCK")
1291
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001292 def testNewAttributes(self):
1293 # testing .family, .type and .protocol
Victor Stinnerdaf45552013-08-28 00:53:59 +02001294
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001295 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1296 self.assertEqual(sock.family, socket.AF_INET)
Victor Stinnerdaf45552013-08-28 00:53:59 +02001297 if hasattr(socket, 'SOCK_CLOEXEC'):
1298 self.assertIn(sock.type,
1299 (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
1300 socket.SOCK_STREAM))
1301 else:
1302 self.assertEqual(sock.type, socket.SOCK_STREAM)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001303 self.assertEqual(sock.proto, 0)
1304 sock.close()
1305
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001306 def test_getsockaddrarg(self):
Charles-François Natali65708cf2014-07-25 18:44:30 +01001307 sock = socket.socket()
1308 self.addCleanup(sock.close)
Antoine Pitrouccc87b52011-05-10 23:37:11 +02001309 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001310 big_port = port + 65536
1311 neg_port = port - 65536
Charles-François Natali65708cf2014-07-25 18:44:30 +01001312 self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
1313 self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
1314 # Since find_unused_port() is inherently subject to race conditions, we
1315 # call it a couple times if necessary.
1316 for i in itertools.count():
1317 port = support.find_unused_port()
1318 try:
1319 sock.bind((HOST, port))
1320 except OSError as e:
1321 if e.errno != errno.EADDRINUSE or i == 5:
1322 raise
1323 else:
1324 break
Benjamin Peterson5c6d7872009-02-06 02:40:07 +00001325
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001326 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +00001327 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00001328 self.assertTrue(hasattr(socket.socket, 'ioctl'))
1329 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
1330 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
1331 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001332 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
1333 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +00001334 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +00001335 self.assertRaises(ValueError, s.ioctl, -1, None)
1336 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +00001337
Steve Dowerea93ac02016-06-17 12:52:18 -07001338 @unittest.skipUnless(os.name == "nt", "Windows specific")
1339 @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
1340 'Loopback fast path support required for this test')
1341 def test_sio_loopback_fast_path(self):
1342 s = socket.socket()
1343 self.addCleanup(s.close)
Berker Peksagce4271a2016-06-18 16:10:07 +03001344 try:
1345 s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
1346 except OSError as exc:
1347 WSAEOPNOTSUPP = 10045
1348 if exc.winerror == WSAEOPNOTSUPP:
1349 self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
1350 "doesn't implemented in this Windows version")
1351 raise
Steve Dowerea93ac02016-06-17 12:52:18 -07001352 self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
1353
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001354 def testGetaddrinfo(self):
1355 try:
1356 socket.getaddrinfo('localhost', 80)
1357 except socket.gaierror as err:
1358 if err.errno == socket.EAI_SERVICE:
1359 # see http://bugs.python.org/issue1282647
1360 self.skipTest("buggy libc version")
1361 raise
1362 # len of every sequence is supposed to be == 5
1363 for info in socket.getaddrinfo(HOST, None):
1364 self.assertEqual(len(info), 5)
1365 # host can be a domain name, a string representation of an
1366 # IPv4/v6 address or None
1367 socket.getaddrinfo('localhost', 80)
1368 socket.getaddrinfo('127.0.0.1', 80)
1369 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +02001370 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001371 socket.getaddrinfo('::1', 80)
1372 # port can be a string service name such as "http", a numeric
1373 # port number or None
Xavier de Gayed0c2b5b2016-12-13 09:22:01 +01001374 # Issue #26936: Android getaddrinfo() was broken before API level 23.
1375 if (not hasattr(sys, 'getandroidapilevel') or
1376 sys.getandroidapilevel() >= 23):
1377 socket.getaddrinfo(HOST, "http")
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001378 socket.getaddrinfo(HOST, 80)
1379 socket.getaddrinfo(HOST, None)
1380 # test family and socktype filters
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001381 infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
1382 for family, type, _, _, _ in infos:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001383 self.assertEqual(family, socket.AF_INET)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001384 self.assertEqual(str(family), 'AddressFamily.AF_INET')
1385 self.assertEqual(type, socket.SOCK_STREAM)
Ethan Furman7184bac2014-10-14 18:56:53 -07001386 self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001387 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1388 for _, socktype, _, _, _ in infos:
1389 self.assertEqual(socktype, socket.SOCK_STREAM)
1390 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001391 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001392 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1393 # a server willing to support both IPv4 and IPv6 will
1394 # usually do this
1395 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1396 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001397 # test keyword arguments
1398 a = socket.getaddrinfo(HOST, None)
1399 b = socket.getaddrinfo(host=HOST, port=None)
1400 self.assertEqual(a, b)
1401 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1402 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1403 self.assertEqual(a, b)
1404 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1405 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1406 self.assertEqual(a, b)
1407 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1408 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1409 self.assertEqual(a, b)
1410 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1411 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1412 self.assertEqual(a, b)
1413 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1414 socket.AI_PASSIVE)
1415 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1416 type=socket.SOCK_STREAM, proto=0,
1417 flags=socket.AI_PASSIVE)
1418 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001419 # Issue #6697.
1420 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001421
Ned Deilyb24f4812014-02-13 22:50:42 -08001422 # Issue 17269: test workaround for OS X platform bug segfault
Ronald Oussorena822d3662013-06-10 10:36:28 +02001423 if hasattr(socket, 'AI_NUMERICSERV'):
Ned Deilyb24f4812014-02-13 22:50:42 -08001424 try:
1425 # The arguments here are undefined and the call may succeed
1426 # or fail. All we care here is that it doesn't segfault.
1427 socket.getaddrinfo("localhost", None, 0, 0, 0,
1428 socket.AI_NUMERICSERV)
1429 except socket.gaierror:
1430 pass
Ronald Oussoren27a4ac52013-05-24 13:47:37 +02001431
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001432 def test_getnameinfo(self):
1433 # only IP addresses are allowed
Andrew Svetlov0832af62012-12-18 23:10:48 +02001434 self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001435
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001436 @unittest.skipUnless(support.is_resource_enabled('network'),
1437 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001438 def test_idna(self):
Victor Stinner808d6412015-09-21 09:04:01 +02001439 # Check for internet access before running test
1440 # (issue #12804, issue #25138).
1441 with support.transient_internet('python.org'):
Nadeem Vawda61baebd2012-01-25 08:02:05 +02001442 socket.gethostbyname('python.org')
Victor Stinner808d6412015-09-21 09:04:01 +02001443
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001444 # these should all be successful
Benjamin Peterson863c9622014-11-03 15:10:47 -05001445 domain = 'испытание.pythontest.net'
1446 socket.gethostbyname(domain)
1447 socket.gethostbyname_ex(domain)
1448 socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001449 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1450 # have a reverse entry yet
1451 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001452
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001453 def check_sendall_interrupted(self, with_timeout):
Martin Pantere26da7c2016-06-02 10:07:09 +00001454 # socketpair() is not strictly required, but it makes things easier.
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001455 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1456 self.skipTest("signal.alarm and socket.socketpair required for this test")
1457 # Our signal handlers clobber the C errno by calling a math function
1458 # with an invalid domain value.
1459 def ok_handler(*args):
1460 self.assertRaises(ValueError, math.acosh, 0)
1461 def raising_handler(*args):
1462 self.assertRaises(ValueError, math.acosh, 0)
1463 1 // 0
1464 c, s = socket.socketpair()
1465 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1466 try:
1467 if with_timeout:
1468 # Just above the one second minimum for signal.alarm
1469 c.settimeout(1.5)
1470 with self.assertRaises(ZeroDivisionError):
1471 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001472 c.sendall(b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001473 if with_timeout:
1474 signal.signal(signal.SIGALRM, ok_handler)
1475 signal.alarm(1)
Charles-François Natali5fd26422013-08-29 19:01:40 +02001476 self.assertRaises(socket.timeout, c.sendall,
1477 b"x" * support.SOCK_MAX_SIZE)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001478 finally:
Victor Stinner71fe8c02013-08-24 15:52:47 +02001479 signal.alarm(0)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001480 signal.signal(signal.SIGALRM, old_alarm)
1481 c.close()
1482 s.close()
1483
1484 def test_sendall_interrupted(self):
1485 self.check_sendall_interrupted(False)
1486
1487 def test_sendall_interrupted_with_timeout(self):
1488 self.check_sendall_interrupted(True)
1489
Antoine Pitroue033e062010-10-29 10:38:18 +00001490 def test_dealloc_warn(self):
1491 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1492 r = repr(sock)
1493 with self.assertWarns(ResourceWarning) as cm:
1494 sock = None
1495 support.gc_collect()
1496 self.assertIn(r, str(cm.warning.args[0]))
1497 # An open socket file object gets dereferenced after the socket
1498 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1499 f = sock.makefile('rb')
1500 r = repr(sock)
1501 sock = None
1502 support.gc_collect()
1503 with self.assertWarns(ResourceWarning):
1504 f = None
1505 support.gc_collect()
1506
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001507 def test_name_closed_socketio(self):
1508 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1509 fp = sock.makefile("rb")
1510 fp.close()
1511 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1512
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +02001513 def test_unusable_closed_socketio(self):
1514 with socket.socket() as sock:
1515 fp = sock.makefile("rb", buffering=0)
1516 self.assertTrue(fp.readable())
1517 self.assertFalse(fp.writable())
1518 self.assertFalse(fp.seekable())
1519 fp.close()
1520 self.assertRaises(ValueError, fp.readable)
1521 self.assertRaises(ValueError, fp.writable)
1522 self.assertRaises(ValueError, fp.seekable)
1523
Berker Peksag3fe64d02016-02-18 17:34:00 +02001524 def test_makefile_mode(self):
1525 for mode in 'r', 'rb', 'rw', 'w', 'wb':
1526 with self.subTest(mode=mode):
1527 with socket.socket() as sock:
1528 with sock.makefile(mode) as fp:
1529 self.assertEqual(fp.mode, mode)
1530
1531 def test_makefile_invalid_mode(self):
1532 for mode in 'rt', 'x', '+', 'a':
1533 with self.subTest(mode=mode):
1534 with socket.socket() as sock:
1535 with self.assertRaisesRegex(ValueError, 'invalid mode'):
1536 sock.makefile(mode)
1537
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001538 def test_pickle(self):
1539 sock = socket.socket()
1540 with sock:
1541 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1542 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
Ethan Furman24e837f2015-03-18 17:27:57 -07001543 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1544 family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
1545 self.assertEqual(family, socket.AF_INET)
1546 type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
1547 self.assertEqual(type, socket.SOCK_STREAM)
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001548
Serhiy Storchaka78980432013-01-15 01:12:17 +02001549 def test_listen_backlog(self):
1550 for backlog in 0, -1:
Charles-François Natali644b8f52014-05-22 19:45:39 +01001551 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
1552 srv.bind((HOST, 0))
1553 srv.listen(backlog)
1554
1555 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
Serhiy Storchaka78980432013-01-15 01:12:17 +02001556 srv.bind((HOST, 0))
Charles-François Natali644b8f52014-05-22 19:45:39 +01001557 srv.listen()
Serhiy Storchaka78980432013-01-15 01:12:17 +02001558
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001559 @support.cpython_only
1560 def test_listen_backlog_overflow(self):
Serhiy Storchaka78980432013-01-15 01:12:17 +02001561 # Issue 15989
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02001562 import _testcapi
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001563 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1564 srv.bind((HOST, 0))
Serhiy Storchaka78980432013-01-15 01:12:17 +02001565 self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001566 srv.close()
1567
Charles-François Natali42663332012-01-02 15:57:30 +01001568 @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Charles-François Natali366999a2012-01-02 15:47:29 +01001569 def test_flowinfo(self):
1570 self.assertRaises(OverflowError, socket.getnameinfo,
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001571 (support.HOSTv6, 0, 0xffffffff), 0)
Charles-François Natali366999a2012-01-02 15:47:29 +01001572 with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
Charles-François Natalifcfb3242013-08-31 14:40:49 +02001573 self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
Charles-François Natali366999a2012-01-02 15:47:29 +01001574
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001575 def test_str_for_enums(self):
1576 # Make sure that the AF_* and SOCK_* constants have enum-like string
1577 # reprs.
1578 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
1579 self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
Ethan Furman7184bac2014-10-14 18:56:53 -07001580 self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001581
1582 @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
1583 def test_uknown_socket_family_repr(self):
1584 # Test that when created with a family that's not one of the known
1585 # AF_*/SOCK_* constants, socket.family just returns the number.
1586 #
1587 # To do this we fool socket.socket into believing it already has an
1588 # open fd because on this path it doesn't actually verify the family and
1589 # type and populates the socket object.
1590 #
1591 # On Windows this trick won't work, so the test is skipped.
Xavier de Gaye547c1b92016-11-13 19:39:48 +01001592 fd, path = tempfile.mkstemp()
1593 self.addCleanup(os.unlink, path)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -07001594 with socket.socket(family=42424, type=13331, fileno=fd) as s:
1595 self.assertEqual(s.family, 42424)
1596 self.assertEqual(s.type, 13331)
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001597
Berker Peksagbcfb35f2016-09-17 23:22:06 +03001598 @unittest.skipUnless(hasattr(os, 'sendfile'), 'test needs os.sendfile()')
1599 def test__sendfile_use_sendfile(self):
1600 class File:
1601 def __init__(self, fd):
1602 self.fd = fd
1603
1604 def fileno(self):
1605 return self.fd
1606 with socket.socket() as sock:
1607 fd = os.open(os.curdir, os.O_RDONLY)
1608 os.close(fd)
1609 with self.assertRaises(socket._GiveupOnSendfile):
1610 sock._sendfile_use_sendfile(File(fd))
1611 with self.assertRaises(OverflowError):
1612 sock._sendfile_use_sendfile(File(2**1000))
1613 with self.assertRaises(TypeError):
1614 sock._sendfile_use_sendfile(File(None))
1615
1616
Charles-François Natali47413c12011-10-06 19:47:44 +02001617@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1618class BasicCANTest(unittest.TestCase):
1619
1620 def testCrucialConstants(self):
1621 socket.AF_CAN
1622 socket.PF_CAN
1623 socket.CAN_RAW
1624
Charles-François Natali773e42d2013-02-05 19:42:01 +01001625 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1626 'socket.CAN_BCM required for this test.')
1627 def testBCMConstants(self):
1628 socket.CAN_BCM
1629
1630 # opcodes
1631 socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
1632 socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
1633 socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
1634 socket.CAN_BCM_TX_SEND # send one CAN frame
1635 socket.CAN_BCM_RX_SETUP # create RX content filter subscription
1636 socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
1637 socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
1638 socket.CAN_BCM_TX_STATUS # reply to TX_READ request
1639 socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
1640 socket.CAN_BCM_RX_STATUS # reply to RX_READ request
1641 socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
1642 socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
1643
Charles-François Natali47413c12011-10-06 19:47:44 +02001644 def testCreateSocket(self):
1645 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1646 pass
1647
Charles-François Natali773e42d2013-02-05 19:42:01 +01001648 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1649 'socket.CAN_BCM required for this test.')
1650 def testCreateBCMSocket(self):
1651 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
1652 pass
1653
Charles-François Natali47413c12011-10-06 19:47:44 +02001654 def testBindAny(self):
1655 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1656 s.bind(('', ))
1657
1658 def testTooLongInterfaceName(self):
1659 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1660 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02001661 self.assertRaisesRegex(OSError, 'interface name too long',
Antoine Pitrouffa547e2011-10-11 22:43:37 +02001662 s.bind, ('x' * 1024,))
Charles-François Natali47413c12011-10-06 19:47:44 +02001663
1664 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1665 'socket.CAN_RAW_LOOPBACK required for this test.')
1666 def testLoopback(self):
1667 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1668 for loopback in (0, 1):
1669 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1670 loopback)
1671 self.assertEqual(loopback,
1672 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1673
1674 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1675 'socket.CAN_RAW_FILTER required for this test.')
1676 def testFilter(self):
1677 can_id, can_mask = 0x200, 0x700
1678 can_filter = struct.pack("=II", can_id, can_mask)
1679 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1680 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1681 self.assertEqual(can_filter,
1682 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02001683 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
Charles-François Natali47413c12011-10-06 19:47:44 +02001684
1685
1686@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
Terry Jan Reedya40e6b02014-06-13 15:20:45 -04001687@unittest.skipUnless(thread, 'Threading required for this test.')
Charles-François Natali47413c12011-10-06 19:47:44 +02001688class CANTest(ThreadedCANSocketTest):
1689
Charles-François Natali47413c12011-10-06 19:47:44 +02001690 def __init__(self, methodName='runTest'):
1691 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1692
1693 @classmethod
1694 def build_can_frame(cls, can_id, data):
1695 """Build a CAN frame."""
1696 can_dlc = len(data)
1697 data = data.ljust(8, b'\x00')
1698 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1699
1700 @classmethod
1701 def dissect_can_frame(cls, frame):
1702 """Dissect a CAN frame."""
1703 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1704 return (can_id, can_dlc, data[:can_dlc])
1705
1706 def testSendFrame(self):
1707 cf, addr = self.s.recvfrom(self.bufsize)
1708 self.assertEqual(self.cf, cf)
1709 self.assertEqual(addr[0], self.interface)
1710 self.assertEqual(addr[1], socket.AF_CAN)
1711
1712 def _testSendFrame(self):
1713 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1714 self.cli.send(self.cf)
1715
1716 def testSendMaxFrame(self):
1717 cf, addr = self.s.recvfrom(self.bufsize)
1718 self.assertEqual(self.cf, cf)
1719
1720 def _testSendMaxFrame(self):
1721 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1722 self.cli.send(self.cf)
1723
1724 def testSendMultiFrames(self):
1725 cf, addr = self.s.recvfrom(self.bufsize)
1726 self.assertEqual(self.cf1, cf)
1727
1728 cf, addr = self.s.recvfrom(self.bufsize)
1729 self.assertEqual(self.cf2, cf)
1730
1731 def _testSendMultiFrames(self):
1732 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1733 self.cli.send(self.cf1)
1734
1735 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1736 self.cli.send(self.cf2)
1737
Charles-François Natali773e42d2013-02-05 19:42:01 +01001738 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1739 'socket.CAN_BCM required for this test.')
1740 def _testBCM(self):
1741 cf, addr = self.cli.recvfrom(self.bufsize)
1742 self.assertEqual(self.cf, cf)
1743 can_id, can_dlc, data = self.dissect_can_frame(cf)
1744 self.assertEqual(self.can_id, can_id)
1745 self.assertEqual(self.data, data)
1746
1747 @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
1748 'socket.CAN_BCM required for this test.')
1749 def testBCM(self):
1750 bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
1751 self.addCleanup(bcm.close)
1752 bcm.connect((self.interface,))
1753 self.can_id = 0x123
1754 self.data = bytes([0xc0, 0xff, 0xee])
1755 self.cf = self.build_can_frame(self.can_id, self.data)
1756 opcode = socket.CAN_BCM_TX_SEND
1757 flags = 0
1758 count = 0
1759 ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
1760 bcm_can_id = 0x0222
1761 nframes = 1
1762 assert len(self.cf) == 16
1763 header = struct.pack(self.bcm_cmd_msg_fmt,
1764 opcode,
1765 flags,
1766 count,
1767 ival1_seconds,
1768 ival1_usec,
1769 ival2_seconds,
1770 ival2_usec,
1771 bcm_can_id,
1772 nframes,
1773 )
1774 header_plus_frame = header + self.cf
1775 bytes_sent = bcm.send(header_plus_frame)
1776 self.assertEqual(bytes_sent, len(header_plus_frame))
1777
Charles-François Natali47413c12011-10-06 19:47:44 +02001778
Pier-Yves Lessarda30f6d42017-08-28 04:32:44 -04001779@unittest.skipUnless(HAVE_SOCKET_CAN_ISOTP, 'CAN ISOTP required for this test.')
1780class ISOTPTest(unittest.TestCase):
1781
1782 def __init__(self, *args, **kwargs):
1783 super().__init__(*args, **kwargs)
1784 self.interface = "vcan0"
1785
1786 def testCrucialConstants(self):
1787 socket.AF_CAN
1788 socket.PF_CAN
1789 socket.CAN_ISOTP
1790 socket.SOCK_DGRAM
1791
1792 def testCreateSocket(self):
1793 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1794 pass
1795
1796 @unittest.skipUnless(hasattr(socket, "CAN_ISOTP"),
1797 'socket.CAN_ISOTP required for this test.')
1798 def testCreateISOTPSocket(self):
1799 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1800 pass
1801
1802 def testTooLongInterfaceName(self):
1803 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1804 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1805 with self.assertRaisesRegex(OSError, 'interface name too long'):
1806 s.bind(('x' * 1024, 1, 2))
1807
1808 def testBind(self):
1809 try:
1810 with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_ISOTP) as s:
1811 addr = self.interface, 0x123, 0x456
1812 s.bind(addr)
1813 self.assertEqual(s.getsockname(), addr)
1814 except OSError as e:
1815 if e.errno == errno.ENODEV:
1816 self.skipTest('network interface `%s` does not exist' %
1817 self.interface)
1818 else:
1819 raise
1820
1821
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001822@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1823class BasicRDSTest(unittest.TestCase):
1824
1825 def testCrucialConstants(self):
1826 socket.AF_RDS
1827 socket.PF_RDS
1828
1829 def testCreateSocket(self):
1830 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1831 pass
1832
1833 def testSocketBufferSize(self):
1834 bufsize = 16384
1835 with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
1836 s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
1837 s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
1838
1839
1840@unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
1841@unittest.skipUnless(thread, 'Threading required for this test.')
1842class RDSTest(ThreadedRDSSocketTest):
1843
1844 def __init__(self, methodName='runTest'):
1845 ThreadedRDSSocketTest.__init__(self, methodName=methodName)
1846
Charles-François Natali240c55f2011-11-10 20:33:36 +01001847 def setUp(self):
1848 super().setUp()
1849 self.evt = threading.Event()
1850
Charles-François Natali10b8cf42011-11-10 19:21:37 +01001851 def testSendAndRecv(self):
1852 data, addr = self.serv.recvfrom(self.bufsize)
1853 self.assertEqual(self.data, data)
1854 self.assertEqual(self.cli_addr, addr)
1855
1856 def _testSendAndRecv(self):
1857 self.data = b'spam'
1858 self.cli.sendto(self.data, 0, (HOST, self.port))
1859
1860 def testPeek(self):
1861 data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
1862 self.assertEqual(self.data, data)
1863 data, addr = self.serv.recvfrom(self.bufsize)
1864 self.assertEqual(self.data, data)
1865
1866 def _testPeek(self):
1867 self.data = b'spam'
1868 self.cli.sendto(self.data, 0, (HOST, self.port))
1869
1870 @requireAttrs(socket.socket, 'recvmsg')
1871 def testSendAndRecvMsg(self):
1872 data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
1873 self.assertEqual(self.data, data)
1874
1875 @requireAttrs(socket.socket, 'sendmsg')
1876 def _testSendAndRecvMsg(self):
1877 self.data = b'hello ' * 10
1878 self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
1879
1880 def testSendAndRecvMulti(self):
1881 data, addr = self.serv.recvfrom(self.bufsize)
1882 self.assertEqual(self.data1, data)
1883
1884 data, addr = self.serv.recvfrom(self.bufsize)
1885 self.assertEqual(self.data2, data)
1886
1887 def _testSendAndRecvMulti(self):
1888 self.data1 = b'bacon'
1889 self.cli.sendto(self.data1, 0, (HOST, self.port))
1890
1891 self.data2 = b'egg'
1892 self.cli.sendto(self.data2, 0, (HOST, self.port))
1893
1894 def testSelect(self):
1895 r, w, x = select.select([self.serv], [], [], 3.0)
1896 self.assertIn(self.serv, r)
1897 data, addr = self.serv.recvfrom(self.bufsize)
1898 self.assertEqual(self.data, data)
1899
1900 def _testSelect(self):
1901 self.data = b'select'
1902 self.cli.sendto(self.data, 0, (HOST, self.port))
1903
1904 def testCongestion(self):
1905 # wait until the sender is done
1906 self.evt.wait()
1907
1908 def _testCongestion(self):
1909 # test the behavior in case of congestion
1910 self.data = b'fill'
1911 self.cli.setblocking(False)
1912 try:
1913 # try to lower the receiver's socket buffer size
1914 self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
1915 except OSError:
1916 pass
1917 with self.assertRaises(OSError) as cm:
1918 try:
1919 # fill the receiver's socket buffer
1920 while True:
1921 self.cli.sendto(self.data, 0, (HOST, self.port))
1922 finally:
1923 # signal the receiver we're done
1924 self.evt.set()
1925 # sendto() should have failed with ENOBUFS
1926 self.assertEqual(cm.exception.errno, errno.ENOBUFS)
1927 # and we should have received a congestion notification through poll
1928 r, w, x = select.select([self.serv], [], [], 3.0)
1929 self.assertIn(self.serv, r)
1930
1931
caaveryeffc12f2017-09-06 18:18:10 -04001932@unittest.skipIf(fcntl is None, "need fcntl")
1933@unittest.skipUnless(HAVE_SOCKET_VSOCK,
1934 'VSOCK sockets required for this test.')
1935class BasicVSOCKTest(unittest.TestCase):
1936
1937 def testCrucialConstants(self):
1938 socket.AF_VSOCK
1939
1940 def testVSOCKConstants(self):
1941 socket.SO_VM_SOCKETS_BUFFER_SIZE
1942 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE
1943 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE
1944 socket.VMADDR_CID_ANY
1945 socket.VMADDR_PORT_ANY
1946 socket.VMADDR_CID_HOST
1947 socket.VM_SOCKETS_INVALID_VERSION
1948 socket.IOCTL_VM_SOCKETS_GET_LOCAL_CID
1949
1950 def testCreateSocket(self):
1951 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
1952 pass
1953
1954 def testSocketBufferSize(self):
1955 with socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM) as s:
1956 orig_max = s.getsockopt(socket.AF_VSOCK,
1957 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE)
1958 orig = s.getsockopt(socket.AF_VSOCK,
1959 socket.SO_VM_SOCKETS_BUFFER_SIZE)
1960 orig_min = s.getsockopt(socket.AF_VSOCK,
1961 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE)
1962
1963 s.setsockopt(socket.AF_VSOCK,
1964 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE, orig_max * 2)
1965 s.setsockopt(socket.AF_VSOCK,
1966 socket.SO_VM_SOCKETS_BUFFER_SIZE, orig * 2)
1967 s.setsockopt(socket.AF_VSOCK,
1968 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE, orig_min * 2)
1969
1970 self.assertEqual(orig_max * 2,
1971 s.getsockopt(socket.AF_VSOCK,
1972 socket.SO_VM_SOCKETS_BUFFER_MAX_SIZE))
1973 self.assertEqual(orig * 2,
1974 s.getsockopt(socket.AF_VSOCK,
1975 socket.SO_VM_SOCKETS_BUFFER_SIZE))
1976 self.assertEqual(orig_min * 2,
1977 s.getsockopt(socket.AF_VSOCK,
1978 socket.SO_VM_SOCKETS_BUFFER_MIN_SIZE))
1979
Victor Stinner45df8202010-04-28 22:31:17 +00001980@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001981class BasicTCPTest(SocketConnectedTest):
1982
1983 def __init__(self, methodName='runTest'):
1984 SocketConnectedTest.__init__(self, methodName=methodName)
1985
1986 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001987 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001988 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001989 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001990
1991 def _testRecv(self):
1992 self.serv_conn.send(MSG)
1993
1994 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001995 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001996 seg1 = self.cli_conn.recv(len(MSG) - 3)
1997 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001998 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001999 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002000
2001 def _testOverFlowRecv(self):
2002 self.serv_conn.send(MSG)
2003
2004 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002005 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002006 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002007 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002008
2009 def _testRecvFrom(self):
2010 self.serv_conn.send(MSG)
2011
2012 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002013 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002014 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
2015 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00002016 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00002017 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002018
2019 def _testOverFlowRecvFrom(self):
2020 self.serv_conn.send(MSG)
2021
2022 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002023 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002024 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00002025 while 1:
2026 read = self.cli_conn.recv(1024)
2027 if not read:
2028 break
Guido van Rossume531e292002-08-08 20:28:34 +00002029 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002030 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002031
2032 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00002033 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00002034 self.serv_conn.sendall(big_chunk)
2035
2036 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002037 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002038 fd = self.cli_conn.fileno()
2039 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002040 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00002041 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002042 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002043 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002044
2045 def _testFromFd(self):
2046 self.serv_conn.send(MSG)
2047
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002048 def testDup(self):
2049 # Testing dup()
2050 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00002051 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00002052 msg = sock.recv(1024)
2053 self.assertEqual(msg, MSG)
2054
2055 def _testDup(self):
2056 self.serv_conn.send(MSG)
2057
Guido van Rossum24e4af82002-06-12 19:18:08 +00002058 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002059 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002060 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00002061 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00002062 # wait for _testShutdown to finish: on OS X, when the server
2063 # closes the connection the client also becomes disconnected,
2064 # and the client's shutdown call will fail. (Issue #4397.)
2065 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00002066
2067 def _testShutdown(self):
2068 self.serv_conn.send(MSG)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002069 self.serv_conn.shutdown(2)
2070
2071 testShutdown_overflow = support.cpython_only(testShutdown)
2072
2073 @support.cpython_only
2074 def _testShutdown_overflow(self):
2075 import _testcapi
2076 self.serv_conn.send(MSG)
Serhiy Storchaka78980432013-01-15 01:12:17 +02002077 # Issue 15989
2078 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2079 _testcapi.INT_MAX + 1)
2080 self.assertRaises(OverflowError, self.serv_conn.shutdown,
2081 2 + (_testcapi.UINT_MAX + 1))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002082 self.serv_conn.shutdown(2)
2083
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002084 def testDetach(self):
2085 # Testing detach()
2086 fileno = self.cli_conn.fileno()
2087 f = self.cli_conn.detach()
2088 self.assertEqual(f, fileno)
2089 # cli_conn cannot be used anymore...
Antoine Pitrou70deb3d2012-04-01 01:00:17 +02002090 self.assertTrue(self.cli_conn._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02002091 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002092 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002093 # ...but we can create another socket using the (still open)
2094 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002095 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00002096 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002097 msg = sock.recv(1024)
2098 self.assertEqual(msg, MSG)
2099
Antoine Pitrou6e451df2010-08-09 20:39:54 +00002100 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00002101 self.serv_conn.send(MSG)
2102
Victor Stinner45df8202010-04-28 22:31:17 +00002103@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00002104class BasicUDPTest(ThreadedUDPSocketTest):
2105
2106 def __init__(self, methodName='runTest'):
2107 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
2108
2109 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002110 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002111 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002112 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002113
2114 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002115 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002116
Guido van Rossum1c938012002-06-12 21:17:20 +00002117 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00002118 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00002119 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00002120 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00002121
Guido van Rossum1c938012002-06-12 21:17:20 +00002122 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002123 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00002124
Guido van Rossumd8faa362007-04-27 19:54:29 +00002125 def testRecvFromNegative(self):
2126 # Negative lengths passed to recvfrom should give ValueError.
2127 self.assertRaises(ValueError, self.serv.recvfrom, -1)
2128
2129 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00002130 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00002131
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002132# Tests for the sendmsg()/recvmsg() interface. Where possible, the
2133# same test code is used with different families and types of socket
2134# (e.g. stream, datagram), and tests using recvmsg() are repeated
2135# using recvmsg_into().
2136#
2137# The generic test classes such as SendmsgTests and
2138# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
2139# supplied with sockets cli_sock and serv_sock representing the
2140# client's and the server's end of the connection respectively, and
2141# attributes cli_addr and serv_addr holding their (numeric where
2142# appropriate) addresses.
2143#
2144# The final concrete test classes combine these with subclasses of
2145# SocketTestBase which set up client and server sockets of a specific
2146# type, and with subclasses of SendrecvmsgBase such as
2147# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
2148# sockets to cli_sock and serv_sock and override the methods and
2149# attributes of SendrecvmsgBase to fill in destination addresses if
2150# needed when sending, check for specific flags in msg_flags, etc.
2151#
2152# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
2153# recvmsg_into().
2154
2155# XXX: like the other datagram (UDP) tests in this module, the code
2156# here assumes that datagram delivery on the local machine will be
2157# reliable.
2158
2159class SendrecvmsgBase(ThreadSafeCleanupTestCase):
2160 # Base class for sendmsg()/recvmsg() tests.
2161
2162 # Time in seconds to wait before considering a test failed, or
2163 # None for no timeout. Not all tests actually set a timeout.
2164 fail_timeout = 3.0
2165
2166 def setUp(self):
2167 self.misc_event = threading.Event()
2168 super().setUp()
2169
2170 def sendToServer(self, msg):
2171 # Send msg to the server.
2172 return self.cli_sock.send(msg)
2173
2174 # Tuple of alternative default arguments for sendmsg() when called
2175 # via sendmsgToServer() (e.g. to include a destination address).
2176 sendmsg_to_server_defaults = ()
2177
2178 def sendmsgToServer(self, *args):
2179 # Call sendmsg() on self.cli_sock with the given arguments,
2180 # filling in any arguments which are not supplied with the
2181 # corresponding items of self.sendmsg_to_server_defaults, if
2182 # any.
2183 return self.cli_sock.sendmsg(
2184 *(args + self.sendmsg_to_server_defaults[len(args):]))
2185
2186 def doRecvmsg(self, sock, bufsize, *args):
2187 # Call recvmsg() on sock with given arguments and return its
2188 # result. Should be used for tests which can use either
2189 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
2190 # this method with one which emulates it using recvmsg_into(),
2191 # thus allowing the same test to be used for both methods.
2192 result = sock.recvmsg(bufsize, *args)
2193 self.registerRecvmsgResult(result)
2194 return result
2195
2196 def registerRecvmsgResult(self, result):
2197 # Called by doRecvmsg() with the return value of recvmsg() or
2198 # recvmsg_into(). Can be overridden to arrange cleanup based
2199 # on the returned ancillary data, for instance.
2200 pass
2201
2202 def checkRecvmsgAddress(self, addr1, addr2):
2203 # Called to compare the received address with the address of
2204 # the peer.
2205 self.assertEqual(addr1, addr2)
2206
2207 # Flags that are normally unset in msg_flags
2208 msg_flags_common_unset = 0
2209 for name in ("MSG_CTRUNC", "MSG_OOB"):
2210 msg_flags_common_unset |= getattr(socket, name, 0)
2211
2212 # Flags that are normally set
2213 msg_flags_common_set = 0
2214
2215 # Flags set when a complete record has been received (e.g. MSG_EOR
2216 # for SCTP)
2217 msg_flags_eor_indicator = 0
2218
2219 # Flags set when a complete record has not been received
2220 # (e.g. MSG_TRUNC for datagram sockets)
2221 msg_flags_non_eor_indicator = 0
2222
2223 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
2224 # Method to check the value of msg_flags returned by recvmsg[_into]().
2225 #
2226 # Checks that all bits in msg_flags_common_set attribute are
2227 # set in "flags" and all bits in msg_flags_common_unset are
2228 # unset.
2229 #
2230 # The "eor" argument specifies whether the flags should
2231 # indicate that a full record (or datagram) has been received.
2232 # If "eor" is None, no checks are done; otherwise, checks
2233 # that:
2234 #
2235 # * if "eor" is true, all bits in msg_flags_eor_indicator are
2236 # set and all bits in msg_flags_non_eor_indicator are unset
2237 #
2238 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
2239 # are set and all bits in msg_flags_eor_indicator are unset
2240 #
2241 # If "checkset" and/or "checkunset" are supplied, they require
2242 # the given bits to be set or unset respectively, overriding
2243 # what the attributes require for those bits.
2244 #
2245 # If any bits are set in "ignore", they will not be checked,
2246 # regardless of the other inputs.
2247 #
2248 # Will raise Exception if the inputs require a bit to be both
2249 # set and unset, and it is not ignored.
2250
2251 defaultset = self.msg_flags_common_set
2252 defaultunset = self.msg_flags_common_unset
2253
2254 if eor:
2255 defaultset |= self.msg_flags_eor_indicator
2256 defaultunset |= self.msg_flags_non_eor_indicator
2257 elif eor is not None:
2258 defaultset |= self.msg_flags_non_eor_indicator
2259 defaultunset |= self.msg_flags_eor_indicator
2260
2261 # Function arguments override defaults
2262 defaultset &= ~checkunset
2263 defaultunset &= ~checkset
2264
2265 # Merge arguments with remaining defaults, and check for conflicts
2266 checkset |= defaultset
2267 checkunset |= defaultunset
2268 inboth = checkset & checkunset & ~ignore
2269 if inboth:
2270 raise Exception("contradictory set, unset requirements for flags "
2271 "{0:#x}".format(inboth))
2272
2273 # Compare with given msg_flags value
2274 mask = (checkset | checkunset) & ~ignore
2275 self.assertEqual(flags & mask, checkset & mask)
2276
2277
2278class RecvmsgIntoMixin(SendrecvmsgBase):
2279 # Mixin to implement doRecvmsg() using recvmsg_into().
2280
2281 def doRecvmsg(self, sock, bufsize, *args):
2282 buf = bytearray(bufsize)
2283 result = sock.recvmsg_into([buf], *args)
2284 self.registerRecvmsgResult(result)
2285 self.assertGreaterEqual(result[0], 0)
2286 self.assertLessEqual(result[0], bufsize)
2287 return (bytes(buf[:result[0]]),) + result[1:]
2288
2289
2290class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
2291 # Defines flags to be checked in msg_flags for datagram sockets.
2292
2293 @property
2294 def msg_flags_non_eor_indicator(self):
2295 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
2296
2297
2298class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
2299 # Defines flags to be checked in msg_flags for SCTP sockets.
2300
2301 @property
2302 def msg_flags_eor_indicator(self):
2303 return super().msg_flags_eor_indicator | socket.MSG_EOR
2304
2305
2306class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
2307 # Base class for tests on connectionless-mode sockets. Users must
2308 # supply sockets on attributes cli and serv to be mapped to
2309 # cli_sock and serv_sock respectively.
2310
2311 @property
2312 def serv_sock(self):
2313 return self.serv
2314
2315 @property
2316 def cli_sock(self):
2317 return self.cli
2318
2319 @property
2320 def sendmsg_to_server_defaults(self):
2321 return ([], [], 0, self.serv_addr)
2322
2323 def sendToServer(self, msg):
2324 return self.cli_sock.sendto(msg, self.serv_addr)
2325
2326
2327class SendrecvmsgConnectedBase(SendrecvmsgBase):
2328 # Base class for tests on connected sockets. Users must supply
2329 # sockets on attributes serv_conn and cli_conn (representing the
2330 # connections *to* the server and the client), to be mapped to
2331 # cli_sock and serv_sock respectively.
2332
2333 @property
2334 def serv_sock(self):
2335 return self.cli_conn
2336
2337 @property
2338 def cli_sock(self):
2339 return self.serv_conn
2340
2341 def checkRecvmsgAddress(self, addr1, addr2):
2342 # Address is currently "unspecified" for a connected socket,
2343 # so we don't examine it
2344 pass
2345
2346
2347class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
2348 # Base class to set a timeout on server's socket.
2349
2350 def setUp(self):
2351 super().setUp()
2352 self.serv_sock.settimeout(self.fail_timeout)
2353
2354
2355class SendmsgTests(SendrecvmsgServerTimeoutBase):
2356 # Tests for sendmsg() which can use any socket type and do not
2357 # involve recvmsg() or recvmsg_into().
2358
2359 def testSendmsg(self):
2360 # Send a simple message with sendmsg().
2361 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2362
2363 def _testSendmsg(self):
2364 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
2365
2366 def testSendmsgDataGenerator(self):
2367 # Send from buffer obtained from a generator (not a sequence).
2368 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2369
2370 def _testSendmsgDataGenerator(self):
2371 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
2372 len(MSG))
2373
2374 def testSendmsgAncillaryGenerator(self):
2375 # Gather (empty) ancillary data from a generator.
2376 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2377
2378 def _testSendmsgAncillaryGenerator(self):
2379 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
2380 len(MSG))
2381
2382 def testSendmsgArray(self):
2383 # Send data from an array instead of the usual bytes object.
2384 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2385
2386 def _testSendmsgArray(self):
2387 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
2388 len(MSG))
2389
2390 def testSendmsgGather(self):
2391 # Send message data from more than one buffer (gather write).
2392 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2393
2394 def _testSendmsgGather(self):
2395 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2396
2397 def testSendmsgBadArgs(self):
2398 # Check that sendmsg() rejects invalid arguments.
2399 self.assertEqual(self.serv_sock.recv(1000), b"done")
2400
2401 def _testSendmsgBadArgs(self):
2402 self.assertRaises(TypeError, self.cli_sock.sendmsg)
2403 self.assertRaises(TypeError, self.sendmsgToServer,
2404 b"not in an iterable")
2405 self.assertRaises(TypeError, self.sendmsgToServer,
2406 object())
2407 self.assertRaises(TypeError, self.sendmsgToServer,
2408 [object()])
2409 self.assertRaises(TypeError, self.sendmsgToServer,
2410 [MSG, object()])
2411 self.assertRaises(TypeError, self.sendmsgToServer,
2412 [MSG], object())
2413 self.assertRaises(TypeError, self.sendmsgToServer,
2414 [MSG], [], object())
2415 self.assertRaises(TypeError, self.sendmsgToServer,
2416 [MSG], [], 0, object())
2417 self.sendToServer(b"done")
2418
2419 def testSendmsgBadCmsg(self):
2420 # Check that invalid ancillary data items are rejected.
2421 self.assertEqual(self.serv_sock.recv(1000), b"done")
2422
2423 def _testSendmsgBadCmsg(self):
2424 self.assertRaises(TypeError, self.sendmsgToServer,
2425 [MSG], [object()])
2426 self.assertRaises(TypeError, self.sendmsgToServer,
2427 [MSG], [(object(), 0, b"data")])
2428 self.assertRaises(TypeError, self.sendmsgToServer,
2429 [MSG], [(0, object(), b"data")])
2430 self.assertRaises(TypeError, self.sendmsgToServer,
2431 [MSG], [(0, 0, object())])
2432 self.assertRaises(TypeError, self.sendmsgToServer,
2433 [MSG], [(0, 0)])
2434 self.assertRaises(TypeError, self.sendmsgToServer,
2435 [MSG], [(0, 0, b"data", 42)])
2436 self.sendToServer(b"done")
2437
2438 @requireAttrs(socket, "CMSG_SPACE")
2439 def testSendmsgBadMultiCmsg(self):
2440 # Check that invalid ancillary data items are rejected when
2441 # more than one item is present.
2442 self.assertEqual(self.serv_sock.recv(1000), b"done")
2443
2444 @testSendmsgBadMultiCmsg.client_skip
2445 def _testSendmsgBadMultiCmsg(self):
2446 self.assertRaises(TypeError, self.sendmsgToServer,
2447 [MSG], [0, 0, b""])
2448 self.assertRaises(TypeError, self.sendmsgToServer,
2449 [MSG], [(0, 0, b""), object()])
2450 self.sendToServer(b"done")
2451
2452 def testSendmsgExcessCmsgReject(self):
2453 # Check that sendmsg() rejects excess ancillary data items
2454 # when the number that can be sent is limited.
2455 self.assertEqual(self.serv_sock.recv(1000), b"done")
2456
2457 def _testSendmsgExcessCmsgReject(self):
2458 if not hasattr(socket, "CMSG_SPACE"):
2459 # Can only send one item
Andrew Svetlov0832af62012-12-18 23:10:48 +02002460 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002461 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
2462 self.assertIsNone(cm.exception.errno)
2463 self.sendToServer(b"done")
2464
2465 def testSendmsgAfterClose(self):
2466 # Check that sendmsg() fails on a closed socket.
2467 pass
2468
2469 def _testSendmsgAfterClose(self):
2470 self.cli_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002471 self.assertRaises(OSError, self.sendmsgToServer, [MSG])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002472
2473
2474class SendmsgStreamTests(SendmsgTests):
2475 # Tests for sendmsg() which require a stream socket and do not
2476 # involve recvmsg() or recvmsg_into().
2477
2478 def testSendmsgExplicitNoneAddr(self):
2479 # Check that peer address can be specified as None.
2480 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
2481
2482 def _testSendmsgExplicitNoneAddr(self):
2483 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
2484
2485 def testSendmsgTimeout(self):
2486 # Check that timeout works with sendmsg().
2487 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2488 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2489
2490 def _testSendmsgTimeout(self):
2491 try:
2492 self.cli_sock.settimeout(0.03)
2493 with self.assertRaises(socket.timeout):
2494 while True:
2495 self.sendmsgToServer([b"a"*512])
2496 finally:
2497 self.misc_event.set()
2498
2499 # XXX: would be nice to have more tests for sendmsg flags argument.
2500
2501 # Linux supports MSG_DONTWAIT when sending, but in general, it
2502 # only works when receiving. Could add other platforms if they
2503 # support it too.
Serhiy Storchakaabde2c12014-11-19 13:21:13 +02002504 @skipWithClientIf(sys.platform not in {"linux"},
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002505 "MSG_DONTWAIT not known to work on this platform when "
2506 "sending")
2507 def testSendmsgDontWait(self):
2508 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
2509 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
2510 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2511
2512 @testSendmsgDontWait.client_skip
2513 def _testSendmsgDontWait(self):
2514 try:
Andrew Svetlov0832af62012-12-18 23:10:48 +02002515 with self.assertRaises(OSError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002516 while True:
2517 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
2518 self.assertIn(cm.exception.errno,
2519 (errno.EAGAIN, errno.EWOULDBLOCK))
2520 finally:
2521 self.misc_event.set()
2522
2523
2524class SendmsgConnectionlessTests(SendmsgTests):
2525 # Tests for sendmsg() which require a connectionless-mode
2526 # (e.g. datagram) socket, and do not involve recvmsg() or
2527 # recvmsg_into().
2528
2529 def testSendmsgNoDestAddr(self):
2530 # Check that sendmsg() fails when no destination address is
2531 # given for unconnected socket.
2532 pass
2533
2534 def _testSendmsgNoDestAddr(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02002535 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002536 [MSG])
Andrew Svetlov0832af62012-12-18 23:10:48 +02002537 self.assertRaises(OSError, self.cli_sock.sendmsg,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002538 [MSG], [], 0, None)
2539
2540
2541class RecvmsgGenericTests(SendrecvmsgBase):
2542 # Tests for recvmsg() which can also be emulated using
2543 # recvmsg_into(), and can use any socket type.
2544
2545 def testRecvmsg(self):
2546 # Receive a simple message with recvmsg[_into]().
2547 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2548 self.assertEqual(msg, MSG)
2549 self.checkRecvmsgAddress(addr, self.cli_addr)
2550 self.assertEqual(ancdata, [])
2551 self.checkFlags(flags, eor=True)
2552
2553 def _testRecvmsg(self):
2554 self.sendToServer(MSG)
2555
2556 def testRecvmsgExplicitDefaults(self):
2557 # Test recvmsg[_into]() with default arguments provided explicitly.
2558 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2559 len(MSG), 0, 0)
2560 self.assertEqual(msg, MSG)
2561 self.checkRecvmsgAddress(addr, self.cli_addr)
2562 self.assertEqual(ancdata, [])
2563 self.checkFlags(flags, eor=True)
2564
2565 def _testRecvmsgExplicitDefaults(self):
2566 self.sendToServer(MSG)
2567
2568 def testRecvmsgShorter(self):
2569 # Receive a message smaller than buffer.
2570 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2571 len(MSG) + 42)
2572 self.assertEqual(msg, MSG)
2573 self.checkRecvmsgAddress(addr, self.cli_addr)
2574 self.assertEqual(ancdata, [])
2575 self.checkFlags(flags, eor=True)
2576
2577 def _testRecvmsgShorter(self):
2578 self.sendToServer(MSG)
2579
Charles-François Natali8619cd72011-10-03 19:43:15 +02002580 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
2581 # datagram is received (issue #13001).
2582 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002583 def testRecvmsgTrunc(self):
2584 # Receive part of message, check for truncation indicators.
2585 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2586 len(MSG) - 3)
2587 self.assertEqual(msg, MSG[:-3])
2588 self.checkRecvmsgAddress(addr, self.cli_addr)
2589 self.assertEqual(ancdata, [])
2590 self.checkFlags(flags, eor=False)
2591
Charles-François Natali8619cd72011-10-03 19:43:15 +02002592 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002593 def _testRecvmsgTrunc(self):
2594 self.sendToServer(MSG)
2595
2596 def testRecvmsgShortAncillaryBuf(self):
2597 # Test ancillary data buffer too small to hold any ancillary data.
2598 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2599 len(MSG), 1)
2600 self.assertEqual(msg, MSG)
2601 self.checkRecvmsgAddress(addr, self.cli_addr)
2602 self.assertEqual(ancdata, [])
2603 self.checkFlags(flags, eor=True)
2604
2605 def _testRecvmsgShortAncillaryBuf(self):
2606 self.sendToServer(MSG)
2607
2608 def testRecvmsgLongAncillaryBuf(self):
2609 # Test large ancillary data buffer.
2610 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2611 len(MSG), 10240)
2612 self.assertEqual(msg, MSG)
2613 self.checkRecvmsgAddress(addr, self.cli_addr)
2614 self.assertEqual(ancdata, [])
2615 self.checkFlags(flags, eor=True)
2616
2617 def _testRecvmsgLongAncillaryBuf(self):
2618 self.sendToServer(MSG)
2619
2620 def testRecvmsgAfterClose(self):
2621 # Check that recvmsg[_into]() fails on a closed socket.
2622 self.serv_sock.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02002623 self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002624
2625 def _testRecvmsgAfterClose(self):
2626 pass
2627
2628 def testRecvmsgTimeout(self):
2629 # Check that timeout works.
2630 try:
2631 self.serv_sock.settimeout(0.03)
2632 self.assertRaises(socket.timeout,
2633 self.doRecvmsg, self.serv_sock, len(MSG))
2634 finally:
2635 self.misc_event.set()
2636
2637 def _testRecvmsgTimeout(self):
2638 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2639
2640 @requireAttrs(socket, "MSG_PEEK")
2641 def testRecvmsgPeek(self):
2642 # Check that MSG_PEEK in flags enables examination of pending
2643 # data without consuming it.
2644
2645 # Receive part of data with MSG_PEEK.
2646 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2647 len(MSG) - 3, 0,
2648 socket.MSG_PEEK)
2649 self.assertEqual(msg, MSG[:-3])
2650 self.checkRecvmsgAddress(addr, self.cli_addr)
2651 self.assertEqual(ancdata, [])
2652 # Ignoring MSG_TRUNC here (so this test is the same for stream
2653 # and datagram sockets). Some wording in POSIX seems to
2654 # suggest that it needn't be set when peeking, but that may
2655 # just be a slip.
2656 self.checkFlags(flags, eor=False,
2657 ignore=getattr(socket, "MSG_TRUNC", 0))
2658
2659 # Receive all data with MSG_PEEK.
2660 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2661 len(MSG), 0,
2662 socket.MSG_PEEK)
2663 self.assertEqual(msg, MSG)
2664 self.checkRecvmsgAddress(addr, self.cli_addr)
2665 self.assertEqual(ancdata, [])
2666 self.checkFlags(flags, eor=True)
2667
2668 # Check that the same data can still be received normally.
2669 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2670 self.assertEqual(msg, MSG)
2671 self.checkRecvmsgAddress(addr, self.cli_addr)
2672 self.assertEqual(ancdata, [])
2673 self.checkFlags(flags, eor=True)
2674
2675 @testRecvmsgPeek.client_skip
2676 def _testRecvmsgPeek(self):
2677 self.sendToServer(MSG)
2678
2679 @requireAttrs(socket.socket, "sendmsg")
2680 def testRecvmsgFromSendmsg(self):
2681 # Test receiving with recvmsg[_into]() when message is sent
2682 # using sendmsg().
2683 self.serv_sock.settimeout(self.fail_timeout)
2684 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
2685 self.assertEqual(msg, MSG)
2686 self.checkRecvmsgAddress(addr, self.cli_addr)
2687 self.assertEqual(ancdata, [])
2688 self.checkFlags(flags, eor=True)
2689
2690 @testRecvmsgFromSendmsg.client_skip
2691 def _testRecvmsgFromSendmsg(self):
2692 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
2693
2694
2695class RecvmsgGenericStreamTests(RecvmsgGenericTests):
2696 # Tests which require a stream socket and can use either recvmsg()
2697 # or recvmsg_into().
2698
2699 def testRecvmsgEOF(self):
2700 # Receive end-of-stream indicator (b"", peer socket closed).
2701 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2702 self.assertEqual(msg, b"")
2703 self.checkRecvmsgAddress(addr, self.cli_addr)
2704 self.assertEqual(ancdata, [])
2705 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
2706
2707 def _testRecvmsgEOF(self):
2708 self.cli_sock.close()
2709
2710 def testRecvmsgOverflow(self):
2711 # Receive a message in more than one chunk.
2712 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2713 len(MSG) - 3)
2714 self.checkRecvmsgAddress(addr, self.cli_addr)
2715 self.assertEqual(ancdata, [])
2716 self.checkFlags(flags, eor=False)
2717
2718 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
2719 self.checkRecvmsgAddress(addr, self.cli_addr)
2720 self.assertEqual(ancdata, [])
2721 self.checkFlags(flags, eor=True)
2722
2723 msg = seg1 + seg2
2724 self.assertEqual(msg, MSG)
2725
2726 def _testRecvmsgOverflow(self):
2727 self.sendToServer(MSG)
2728
2729
2730class RecvmsgTests(RecvmsgGenericTests):
2731 # Tests for recvmsg() which can use any socket type.
2732
2733 def testRecvmsgBadArgs(self):
2734 # Check that recvmsg() rejects invalid arguments.
2735 self.assertRaises(TypeError, self.serv_sock.recvmsg)
2736 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2737 -1, 0, 0)
2738 self.assertRaises(ValueError, self.serv_sock.recvmsg,
2739 len(MSG), -1, 0)
2740 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2741 [bytearray(10)], 0, 0)
2742 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2743 object(), 0, 0)
2744 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2745 len(MSG), object(), 0)
2746 self.assertRaises(TypeError, self.serv_sock.recvmsg,
2747 len(MSG), 0, object())
2748
2749 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
2750 self.assertEqual(msg, MSG)
2751 self.checkRecvmsgAddress(addr, self.cli_addr)
2752 self.assertEqual(ancdata, [])
2753 self.checkFlags(flags, eor=True)
2754
2755 def _testRecvmsgBadArgs(self):
2756 self.sendToServer(MSG)
2757
2758
2759class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2760 # Tests for recvmsg_into() which can use any socket type.
2761
2762 def testRecvmsgIntoBadArgs(self):
2763 # Check that recvmsg_into() rejects invalid arguments.
2764 buf = bytearray(len(MSG))
2765 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2766 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2767 len(MSG), 0, 0)
2768 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2769 buf, 0, 0)
2770 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2771 [object()], 0, 0)
2772 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2773 [b"I'm not writable"], 0, 0)
2774 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2775 [buf, object()], 0, 0)
2776 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2777 [buf], -1, 0)
2778 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2779 [buf], object(), 0)
2780 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2781 [buf], 0, object())
2782
2783 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2784 self.assertEqual(nbytes, len(MSG))
2785 self.assertEqual(buf, bytearray(MSG))
2786 self.checkRecvmsgAddress(addr, self.cli_addr)
2787 self.assertEqual(ancdata, [])
2788 self.checkFlags(flags, eor=True)
2789
2790 def _testRecvmsgIntoBadArgs(self):
2791 self.sendToServer(MSG)
2792
2793 def testRecvmsgIntoGenerator(self):
2794 # Receive into buffer obtained from a generator (not a sequence).
2795 buf = bytearray(len(MSG))
2796 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2797 (o for o in [buf]))
2798 self.assertEqual(nbytes, len(MSG))
2799 self.assertEqual(buf, bytearray(MSG))
2800 self.checkRecvmsgAddress(addr, self.cli_addr)
2801 self.assertEqual(ancdata, [])
2802 self.checkFlags(flags, eor=True)
2803
2804 def _testRecvmsgIntoGenerator(self):
2805 self.sendToServer(MSG)
2806
2807 def testRecvmsgIntoArray(self):
2808 # Receive into an array rather than the usual bytearray.
2809 buf = array.array("B", [0] * len(MSG))
2810 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2811 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002812 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002813 self.checkRecvmsgAddress(addr, self.cli_addr)
2814 self.assertEqual(ancdata, [])
2815 self.checkFlags(flags, eor=True)
2816
2817 def _testRecvmsgIntoArray(self):
2818 self.sendToServer(MSG)
2819
2820 def testRecvmsgIntoScatter(self):
2821 # Receive into multiple buffers (scatter write).
2822 b1 = bytearray(b"----")
2823 b2 = bytearray(b"0123456789")
2824 b3 = bytearray(b"--------------")
2825 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2826 [b1, memoryview(b2)[2:9], b3])
2827 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2828 self.assertEqual(b1, bytearray(b"Mary"))
2829 self.assertEqual(b2, bytearray(b"01 had a 9"))
2830 self.assertEqual(b3, bytearray(b"little lamb---"))
2831 self.checkRecvmsgAddress(addr, self.cli_addr)
2832 self.assertEqual(ancdata, [])
2833 self.checkFlags(flags, eor=True)
2834
2835 def _testRecvmsgIntoScatter(self):
2836 self.sendToServer(b"Mary had a little lamb")
2837
2838
2839class CmsgMacroTests(unittest.TestCase):
2840 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2841 # assumptions used by sendmsg() and recvmsg[_into](), which share
2842 # code with these functions.
2843
2844 # Match the definition in socketmodule.c
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02002845 try:
2846 import _testcapi
2847 except ImportError:
2848 socklen_t_limit = 0x7fffffff
2849 else:
2850 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002851
2852 @requireAttrs(socket, "CMSG_LEN")
2853 def testCMSG_LEN(self):
2854 # Test CMSG_LEN() with various valid and invalid values,
2855 # checking the assumptions used by recvmsg() and sendmsg().
2856 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2857 values = list(range(257)) + list(range(toobig - 257, toobig))
2858
2859 # struct cmsghdr has at least three members, two of which are ints
2860 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2861 for n in values:
2862 ret = socket.CMSG_LEN(n)
2863 # This is how recvmsg() calculates the data size
2864 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2865 self.assertLessEqual(ret, self.socklen_t_limit)
2866
2867 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2868 # sendmsg() shares code with these functions, and requires
2869 # that it reject values over the limit.
2870 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2871 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2872
2873 @requireAttrs(socket, "CMSG_SPACE")
2874 def testCMSG_SPACE(self):
2875 # Test CMSG_SPACE() with various valid and invalid values,
2876 # checking the assumptions used by sendmsg().
2877 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2878 values = list(range(257)) + list(range(toobig - 257, toobig))
2879
2880 last = socket.CMSG_SPACE(0)
2881 # struct cmsghdr has at least three members, two of which are ints
2882 self.assertGreater(last, array.array("i").itemsize * 2)
2883 for n in values:
2884 ret = socket.CMSG_SPACE(n)
2885 self.assertGreaterEqual(ret, last)
2886 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2887 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2888 self.assertLessEqual(ret, self.socklen_t_limit)
2889 last = ret
2890
2891 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2892 # sendmsg() shares code with these functions, and requires
2893 # that it reject values over the limit.
2894 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2895 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2896
2897
2898class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2899 # Tests for file descriptor passing on Unix-domain sockets.
2900
2901 # Invalid file descriptor value that's unlikely to evaluate to a
2902 # real FD even if one of its bytes is replaced with a different
2903 # value (which shouldn't actually happen).
2904 badfd = -0x5555
2905
2906 def newFDs(self, n):
2907 # Return a list of n file descriptors for newly-created files
2908 # containing their list indices as ASCII numbers.
2909 fds = []
2910 for i in range(n):
2911 fd, path = tempfile.mkstemp()
2912 self.addCleanup(os.unlink, path)
2913 self.addCleanup(os.close, fd)
2914 os.write(fd, str(i).encode())
2915 fds.append(fd)
2916 return fds
2917
2918 def checkFDs(self, fds):
2919 # Check that the file descriptors in the given list contain
2920 # their correct list indices as ASCII numbers.
2921 for n, fd in enumerate(fds):
2922 os.lseek(fd, 0, os.SEEK_SET)
2923 self.assertEqual(os.read(fd, 1024), str(n).encode())
2924
2925 def registerRecvmsgResult(self, result):
2926 self.addCleanup(self.closeRecvmsgFDs, result)
2927
2928 def closeRecvmsgFDs(self, recvmsg_result):
2929 # Close all file descriptors specified in the ancillary data
2930 # of the given return value from recvmsg() or recvmsg_into().
2931 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2932 if (cmsg_level == socket.SOL_SOCKET and
2933 cmsg_type == socket.SCM_RIGHTS):
2934 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002935 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002936 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2937 for fd in fds:
2938 os.close(fd)
2939
2940 def createAndSendFDs(self, n):
2941 # Send n new file descriptors created by newFDs() to the
2942 # server, with the constant MSG as the non-ancillary data.
2943 self.assertEqual(
2944 self.sendmsgToServer([MSG],
2945 [(socket.SOL_SOCKET,
2946 socket.SCM_RIGHTS,
2947 array.array("i", self.newFDs(n)))]),
2948 len(MSG))
2949
2950 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2951 # Check that constant MSG was received with numfds file
2952 # descriptors in a maximum of maxcmsgs control messages (which
2953 # must contain only complete integers). By default, check
2954 # that MSG_CTRUNC is unset, but ignore any flags in
2955 # ignoreflags.
2956 msg, ancdata, flags, addr = result
2957 self.assertEqual(msg, MSG)
2958 self.checkRecvmsgAddress(addr, self.cli_addr)
2959 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2960 ignore=ignoreflags)
2961
2962 self.assertIsInstance(ancdata, list)
2963 self.assertLessEqual(len(ancdata), maxcmsgs)
2964 fds = array.array("i")
2965 for item in ancdata:
2966 self.assertIsInstance(item, tuple)
2967 cmsg_level, cmsg_type, cmsg_data = item
2968 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2969 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2970 self.assertIsInstance(cmsg_data, bytes)
2971 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002972 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002973
2974 self.assertEqual(len(fds), numfds)
2975 self.checkFDs(fds)
2976
2977 def testFDPassSimple(self):
2978 # Pass a single FD (array read from bytes object).
2979 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2980 len(MSG), 10240))
2981
2982 def _testFDPassSimple(self):
2983 self.assertEqual(
2984 self.sendmsgToServer(
2985 [MSG],
2986 [(socket.SOL_SOCKET,
2987 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002988 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002989 len(MSG))
2990
2991 def testMultipleFDPass(self):
2992 # Pass multiple FDs in a single array.
2993 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2994 len(MSG), 10240))
2995
2996 def _testMultipleFDPass(self):
2997 self.createAndSendFDs(4)
2998
2999 @requireAttrs(socket, "CMSG_SPACE")
3000 def testFDPassCMSG_SPACE(self):
3001 # Test using CMSG_SPACE() to calculate ancillary buffer size.
3002 self.checkRecvmsgFDs(
3003 4, self.doRecvmsg(self.serv_sock, len(MSG),
3004 socket.CMSG_SPACE(4 * SIZEOF_INT)))
3005
3006 @testFDPassCMSG_SPACE.client_skip
3007 def _testFDPassCMSG_SPACE(self):
3008 self.createAndSendFDs(4)
3009
3010 def testFDPassCMSG_LEN(self):
3011 # Test using CMSG_LEN() to calculate ancillary buffer size.
3012 self.checkRecvmsgFDs(1,
3013 self.doRecvmsg(self.serv_sock, len(MSG),
3014 socket.CMSG_LEN(4 * SIZEOF_INT)),
3015 # RFC 3542 says implementations may set
3016 # MSG_CTRUNC if there isn't enough space
3017 # for trailing padding.
3018 ignoreflags=socket.MSG_CTRUNC)
3019
3020 def _testFDPassCMSG_LEN(self):
3021 self.createAndSendFDs(1)
3022
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003023 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003024 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003025 @requireAttrs(socket, "CMSG_SPACE")
3026 def testFDPassSeparate(self):
3027 # Pass two FDs in two separate arrays. Arrays may be combined
3028 # into a single control message by the OS.
3029 self.checkRecvmsgFDs(2,
3030 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
3031 maxcmsgs=2)
3032
3033 @testFDPassSeparate.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003034 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003035 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003036 def _testFDPassSeparate(self):
3037 fd0, fd1 = self.newFDs(2)
3038 self.assertEqual(
3039 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3040 socket.SCM_RIGHTS,
3041 array.array("i", [fd0])),
3042 (socket.SOL_SOCKET,
3043 socket.SCM_RIGHTS,
3044 array.array("i", [fd1]))]),
3045 len(MSG))
3046
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003047 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003048 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003049 @requireAttrs(socket, "CMSG_SPACE")
3050 def testFDPassSeparateMinSpace(self):
3051 # Pass two FDs in two separate arrays, receiving them into the
3052 # minimum space for two arrays.
3053 self.checkRecvmsgFDs(2,
3054 self.doRecvmsg(self.serv_sock, len(MSG),
3055 socket.CMSG_SPACE(SIZEOF_INT) +
3056 socket.CMSG_LEN(SIZEOF_INT)),
3057 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
3058
3059 @testFDPassSeparateMinSpace.client_skip
Charles-Francois Natalid66b10e2013-05-20 19:08:19 +02003060 @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
Robert Collins43cbbe22015-08-03 10:36:04 +12003061 @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003062 def _testFDPassSeparateMinSpace(self):
3063 fd0, fd1 = self.newFDs(2)
3064 self.assertEqual(
3065 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
3066 socket.SCM_RIGHTS,
3067 array.array("i", [fd0])),
3068 (socket.SOL_SOCKET,
3069 socket.SCM_RIGHTS,
3070 array.array("i", [fd1]))]),
3071 len(MSG))
3072
3073 def sendAncillaryIfPossible(self, msg, ancdata):
3074 # Try to send msg and ancdata to server, but if the system
3075 # call fails, just send msg with no ancillary data.
3076 try:
3077 nbytes = self.sendmsgToServer([msg], ancdata)
Andrew Svetlov0832af62012-12-18 23:10:48 +02003078 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003079 # Check that it was the system call that failed
3080 self.assertIsInstance(e.errno, int)
3081 nbytes = self.sendmsgToServer([msg])
3082 self.assertEqual(nbytes, len(msg))
3083
Brett Cannon3bbad122015-12-28 17:21:44 -08003084 @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003085 def testFDPassEmpty(self):
3086 # Try to pass an empty FD array. Can receive either no array
3087 # or an empty array.
3088 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
3089 len(MSG), 10240),
3090 ignoreflags=socket.MSG_CTRUNC)
3091
3092 def _testFDPassEmpty(self):
3093 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
3094 socket.SCM_RIGHTS,
3095 b"")])
3096
3097 def testFDPassPartialInt(self):
3098 # Try to pass a truncated FD array.
3099 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3100 len(MSG), 10240)
3101 self.assertEqual(msg, MSG)
3102 self.checkRecvmsgAddress(addr, self.cli_addr)
3103 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3104 self.assertLessEqual(len(ancdata), 1)
3105 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3106 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3107 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3108 self.assertLess(len(cmsg_data), SIZEOF_INT)
3109
3110 def _testFDPassPartialInt(self):
3111 self.sendAncillaryIfPossible(
3112 MSG,
3113 [(socket.SOL_SOCKET,
3114 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003115 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003116
3117 @requireAttrs(socket, "CMSG_SPACE")
3118 def testFDPassPartialIntInMiddle(self):
3119 # Try to pass two FD arrays, the first of which is truncated.
3120 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3121 len(MSG), 10240)
3122 self.assertEqual(msg, MSG)
3123 self.checkRecvmsgAddress(addr, self.cli_addr)
3124 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
3125 self.assertLessEqual(len(ancdata), 2)
3126 fds = array.array("i")
3127 # Arrays may have been combined in a single control message
3128 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3129 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3130 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003131 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003132 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3133 self.assertLessEqual(len(fds), 2)
3134 self.checkFDs(fds)
3135
3136 @testFDPassPartialIntInMiddle.client_skip
3137 def _testFDPassPartialIntInMiddle(self):
3138 fd0, fd1 = self.newFDs(2)
3139 self.sendAncillaryIfPossible(
3140 MSG,
3141 [(socket.SOL_SOCKET,
3142 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003143 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003144 (socket.SOL_SOCKET,
3145 socket.SCM_RIGHTS,
3146 array.array("i", [fd1]))])
3147
3148 def checkTruncatedHeader(self, result, ignoreflags=0):
3149 # Check that no ancillary data items are returned when data is
3150 # truncated inside the cmsghdr structure.
3151 msg, ancdata, flags, addr = result
3152 self.assertEqual(msg, MSG)
3153 self.checkRecvmsgAddress(addr, self.cli_addr)
3154 self.assertEqual(ancdata, [])
3155 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3156 ignore=ignoreflags)
3157
3158 def testCmsgTruncNoBufSize(self):
3159 # Check that no ancillary data is received when no buffer size
3160 # is specified.
3161 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
3162 # BSD seems to set MSG_CTRUNC only
3163 # if an item has been partially
3164 # received.
3165 ignoreflags=socket.MSG_CTRUNC)
3166
3167 def _testCmsgTruncNoBufSize(self):
3168 self.createAndSendFDs(1)
3169
3170 def testCmsgTrunc0(self):
3171 # Check that no ancillary data is received when buffer size is 0.
3172 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
3173 ignoreflags=socket.MSG_CTRUNC)
3174
3175 def _testCmsgTrunc0(self):
3176 self.createAndSendFDs(1)
3177
3178 # Check that no ancillary data is returned for various non-zero
3179 # (but still too small) buffer sizes.
3180
3181 def testCmsgTrunc1(self):
3182 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
3183
3184 def _testCmsgTrunc1(self):
3185 self.createAndSendFDs(1)
3186
3187 def testCmsgTrunc2Int(self):
3188 # The cmsghdr structure has at least three members, two of
3189 # which are ints, so we still shouldn't see any ancillary
3190 # data.
3191 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3192 SIZEOF_INT * 2))
3193
3194 def _testCmsgTrunc2Int(self):
3195 self.createAndSendFDs(1)
3196
3197 def testCmsgTruncLen0Minus1(self):
3198 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
3199 socket.CMSG_LEN(0) - 1))
3200
3201 def _testCmsgTruncLen0Minus1(self):
3202 self.createAndSendFDs(1)
3203
3204 # The following tests try to truncate the control message in the
3205 # middle of the FD array.
3206
3207 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
3208 # Check that file descriptor data is truncated to between
3209 # mindata and maxdata bytes when received with buffer size
3210 # ancbuf, and that any complete file descriptor numbers are
3211 # valid.
3212 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3213 len(MSG), ancbuf)
3214 self.assertEqual(msg, MSG)
3215 self.checkRecvmsgAddress(addr, self.cli_addr)
3216 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3217
3218 if mindata == 0 and ancdata == []:
3219 return
3220 self.assertEqual(len(ancdata), 1)
3221 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3222 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
3223 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
3224 self.assertGreaterEqual(len(cmsg_data), mindata)
3225 self.assertLessEqual(len(cmsg_data), maxdata)
3226 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003227 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003228 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
3229 self.checkFDs(fds)
3230
3231 def testCmsgTruncLen0(self):
3232 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
3233
3234 def _testCmsgTruncLen0(self):
3235 self.createAndSendFDs(1)
3236
3237 def testCmsgTruncLen0Plus1(self):
3238 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
3239
3240 def _testCmsgTruncLen0Plus1(self):
3241 self.createAndSendFDs(2)
3242
3243 def testCmsgTruncLen1(self):
3244 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
3245 maxdata=SIZEOF_INT)
3246
3247 def _testCmsgTruncLen1(self):
3248 self.createAndSendFDs(2)
3249
3250 def testCmsgTruncLen2Minus1(self):
3251 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
3252 maxdata=(2 * SIZEOF_INT) - 1)
3253
3254 def _testCmsgTruncLen2Minus1(self):
3255 self.createAndSendFDs(2)
3256
3257
3258class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
3259 # Test sendmsg() and recvmsg[_into]() using the ancillary data
3260 # features of the RFC 3542 Advanced Sockets API for IPv6.
3261 # Currently we can only handle certain data items (e.g. traffic
3262 # class, hop limit, MTU discovery and fragmentation settings)
3263 # without resorting to unportable means such as the struct module,
3264 # but the tests here are aimed at testing the ancillary data
3265 # handling in sendmsg() and recvmsg() rather than the IPv6 API
3266 # itself.
3267
3268 # Test value to use when setting hop limit of packet
3269 hop_limit = 2
3270
3271 # Test value to use when setting traffic class of packet.
3272 # -1 means "use kernel default".
3273 traffic_class = -1
3274
3275 def ancillaryMapping(self, ancdata):
3276 # Given ancillary data list ancdata, return a mapping from
3277 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
3278 # Check that no (level, type) pair appears more than once.
3279 d = {}
3280 for cmsg_level, cmsg_type, cmsg_data in ancdata:
3281 self.assertNotIn((cmsg_level, cmsg_type), d)
3282 d[(cmsg_level, cmsg_type)] = cmsg_data
3283 return d
3284
3285 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
3286 # Receive hop limit into ancbufsize bytes of ancillary data
3287 # space. Check that data is MSG, ancillary data is not
3288 # truncated (but ignore any flags in ignoreflags), and hop
3289 # limit is between 0 and maxhop inclusive.
3290 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3291 socket.IPV6_RECVHOPLIMIT, 1)
3292 self.misc_event.set()
3293 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3294 len(MSG), ancbufsize)
3295
3296 self.assertEqual(msg, MSG)
3297 self.checkRecvmsgAddress(addr, self.cli_addr)
3298 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3299 ignore=ignoreflags)
3300
3301 self.assertEqual(len(ancdata), 1)
3302 self.assertIsInstance(ancdata[0], tuple)
3303 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3304 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3305 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3306 self.assertIsInstance(cmsg_data, bytes)
3307 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3308 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003309 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003310 self.assertGreaterEqual(a[0], 0)
3311 self.assertLessEqual(a[0], maxhop)
3312
3313 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3314 def testRecvHopLimit(self):
3315 # Test receiving the packet hop limit as ancillary data.
3316 self.checkHopLimit(ancbufsize=10240)
3317
3318 @testRecvHopLimit.client_skip
3319 def _testRecvHopLimit(self):
3320 # Need to wait until server has asked to receive ancillary
3321 # data, as implementations are not required to buffer it
3322 # otherwise.
3323 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3324 self.sendToServer(MSG)
3325
3326 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3327 def testRecvHopLimitCMSG_SPACE(self):
3328 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
3329 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
3330
3331 @testRecvHopLimitCMSG_SPACE.client_skip
3332 def _testRecvHopLimitCMSG_SPACE(self):
3333 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3334 self.sendToServer(MSG)
3335
3336 # Could test receiving into buffer sized using CMSG_LEN, but RFC
3337 # 3542 says portable applications must provide space for trailing
3338 # padding. Implementations may set MSG_CTRUNC if there isn't
3339 # enough space for the padding.
3340
3341 @requireAttrs(socket.socket, "sendmsg")
3342 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3343 def testSetHopLimit(self):
3344 # Test setting hop limit on outgoing packet and receiving it
3345 # at the other end.
3346 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
3347
3348 @testSetHopLimit.client_skip
3349 def _testSetHopLimit(self):
3350 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3351 self.assertEqual(
3352 self.sendmsgToServer([MSG],
3353 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3354 array.array("i", [self.hop_limit]))]),
3355 len(MSG))
3356
3357 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
3358 ignoreflags=0):
3359 # Receive traffic class and hop limit into ancbufsize bytes of
3360 # ancillary data space. Check that data is MSG, ancillary
3361 # data is not truncated (but ignore any flags in ignoreflags),
3362 # and traffic class and hop limit are in range (hop limit no
3363 # more than maxhop).
3364 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3365 socket.IPV6_RECVHOPLIMIT, 1)
3366 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3367 socket.IPV6_RECVTCLASS, 1)
3368 self.misc_event.set()
3369 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3370 len(MSG), ancbufsize)
3371
3372 self.assertEqual(msg, MSG)
3373 self.checkRecvmsgAddress(addr, self.cli_addr)
3374 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
3375 ignore=ignoreflags)
3376 self.assertEqual(len(ancdata), 2)
3377 ancmap = self.ancillaryMapping(ancdata)
3378
3379 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
3380 self.assertEqual(len(tcdata), SIZEOF_INT)
3381 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003382 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003383 self.assertGreaterEqual(a[0], 0)
3384 self.assertLessEqual(a[0], 255)
3385
3386 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
3387 self.assertEqual(len(hldata), SIZEOF_INT)
3388 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003389 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003390 self.assertGreaterEqual(a[0], 0)
3391 self.assertLessEqual(a[0], maxhop)
3392
3393 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3394 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3395 def testRecvTrafficClassAndHopLimit(self):
3396 # Test receiving traffic class and hop limit as ancillary data.
3397 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
3398
3399 @testRecvTrafficClassAndHopLimit.client_skip
3400 def _testRecvTrafficClassAndHopLimit(self):
3401 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3402 self.sendToServer(MSG)
3403
3404 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3405 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3406 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3407 # Test receiving traffic class and hop limit, using
3408 # CMSG_SPACE() to calculate buffer size.
3409 self.checkTrafficClassAndHopLimit(
3410 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
3411
3412 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
3413 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
3414 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3415 self.sendToServer(MSG)
3416
3417 @requireAttrs(socket.socket, "sendmsg")
3418 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3419 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3420 def testSetTrafficClassAndHopLimit(self):
3421 # Test setting traffic class and hop limit on outgoing packet,
3422 # and receiving them at the other end.
3423 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3424 maxhop=self.hop_limit)
3425
3426 @testSetTrafficClassAndHopLimit.client_skip
3427 def _testSetTrafficClassAndHopLimit(self):
3428 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3429 self.assertEqual(
3430 self.sendmsgToServer([MSG],
3431 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3432 array.array("i", [self.traffic_class])),
3433 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3434 array.array("i", [self.hop_limit]))]),
3435 len(MSG))
3436
3437 @requireAttrs(socket.socket, "sendmsg")
3438 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3439 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3440 def testOddCmsgSize(self):
3441 # Try to send ancillary data with first item one byte too
3442 # long. Fall back to sending with correct size if this fails,
3443 # and check that second item was handled correctly.
3444 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
3445 maxhop=self.hop_limit)
3446
3447 @testOddCmsgSize.client_skip
3448 def _testOddCmsgSize(self):
3449 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3450 try:
3451 nbytes = self.sendmsgToServer(
3452 [MSG],
3453 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003454 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003455 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3456 array.array("i", [self.hop_limit]))])
Andrew Svetlov0832af62012-12-18 23:10:48 +02003457 except OSError as e:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003458 self.assertIsInstance(e.errno, int)
3459 nbytes = self.sendmsgToServer(
3460 [MSG],
3461 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
3462 array.array("i", [self.traffic_class])),
3463 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
3464 array.array("i", [self.hop_limit]))])
3465 self.assertEqual(nbytes, len(MSG))
3466
3467 # Tests for proper handling of truncated ancillary data
3468
3469 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
3470 # Receive hop limit into ancbufsize bytes of ancillary data
3471 # space, which should be too small to contain the ancillary
3472 # data header (if ancbufsize is None, pass no second argument
3473 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
3474 # (unless included in ignoreflags), and no ancillary data is
3475 # returned.
3476 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3477 socket.IPV6_RECVHOPLIMIT, 1)
3478 self.misc_event.set()
3479 args = () if ancbufsize is None else (ancbufsize,)
3480 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3481 len(MSG), *args)
3482
3483 self.assertEqual(msg, MSG)
3484 self.checkRecvmsgAddress(addr, self.cli_addr)
3485 self.assertEqual(ancdata, [])
3486 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3487 ignore=ignoreflags)
3488
3489 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3490 def testCmsgTruncNoBufSize(self):
3491 # Check that no ancillary data is received when no ancillary
3492 # buffer size is provided.
3493 self.checkHopLimitTruncatedHeader(ancbufsize=None,
3494 # BSD seems to set
3495 # MSG_CTRUNC only if an item
3496 # has been partially
3497 # received.
3498 ignoreflags=socket.MSG_CTRUNC)
3499
3500 @testCmsgTruncNoBufSize.client_skip
3501 def _testCmsgTruncNoBufSize(self):
3502 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3503 self.sendToServer(MSG)
3504
3505 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3506 def testSingleCmsgTrunc0(self):
3507 # Check that no ancillary data is received when ancillary
3508 # buffer size is zero.
3509 self.checkHopLimitTruncatedHeader(ancbufsize=0,
3510 ignoreflags=socket.MSG_CTRUNC)
3511
3512 @testSingleCmsgTrunc0.client_skip
3513 def _testSingleCmsgTrunc0(self):
3514 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3515 self.sendToServer(MSG)
3516
3517 # Check that no ancillary data is returned for various non-zero
3518 # (but still too small) buffer sizes.
3519
3520 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3521 def testSingleCmsgTrunc1(self):
3522 self.checkHopLimitTruncatedHeader(ancbufsize=1)
3523
3524 @testSingleCmsgTrunc1.client_skip
3525 def _testSingleCmsgTrunc1(self):
3526 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3527 self.sendToServer(MSG)
3528
3529 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3530 def testSingleCmsgTrunc2Int(self):
3531 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
3532
3533 @testSingleCmsgTrunc2Int.client_skip
3534 def _testSingleCmsgTrunc2Int(self):
3535 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3536 self.sendToServer(MSG)
3537
3538 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3539 def testSingleCmsgTruncLen0Minus1(self):
3540 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
3541
3542 @testSingleCmsgTruncLen0Minus1.client_skip
3543 def _testSingleCmsgTruncLen0Minus1(self):
3544 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3545 self.sendToServer(MSG)
3546
3547 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
3548 def testSingleCmsgTruncInData(self):
3549 # Test truncation of a control message inside its associated
3550 # data. The message may be returned with its data truncated,
3551 # or not returned at all.
3552 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3553 socket.IPV6_RECVHOPLIMIT, 1)
3554 self.misc_event.set()
3555 msg, ancdata, flags, addr = self.doRecvmsg(
3556 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
3557
3558 self.assertEqual(msg, MSG)
3559 self.checkRecvmsgAddress(addr, self.cli_addr)
3560 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3561
3562 self.assertLessEqual(len(ancdata), 1)
3563 if ancdata:
3564 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3565 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3566 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
3567 self.assertLess(len(cmsg_data), SIZEOF_INT)
3568
3569 @testSingleCmsgTruncInData.client_skip
3570 def _testSingleCmsgTruncInData(self):
3571 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3572 self.sendToServer(MSG)
3573
3574 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
3575 # Receive traffic class and hop limit into ancbufsize bytes of
3576 # ancillary data space, which should be large enough to
3577 # contain the first item, but too small to contain the header
3578 # of the second. Check that data is MSG, MSG_CTRUNC is set
3579 # (unless included in ignoreflags), and only one ancillary
3580 # data item is returned.
3581 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3582 socket.IPV6_RECVHOPLIMIT, 1)
3583 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3584 socket.IPV6_RECVTCLASS, 1)
3585 self.misc_event.set()
3586 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
3587 len(MSG), ancbufsize)
3588
3589 self.assertEqual(msg, MSG)
3590 self.checkRecvmsgAddress(addr, self.cli_addr)
3591 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
3592 ignore=ignoreflags)
3593
3594 self.assertEqual(len(ancdata), 1)
3595 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
3596 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3597 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
3598 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3599 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003600 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003601 self.assertGreaterEqual(a[0], 0)
3602 self.assertLessEqual(a[0], 255)
3603
3604 # Try the above test with various buffer sizes.
3605
3606 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3607 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3608 def testSecondCmsgTrunc0(self):
3609 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
3610 ignoreflags=socket.MSG_CTRUNC)
3611
3612 @testSecondCmsgTrunc0.client_skip
3613 def _testSecondCmsgTrunc0(self):
3614 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3615 self.sendToServer(MSG)
3616
3617 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3618 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3619 def testSecondCmsgTrunc1(self):
3620 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
3621
3622 @testSecondCmsgTrunc1.client_skip
3623 def _testSecondCmsgTrunc1(self):
3624 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3625 self.sendToServer(MSG)
3626
3627 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3628 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3629 def testSecondCmsgTrunc2Int(self):
3630 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3631 2 * SIZEOF_INT)
3632
3633 @testSecondCmsgTrunc2Int.client_skip
3634 def _testSecondCmsgTrunc2Int(self):
3635 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3636 self.sendToServer(MSG)
3637
3638 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3639 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3640 def testSecondCmsgTruncLen0Minus1(self):
3641 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
3642 socket.CMSG_LEN(0) - 1)
3643
3644 @testSecondCmsgTruncLen0Minus1.client_skip
3645 def _testSecondCmsgTruncLen0Minus1(self):
3646 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3647 self.sendToServer(MSG)
3648
3649 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
3650 "IPV6_RECVTCLASS", "IPV6_TCLASS")
3651 def testSecomdCmsgTruncInData(self):
3652 # Test truncation of the second of two control messages inside
3653 # its associated data.
3654 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3655 socket.IPV6_RECVHOPLIMIT, 1)
3656 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
3657 socket.IPV6_RECVTCLASS, 1)
3658 self.misc_event.set()
3659 msg, ancdata, flags, addr = self.doRecvmsg(
3660 self.serv_sock, len(MSG),
3661 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
3662
3663 self.assertEqual(msg, MSG)
3664 self.checkRecvmsgAddress(addr, self.cli_addr)
3665 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
3666
3667 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
3668
3669 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3670 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3671 cmsg_types.remove(cmsg_type)
3672 self.assertEqual(len(cmsg_data), SIZEOF_INT)
3673 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02003674 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003675 self.assertGreaterEqual(a[0], 0)
3676 self.assertLessEqual(a[0], 255)
3677
3678 if ancdata:
3679 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
3680 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
3681 cmsg_types.remove(cmsg_type)
3682 self.assertLess(len(cmsg_data), SIZEOF_INT)
3683
3684 self.assertEqual(ancdata, [])
3685
3686 @testSecomdCmsgTruncInData.client_skip
3687 def _testSecomdCmsgTruncInData(self):
3688 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
3689 self.sendToServer(MSG)
3690
3691
3692# Derive concrete test classes for different socket types.
3693
3694class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
3695 SendrecvmsgConnectionlessBase,
3696 ThreadedSocketTestMixin, UDPTestBase):
3697 pass
3698
3699@requireAttrs(socket.socket, "sendmsg")
3700@unittest.skipUnless(thread, 'Threading required for this test.')
3701class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
3702 pass
3703
3704@requireAttrs(socket.socket, "recvmsg")
3705@unittest.skipUnless(thread, 'Threading required for this test.')
3706class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
3707 pass
3708
3709@requireAttrs(socket.socket, "recvmsg_into")
3710@unittest.skipUnless(thread, 'Threading required for this test.')
3711class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
3712 pass
3713
3714
3715class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
3716 SendrecvmsgConnectionlessBase,
3717 ThreadedSocketTestMixin, UDP6TestBase):
Charles-François Natali37114bb2013-07-09 19:15:43 +02003718
3719 def checkRecvmsgAddress(self, addr1, addr2):
3720 # Called to compare the received address with the address of
3721 # the peer, ignoring scope ID
3722 self.assertEqual(addr1[:-1], addr2[:-1])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003723
3724@requireAttrs(socket.socket, "sendmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003725@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003726@requireSocket("AF_INET6", "SOCK_DGRAM")
3727@unittest.skipUnless(thread, 'Threading required for this test.')
3728class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
3729 pass
3730
3731@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003732@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003733@requireSocket("AF_INET6", "SOCK_DGRAM")
3734@unittest.skipUnless(thread, 'Threading required for this test.')
3735class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
3736 pass
3737
3738@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003739@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003740@requireSocket("AF_INET6", "SOCK_DGRAM")
3741@unittest.skipUnless(thread, 'Threading required for this test.')
3742class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
3743 pass
3744
3745@requireAttrs(socket.socket, "recvmsg")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003746@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003747@requireAttrs(socket, "IPPROTO_IPV6")
3748@requireSocket("AF_INET6", "SOCK_DGRAM")
3749@unittest.skipUnless(thread, 'Threading required for this test.')
3750class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
3751 SendrecvmsgUDP6TestBase):
3752 pass
3753
3754@requireAttrs(socket.socket, "recvmsg_into")
Ross Lagerwall8d459f02012-07-08 09:53:57 +02003755@unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003756@requireAttrs(socket, "IPPROTO_IPV6")
3757@requireSocket("AF_INET6", "SOCK_DGRAM")
3758@unittest.skipUnless(thread, 'Threading required for this test.')
3759class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
3760 RFC3542AncillaryTest,
3761 SendrecvmsgUDP6TestBase):
3762 pass
3763
3764
3765class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
3766 ConnectedStreamTestMixin, TCPTestBase):
3767 pass
3768
3769@requireAttrs(socket.socket, "sendmsg")
3770@unittest.skipUnless(thread, 'Threading required for this test.')
3771class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3772 pass
3773
3774@requireAttrs(socket.socket, "recvmsg")
3775@unittest.skipUnless(thread, 'Threading required for this test.')
3776class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3777 SendrecvmsgTCPTestBase):
3778 pass
3779
3780@requireAttrs(socket.socket, "recvmsg_into")
3781@unittest.skipUnless(thread, 'Threading required for this test.')
3782class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3783 SendrecvmsgTCPTestBase):
3784 pass
3785
3786
3787class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3788 SendrecvmsgConnectedBase,
3789 ConnectedStreamTestMixin, SCTPStreamBase):
3790 pass
3791
3792@requireAttrs(socket.socket, "sendmsg")
3793@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3794@unittest.skipUnless(thread, 'Threading required for this test.')
3795class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3796 pass
3797
3798@requireAttrs(socket.socket, "recvmsg")
3799@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3800@unittest.skipUnless(thread, 'Threading required for this test.')
3801class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3802 SendrecvmsgSCTPStreamTestBase):
Antoine Pitrou92f8b002012-12-16 16:40:04 +01003803
3804 def testRecvmsgEOF(self):
3805 try:
3806 super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
3807 except OSError as e:
3808 if e.errno != errno.ENOTCONN:
3809 raise
3810 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003811
3812@requireAttrs(socket.socket, "recvmsg_into")
3813@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3814@unittest.skipUnless(thread, 'Threading required for this test.')
3815class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3816 SendrecvmsgSCTPStreamTestBase):
Antoine Pitroud5a070f2012-12-18 23:44:36 +01003817
3818 def testRecvmsgEOF(self):
3819 try:
3820 super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
3821 except OSError as e:
3822 if e.errno != errno.ENOTCONN:
3823 raise
3824 self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003825
3826
3827class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3828 ConnectedStreamTestMixin, UnixStreamBase):
3829 pass
3830
3831@requireAttrs(socket.socket, "sendmsg")
3832@requireAttrs(socket, "AF_UNIX")
3833@unittest.skipUnless(thread, 'Threading required for this test.')
3834class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3835 pass
3836
3837@requireAttrs(socket.socket, "recvmsg")
3838@requireAttrs(socket, "AF_UNIX")
3839@unittest.skipUnless(thread, 'Threading required for this test.')
3840class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3841 SendrecvmsgUnixStreamTestBase):
3842 pass
3843
3844@requireAttrs(socket.socket, "recvmsg_into")
3845@requireAttrs(socket, "AF_UNIX")
3846@unittest.skipUnless(thread, 'Threading required for this test.')
3847class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3848 SendrecvmsgUnixStreamTestBase):
3849 pass
3850
3851@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3852@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3853@unittest.skipUnless(thread, 'Threading required for this test.')
3854class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3855 pass
3856
3857@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3858@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3859@unittest.skipUnless(thread, 'Threading required for this test.')
3860class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3861 SendrecvmsgUnixStreamTestBase):
3862 pass
3863
3864
3865# Test interrupting the interruptible send/receive methods with a
3866# signal when a timeout is set. These tests avoid having multiple
3867# threads alive during the test so that the OS cannot deliver the
3868# signal to the wrong one.
3869
3870class InterruptedTimeoutBase(unittest.TestCase):
3871 # Base class for interrupted send/receive tests. Installs an
3872 # empty handler for SIGALRM and removes it on teardown, along with
3873 # any scheduled alarms.
3874
3875 def setUp(self):
3876 super().setUp()
3877 orig_alrm_handler = signal.signal(signal.SIGALRM,
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003878 lambda signum, frame: 1 / 0)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003879 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3880 self.addCleanup(self.setAlarm, 0)
3881
3882 # Timeout for socket operations
3883 timeout = 4.0
3884
3885 # Provide setAlarm() method to schedule delivery of SIGALRM after
3886 # given number of seconds, or cancel it if zero, and an
3887 # appropriate time value to use. Use setitimer() if available.
3888 if hasattr(signal, "setitimer"):
3889 alarm_time = 0.05
3890
3891 def setAlarm(self, seconds):
3892 signal.setitimer(signal.ITIMER_REAL, seconds)
3893 else:
3894 # Old systems may deliver the alarm up to one second early
3895 alarm_time = 2
3896
3897 def setAlarm(self, seconds):
3898 signal.alarm(seconds)
3899
3900
3901# Require siginterrupt() in order to ensure that system calls are
3902# interrupted by default.
3903@requireAttrs(signal, "siginterrupt")
3904@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3905 "Don't have signal.alarm or signal.setitimer")
3906class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3907 # Test interrupting the recv*() methods with signals when a
3908 # timeout is set.
3909
3910 def setUp(self):
3911 super().setUp()
3912 self.serv.settimeout(self.timeout)
3913
3914 def checkInterruptedRecv(self, func, *args, **kwargs):
Charles-François Natali26dd5ed2015-02-07 13:29:15 +00003915 # Check that func(*args, **kwargs) raises
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003916 # errno of EINTR when interrupted by a signal.
3917 self.setAlarm(self.alarm_time)
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003918 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003919 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003920
3921 def testInterruptedRecvTimeout(self):
3922 self.checkInterruptedRecv(self.serv.recv, 1024)
3923
3924 def testInterruptedRecvIntoTimeout(self):
3925 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3926
3927 def testInterruptedRecvfromTimeout(self):
3928 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3929
3930 def testInterruptedRecvfromIntoTimeout(self):
3931 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3932
3933 @requireAttrs(socket.socket, "recvmsg")
3934 def testInterruptedRecvmsgTimeout(self):
3935 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3936
3937 @requireAttrs(socket.socket, "recvmsg_into")
3938 def testInterruptedRecvmsgIntoTimeout(self):
3939 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3940
3941
3942# Require siginterrupt() in order to ensure that system calls are
3943# interrupted by default.
3944@requireAttrs(signal, "siginterrupt")
3945@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3946 "Don't have signal.alarm or signal.setitimer")
3947@unittest.skipUnless(thread, 'Threading required for this test.')
3948class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3949 ThreadSafeCleanupTestCase,
3950 SocketListeningTestMixin, TCPTestBase):
3951 # Test interrupting the interruptible send*() methods with signals
3952 # when a timeout is set.
3953
3954 def setUp(self):
3955 super().setUp()
3956 self.serv_conn = self.newSocket()
3957 self.addCleanup(self.serv_conn.close)
3958 # Use a thread to complete the connection, but wait for it to
3959 # terminate before running the test, so that there is only one
3960 # thread to accept the signal.
3961 cli_thread = threading.Thread(target=self.doConnect)
3962 cli_thread.start()
3963 self.cli_conn, addr = self.serv.accept()
3964 self.addCleanup(self.cli_conn.close)
3965 cli_thread.join()
3966 self.serv_conn.settimeout(self.timeout)
3967
3968 def doConnect(self):
3969 self.serv_conn.connect(self.serv_addr)
3970
3971 def checkInterruptedSend(self, func, *args, **kwargs):
3972 # Check that func(*args, **kwargs), run in a loop, raises
Andrew Svetlov0832af62012-12-18 23:10:48 +02003973 # OSError with an errno of EINTR when interrupted by a
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003974 # signal.
Charles-François Natali6e6c59b2015-02-07 13:27:50 +00003975 with self.assertRaises(ZeroDivisionError) as cm:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003976 while True:
3977 self.setAlarm(self.alarm_time)
3978 func(*args, **kwargs)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003979
Ned Deilyc5640382014-02-03 13:58:31 -08003980 # Issue #12958: The following tests have problems on OS X prior to 10.7
3981 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003982 def testInterruptedSendTimeout(self):
3983 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3984
Ned Deilyc5640382014-02-03 13:58:31 -08003985 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003986 def testInterruptedSendtoTimeout(self):
3987 # Passing an actual address here as Python's wrapper for
3988 # sendto() doesn't allow passing a zero-length one; POSIX
3989 # requires that the address is ignored since the socket is
3990 # connection-mode, however.
3991 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3992 self.serv_addr)
3993
Ned Deilyc5640382014-02-03 13:58:31 -08003994 @support.requires_mac_ver(10, 7)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003995 @requireAttrs(socket.socket, "sendmsg")
3996 def testInterruptedSendmsgTimeout(self):
3997 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3998
3999
Victor Stinner45df8202010-04-28 22:31:17 +00004000@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004001class TCPCloserTest(ThreadedTCPSocketTest):
4002
4003 def testClose(self):
4004 conn, addr = self.serv.accept()
4005 conn.close()
4006
4007 sd = self.cli
4008 read, write, err = select.select([sd], [], [], 1.0)
4009 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004010 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004011
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004012 # Calling close() many times should be safe.
4013 conn.close()
4014 conn.close()
4015
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004016 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004017 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004018 time.sleep(1.0)
4019
Victor Stinner45df8202010-04-28 22:31:17 +00004020@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00004021class BasicSocketPairTest(SocketPairTest):
4022
4023 def __init__(self, methodName='runTest'):
4024 SocketPairTest.__init__(self, methodName=methodName)
4025
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004026 def _check_defaults(self, sock):
4027 self.assertIsInstance(sock, socket.socket)
4028 if hasattr(socket, 'AF_UNIX'):
4029 self.assertEqual(sock.family, socket.AF_UNIX)
4030 else:
4031 self.assertEqual(sock.family, socket.AF_INET)
4032 self.assertEqual(sock.type, socket.SOCK_STREAM)
4033 self.assertEqual(sock.proto, 0)
4034
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004035 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004036 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004037
4038 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00004039 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00004040
Dave Cole331708b2004-08-09 04:51:41 +00004041 def testRecv(self):
4042 msg = self.serv.recv(1024)
4043 self.assertEqual(msg, MSG)
4044
4045 def _testRecv(self):
4046 self.cli.send(MSG)
4047
4048 def testSend(self):
4049 self.serv.send(MSG)
4050
4051 def _testSend(self):
4052 msg = self.cli.recv(1024)
4053 self.assertEqual(msg, MSG)
4054
Victor Stinner45df8202010-04-28 22:31:17 +00004055@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00004056class NonBlockingTCPTests(ThreadedTCPSocketTest):
4057
4058 def __init__(self, methodName='runTest'):
4059 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
4060
4061 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004062 # Testing whether set blocking works
Serhiy Storchaka45cb7f62013-01-15 11:08:30 +02004063 self.serv.setblocking(True)
4064 self.assertIsNone(self.serv.gettimeout())
4065 self.serv.setblocking(False)
4066 self.assertEqual(self.serv.gettimeout(), 0.0)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004067 start = time.time()
4068 try:
4069 self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004070 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004071 pass
4072 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004073 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00004074
4075 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00004076 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00004077
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +02004078 @support.cpython_only
4079 def testSetBlocking_overflow(self):
4080 # Issue 15989
4081 import _testcapi
4082 if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
4083 self.skipTest('needs UINT_MAX < ULONG_MAX')
4084 self.serv.setblocking(False)
4085 self.assertEqual(self.serv.gettimeout(), 0.0)
4086 self.serv.setblocking(_testcapi.UINT_MAX + 1)
4087 self.assertIsNone(self.serv.gettimeout())
4088
4089 _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
4090
Serhiy Storchaka43767632013-11-03 21:31:38 +02004091 @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
4092 'test needs socket.SOCK_NONBLOCK')
4093 @support.requires_linux_version(2, 6, 28)
4094 def testInitNonBlocking(self):
4095 # reinit server socket
4096 self.serv.close()
4097 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
4098 socket.SOCK_NONBLOCK)
4099 self.port = support.bind_port(self.serv)
Charles-François Natali6e204602014-07-23 19:28:13 +01004100 self.serv.listen()
Serhiy Storchaka43767632013-11-03 21:31:38 +02004101 # actual testing
4102 start = time.time()
4103 try:
4104 self.serv.accept()
4105 except OSError:
Antoine Pitroub1c54962010-10-14 15:05:38 +00004106 pass
Serhiy Storchaka43767632013-11-03 21:31:38 +02004107 end = time.time()
4108 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
4109
4110 def _testInitNonBlocking(self):
4111 pass
Antoine Pitroub1c54962010-10-14 15:05:38 +00004112
Antoine Pitrou600232b2011-01-05 21:03:42 +00004113 def testInheritFlags(self):
4114 # Issue #7995: when calling accept() on a listening socket with a
4115 # timeout, the resulting socket should not be non-blocking.
4116 self.serv.settimeout(10)
4117 try:
4118 conn, addr = self.serv.accept()
4119 message = conn.recv(len(MSG))
4120 finally:
4121 conn.close()
4122 self.serv.settimeout(None)
4123
4124 def _testInheritFlags(self):
4125 time.sleep(0.1)
4126 self.cli.connect((HOST, self.port))
4127 time.sleep(0.5)
4128 self.cli.send(MSG)
4129
Guido van Rossum24e4af82002-06-12 19:18:08 +00004130 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004131 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00004132 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00004133 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004134 conn, addr = self.serv.accept()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004135 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004136 pass
4137 else:
4138 self.fail("Error trying to do non-blocking accept.")
4139 read, write, err = select.select([self.serv], [], [])
4140 if self.serv in read:
4141 conn, addr = self.serv.accept()
Benjamin Petersond9dbf492015-10-24 20:06:04 -07004142 self.assertIsNone(conn.gettimeout())
Brian Curtin21ebbb72010-11-02 02:07:09 +00004143 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004144 else:
4145 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00004146
Guido van Rossum24e4af82002-06-12 19:18:08 +00004147 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004148 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00004149 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004150
4151 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004152 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00004153 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004154 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004155
4156 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00004157 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00004158 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00004159
4160 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004161 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00004162 conn, addr = self.serv.accept()
4163 conn.setblocking(0)
4164 try:
4165 msg = conn.recv(len(MSG))
Andrew Svetlov0832af62012-12-18 23:10:48 +02004166 except OSError:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004167 pass
4168 else:
4169 self.fail("Error trying to do non-blocking recv.")
4170 read, write, err = select.select([conn], [], [])
4171 if conn in read:
4172 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004173 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00004174 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004175 else:
4176 self.fail("Error during select call to non-blocking socket.")
4177
4178 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004179 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00004180 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004181 self.cli.send(MSG)
4182
Victor Stinner45df8202010-04-28 22:31:17 +00004183@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00004184class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004185 """Unit tests for the object returned by socket.makefile()
4186
Antoine Pitrou834bd812010-10-13 16:17:14 +00004187 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004188 the client connection. You can read from this file to
4189 get output from the server.
4190
Antoine Pitrou834bd812010-10-13 16:17:14 +00004191 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004192 server connection. You can write to this file to send output
4193 to the client.
4194 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00004195
Guido van Rossume9f66142002-08-07 15:46:19 +00004196 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004197 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00004198 errors = 'strict'
4199 newline = None
4200
4201 read_mode = 'rb'
4202 read_msg = MSG
4203 write_mode = 'wb'
4204 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00004205
Guido van Rossum24e4af82002-06-12 19:18:08 +00004206 def __init__(self, methodName='runTest'):
4207 SocketConnectedTest.__init__(self, methodName=methodName)
4208
4209 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004210 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
4211 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00004212 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004213 self.read_file = self.cli_conn.makefile(
4214 self.read_mode, self.bufsize,
4215 encoding = self.encoding,
4216 errors = self.errors,
4217 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004218
4219 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004220 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004221 self.read_file.close()
4222 self.assertTrue(self.read_file.closed)
4223 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004224 SocketConnectedTest.tearDown(self)
4225
4226 def clientSetUp(self):
4227 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004228 self.write_file = self.serv_conn.makefile(
4229 self.write_mode, self.bufsize,
4230 encoding = self.encoding,
4231 errors = self.errors,
4232 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004233
4234 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00004235 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00004236 self.write_file.close()
4237 self.assertTrue(self.write_file.closed)
4238 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00004239 SocketConnectedTest.clientTearDown(self)
4240
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004241 def testReadAfterTimeout(self):
4242 # Issue #7322: A file object must disallow further reads
4243 # after a timeout has occurred.
4244 self.cli_conn.settimeout(1)
4245 self.read_file.read(3)
4246 # First read raises a timeout
4247 self.assertRaises(socket.timeout, self.read_file.read, 1)
4248 # Second read is disallowed
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02004249 with self.assertRaises(OSError) as ctx:
Antoine Pitrou68e5c042011-02-25 23:07:44 +00004250 self.read_file.read(1)
4251 self.assertIn("cannot read from timed out object", str(ctx.exception))
4252
4253 def _testReadAfterTimeout(self):
4254 self.write_file.write(self.write_msg[0:3])
4255 self.write_file.flush()
4256 self.serv_finished.wait()
4257
Guido van Rossum24e4af82002-06-12 19:18:08 +00004258 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004259 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004260 first_seg = self.read_file.read(len(self.read_msg)-3)
4261 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00004262 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00004263 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004264
4265 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004266 self.write_file.write(self.write_msg)
4267 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004268
Guido van Rossum8c943832002-08-08 01:00:28 +00004269 def testFullRead(self):
4270 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004271 msg = self.read_file.read()
4272 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00004273
4274 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004275 self.write_file.write(self.write_msg)
4276 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00004277
Guido van Rossum24e4af82002-06-12 19:18:08 +00004278 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004279 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004280 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004281 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00004282 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00004283 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00004284 break
Guido van Rossum8c943832002-08-08 01:00:28 +00004285 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00004286 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004287
4288 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004289 self.write_file.write(self.write_msg)
4290 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004291
4292 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004293 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00004294 line = self.read_file.readline()
4295 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004296
4297 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004298 self.write_file.write(self.write_msg)
4299 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00004300
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004301 def testCloseAfterMakefile(self):
4302 # The file returned by makefile should keep the socket open.
4303 self.cli_conn.close()
4304 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00004305 msg = self.read_file.read()
4306 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004307
4308 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004309 self.write_file.write(self.write_msg)
4310 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004311
4312 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004313 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004314 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00004315 if isinstance(self.read_msg, str):
4316 msg = msg.decode()
4317 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004318
4319 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004320 self.write_file.write(self.write_msg)
4321 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00004322
Tim Peters116d83c2004-03-28 02:20:45 +00004323 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004324 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004325
4326 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004327 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00004328
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004329 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004330 self.assertEqual(self.read_file.mode, self.read_mode)
4331 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004332
4333 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004334 self.assertEqual(self.write_file.mode, self.write_mode)
4335 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00004336
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004337 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004338 self.read_file.close()
4339 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004340 self.cli_conn.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004341 self.assertRaises(OSError, self.cli_conn.getsockname)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004342
4343 def _testRealClose(self):
4344 pass
4345
4346
Guido van Rossume9f66142002-08-07 15:46:19 +00004347class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
4348
4349 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00004350
Guido van Rossume9f66142002-08-07 15:46:19 +00004351 In this case (and in this case only), it should be possible to
4352 create a file object, read a line from it, create another file
4353 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00004354 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00004355 when reading multiple requests from the same socket."""
4356
4357 bufsize = 0 # Use unbuffered mode
4358
4359 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00004360 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00004361 line = self.read_file.readline() # first line
4362 self.assertEqual(line, b"A. " + self.write_msg) # first line
4363 self.read_file = self.cli_conn.makefile('rb', 0)
4364 line = self.read_file.readline() # second line
4365 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00004366
4367 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004368 self.write_file.write(b"A. " + self.write_msg)
4369 self.write_file.write(b"B. " + self.write_msg)
4370 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00004371
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004372 def testMakefileClose(self):
4373 # The file returned by makefile should keep the socket open...
4374 self.cli_conn.close()
4375 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004376 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004377 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00004378 self.read_file.close()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004379 self.assertRaises(OSError, self.cli_conn.recv, 1024)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004380
4381 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004382 self.write_file.write(self.write_msg)
4383 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004384
4385 def testMakefileCloseSocketDestroy(self):
4386 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004387 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004388 refcount_after = sys.getrefcount(self.cli_conn)
4389 self.assertEqual(refcount_before - 1, refcount_after)
4390
4391 def _testMakefileCloseSocketDestroy(self):
4392 pass
4393
Antoine Pitrou98b46702010-09-18 22:59:00 +00004394 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00004395 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00004396 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
4397
4398 def testSmallReadNonBlocking(self):
4399 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004400 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
4401 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004402 self.evt1.set()
4403 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004404 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02004405 if first_seg is None:
4406 # Data not arrived (can happen under Windows), wait a bit
4407 time.sleep(0.5)
4408 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004409 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004410 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004411 self.assertEqual(n, 3)
4412 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00004413 self.assertEqual(msg, self.read_msg)
4414 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
4415 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004416
4417 def _testSmallReadNonBlocking(self):
4418 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00004419 self.write_file.write(self.write_msg)
4420 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00004421 self.evt2.set()
4422 # Avoid cloding the socket before the server test has finished,
4423 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
4424 self.serv_finished.wait(5.0)
4425
4426 def testWriteNonBlocking(self):
4427 self.cli_finished.wait(5.0)
4428 # The client thread can't skip directly - the SkipTest exception
4429 # would appear as a failure.
4430 if self.serv_skipped:
4431 self.skipTest(self.serv_skipped)
4432
4433 def _testWriteNonBlocking(self):
4434 self.serv_skipped = None
4435 self.serv_conn.setblocking(False)
4436 # Try to saturate the socket buffer pipe with repeated large writes.
Charles-François Natali5fd26422013-08-29 19:01:40 +02004437 BIG = b"x" * support.SOCK_MAX_SIZE
Antoine Pitrou98b46702010-09-18 22:59:00 +00004438 LIMIT = 10
4439 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00004440 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004441 self.assertGreater(n, 0)
4442 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00004443 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00004444 if n is None:
4445 # Succeeded
4446 break
4447 self.assertGreater(n, 0)
4448 else:
4449 # Let us know that this test didn't manage to establish
4450 # the expected conditions. This is not a failure in itself but,
4451 # if it happens repeatedly, the test should be fixed.
4452 self.serv_skipped = "failed to saturate the socket buffer"
4453
Gregory P. Smithde3369f2009-01-12 04:50:11 +00004454
Guido van Rossum8c943832002-08-08 01:00:28 +00004455class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4456
4457 bufsize = 1 # Default-buffered for reading; line-buffered for writing
4458
4459
4460class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
4461
4462 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00004463
Thomas Woutersb2137042007-02-01 18:02:27 +00004464
Antoine Pitrou834bd812010-10-13 16:17:14 +00004465class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
4466 """Tests for socket.makefile() in text mode (rather than binary)"""
4467
4468 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004469 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004470 write_mode = 'wb'
4471 write_msg = MSG
4472 newline = ''
4473
4474
4475class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
4476 """Tests for socket.makefile() in text mode (rather than binary)"""
4477
4478 read_mode = 'rb'
4479 read_msg = MSG
4480 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004481 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004482 newline = ''
4483
4484
4485class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
4486 """Tests for socket.makefile() in text mode (rather than binary)"""
4487
4488 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004489 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004490 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00004491 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00004492 newline = ''
4493
4494
Guido van Rossumd8faa362007-04-27 19:54:29 +00004495class NetworkConnectionTest(object):
4496 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004497
Guido van Rossumd8faa362007-04-27 19:54:29 +00004498 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004499 # We're inherited below by BasicTCPTest2, which also inherits
4500 # BasicTCPTest, which defines self.port referenced below.
4501 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004502 self.serv_conn = self.cli
4503
4504class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
4505 """Tests that NetworkConnection does not break existing TCP functionality.
4506 """
4507
4508class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004509
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004510 class MockSocket(socket.socket):
4511 def connect(self, *args):
4512 raise socket.timeout('timed out')
4513
4514 @contextlib.contextmanager
4515 def mocked_socket_module(self):
4516 """Return a socket which times out on connect"""
4517 old_socket = socket.socket
4518 socket.socket = self.MockSocket
4519 try:
4520 yield
4521 finally:
4522 socket.socket = old_socket
4523
4524 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004525 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004526 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004527 self.addCleanup(cli.close)
Andrew Svetlov0832af62012-12-18 23:10:48 +02004528 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004529 cli.connect((HOST, port))
4530 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
4531
4532 def test_create_connection(self):
4533 # Issue #9792: errors raised by create_connection() should have
4534 # a proper errno attribute.
4535 port = support.find_unused_port()
Andrew Svetlov0832af62012-12-18 23:10:48 +02004536 with self.assertRaises(OSError) as cm:
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004537 socket.create_connection((HOST, port))
Trent Nelson45bb6132012-10-17 06:15:15 -04004538
4539 # Issue #16257: create_connection() calls getaddrinfo() against
4540 # 'localhost'. This may result in an IPV6 addr being returned
4541 # as well as an IPV4 one:
4542 # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
4543 # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
4544 # (26, 2, 0, '', ('::1', 41230, 0, 0))]
4545 #
4546 # create_connection() enumerates through all the addresses returned
4547 # and if it doesn't successfully bind to any of them, it propagates
4548 # the last exception it encountered.
4549 #
4550 # On Solaris, ENETUNREACH is returned in this circumstance instead
4551 # of ECONNREFUSED. So, if that errno exists, add it to our list of
4552 # expected errnos.
4553 expected_errnos = [ errno.ECONNREFUSED, ]
4554 if hasattr(errno, 'ENETUNREACH'):
4555 expected_errnos.append(errno.ENETUNREACH)
4556
4557 self.assertIn(cm.exception.errno, expected_errnos)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00004558
4559 def test_create_connection_timeout(self):
4560 # Issue #9792: create_connection() should not recast timeout errors
4561 # as generic socket errors.
4562 with self.mocked_socket_module():
4563 with self.assertRaises(socket.timeout):
4564 socket.create_connection((HOST, 1234))
4565
Guido van Rossumd8faa362007-04-27 19:54:29 +00004566
Victor Stinner45df8202010-04-28 22:31:17 +00004567@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004568class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
4569
4570 def __init__(self, methodName='runTest'):
4571 SocketTCPTest.__init__(self, methodName=methodName)
4572 ThreadableTest.__init__(self)
4573
4574 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004575 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004576
4577 def clientTearDown(self):
4578 self.cli.close()
4579 self.cli = None
4580 ThreadableTest.clientTearDown(self)
4581
4582 def _justAccept(self):
4583 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004584 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00004585
4586 testFamily = _justAccept
4587 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004588 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004589 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004590 self.assertEqual(self.cli.family, 2)
4591
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004592 testSourceAddress = _justAccept
4593 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00004594 self.cli = socket.create_connection((HOST, self.port), timeout=30,
4595 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004596 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00004597 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00004598 # The port number being used is sufficient to show that the bind()
4599 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00004600
Guido van Rossumd8faa362007-04-27 19:54:29 +00004601 testTimeoutDefault = _justAccept
4602 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00004603 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004604 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004605 socket.setdefaulttimeout(42)
4606 try:
4607 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00004608 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004609 finally:
4610 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00004611 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004612
4613 testTimeoutNone = _justAccept
4614 def _testTimeoutNone(self):
4615 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004616 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004617 socket.setdefaulttimeout(30)
4618 try:
4619 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004620 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00004621 finally:
4622 socket.setdefaulttimeout(None)
4623 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004624
4625 testTimeoutValueNamed = _justAccept
4626 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004627 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004628 self.assertEqual(self.cli.gettimeout(), 30)
4629
4630 testTimeoutValueNonamed = _justAccept
4631 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004632 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00004633 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004634 self.assertEqual(self.cli.gettimeout(), 30)
4635
Victor Stinner45df8202010-04-28 22:31:17 +00004636@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00004637class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
4638
4639 def __init__(self, methodName='runTest'):
4640 SocketTCPTest.__init__(self, methodName=methodName)
4641 ThreadableTest.__init__(self)
4642
4643 def clientSetUp(self):
4644 pass
4645
4646 def clientTearDown(self):
4647 self.cli.close()
4648 self.cli = None
4649 ThreadableTest.clientTearDown(self)
4650
4651 def testInsideTimeout(self):
4652 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004653 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00004654 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004655 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004656 testOutsideTimeout = testInsideTimeout
4657
4658 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004659 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004660 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004661 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00004662
4663 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00004664 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004665 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00004666
4667
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004668class TCPTimeoutTest(SocketTCPTest):
4669
4670 def testTCPTimeout(self):
4671 def raise_timeout(*args, **kwargs):
4672 self.serv.settimeout(1.0)
4673 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004674 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004675 "Error generating a timeout exception (TCP)")
4676
4677 def testTimeoutZero(self):
4678 ok = False
4679 try:
4680 self.serv.settimeout(0.0)
4681 foo = self.serv.accept()
4682 except socket.timeout:
4683 self.fail("caught timeout instead of error (TCP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004684 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004685 ok = True
4686 except:
4687 self.fail("caught unexpected exception (TCP)")
4688 if not ok:
4689 self.fail("accept() returned success when we did not expect it")
4690
Serhiy Storchaka43767632013-11-03 21:31:38 +02004691 @unittest.skipUnless(hasattr(signal, 'alarm'),
4692 'test needs signal.alarm()')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004693 def testInterruptedTimeout(self):
4694 # XXX I don't know how to do this test on MSWindows or any other
4695 # plaform that doesn't support signal.alarm() or os.kill(), though
4696 # the bug should have existed on all platforms.
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004697 self.serv.settimeout(5.0) # must be longer than alarm
4698 class Alarm(Exception):
4699 pass
4700 def alarm_handler(signal, frame):
4701 raise Alarm
4702 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4703 try:
4704 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4705 try:
4706 foo = self.serv.accept()
4707 except socket.timeout:
4708 self.fail("caught timeout instead of Alarm")
4709 except Alarm:
4710 pass
4711 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004712 self.fail("caught other exception instead of Alarm:"
4713 " %s(%s):\n%s" %
4714 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004715 else:
4716 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004717 finally:
4718 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004719 except Alarm:
4720 self.fail("got Alarm in wrong place")
4721 finally:
4722 # no alarm can be pending. Safe to restore old handler.
4723 signal.signal(signal.SIGALRM, old_alarm)
4724
Ezio Melotti7f78ddc2011-11-18 18:33:14 +02004725class UDPTimeoutTest(SocketUDPTest):
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004726
4727 def testUDPTimeout(self):
4728 def raise_timeout(*args, **kwargs):
4729 self.serv.settimeout(1.0)
4730 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004731 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004732 "Error generating a timeout exception (UDP)")
4733
4734 def testTimeoutZero(self):
4735 ok = False
4736 try:
4737 self.serv.settimeout(0.0)
4738 foo = self.serv.recv(1024)
4739 except socket.timeout:
4740 self.fail("caught timeout instead of error (UDP)")
Andrew Svetlov0832af62012-12-18 23:10:48 +02004741 except OSError:
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004742 ok = True
4743 except:
4744 self.fail("caught unexpected exception (UDP)")
4745 if not ok:
4746 self.fail("recv() returned success when we did not expect it")
4747
4748class TestExceptions(unittest.TestCase):
4749
4750 def testExceptionTree(self):
Andrew Svetlov0832af62012-12-18 23:10:48 +02004751 self.assertTrue(issubclass(OSError, Exception))
4752 self.assertTrue(issubclass(socket.herror, OSError))
4753 self.assertTrue(issubclass(socket.gaierror, OSError))
4754 self.assertTrue(issubclass(socket.timeout, OSError))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004755
Yury Selivanovfa22b292016-10-18 16:03:52 -04004756 def test_setblocking_invalidfd(self):
4757 # Regression test for issue #28471
4758
4759 sock0 = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
4760 sock = socket.socket(
4761 socket.AF_INET, socket.SOCK_STREAM, 0, sock0.fileno())
4762 sock0.close()
Martin Panter10f29c92016-10-20 07:44:29 +00004763 self.addCleanup(sock.detach)
Yury Selivanovfa22b292016-10-18 16:03:52 -04004764
4765 with self.assertRaises(OSError):
4766 sock.setblocking(False)
4767
4768
Serhiy Storchaka43767632013-11-03 21:31:38 +02004769@unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004770class TestLinuxAbstractNamespace(unittest.TestCase):
4771
4772 UNIX_PATH_MAX = 108
4773
4774 def testLinuxAbstractNamespace(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004775 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004776 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4777 s1.bind(address)
Charles-François Natali6e204602014-07-23 19:28:13 +01004778 s1.listen()
Victor Stinner1d5eb342011-01-03 14:30:46 +00004779 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4780 s2.connect(s1.getsockname())
4781 with s1.accept()[0] as s3:
4782 self.assertEqual(s1.getsockname(), address)
4783 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004784
4785 def testMaxName(self):
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004786 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004787 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4788 s.bind(address)
4789 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004790
4791 def testNameOverflow(self):
4792 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004793 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
Andrew Svetlov0832af62012-12-18 23:10:48 +02004794 self.assertRaises(OSError, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004795
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004796 def testStrName(self):
4797 # Check that an abstract name can be passed as a string.
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004798 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4799 try:
Charles-François Natalib10c71d2013-05-21 10:45:46 +02004800 s.bind("\x00python\x00test\x00")
4801 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004802 finally:
4803 s.close()
4804
Serhiy Storchaka8490f5a2015-03-20 09:00:36 +02004805 def testBytearrayName(self):
4806 # Check that an abstract name can be passed as a bytearray.
4807 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4808 s.bind(bytearray(b"\x00python\x00test\x00"))
4809 self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
4810
Serhiy Storchaka43767632013-11-03 21:31:38 +02004811@unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004812class TestUnixDomain(unittest.TestCase):
4813
4814 def setUp(self):
4815 self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
4816
4817 def tearDown(self):
4818 self.sock.close()
4819
4820 def encoded(self, path):
4821 # Return the given path encoded in the file system encoding,
4822 # or skip the test if this is not possible.
4823 try:
4824 return os.fsencode(path)
4825 except UnicodeEncodeError:
4826 self.skipTest(
4827 "Pathname {0!a} cannot be represented in file "
4828 "system encoding {1!r}".format(
4829 path, sys.getfilesystemencoding()))
4830
Antoine Pitrou16374872011-12-16 15:04:12 +01004831 def bind(self, sock, path):
4832 # Bind the socket
4833 try:
Xavier de Gayee88ed052016-12-14 11:52:28 +01004834 support.bind_unix_socket(sock, path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004835 except OSError as e:
4836 if str(e) == "AF_UNIX path too long":
4837 self.skipTest(
Serhiy Storchakad65c9492015-11-02 14:10:23 +02004838 "Pathname {0!a} is too long to serve as an AF_UNIX path"
Antoine Pitrou16374872011-12-16 15:04:12 +01004839 .format(path))
4840 else:
4841 raise
4842
Antoine Pitrou495b5022017-05-02 17:20:00 +02004843 def testUnbound(self):
Antoine Pitrou0360a9d2017-05-02 23:48:26 +02004844 # Issue #30205 (note getsockname() can return None on OS X)
4845 self.assertIn(self.sock.getsockname(), ('', None))
Antoine Pitrou495b5022017-05-02 17:20:00 +02004846
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004847 def testStrAddr(self):
4848 # Test binding to and retrieving a normal string pathname.
4849 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004850 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004851 self.addCleanup(support.unlink, path)
4852 self.assertEqual(self.sock.getsockname(), path)
4853
4854 def testBytesAddr(self):
4855 # Test binding to a bytes pathname.
4856 path = os.path.abspath(support.TESTFN)
Antoine Pitrou16374872011-12-16 15:04:12 +01004857 self.bind(self.sock, self.encoded(path))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004858 self.addCleanup(support.unlink, path)
4859 self.assertEqual(self.sock.getsockname(), path)
4860
4861 def testSurrogateescapeBind(self):
4862 # Test binding to a valid non-ASCII pathname, with the
4863 # non-ASCII bytes supplied using surrogateescape encoding.
4864 path = os.path.abspath(support.TESTFN_UNICODE)
4865 b = self.encoded(path)
Antoine Pitrou16374872011-12-16 15:04:12 +01004866 self.bind(self.sock, b.decode("ascii", "surrogateescape"))
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004867 self.addCleanup(support.unlink, path)
4868 self.assertEqual(self.sock.getsockname(), path)
4869
4870 def testUnencodableAddr(self):
4871 # Test binding to a pathname that cannot be encoded in the
4872 # file system encoding.
4873 if support.TESTFN_UNENCODABLE is None:
4874 self.skipTest("No unencodable filename available")
4875 path = os.path.abspath(support.TESTFN_UNENCODABLE)
Antoine Pitrou16374872011-12-16 15:04:12 +01004876 self.bind(self.sock, path)
Antoine Pitrou6ec29e22011-12-16 14:46:36 +01004877 self.addCleanup(support.unlink, path)
4878 self.assertEqual(self.sock.getsockname(), path)
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004879
Victor Stinner45df8202010-04-28 22:31:17 +00004880@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004881class BufferIOTest(SocketConnectedTest):
4882 """
4883 Test the buffer versions of socket.recv() and socket.send().
4884 """
4885 def __init__(self, methodName='runTest'):
4886 SocketConnectedTest.__init__(self, methodName=methodName)
4887
Antoine Pitrou25480782010-03-17 22:50:28 +00004888 def testRecvIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004889 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004890 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004891 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004892 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004893 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004894 self.assertEqual(msg, MSG)
4895
Antoine Pitrou25480782010-03-17 22:50:28 +00004896 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004897 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004898 self.serv_conn.send(buf)
4899
Antoine Pitrou25480782010-03-17 22:50:28 +00004900 def testRecvIntoBytearray(self):
4901 buf = bytearray(1024)
4902 nbytes = self.cli_conn.recv_into(buf)
4903 self.assertEqual(nbytes, len(MSG))
4904 msg = buf[:len(MSG)]
4905 self.assertEqual(msg, MSG)
4906
4907 _testRecvIntoBytearray = _testRecvIntoArray
4908
4909 def testRecvIntoMemoryview(self):
4910 buf = bytearray(1024)
4911 nbytes = self.cli_conn.recv_into(memoryview(buf))
4912 self.assertEqual(nbytes, len(MSG))
4913 msg = buf[:len(MSG)]
4914 self.assertEqual(msg, MSG)
4915
4916 _testRecvIntoMemoryview = _testRecvIntoArray
4917
4918 def testRecvFromIntoArray(self):
Berker Peksag480b0692016-10-02 11:39:41 +03004919 buf = array.array("B", [0] * len(MSG))
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004920 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004921 self.assertEqual(nbytes, len(MSG))
Berker Peksag480b0692016-10-02 11:39:41 +03004922 buf = buf.tobytes()
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004923 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004924 self.assertEqual(msg, MSG)
4925
Antoine Pitrou25480782010-03-17 22:50:28 +00004926 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004927 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004928 self.serv_conn.send(buf)
4929
Antoine Pitrou25480782010-03-17 22:50:28 +00004930 def testRecvFromIntoBytearray(self):
4931 buf = bytearray(1024)
4932 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4933 self.assertEqual(nbytes, len(MSG))
4934 msg = buf[:len(MSG)]
4935 self.assertEqual(msg, MSG)
4936
4937 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4938
4939 def testRecvFromIntoMemoryview(self):
4940 buf = bytearray(1024)
4941 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4942 self.assertEqual(nbytes, len(MSG))
4943 msg = buf[:len(MSG)]
4944 self.assertEqual(msg, MSG)
4945
4946 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4947
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004948 def testRecvFromIntoSmallBuffer(self):
4949 # See issue #20246.
4950 buf = bytearray(8)
4951 self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
4952
4953 def _testRecvFromIntoSmallBuffer(self):
Stefan Krah6b2e5592014-01-21 22:58:40 +01004954 self.serv_conn.send(MSG)
Benjamin Petersonc6b37e22014-01-13 23:14:42 -05004955
Benjamin Petersonbd1d12e2014-01-14 00:27:42 -05004956 def testRecvFromIntoEmptyBuffer(self):
4957 buf = bytearray()
4958 self.cli_conn.recvfrom_into(buf)
4959 self.cli_conn.recvfrom_into(buf, 0)
4960
4961 _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
4962
Christian Heimes043d6f62008-01-07 17:19:16 +00004963
4964TIPC_STYPE = 2000
4965TIPC_LOWER = 200
4966TIPC_UPPER = 210
4967
4968def isTipcAvailable():
4969 """Check if the TIPC module is loaded
4970
4971 The TIPC module is not loaded automatically on Ubuntu and probably
4972 other Linux distros.
4973 """
4974 if not hasattr(socket, "AF_TIPC"):
4975 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004976 try:
4977 f = open("/proc/modules")
Martin Panter8cbd46f2017-01-08 00:46:25 +00004978 except (FileNotFoundError, IsADirectoryError, PermissionError):
Martin Pantere9ae5f92016-12-24 10:41:37 +00004979 # It's ok if the file does not exist, is a directory or if we
Martin Panter8cbd46f2017-01-08 00:46:25 +00004980 # have not the permission to read it.
4981 return False
Martin Pantere9ae5f92016-12-24 10:41:37 +00004982 with f:
Christian Heimes043d6f62008-01-07 17:19:16 +00004983 for line in f:
4984 if line.startswith("tipc "):
4985 return True
Christian Heimes043d6f62008-01-07 17:19:16 +00004986 return False
4987
Serhiy Storchaka43767632013-11-03 21:31:38 +02004988@unittest.skipUnless(isTipcAvailable(),
4989 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004990class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004991 def testRDM(self):
4992 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4993 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004994 self.addCleanup(srv.close)
4995 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004996
4997 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4998 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4999 TIPC_LOWER, TIPC_UPPER)
5000 srv.bind(srvaddr)
5001
5002 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5003 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5004 cli.sendto(MSG, sendaddr)
5005
5006 msg, recvaddr = srv.recvfrom(1024)
5007
5008 self.assertEqual(cli.getsockname(), recvaddr)
5009 self.assertEqual(msg, MSG)
5010
5011
Serhiy Storchaka43767632013-11-03 21:31:38 +02005012@unittest.skipUnless(isTipcAvailable(),
5013 "TIPC module is not loaded, please 'sudo modprobe tipc'")
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005014class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00005015 def __init__(self, methodName = 'runTest'):
5016 unittest.TestCase.__init__(self, methodName = methodName)
5017 ThreadableTest.__init__(self)
5018
5019 def setUp(self):
5020 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005021 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005022 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
5023 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
5024 TIPC_LOWER, TIPC_UPPER)
5025 self.srv.bind(srvaddr)
Charles-François Natali6e204602014-07-23 19:28:13 +01005026 self.srv.listen()
Christian Heimes043d6f62008-01-07 17:19:16 +00005027 self.serverExplicitReady()
5028 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005029 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005030
5031 def clientSetUp(self):
Martin Pantera90a4a92016-05-30 04:04:50 +00005032 # There is a hittable race between serverExplicitReady() and the
Christian Heimes043d6f62008-01-07 17:19:16 +00005033 # accept() call; sleep a little while to avoid it, otherwise
5034 # we could get an exception
5035 time.sleep(0.1)
5036 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02005037 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00005038 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
5039 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
5040 self.cli.connect(addr)
5041 self.cliaddr = self.cli.getsockname()
5042
5043 def testStream(self):
5044 msg = self.conn.recv(1024)
5045 self.assertEqual(msg, MSG)
5046 self.assertEqual(self.cliaddr, self.connaddr)
5047
5048 def _testStream(self):
5049 self.cli.send(MSG)
5050 self.cli.close()
5051
5052
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005053@unittest.skipUnless(thread, 'Threading required for this test.')
5054class ContextManagersTest(ThreadedTCPSocketTest):
5055
5056 def _testSocketClass(self):
5057 # base test
5058 with socket.socket() as sock:
5059 self.assertFalse(sock._closed)
5060 self.assertTrue(sock._closed)
5061 # close inside with block
5062 with socket.socket() as sock:
5063 sock.close()
5064 self.assertTrue(sock._closed)
5065 # exception inside with block
5066 with socket.socket() as sock:
Andrew Svetlov0832af62012-12-18 23:10:48 +02005067 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005068 self.assertTrue(sock._closed)
5069
5070 def testCreateConnectionBase(self):
5071 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005072 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005073 data = conn.recv(1024)
5074 conn.sendall(data)
5075
5076 def _testCreateConnectionBase(self):
5077 address = self.serv.getsockname()
5078 with socket.create_connection(address) as sock:
5079 self.assertFalse(sock._closed)
5080 sock.sendall(b'foo')
5081 self.assertEqual(sock.recv(1024), b'foo')
5082 self.assertTrue(sock._closed)
5083
5084 def testCreateConnectionClose(self):
5085 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00005086 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005087 data = conn.recv(1024)
5088 conn.sendall(data)
5089
5090 def _testCreateConnectionClose(self):
5091 address = self.serv.getsockname()
5092 with socket.create_connection(address) as sock:
5093 sock.close()
5094 self.assertTrue(sock._closed)
Andrew Svetlov0832af62012-12-18 23:10:48 +02005095 self.assertRaises(OSError, sock.sendall, b'foo')
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005096
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00005097
Victor Stinnerdaf45552013-08-28 00:53:59 +02005098class InheritanceTest(unittest.TestCase):
5099 @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
5100 "SOCK_CLOEXEC not defined")
Charles-François Natali239bb962011-06-03 12:55:15 +02005101 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005102 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00005103 with socket.socket(socket.AF_INET,
5104 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
5105 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
Victor Stinnerd39dca92013-08-28 12:28:18 +02005106 self.assertFalse(s.get_inheritable())
Victor Stinnerdaf45552013-08-28 00:53:59 +02005107
5108 def test_default_inheritable(self):
5109 sock = socket.socket()
5110 with sock:
5111 self.assertEqual(sock.get_inheritable(), False)
5112
5113 def test_dup(self):
5114 sock = socket.socket()
5115 with sock:
5116 newsock = sock.dup()
5117 sock.close()
5118 with newsock:
5119 self.assertEqual(newsock.get_inheritable(), False)
5120
5121 def test_set_inheritable(self):
5122 sock = socket.socket()
5123 with sock:
5124 sock.set_inheritable(True)
5125 self.assertEqual(sock.get_inheritable(), True)
5126
5127 sock.set_inheritable(False)
5128 self.assertEqual(sock.get_inheritable(), False)
5129
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005130 @unittest.skipIf(fcntl is None, "need fcntl")
5131 def test_get_inheritable_cloexec(self):
5132 sock = socket.socket()
5133 with sock:
5134 fd = sock.fileno()
5135 self.assertEqual(sock.get_inheritable(), False)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005136
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005137 # clear FD_CLOEXEC flag
5138 flags = fcntl.fcntl(fd, fcntl.F_GETFD)
5139 flags &= ~fcntl.FD_CLOEXEC
5140 fcntl.fcntl(fd, fcntl.F_SETFD, flags)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005141
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005142 self.assertEqual(sock.get_inheritable(), True)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005143
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005144 @unittest.skipIf(fcntl is None, "need fcntl")
5145 def test_set_inheritable_cloexec(self):
5146 sock = socket.socket()
5147 with sock:
5148 fd = sock.fileno()
5149 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5150 fcntl.FD_CLOEXEC)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005151
Victor Stinner4f7a36f2013-09-08 14:14:38 +02005152 sock.set_inheritable(True)
5153 self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
5154 0)
Victor Stinnera3c18d02013-09-08 11:53:09 +02005155
5156
Victor Stinnerdaf45552013-08-28 00:53:59 +02005157 @unittest.skipUnless(hasattr(socket, "socketpair"),
5158 "need socket.socketpair()")
5159 def test_socketpair(self):
5160 s1, s2 = socket.socketpair()
5161 self.addCleanup(s1.close)
5162 self.addCleanup(s2.close)
5163 self.assertEqual(s1.get_inheritable(), False)
5164 self.assertEqual(s2.get_inheritable(), False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005165
5166
5167@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
5168 "SOCK_NONBLOCK not defined")
5169class NonblockConstantTest(unittest.TestCase):
5170 def checkNonblock(self, s, nonblock=True, timeout=0.0):
5171 if nonblock:
5172 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
5173 self.assertEqual(s.gettimeout(), timeout)
5174 else:
5175 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
5176 self.assertEqual(s.gettimeout(), None)
5177
Charles-François Natali239bb962011-06-03 12:55:15 +02005178 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005179 def test_SOCK_NONBLOCK(self):
5180 # a lot of it seems silly and redundant, but I wanted to test that
5181 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00005182 with socket.socket(socket.AF_INET,
5183 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
5184 self.checkNonblock(s)
5185 s.setblocking(1)
5186 self.checkNonblock(s, False)
5187 s.setblocking(0)
5188 self.checkNonblock(s)
5189 s.settimeout(None)
5190 self.checkNonblock(s, False)
5191 s.settimeout(2.0)
5192 self.checkNonblock(s, timeout=2.0)
5193 s.setblocking(1)
5194 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005195 # defaulttimeout
5196 t = socket.getdefaulttimeout()
5197 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005198 with socket.socket() as s:
5199 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005200 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005201 with socket.socket() as s:
5202 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005203 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005204 with socket.socket() as s:
5205 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005206 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00005207 with socket.socket() as s:
5208 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00005209 socket.setdefaulttimeout(t)
5210
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005211
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005212@unittest.skipUnless(os.name == "nt", "Windows specific")
5213@unittest.skipUnless(multiprocessing, "need multiprocessing")
5214class TestSocketSharing(SocketTCPTest):
5215 # This must be classmethod and not staticmethod or multiprocessing
5216 # won't be able to bootstrap it.
5217 @classmethod
5218 def remoteProcessServer(cls, q):
5219 # Recreate socket from shared data
5220 sdata = q.get()
5221 message = q.get()
5222
5223 s = socket.fromshare(sdata)
5224 s2, c = s.accept()
5225
5226 # Send the message
5227 s2.sendall(message)
5228 s2.close()
5229 s.close()
5230
5231 def testShare(self):
5232 # Transfer the listening server socket to another process
5233 # and service it from there.
5234
5235 # Create process:
5236 q = multiprocessing.Queue()
5237 p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
5238 p.start()
5239
5240 # Get the shared socket data
5241 data = self.serv.share(p.pid)
5242
5243 # Pass the shared socket to the other process
5244 addr = self.serv.getsockname()
5245 self.serv.close()
5246 q.put(data)
5247
5248 # The data that the server will send us
5249 message = b"slapmahfro"
5250 q.put(message)
5251
5252 # Connect
5253 s = socket.create_connection(addr)
5254 # listen for the data
5255 m = []
5256 while True:
5257 data = s.recv(100)
5258 if not data:
5259 break
5260 m.append(data)
5261 s.close()
5262 received = b"".join(m)
5263 self.assertEqual(received, message)
5264 p.join()
5265
5266 def testShareLength(self):
5267 data = self.serv.share(os.getpid())
5268 self.assertRaises(ValueError, socket.fromshare, data[:-1])
5269 self.assertRaises(ValueError, socket.fromshare, data+b"foo")
5270
5271 def compareSockets(self, org, other):
5272 # socket sharing is expected to work only for blocking socket
Martin Panter46f50722016-05-26 05:35:26 +00005273 # since the internal python timeout value isn't transferred.
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005274 self.assertEqual(org.gettimeout(), None)
5275 self.assertEqual(org.gettimeout(), other.gettimeout())
5276
5277 self.assertEqual(org.family, other.family)
5278 self.assertEqual(org.type, other.type)
5279 # If the user specified "0" for proto, then
5280 # internally windows will have picked the correct value.
5281 # Python introspection on the socket however will still return
5282 # 0. For the shared socket, the python value is recreated
5283 # from the actual value, so it may not compare correctly.
5284 if org.proto != 0:
5285 self.assertEqual(org.proto, other.proto)
5286
5287 def testShareLocal(self):
5288 data = self.serv.share(os.getpid())
5289 s = socket.fromshare(data)
5290 try:
5291 self.compareSockets(self.serv, s)
5292 finally:
5293 s.close()
5294
5295 def testTypes(self):
5296 families = [socket.AF_INET, socket.AF_INET6]
5297 types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
5298 for f in families:
5299 for t in types:
Kristján Valur Jónsson52a11f12012-04-07 20:38:44 +00005300 try:
5301 source = socket.socket(f, t)
5302 except OSError:
5303 continue # This combination is not supported
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005304 try:
5305 data = source.share(os.getpid())
5306 shared = socket.fromshare(data)
5307 try:
5308 self.compareSockets(source, shared)
5309 finally:
5310 shared.close()
5311 finally:
5312 source.close()
5313
5314
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005315@unittest.skipUnless(thread, 'Threading required for this test.')
5316class SendfileUsingSendTest(ThreadedTCPSocketTest):
5317 """
5318 Test the send() implementation of socket.sendfile().
5319 """
5320
5321 FILESIZE = (10 * 1024 * 1024) # 10MB
5322 BUFSIZE = 8192
5323 FILEDATA = b""
5324 TIMEOUT = 2
5325
5326 @classmethod
5327 def setUpClass(cls):
5328 def chunks(total, step):
5329 assert total >= step
5330 while total > step:
5331 yield step
5332 total -= step
5333 if total:
5334 yield total
5335
5336 chunk = b"".join([random.choice(string.ascii_letters).encode()
5337 for i in range(cls.BUFSIZE)])
5338 with open(support.TESTFN, 'wb') as f:
5339 for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
5340 f.write(chunk)
5341 with open(support.TESTFN, 'rb') as f:
5342 cls.FILEDATA = f.read()
5343 assert len(cls.FILEDATA) == cls.FILESIZE
5344
5345 @classmethod
5346 def tearDownClass(cls):
5347 support.unlink(support.TESTFN)
5348
5349 def accept_conn(self):
5350 self.serv.settimeout(self.TIMEOUT)
5351 conn, addr = self.serv.accept()
5352 conn.settimeout(self.TIMEOUT)
5353 self.addCleanup(conn.close)
5354 return conn
5355
5356 def recv_data(self, conn):
5357 received = []
5358 while True:
5359 chunk = conn.recv(self.BUFSIZE)
5360 if not chunk:
5361 break
5362 received.append(chunk)
5363 return b''.join(received)
5364
5365 def meth_from_sock(self, sock):
5366 # Depending on the mixin class being run return either send()
5367 # or sendfile() method implementation.
5368 return getattr(sock, "_sendfile_use_send")
5369
5370 # regular file
5371
5372 def _testRegularFile(self):
5373 address = self.serv.getsockname()
5374 file = open(support.TESTFN, 'rb')
5375 with socket.create_connection(address) as sock, file as file:
5376 meth = self.meth_from_sock(sock)
5377 sent = meth(file)
5378 self.assertEqual(sent, self.FILESIZE)
5379 self.assertEqual(file.tell(), self.FILESIZE)
5380
5381 def testRegularFile(self):
5382 conn = self.accept_conn()
5383 data = self.recv_data(conn)
5384 self.assertEqual(len(data), self.FILESIZE)
5385 self.assertEqual(data, self.FILEDATA)
5386
5387 # non regular file
5388
5389 def _testNonRegularFile(self):
5390 address = self.serv.getsockname()
5391 file = io.BytesIO(self.FILEDATA)
5392 with socket.create_connection(address) as sock, file as file:
5393 sent = sock.sendfile(file)
5394 self.assertEqual(sent, self.FILESIZE)
5395 self.assertEqual(file.tell(), self.FILESIZE)
5396 self.assertRaises(socket._GiveupOnSendfile,
5397 sock._sendfile_use_sendfile, file)
5398
5399 def testNonRegularFile(self):
5400 conn = self.accept_conn()
5401 data = self.recv_data(conn)
5402 self.assertEqual(len(data), self.FILESIZE)
5403 self.assertEqual(data, self.FILEDATA)
5404
5405 # empty file
5406
5407 def _testEmptyFileSend(self):
5408 address = self.serv.getsockname()
5409 filename = support.TESTFN + "2"
5410 with open(filename, 'wb'):
5411 self.addCleanup(support.unlink, filename)
5412 file = open(filename, 'rb')
5413 with socket.create_connection(address) as sock, file as file:
5414 meth = self.meth_from_sock(sock)
5415 sent = meth(file)
5416 self.assertEqual(sent, 0)
5417 self.assertEqual(file.tell(), 0)
5418
5419 def testEmptyFileSend(self):
5420 conn = self.accept_conn()
5421 data = self.recv_data(conn)
5422 self.assertEqual(data, b"")
5423
5424 # offset
5425
5426 def _testOffset(self):
5427 address = self.serv.getsockname()
5428 file = open(support.TESTFN, 'rb')
5429 with socket.create_connection(address) as sock, file as file:
5430 meth = self.meth_from_sock(sock)
5431 sent = meth(file, offset=5000)
5432 self.assertEqual(sent, self.FILESIZE - 5000)
5433 self.assertEqual(file.tell(), self.FILESIZE)
5434
5435 def testOffset(self):
5436 conn = self.accept_conn()
5437 data = self.recv_data(conn)
5438 self.assertEqual(len(data), self.FILESIZE - 5000)
5439 self.assertEqual(data, self.FILEDATA[5000:])
5440
5441 # count
5442
5443 def _testCount(self):
5444 address = self.serv.getsockname()
5445 file = open(support.TESTFN, 'rb')
5446 with socket.create_connection(address, timeout=2) as sock, file as file:
5447 count = 5000007
5448 meth = self.meth_from_sock(sock)
5449 sent = meth(file, count=count)
5450 self.assertEqual(sent, count)
5451 self.assertEqual(file.tell(), count)
5452
5453 def testCount(self):
5454 count = 5000007
5455 conn = self.accept_conn()
5456 data = self.recv_data(conn)
5457 self.assertEqual(len(data), count)
5458 self.assertEqual(data, self.FILEDATA[:count])
5459
5460 # count small
5461
5462 def _testCountSmall(self):
5463 address = self.serv.getsockname()
5464 file = open(support.TESTFN, 'rb')
5465 with socket.create_connection(address, timeout=2) as sock, file as file:
5466 count = 1
5467 meth = self.meth_from_sock(sock)
5468 sent = meth(file, count=count)
5469 self.assertEqual(sent, count)
5470 self.assertEqual(file.tell(), count)
5471
5472 def testCountSmall(self):
5473 count = 1
5474 conn = self.accept_conn()
5475 data = self.recv_data(conn)
5476 self.assertEqual(len(data), count)
5477 self.assertEqual(data, self.FILEDATA[:count])
5478
5479 # count + offset
5480
5481 def _testCountWithOffset(self):
5482 address = self.serv.getsockname()
5483 file = open(support.TESTFN, 'rb')
5484 with socket.create_connection(address, timeout=2) as sock, file as file:
5485 count = 100007
5486 meth = self.meth_from_sock(sock)
5487 sent = meth(file, offset=2007, count=count)
5488 self.assertEqual(sent, count)
5489 self.assertEqual(file.tell(), count + 2007)
5490
5491 def testCountWithOffset(self):
5492 count = 100007
5493 conn = self.accept_conn()
5494 data = self.recv_data(conn)
5495 self.assertEqual(len(data), count)
5496 self.assertEqual(data, self.FILEDATA[2007:count+2007])
5497
5498 # non blocking sockets are not supposed to work
5499
5500 def _testNonBlocking(self):
5501 address = self.serv.getsockname()
5502 file = open(support.TESTFN, 'rb')
5503 with socket.create_connection(address) as sock, file as file:
5504 sock.setblocking(False)
5505 meth = self.meth_from_sock(sock)
5506 self.assertRaises(ValueError, meth, file)
5507 self.assertRaises(ValueError, sock.sendfile, file)
5508
5509 def testNonBlocking(self):
5510 conn = self.accept_conn()
5511 if conn.recv(8192):
5512 self.fail('was not supposed to receive any data')
5513
5514 # timeout (non-triggered)
5515
5516 def _testWithTimeout(self):
5517 address = self.serv.getsockname()
5518 file = open(support.TESTFN, 'rb')
5519 with socket.create_connection(address, timeout=2) as sock, file as file:
5520 meth = self.meth_from_sock(sock)
5521 sent = meth(file)
5522 self.assertEqual(sent, self.FILESIZE)
5523
5524 def testWithTimeout(self):
5525 conn = self.accept_conn()
5526 data = self.recv_data(conn)
5527 self.assertEqual(len(data), self.FILESIZE)
5528 self.assertEqual(data, self.FILEDATA)
5529
5530 # timeout (triggered)
5531
5532 def _testWithTimeoutTriggeredSend(self):
5533 address = self.serv.getsockname()
5534 file = open(support.TESTFN, 'rb')
5535 with socket.create_connection(address, timeout=0.01) as sock, \
5536 file as file:
5537 meth = self.meth_from_sock(sock)
5538 self.assertRaises(socket.timeout, meth, file)
5539
5540 def testWithTimeoutTriggeredSend(self):
5541 conn = self.accept_conn()
5542 conn.recv(88192)
5543
5544 # errors
5545
5546 def _test_errors(self):
5547 pass
5548
5549 def test_errors(self):
5550 with open(support.TESTFN, 'rb') as file:
5551 with socket.socket(type=socket.SOCK_DGRAM) as s:
5552 meth = self.meth_from_sock(s)
5553 self.assertRaisesRegex(
5554 ValueError, "SOCK_STREAM", meth, file)
5555 with open(support.TESTFN, 'rt') as file:
5556 with socket.socket() as s:
5557 meth = self.meth_from_sock(s)
5558 self.assertRaisesRegex(
5559 ValueError, "binary mode", meth, file)
5560 with open(support.TESTFN, 'rb') as file:
5561 with socket.socket() as s:
5562 meth = self.meth_from_sock(s)
5563 self.assertRaisesRegex(TypeError, "positive integer",
5564 meth, file, count='2')
5565 self.assertRaisesRegex(TypeError, "positive integer",
5566 meth, file, count=0.1)
5567 self.assertRaisesRegex(ValueError, "positive integer",
5568 meth, file, count=0)
5569 self.assertRaisesRegex(ValueError, "positive integer",
5570 meth, file, count=-1)
5571
5572
5573@unittest.skipUnless(thread, 'Threading required for this test.')
5574@unittest.skipUnless(hasattr(os, "sendfile"),
5575 'os.sendfile() required for this test.')
5576class SendfileUsingSendfileTest(SendfileUsingSendTest):
5577 """
5578 Test the sendfile() implementation of socket.sendfile().
5579 """
5580 def meth_from_sock(self, sock):
5581 return getattr(sock, "_sendfile_use_sendfile")
5582
Christian Heimes48371412016-09-06 00:37:46 +02005583
5584@unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
Christian Heimesdffa3942016-09-05 23:54:41 +02005585class LinuxKernelCryptoAPI(unittest.TestCase):
5586 # tests for AF_ALG
5587 def create_alg(self, typ, name):
5588 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes407380f2016-09-06 11:14:09 +02005589 try:
5590 sock.bind((typ, name))
5591 except FileNotFoundError as e:
5592 # type / algorithm is not available
Christian Heimes02b30352016-09-11 19:49:56 +02005593 sock.close()
Christian Heimes407380f2016-09-06 11:14:09 +02005594 raise unittest.SkipTest(str(e), typ, name)
Christian Heimes49aed7b2016-09-11 20:03:46 +02005595 else:
Christian Heimes02b30352016-09-11 19:49:56 +02005596 return sock
Christian Heimesdffa3942016-09-05 23:54:41 +02005597
5598 def test_sha256(self):
5599 expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
5600 "177a9cb410ff61f20015ad")
5601 with self.create_alg('hash', 'sha256') as algo:
5602 op, _ = algo.accept()
5603 with op:
5604 op.sendall(b"abc")
5605 self.assertEqual(op.recv(512), expected)
5606
5607 op, _ = algo.accept()
5608 with op:
5609 op.send(b'a', socket.MSG_MORE)
5610 op.send(b'b', socket.MSG_MORE)
5611 op.send(b'c', socket.MSG_MORE)
5612 op.send(b'')
5613 self.assertEqual(op.recv(512), expected)
5614
5615 def test_hmac_sha1(self):
5616 expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
5617 with self.create_alg('hash', 'hmac(sha1)') as algo:
5618 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
5619 op, _ = algo.accept()
5620 with op:
5621 op.sendall(b"what do ya want for nothing?")
5622 self.assertEqual(op.recv(512), expected)
5623
Christian Heimese084f842016-09-11 20:11:30 +02005624 # Although it should work with 3.19 and newer the test blocks on
5625 # Ubuntu 15.10 with Kernel 4.2.0-19.
5626 @support.requires_linux_version(4, 3)
Christian Heimesdffa3942016-09-05 23:54:41 +02005627 def test_aes_cbc(self):
5628 key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
5629 iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
5630 msg = b"Single block msg"
5631 ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
5632 msglen = len(msg)
5633 with self.create_alg('skcipher', 'cbc(aes)') as algo:
5634 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5635 op, _ = algo.accept()
5636 with op:
5637 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5638 flags=socket.MSG_MORE)
5639 op.sendall(msg)
5640 self.assertEqual(op.recv(msglen), ciphertext)
5641
5642 op, _ = algo.accept()
5643 with op:
5644 op.sendmsg_afalg([ciphertext],
5645 op=socket.ALG_OP_DECRYPT, iv=iv)
5646 self.assertEqual(op.recv(msglen), msg)
5647
5648 # long message
5649 multiplier = 1024
5650 longmsg = [msg] * multiplier
5651 op, _ = algo.accept()
5652 with op:
5653 op.sendmsg_afalg(longmsg,
5654 op=socket.ALG_OP_ENCRYPT, iv=iv)
5655 enc = op.recv(msglen * multiplier)
5656 self.assertEqual(len(enc), msglen * multiplier)
5657 self.assertTrue(enc[:msglen], ciphertext)
5658
5659 op, _ = algo.accept()
5660 with op:
5661 op.sendmsg_afalg([enc],
5662 op=socket.ALG_OP_DECRYPT, iv=iv)
5663 dec = op.recv(msglen * multiplier)
5664 self.assertEqual(len(dec), msglen * multiplier)
5665 self.assertEqual(dec, msg * multiplier)
5666
matejcik9764c152017-02-16 14:41:31 +01005667 @support.requires_linux_version(4, 9) # see issue29324
Christian Heimesdffa3942016-09-05 23:54:41 +02005668 def test_aead_aes_gcm(self):
5669 key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
5670 iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
5671 plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
5672 assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
5673 expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
5674 expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
5675
5676 taglen = len(expected_tag)
5677 assoclen = len(assoc)
5678
5679 with self.create_alg('aead', 'gcm(aes)') as algo:
5680 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
5681 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
5682 None, taglen)
5683
5684 # send assoc, plain and tag buffer in separate steps
5685 op, _ = algo.accept()
5686 with op:
5687 op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
5688 assoclen=assoclen, flags=socket.MSG_MORE)
5689 op.sendall(assoc, socket.MSG_MORE)
matejcik9764c152017-02-16 14:41:31 +01005690 op.sendall(plain)
Christian Heimesdffa3942016-09-05 23:54:41 +02005691 res = op.recv(assoclen + len(plain) + taglen)
5692 self.assertEqual(expected_ct, res[assoclen:-taglen])
5693 self.assertEqual(expected_tag, res[-taglen:])
5694
5695 # now with msg
5696 op, _ = algo.accept()
5697 with op:
matejcik9764c152017-02-16 14:41:31 +01005698 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005699 op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
5700 assoclen=assoclen)
5701 res = op.recv(assoclen + len(plain) + taglen)
5702 self.assertEqual(expected_ct, res[assoclen:-taglen])
5703 self.assertEqual(expected_tag, res[-taglen:])
5704
5705 # create anc data manually
5706 pack_uint32 = struct.Struct('I').pack
5707 op, _ = algo.accept()
5708 with op:
matejcik9764c152017-02-16 14:41:31 +01005709 msg = assoc + plain
Christian Heimesdffa3942016-09-05 23:54:41 +02005710 op.sendmsg(
5711 [msg],
5712 ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
5713 [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
5714 [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
5715 )
5716 )
matejcik9764c152017-02-16 14:41:31 +01005717 res = op.recv(len(msg) + taglen)
Christian Heimesdffa3942016-09-05 23:54:41 +02005718 self.assertEqual(expected_ct, res[assoclen:-taglen])
5719 self.assertEqual(expected_tag, res[-taglen:])
5720
5721 # decrypt and verify
5722 op, _ = algo.accept()
5723 with op:
5724 msg = assoc + expected_ct + expected_tag
5725 op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
5726 assoclen=assoclen)
matejcik9764c152017-02-16 14:41:31 +01005727 res = op.recv(len(msg) - taglen)
5728 self.assertEqual(plain, res[assoclen:])
Christian Heimesdffa3942016-09-05 23:54:41 +02005729
Christian Heimese084f842016-09-11 20:11:30 +02005730 @support.requires_linux_version(4, 3) # see test_aes_cbc
Christian Heimesdffa3942016-09-05 23:54:41 +02005731 def test_drbg_pr_sha256(self):
5732 # deterministic random bit generator, prediction resistance, sha256
5733 with self.create_alg('rng', 'drbg_pr_sha256') as algo:
5734 extra_seed = os.urandom(32)
5735 algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
5736 op, _ = algo.accept()
5737 with op:
5738 rn = op.recv(32)
5739 self.assertEqual(len(rn), 32)
5740
5741 def test_sendmsg_afalg_args(self):
5742 sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
Christian Heimes02b30352016-09-11 19:49:56 +02005743 with sock:
5744 with self.assertRaises(TypeError):
5745 sock.sendmsg_afalg()
Christian Heimesdffa3942016-09-05 23:54:41 +02005746
Christian Heimes02b30352016-09-11 19:49:56 +02005747 with self.assertRaises(TypeError):
5748 sock.sendmsg_afalg(op=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005749
Christian Heimes02b30352016-09-11 19:49:56 +02005750 with self.assertRaises(TypeError):
5751 sock.sendmsg_afalg(1)
Christian Heimesdffa3942016-09-05 23:54:41 +02005752
Christian Heimes02b30352016-09-11 19:49:56 +02005753 with self.assertRaises(TypeError):
5754 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
Christian Heimesdffa3942016-09-05 23:54:41 +02005755
Christian Heimes02b30352016-09-11 19:49:56 +02005756 with self.assertRaises(TypeError):
5757 sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
5758
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005759
Guido van Rossumb995eb72002-07-31 16:08:40 +00005760def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005761 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00005762 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00005763
5764 tests.extend([
5765 NonBlockingTCPTests,
5766 FileObjectClassTestCase,
5767 UnbufferedFileObjectClassTestCase,
5768 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00005769 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00005770 UnicodeReadFileObjectClassTestCase,
5771 UnicodeWriteFileObjectClassTestCase,
5772 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00005773 NetworkConnectionNoServer,
5774 NetworkConnectionAttributesTest,
5775 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00005776 ContextManagersTest,
Victor Stinnerdaf45552013-08-28 00:53:59 +02005777 InheritanceTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00005778 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00005779 ])
Serhiy Storchaka43767632013-11-03 21:31:38 +02005780 tests.append(BasicSocketPairTest)
5781 tests.append(TestUnixDomain)
5782 tests.append(TestLinuxAbstractNamespace)
5783 tests.extend([TIPCTest, TIPCThreadableTest])
Charles-François Natali47413c12011-10-06 19:47:44 +02005784 tests.extend([BasicCANTest, CANTest])
Charles-François Natali10b8cf42011-11-10 19:21:37 +01005785 tests.extend([BasicRDSTest, RDSTest])
Christian Heimesdffa3942016-09-05 23:54:41 +02005786 tests.append(LinuxKernelCryptoAPI)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005787 tests.extend([
caaveryeffc12f2017-09-06 18:18:10 -04005788 BasicVSOCKTest,
5789 ThreadedVSOCKSocketStreamTest,
5790 ])
5791 tests.extend([
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005792 CmsgMacroTests,
5793 SendmsgUDPTest,
5794 RecvmsgUDPTest,
5795 RecvmsgIntoUDPTest,
5796 SendmsgUDP6Test,
5797 RecvmsgUDP6Test,
5798 RecvmsgRFC3542AncillaryUDP6Test,
5799 RecvmsgIntoRFC3542AncillaryUDP6Test,
5800 RecvmsgIntoUDP6Test,
5801 SendmsgTCPTest,
5802 RecvmsgTCPTest,
5803 RecvmsgIntoTCPTest,
5804 SendmsgSCTPStreamTest,
5805 RecvmsgSCTPStreamTest,
5806 RecvmsgIntoSCTPStreamTest,
5807 SendmsgUnixStreamTest,
5808 RecvmsgUnixStreamTest,
5809 RecvmsgIntoUnixStreamTest,
5810 RecvmsgSCMRightsStreamTest,
5811 RecvmsgIntoSCMRightsStreamTest,
5812 # These are slow when setitimer() is not available
5813 InterruptedRecvTimeoutTest,
5814 InterruptedSendTimeoutTest,
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +00005815 TestSocketSharing,
Giampaolo Rodola'915d1412014-06-11 03:54:30 +02005816 SendfileUsingSendTest,
5817 SendfileUsingSendfileTest,
Nick Coghlan96fe56a2011-08-22 11:55:57 +10005818 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00005819
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005820 thread_info = support.threading_setup()
5821 support.run_unittest(*tests)
5822 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00005823
5824if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00005825 test_main()