blob: 1558570b32c1fb91ae22a739522d810557a8cdc1 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Barry Warsawcf3d4b51997-01-03 20:03:32 +00002
Guido van Rossum24e4af82002-06-12 19:18:08 +00003import unittest
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004from test import support
Barry Warsawcf3d4b51997-01-03 20:03:32 +00005
Christian Heimes5e696852008-04-09 08:37:03 +00006import errno
Gregory P. Smithaafdca82010-01-04 04:50:36 +00007import io
Barry Warsawcf3d4b51997-01-03 20:03:32 +00008import socket
Guido van Rossum24e4af82002-06-12 19:18:08 +00009import select
Nick Coghlan96fe56a2011-08-22 11:55:57 +100010import tempfile
11import _testcapi
Christian Heimesbbe741d2008-03-28 10:53:29 +000012import time
13import traceback
Alexandre Vassalottif260e442008-05-11 19:59:59 +000014import queue
Jack Jansen522e7692002-09-06 21:57:50 +000015import sys
Christian Heimesfaf2f632008-01-06 16:59:19 +000016import os
17import array
Antoine Pitrouacd0fda2010-10-23 17:01:44 +000018import platform
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +000019import contextlib
Raymond Hettinger027bb632004-05-31 03:09:25 +000020from weakref import proxy
Thomas Wouters0e3f5912006-08-11 14:57:12 +000021import signal
Antoine Pitrou6d7df632010-09-27 17:52:25 +000022import math
Antoine Pitrou6d58d642011-03-20 23:56:36 +010023import pickle
Charles-François Natali47413c12011-10-06 19:47:44 +020024import struct
Antoine Pitroub1c54962010-10-14 15:05:38 +000025try:
26 import fcntl
27except ImportError:
28 fcntl = False
Barry Warsawcf3d4b51997-01-03 20:03:32 +000029
Benjamin Petersonee8712c2008-05-20 21:35:26 +000030HOST = support.HOST
Marc-André Lemburg8f36af72011-02-25 15:42:01 +000031MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
Barry Warsawcf3d4b51997-01-03 20:03:32 +000032
Victor Stinner45df8202010-04-28 22:31:17 +000033try:
34 import _thread as thread
35 import threading
36except ImportError:
37 thread = None
38 threading = None
39
Charles-François Natali47413c12011-10-06 19:47:44 +020040def _have_socket_can():
41 """Check whether CAN sockets are supported on this host."""
42 try:
43 s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
44 except (AttributeError, socket.error, OSError):
45 return False
46 else:
47 s.close()
48 return True
49
50HAVE_SOCKET_CAN = _have_socket_can()
51
Nick Coghlan96fe56a2011-08-22 11:55:57 +100052# Size in bytes of the int type
53SIZEOF_INT = array.array("i").itemsize
54
Guido van Rossum24e4af82002-06-12 19:18:08 +000055class SocketTCPTest(unittest.TestCase):
Barry Warsawcf3d4b51997-01-03 20:03:32 +000056
Guido van Rossum24e4af82002-06-12 19:18:08 +000057 def setUp(self):
58 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000059 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000060 self.serv.listen(1)
Barry Warsawcf3d4b51997-01-03 20:03:32 +000061
Guido van Rossum24e4af82002-06-12 19:18:08 +000062 def tearDown(self):
63 self.serv.close()
64 self.serv = None
Barry Warsawcf3d4b51997-01-03 20:03:32 +000065
Guido van Rossum24e4af82002-06-12 19:18:08 +000066class SocketUDPTest(unittest.TestCase):
67
68 def setUp(self):
69 self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Benjamin Petersonee8712c2008-05-20 21:35:26 +000070 self.port = support.bind_port(self.serv)
Guido van Rossum24e4af82002-06-12 19:18:08 +000071
72 def tearDown(self):
73 self.serv.close()
74 self.serv = None
75
Nick Coghlan96fe56a2011-08-22 11:55:57 +100076class ThreadSafeCleanupTestCase(unittest.TestCase):
77 """Subclass of unittest.TestCase with thread-safe cleanup methods.
78
79 This subclass protects the addCleanup() and doCleanups() methods
80 with a recursive lock.
81 """
82
83 if threading:
84 def __init__(self, *args, **kwargs):
85 super().__init__(*args, **kwargs)
86 self._cleanup_lock = threading.RLock()
87
88 def addCleanup(self, *args, **kwargs):
89 with self._cleanup_lock:
90 return super().addCleanup(*args, **kwargs)
91
92 def doCleanups(self, *args, **kwargs):
93 with self._cleanup_lock:
94 return super().doCleanups(*args, **kwargs)
95
Charles-François Natali47413c12011-10-06 19:47:44 +020096class SocketCANTest(unittest.TestCase):
97
98 """To be able to run this test, a `vcan0` CAN interface can be created with
99 the following commands:
100 # modprobe vcan
101 # ip link add dev vcan0 type vcan
102 # ifconfig vcan0 up
103 """
104 interface = 'vcan0'
105 bufsize = 128
106
107 def setUp(self):
108 self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
109 try:
110 self.s.bind((self.interface,))
111 except socket.error:
112 self.skipTest('network interface `%s` does not exist' %
113 self.interface)
114 self.s.close()
115
116 def tearDown(self):
117 self.s.close()
118 self.s = None
119
Guido van Rossum24e4af82002-06-12 19:18:08 +0000120class ThreadableTest:
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000121 """Threadable Test class
122
123 The ThreadableTest class makes it easy to create a threaded
124 client/server pair from an existing unit test. To create a
125 new threaded class from an existing unit test, use multiple
126 inheritance:
127
128 class NewClass (OldClass, ThreadableTest):
129 pass
130
131 This class defines two new fixture functions with obvious
132 purposes for overriding:
133
134 clientSetUp ()
135 clientTearDown ()
136
137 Any new test functions within the class must then define
138 tests in pairs, where the test name is preceeded with a
139 '_' to indicate the client portion of the test. Ex:
140
141 def testFoo(self):
142 # Server portion
143
144 def _testFoo(self):
145 # Client portion
146
147 Any exceptions raised by the clients during their tests
148 are caught and transferred to the main thread to alert
149 the testing framework.
150
151 Note, the server setup function cannot call any blocking
152 functions that rely on the client thread during setup,
Guido van Rossumd8faa362007-04-27 19:54:29 +0000153 unless serverExplicitReady() is called just before
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000154 the blocking call (such as in setting up a client/server
155 connection and performing the accept() in setUp().
156 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000157
158 def __init__(self):
159 # Swap the true setup function
160 self.__setUp = self.setUp
161 self.__tearDown = self.tearDown
162 self.setUp = self._setUp
163 self.tearDown = self._tearDown
164
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000165 def serverExplicitReady(self):
166 """This method allows the server to explicitly indicate that
167 it wants the client thread to proceed. This is useful if the
168 server is about to execute a blocking routine that is
169 dependent upon the client thread during its setup routine."""
170 self.server_ready.set()
171
Guido van Rossum24e4af82002-06-12 19:18:08 +0000172 def _setUp(self):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000173 self.server_ready = threading.Event()
174 self.client_ready = threading.Event()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000175 self.done = threading.Event()
Alexandre Vassalottif260e442008-05-11 19:59:59 +0000176 self.queue = queue.Queue(1)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000177
178 # Do some munging to start the client test.
Guido van Rossum11ba0942002-06-13 15:07:44 +0000179 methodname = self.id()
180 i = methodname.rfind('.')
181 methodname = methodname[i+1:]
182 test_method = getattr(self, '_' + methodname)
Guido van Rossumab659962002-06-12 21:29:43 +0000183 self.client_thread = thread.start_new_thread(
184 self.clientRun, (test_method,))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000185
186 self.__setUp()
Benjamin Peterson672b8032008-06-11 19:14:14 +0000187 if not self.server_ready.is_set():
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000188 self.server_ready.set()
189 self.client_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000190
191 def _tearDown(self):
192 self.__tearDown()
193 self.done.wait()
194
Raymond Hettingerda3caed2008-01-14 21:39:24 +0000195 if self.queue.qsize():
Antoine Pitrou98b46702010-09-18 22:59:00 +0000196 exc = self.queue.get()
197 raise exc
Guido van Rossum24e4af82002-06-12 19:18:08 +0000198
199 def clientRun(self, test_func):
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000200 self.server_ready.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000201 self.clientSetUp()
Charles-François Natalia49ed762011-09-21 22:03:58 +0200202 self.client_ready.set()
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000203 if not hasattr(test_func, '__call__'):
Collin Winter3add4d72007-08-29 23:37:32 +0000204 raise TypeError("test_func must be a callable function")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000205 try:
206 test_func()
Nick Coghlan2496f332011-09-19 20:26:31 +1000207 except unittest._ExpectedFailure:
208 # We deliberately ignore expected failures
209 pass
Antoine Pitrou98b46702010-09-18 22:59:00 +0000210 except BaseException as e:
211 self.queue.put(e)
212 finally:
213 self.clientTearDown()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000214
215 def clientSetUp(self):
Collin Winter3add4d72007-08-29 23:37:32 +0000216 raise NotImplementedError("clientSetUp must be implemented.")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000217
218 def clientTearDown(self):
219 self.done.set()
220 thread.exit()
221
222class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
223
224 def __init__(self, methodName='runTest'):
225 SocketTCPTest.__init__(self, methodName=methodName)
226 ThreadableTest.__init__(self)
227
228 def clientSetUp(self):
229 self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
230
231 def clientTearDown(self):
232 self.cli.close()
233 self.cli = None
234 ThreadableTest.clientTearDown(self)
235
236class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
237
238 def __init__(self, methodName='runTest'):
239 SocketUDPTest.__init__(self, methodName=methodName)
240 ThreadableTest.__init__(self)
241
242 def clientSetUp(self):
243 self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
244
Brian Curtin3beb38f2010-11-04 03:41:43 +0000245 def clientTearDown(self):
246 self.cli.close()
247 self.cli = None
248 ThreadableTest.clientTearDown(self)
249
Charles-François Natali47413c12011-10-06 19:47:44 +0200250class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
251
252 def __init__(self, methodName='runTest'):
253 SocketCANTest.__init__(self, methodName=methodName)
254 ThreadableTest.__init__(self)
255
256 def clientSetUp(self):
257 self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
258 try:
259 self.cli.bind((self.interface,))
260 except socket.error:
261 self.skipTest('network interface `%s` does not exist' %
262 self.interface)
263 self.cli.close()
264
265 def clientTearDown(self):
266 self.cli.close()
267 self.cli = None
268 ThreadableTest.clientTearDown(self)
269
Guido van Rossum24e4af82002-06-12 19:18:08 +0000270class SocketConnectedTest(ThreadedTCPSocketTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000271 """Socket tests for client-server connection.
272
273 self.cli_conn is a client socket connected to the server. The
274 setUp() method guarantees that it is connected to the server.
275 """
Guido van Rossum24e4af82002-06-12 19:18:08 +0000276
277 def __init__(self, methodName='runTest'):
278 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
279
280 def setUp(self):
281 ThreadedTCPSocketTest.setUp(self)
Guido van Rossum83ccb4e2002-06-18 18:35:13 +0000282 # Indicate explicitly we're ready for the client thread to
283 # proceed and then perform the blocking call to accept
284 self.serverExplicitReady()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000285 conn, addr = self.serv.accept()
286 self.cli_conn = conn
287
288 def tearDown(self):
289 self.cli_conn.close()
290 self.cli_conn = None
291 ThreadedTCPSocketTest.tearDown(self)
292
293 def clientSetUp(self):
294 ThreadedTCPSocketTest.clientSetUp(self)
Christian Heimes5e696852008-04-09 08:37:03 +0000295 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000296 self.serv_conn = self.cli
297
298 def clientTearDown(self):
299 self.serv_conn.close()
300 self.serv_conn = None
301 ThreadedTCPSocketTest.clientTearDown(self)
302
Dave Cole331708b2004-08-09 04:51:41 +0000303class SocketPairTest(unittest.TestCase, ThreadableTest):
304
305 def __init__(self, methodName='runTest'):
306 unittest.TestCase.__init__(self, methodName=methodName)
307 ThreadableTest.__init__(self)
308
309 def setUp(self):
310 self.serv, self.cli = socket.socketpair()
311
312 def tearDown(self):
313 self.serv.close()
314 self.serv = None
315
316 def clientSetUp(self):
317 pass
318
319 def clientTearDown(self):
320 self.cli.close()
321 self.cli = None
322 ThreadableTest.clientTearDown(self)
323
Tim Peters494aaee2004-08-09 18:54:11 +0000324
Nick Coghlan96fe56a2011-08-22 11:55:57 +1000325# The following classes are used by the sendmsg()/recvmsg() tests.
326# Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
327# gives a drop-in replacement for SocketConnectedTest, but different
328# address families can be used, and the attributes serv_addr and
329# cli_addr will be set to the addresses of the endpoints.
330
331class SocketTestBase(unittest.TestCase):
332 """A base class for socket tests.
333
334 Subclasses must provide methods newSocket() to return a new socket
335 and bindSock(sock) to bind it to an unused address.
336
337 Creates a socket self.serv and sets self.serv_addr to its address.
338 """
339
340 def setUp(self):
341 self.serv = self.newSocket()
342 self.bindServer()
343
344 def bindServer(self):
345 """Bind server socket and set self.serv_addr to its address."""
346 self.bindSock(self.serv)
347 self.serv_addr = self.serv.getsockname()
348
349 def tearDown(self):
350 self.serv.close()
351 self.serv = None
352
353
354class SocketListeningTestMixin(SocketTestBase):
355 """Mixin to listen on the server socket."""
356
357 def setUp(self):
358 super().setUp()
359 self.serv.listen(1)
360
361
362class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
363 ThreadableTest):
364 """Mixin to add client socket and allow client/server tests.
365
366 Client socket is self.cli and its address is self.cli_addr. See
367 ThreadableTest for usage information.
368 """
369
370 def __init__(self, *args, **kwargs):
371 super().__init__(*args, **kwargs)
372 ThreadableTest.__init__(self)
373
374 def clientSetUp(self):
375 self.cli = self.newClientSocket()
376 self.bindClient()
377
378 def newClientSocket(self):
379 """Return a new socket for use as client."""
380 return self.newSocket()
381
382 def bindClient(self):
383 """Bind client socket and set self.cli_addr to its address."""
384 self.bindSock(self.cli)
385 self.cli_addr = self.cli.getsockname()
386
387 def clientTearDown(self):
388 self.cli.close()
389 self.cli = None
390 ThreadableTest.clientTearDown(self)
391
392
393class ConnectedStreamTestMixin(SocketListeningTestMixin,
394 ThreadedSocketTestMixin):
395 """Mixin to allow client/server stream tests with connected client.
396
397 Server's socket representing connection to client is self.cli_conn
398 and client's connection to server is self.serv_conn. (Based on
399 SocketConnectedTest.)
400 """
401
402 def setUp(self):
403 super().setUp()
404 # Indicate explicitly we're ready for the client thread to
405 # proceed and then perform the blocking call to accept
406 self.serverExplicitReady()
407 conn, addr = self.serv.accept()
408 self.cli_conn = conn
409
410 def tearDown(self):
411 self.cli_conn.close()
412 self.cli_conn = None
413 super().tearDown()
414
415 def clientSetUp(self):
416 super().clientSetUp()
417 self.cli.connect(self.serv_addr)
418 self.serv_conn = self.cli
419
420 def clientTearDown(self):
421 self.serv_conn.close()
422 self.serv_conn = None
423 super().clientTearDown()
424
425
426class UnixSocketTestBase(SocketTestBase):
427 """Base class for Unix-domain socket tests."""
428
429 # This class is used for file descriptor passing tests, so we
430 # create the sockets in a private directory so that other users
431 # can't send anything that might be problematic for a privileged
432 # user running the tests.
433
434 def setUp(self):
435 self.dir_path = tempfile.mkdtemp()
436 self.addCleanup(os.rmdir, self.dir_path)
437 super().setUp()
438
439 def bindSock(self, sock):
440 path = tempfile.mktemp(dir=self.dir_path)
441 sock.bind(path)
442 self.addCleanup(support.unlink, path)
443
444class UnixStreamBase(UnixSocketTestBase):
445 """Base class for Unix-domain SOCK_STREAM tests."""
446
447 def newSocket(self):
448 return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
449
450
451class InetTestBase(SocketTestBase):
452 """Base class for IPv4 socket tests."""
453
454 host = HOST
455
456 def setUp(self):
457 super().setUp()
458 self.port = self.serv_addr[1]
459
460 def bindSock(self, sock):
461 support.bind_port(sock, host=self.host)
462
463class TCPTestBase(InetTestBase):
464 """Base class for TCP-over-IPv4 tests."""
465
466 def newSocket(self):
467 return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
468
469class UDPTestBase(InetTestBase):
470 """Base class for UDP-over-IPv4 tests."""
471
472 def newSocket(self):
473 return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
474
475class SCTPStreamBase(InetTestBase):
476 """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
477
478 def newSocket(self):
479 return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
480 socket.IPPROTO_SCTP)
481
482
483class Inet6TestBase(InetTestBase):
484 """Base class for IPv6 socket tests."""
485
486 # Don't use "localhost" here - it may not have an IPv6 address
487 # assigned to it by default (e.g. in /etc/hosts), and if someone
488 # has assigned it an IPv4-mapped address, then it's unlikely to
489 # work with the full IPv6 API.
490 host = "::1"
491
492class UDP6TestBase(Inet6TestBase):
493 """Base class for UDP-over-IPv6 tests."""
494
495 def newSocket(self):
496 return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
497
498
499# Test-skipping decorators for use with ThreadableTest.
500
501def skipWithClientIf(condition, reason):
502 """Skip decorated test if condition is true, add client_skip decorator.
503
504 If the decorated object is not a class, sets its attribute
505 "client_skip" to a decorator which will return an empty function
506 if the test is to be skipped, or the original function if it is
507 not. This can be used to avoid running the client part of a
508 skipped test when using ThreadableTest.
509 """
510 def client_pass(*args, **kwargs):
511 pass
512 def skipdec(obj):
513 retval = unittest.skip(reason)(obj)
514 if not isinstance(obj, type):
515 retval.client_skip = lambda f: client_pass
516 return retval
517 def noskipdec(obj):
518 if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
519 obj.client_skip = lambda f: f
520 return obj
521 return skipdec if condition else noskipdec
522
523
524def requireAttrs(obj, *attributes):
525 """Skip decorated test if obj is missing any of the given attributes.
526
527 Sets client_skip attribute as skipWithClientIf() does.
528 """
529 missing = [name for name in attributes if not hasattr(obj, name)]
530 return skipWithClientIf(
531 missing, "don't have " + ", ".join(name for name in missing))
532
533
534def requireSocket(*args):
535 """Skip decorated test if a socket cannot be created with given arguments.
536
537 When an argument is given as a string, will use the value of that
538 attribute of the socket module, or skip the test if it doesn't
539 exist. Sets client_skip attribute as skipWithClientIf() does.
540 """
541 err = None
542 missing = [obj for obj in args if
543 isinstance(obj, str) and not hasattr(socket, obj)]
544 if missing:
545 err = "don't have " + ", ".join(name for name in missing)
546 else:
547 callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
548 for obj in args]
549 try:
550 s = socket.socket(*callargs)
551 except socket.error as e:
552 # XXX: check errno?
553 err = str(e)
554 else:
555 s.close()
556 return skipWithClientIf(
557 err is not None,
558 "can't create socket({0}): {1}".format(
559 ", ".join(str(o) for o in args), err))
560
561
Guido van Rossum24e4af82002-06-12 19:18:08 +0000562#######################################################################
563## Begin Tests
564
565class GeneralModuleTests(unittest.TestCase):
566
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000567 def test_repr(self):
568 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000569 self.addCleanup(s.close)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000570 self.assertTrue(repr(s).startswith("<socket.socket object"))
Walter Dörwalda7eb93e2007-06-05 13:41:53 +0000571
Raymond Hettinger027bb632004-05-31 03:09:25 +0000572 def test_weakref(self):
573 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
574 p = proxy(s)
575 self.assertEqual(p.fileno(), s.fileno())
576 s.close()
577 s = None
578 try:
579 p.fileno()
580 except ReferenceError:
581 pass
582 else:
583 self.fail('Socket proxy still exists')
584
Guido van Rossum24e4af82002-06-12 19:18:08 +0000585 def testSocketError(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000586 # Testing socket module exceptions
Ezio Melotti845f1522011-05-08 20:23:57 +0300587 msg = "Error raising socket exception (%s)."
588 with self.assertRaises(socket.error, msg=msg % 'socket.error'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000589 raise socket.error
Ezio Melotti845f1522011-05-08 20:23:57 +0300590 with self.assertRaises(socket.error, msg=msg % 'socket.herror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000591 raise socket.herror
Ezio Melotti845f1522011-05-08 20:23:57 +0300592 with self.assertRaises(socket.error, msg=msg % 'socket.gaierror'):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000593 raise socket.gaierror
Guido van Rossum24e4af82002-06-12 19:18:08 +0000594
Ezio Melotti63e42302011-05-07 19:47:48 +0300595 def testSendtoErrors(self):
596 # Testing that sendto doens't masks failures. See #10169.
597 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
598 self.addCleanup(s.close)
599 s.bind(('', 0))
600 sockname = s.getsockname()
601 # 2 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300602 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300603 s.sendto('\u2620', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300604 self.assertEqual(str(cm.exception),
605 "'str' does not support the buffer interface")
606 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300607 s.sendto(5j, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300608 self.assertEqual(str(cm.exception),
609 "'complex' does not support the buffer interface")
610 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300611 s.sendto(b'foo', None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300612 self.assertIn('not NoneType',str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300613 # 3 args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300614 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300615 s.sendto('\u2620', 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300616 self.assertEqual(str(cm.exception),
617 "'str' does not support the buffer interface")
618 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300619 s.sendto(5j, 0, sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300620 self.assertEqual(str(cm.exception),
621 "'complex' does not support the buffer interface")
622 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300623 s.sendto(b'foo', 0, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300624 self.assertIn('not NoneType', str(cm.exception))
625 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300626 s.sendto(b'foo', 'bar', sockname)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300627 self.assertIn('an integer is required', str(cm.exception))
628 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300629 s.sendto(b'foo', None, None)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300630 self.assertIn('an integer is required', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300631 # wrong number of args
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300632 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300633 s.sendto(b'foo')
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300634 self.assertIn('(1 given)', str(cm.exception))
635 with self.assertRaises(TypeError) as cm:
Ezio Melotti63e42302011-05-07 19:47:48 +0300636 s.sendto(b'foo', 0, sockname, 4)
Ezio Melotti4c1aebd2011-05-07 19:50:28 +0300637 self.assertIn('(4 given)', str(cm.exception))
Ezio Melotti63e42302011-05-07 19:47:48 +0300638
Guido van Rossum24e4af82002-06-12 19:18:08 +0000639 def testCrucialConstants(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000640 # Testing for mission critical constants
Guido van Rossum24e4af82002-06-12 19:18:08 +0000641 socket.AF_INET
642 socket.SOCK_STREAM
643 socket.SOCK_DGRAM
644 socket.SOCK_RAW
645 socket.SOCK_RDM
646 socket.SOCK_SEQPACKET
647 socket.SOL_SOCKET
648 socket.SO_REUSEADDR
649
Guido van Rossum654c11e2002-06-13 20:24:17 +0000650 def testHostnameRes(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000651 # Testing hostname resolution mechanisms
Guido van Rossum654c11e2002-06-13 20:24:17 +0000652 hostname = socket.gethostname()
Guido van Rossum71e02942002-12-26 16:55:15 +0000653 try:
654 ip = socket.gethostbyname(hostname)
655 except socket.error:
656 # Probably name lookup wasn't set up right; skip this test
657 return
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000658 self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
Guido van Rossum9647b522002-12-26 17:04:45 +0000659 try:
660 hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
661 except socket.error:
662 # Probably a similar problem as above; skip this test
663 return
Brett Cannon01668a12005-03-11 00:04:17 +0000664 all_host_names = [hostname, hname] + aliases
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000665 fqhn = socket.getfqdn(ip)
Guido van Rossum654c11e2002-06-13 20:24:17 +0000666 if not fqhn in all_host_names:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000667 self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000668
Antoine Pitrou061cfb52011-02-28 22:25:22 +0000669 @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
670 @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
671 def test_sethostname(self):
672 oldhn = socket.gethostname()
673 try:
674 socket.sethostname('new')
675 except socket.error as e:
676 if e.errno == errno.EPERM:
677 self.skipTest("test should be run as root")
678 else:
679 raise
680 try:
681 # running test as root!
682 self.assertEqual(socket.gethostname(), 'new')
683 # Should work with bytes objects too
684 socket.sethostname(b'bar')
685 self.assertEqual(socket.gethostname(), 'bar')
686 finally:
687 socket.sethostname(oldhn)
688
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700689 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
690 'socket.if_nameindex() not available.')
691 def testInterfaceNameIndex(self):
692 interfaces = socket.if_nameindex()
693 for index, name in interfaces:
Charles-François Natali60713592011-05-20 16:55:06 +0200694 self.assertIsInstance(index, int)
695 self.assertIsInstance(name, str)
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700696 # interface indices are non-zero integers
697 self.assertGreater(index, 0)
Charles-François Natali60713592011-05-20 16:55:06 +0200698 _index = socket.if_nametoindex(name)
699 self.assertIsInstance(_index, int)
700 self.assertEqual(index, _index)
701 _name = socket.if_indextoname(index)
702 self.assertIsInstance(_name, str)
703 self.assertEqual(name, _name)
704
705 @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
706 'socket.if_nameindex() not available.')
707 def testInvalidInterfaceNameIndex(self):
708 # test nonexistent interface index/name
709 self.assertRaises(socket.error, socket.if_indextoname, 0)
710 self.assertRaises(socket.error, socket.if_nametoindex, '_DEADBEEF')
711 # test with invalid values
712 self.assertRaises(TypeError, socket.if_nametoindex, 0)
713 self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
Gregory P. Smith5ed2e772011-05-15 00:26:45 -0700714
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000715 def testRefCountGetNameInfo(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000716 # Testing reference count for getnameinfo
Guido van Rossum284a2cf2002-06-12 21:19:40 +0000717 if hasattr(sys, "getrefcount"):
Guido van Rossum24e4af82002-06-12 19:18:08 +0000718 try:
719 # On some versions, this loses a reference
720 orig = sys.getrefcount(__name__)
721 socket.getnameinfo(__name__,0)
Benjamin Peterson4ac9ce42009-10-04 14:49:41 +0000722 except TypeError:
Guido van Rossumb053cd82006-08-24 03:53:23 +0000723 if sys.getrefcount(__name__) != orig:
Guido van Rossum24e4af82002-06-12 19:18:08 +0000724 self.fail("socket.getnameinfo loses a reference")
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000725
Guido van Rossum24e4af82002-06-12 19:18:08 +0000726 def testInterpreterCrash(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000727 # Making sure getnameinfo doesn't crash the interpreter
Guido van Rossum24e4af82002-06-12 19:18:08 +0000728 try:
729 # On some versions, this crashes the interpreter.
730 socket.getnameinfo(('x', 0, 0, 0), 0)
731 except socket.error:
732 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +0000733
Guido van Rossumc0a0e082002-09-16 01:30:03 +0000734 def testNtoH(self):
Guido van Rossuma2627af2002-09-14 00:58:46 +0000735 # This just checks that htons etc. are their own inverse,
736 # when looking at the lower 16 or 32 bits.
737 sizes = {socket.htonl: 32, socket.ntohl: 32,
738 socket.htons: 16, socket.ntohs: 16}
739 for func, size in sizes.items():
Guido van Rossume2a383d2007-01-15 16:59:06 +0000740 mask = (1<<size) - 1
Guido van Rossuma2627af2002-09-14 00:58:46 +0000741 for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
742 self.assertEqual(i & mask, func(func(i&mask)) & mask)
Jeremy Hyltoncbd5b892002-07-31 15:57:39 +0000743
Guido van Rossuma2627af2002-09-14 00:58:46 +0000744 swapped = func(mask)
745 self.assertEqual(swapped & mask, mask)
Guido van Rossume2a383d2007-01-15 16:59:06 +0000746 self.assertRaises(OverflowError, func, 1<<34)
Jeremy Hyltonc075e192002-07-25 16:01:12 +0000747
Guido van Rossum018919a2007-01-15 00:07:32 +0000748 def testNtoHErrors(self):
Guido van Rossume2a383d2007-01-15 16:59:06 +0000749 good_values = [ 1, 2, 3, 1, 2, 3 ]
750 bad_values = [ -1, -2, -3, -1, -2, -3 ]
Guido van Rossum018919a2007-01-15 00:07:32 +0000751 for k in good_values:
752 socket.ntohl(k)
753 socket.ntohs(k)
754 socket.htonl(k)
755 socket.htons(k)
756 for k in bad_values:
757 self.assertRaises(OverflowError, socket.ntohl, k)
758 self.assertRaises(OverflowError, socket.ntohs, k)
759 self.assertRaises(OverflowError, socket.htonl, k)
760 self.assertRaises(OverflowError, socket.htons, k)
761
Barry Warsaw11b91a02004-06-28 00:50:43 +0000762 def testGetServBy(self):
763 eq = self.assertEqual
764 # Find one service that exists, then check all the related interfaces.
765 # I've ordered this by protocols that have both a tcp and udp
766 # protocol, at least for modern Linuxes.
Victor Stinnere6747472011-08-21 00:39:18 +0200767 if (sys.platform.startswith(('freebsd', 'netbsd'))
768 or sys.platform in ('linux', 'darwin')):
Andrew MacIntyre18bf43c2004-07-12 12:10:30 +0000769 # avoid the 'echo' service on this platform, as there is an
770 # assumption breaking non-standard port/protocol entry
771 services = ('daytime', 'qotd', 'domain')
772 else:
773 services = ('echo', 'daytime', 'domain')
774 for service in services:
Skip Montanarof4433302002-08-02 15:52:30 +0000775 try:
Barry Warsaw11b91a02004-06-28 00:50:43 +0000776 port = socket.getservbyname(service, 'tcp')
Skip Montanarof4433302002-08-02 15:52:30 +0000777 break
778 except socket.error:
779 pass
Skip Montanaro05eb4012004-02-10 15:51:15 +0000780 else:
781 raise socket.error
Barry Warsaw11b91a02004-06-28 00:50:43 +0000782 # Try same call with optional protocol omitted
783 port2 = socket.getservbyname(service)
784 eq(port, port2)
785 # Try udp, but don't barf it it doesn't exist
786 try:
787 udpport = socket.getservbyname(service, 'udp')
788 except socket.error:
789 udpport = None
790 else:
791 eq(udpport, port)
792 # Now make sure the lookup by port returns the same service name
793 eq(socket.getservbyport(port2), service)
794 eq(socket.getservbyport(port, 'tcp'), service)
795 if udpport is not None:
796 eq(socket.getservbyport(udpport, 'udp'), service)
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000797 # Make sure getservbyport does not accept out of range ports.
798 self.assertRaises(OverflowError, socket.getservbyport, -1)
799 self.assertRaises(OverflowError, socket.getservbyport, 65536)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000800
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000801 def testDefaultTimeout(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000802 # Testing default timeout
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000803 # The default timeout should initially be None
804 self.assertEqual(socket.getdefaulttimeout(), None)
805 s = socket.socket()
806 self.assertEqual(s.gettimeout(), None)
807 s.close()
808
809 # Set the default timeout to 10, and see if it propagates
810 socket.setdefaulttimeout(10)
811 self.assertEqual(socket.getdefaulttimeout(), 10)
812 s = socket.socket()
813 self.assertEqual(s.gettimeout(), 10)
814 s.close()
815
816 # Reset the default timeout to None, and see if it propagates
817 socket.setdefaulttimeout(None)
818 self.assertEqual(socket.getdefaulttimeout(), None)
819 s = socket.socket()
820 self.assertEqual(s.gettimeout(), None)
821 s.close()
822
823 # Check that setting it to an invalid value raises ValueError
824 self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
825
826 # Check that setting it to an invalid type raises TypeError
827 self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
828
Benjamin Petersonf91df042009-02-13 02:50:59 +0000829 def testIPv4_inet_aton_fourbytes(self):
830 if not hasattr(socket, 'inet_aton'):
831 return # No inet_aton, nothing to check
832 # Test that issue1008086 and issue767150 are fixed.
833 # It must return 4 bytes.
Ezio Melottib3aedd42010-11-20 19:04:17 +0000834 self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
835 self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
Benjamin Petersonf91df042009-02-13 02:50:59 +0000836
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000837 def testIPv4toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000838 if not hasattr(socket, 'inet_pton'):
839 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000840 from socket import inet_aton as f, inet_pton, AF_INET
841 g = lambda a: inet_pton(AF_INET, a)
842
Ezio Melottib3aedd42010-11-20 19:04:17 +0000843 self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
844 self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
845 self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
846 self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
847 self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000848
Ezio Melottib3aedd42010-11-20 19:04:17 +0000849 self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
850 self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
851 self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
852 self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000853
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000854 def testIPv6toString(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000855 if not hasattr(socket, 'inet_pton'):
856 return # No inet_pton() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000857 try:
858 from socket import inet_pton, AF_INET6, has_ipv6
859 if not has_ipv6:
860 return
861 except ImportError:
862 return
863 f = lambda a: inet_pton(AF_INET6, a)
864
Ezio Melottib3aedd42010-11-20 19:04:17 +0000865 self.assertEqual(b'\x00' * 16, f('::'))
866 self.assertEqual(b'\x00' * 16, f('0::0'))
867 self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
868 self.assertEqual(
Guido van Rossum67180622007-07-10 07:29:12 +0000869 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 +0000870 f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
871 )
Tim Petersc2659cf2003-05-12 20:19:37 +0000872
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000873 def testStringToIPv4(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000874 if not hasattr(socket, 'inet_ntop'):
875 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000876 from socket import inet_ntoa as f, inet_ntop, AF_INET
877 g = lambda a: inet_ntop(AF_INET, a)
878
Ezio Melottib3aedd42010-11-20 19:04:17 +0000879 self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
880 self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
881 self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
882 self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
Tim Petersc2659cf2003-05-12 20:19:37 +0000883
Ezio Melottib3aedd42010-11-20 19:04:17 +0000884 self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
885 self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
886 self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000887
888 def testStringToIPv6(self):
Guido van Rossumf4001ee2003-04-25 15:11:23 +0000889 if not hasattr(socket, 'inet_ntop'):
890 return # No inet_ntop() on this platform
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000891 try:
892 from socket import inet_ntop, AF_INET6, has_ipv6
893 if not has_ipv6:
894 return
895 except ImportError:
896 return
897 f = lambda a: inet_ntop(AF_INET6, a)
898
Ezio Melottib3aedd42010-11-20 19:04:17 +0000899 self.assertEqual('::', f(b'\x00' * 16))
900 self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
901 self.assertEqual(
Guido van Rossum47dfa4a2003-04-25 05:48:32 +0000902 'aef:b01:506:1001:ffff:9997:55:170',
Guido van Rossum67180622007-07-10 07:29:12 +0000903 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 +0000904 )
905
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000906 # XXX The following don't test module-level functionality...
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +0000907
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000908 def testSockName(self):
909 # Testing getsockname()
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200910 port = support.find_unused_port()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000911 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000912 self.addCleanup(sock.close)
Christian Heimes5e696852008-04-09 08:37:03 +0000913 sock.bind(("0.0.0.0", port))
Guido van Rossum24e4af82002-06-12 19:18:08 +0000914 name = sock.getsockname()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000915 # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
916 # it reasonable to get the host's addr in addition to 0.0.0.0.
917 # At least for eCos. This is required for the S/390 to pass.
Georg Brandl89197fe2010-11-20 14:16:17 +0000918 try:
919 my_ip_addr = socket.gethostbyname(socket.gethostname())
920 except socket.error:
921 # Probably name lookup wasn't set up right; skip this test
922 return
Benjamin Peterson577473f2010-01-19 00:09:57 +0000923 self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
Christian Heimes5e696852008-04-09 08:37:03 +0000924 self.assertEqual(name[1], port)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000925
926 def testGetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000927 # Testing getsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000928 # We know a socket should start without reuse==0
929 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000930 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000931 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000932 self.assertFalse(reuse != 0, "initial mode is reuse")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000933
934 def testSetSockOpt(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000935 # Testing setsockopt()
Guido van Rossum24e4af82002-06-12 19:18:08 +0000936 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +0000937 self.addCleanup(sock.close)
Guido van Rossum24e4af82002-06-12 19:18:08 +0000938 sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
939 reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000940 self.assertFalse(reuse == 0, "failed to set reuse mode")
Guido van Rossum24e4af82002-06-12 19:18:08 +0000941
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000942 def testSendAfterClose(self):
Guido van Rossum8c943832002-08-08 01:00:28 +0000943 # testing send() after close() with timeout
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000944 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
945 sock.settimeout(1)
946 sock.close()
Guido van Rossum8a392d72007-11-21 22:09:45 +0000947 self.assertRaises(socket.error, sock.send, b"spam")
Guido van Rossumb6cc7d22002-07-19 12:46:46 +0000948
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000949 def testNewAttributes(self):
950 # testing .family, .type and .protocol
951 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
952 self.assertEqual(sock.family, socket.AF_INET)
953 self.assertEqual(sock.type, socket.SOCK_STREAM)
954 self.assertEqual(sock.proto, 0)
955 sock.close()
956
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000957 def test_getsockaddrarg(self):
958 host = '0.0.0.0'
Antoine Pitrouccc87b52011-05-10 23:37:11 +0200959 port = support.find_unused_port()
Benjamin Peterson5c6d7872009-02-06 02:40:07 +0000960 big_port = port + 65536
961 neg_port = port - 65536
962 sock = socket.socket()
963 try:
964 self.assertRaises(OverflowError, sock.bind, (host, big_port))
965 self.assertRaises(OverflowError, sock.bind, (host, neg_port))
966 sock.bind((host, port))
967 finally:
968 sock.close()
969
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000970 @unittest.skipUnless(os.name == "nt", "Windows specific")
Christian Heimesfaf2f632008-01-06 16:59:19 +0000971 def test_sock_ioctl(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000972 self.assertTrue(hasattr(socket.socket, 'ioctl'))
973 self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
974 self.assertTrue(hasattr(socket, 'RCVALL_ON'))
975 self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000976 self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
977 s = socket.socket()
Brian Curtin5ad0bd62010-11-05 15:47:45 +0000978 self.addCleanup(s.close)
Kristján Valur Jónsson847ec752009-09-27 21:10:38 +0000979 self.assertRaises(ValueError, s.ioctl, -1, None)
980 s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
Christian Heimesfaf2f632008-01-06 16:59:19 +0000981
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000982 def testGetaddrinfo(self):
983 try:
984 socket.getaddrinfo('localhost', 80)
985 except socket.gaierror as err:
986 if err.errno == socket.EAI_SERVICE:
987 # see http://bugs.python.org/issue1282647
988 self.skipTest("buggy libc version")
989 raise
990 # len of every sequence is supposed to be == 5
991 for info in socket.getaddrinfo(HOST, None):
992 self.assertEqual(len(info), 5)
993 # host can be a domain name, a string representation of an
994 # IPv4/v6 address or None
995 socket.getaddrinfo('localhost', 80)
996 socket.getaddrinfo('127.0.0.1', 80)
997 socket.getaddrinfo(None, 80)
Antoine Pitrou9c39f3c2011-04-28 19:18:10 +0200998 if support.IPV6_ENABLED:
Giampaolo Rodolà419f7042010-08-14 16:45:41 +0000999 socket.getaddrinfo('::1', 80)
1000 # port can be a string service name such as "http", a numeric
1001 # port number or None
1002 socket.getaddrinfo(HOST, "http")
1003 socket.getaddrinfo(HOST, 80)
1004 socket.getaddrinfo(HOST, None)
1005 # test family and socktype filters
1006 infos = socket.getaddrinfo(HOST, None, socket.AF_INET)
1007 for family, _, _, _, _ in infos:
1008 self.assertEqual(family, socket.AF_INET)
1009 infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1010 for _, socktype, _, _, _ in infos:
1011 self.assertEqual(socktype, socket.SOCK_STREAM)
1012 # test proto and flags arguments
Giampaolo Rodolà677d95c2010-08-16 05:08:11 +00001013 socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001014 socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1015 # a server willing to support both IPv4 and IPv6 will
1016 # usually do this
1017 socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1018 socket.AI_PASSIVE)
Giampaolo Rodolàccfb91c2010-08-17 15:30:23 +00001019 # test keyword arguments
1020 a = socket.getaddrinfo(HOST, None)
1021 b = socket.getaddrinfo(host=HOST, port=None)
1022 self.assertEqual(a, b)
1023 a = socket.getaddrinfo(HOST, None, socket.AF_INET)
1024 b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
1025 self.assertEqual(a, b)
1026 a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
1027 b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
1028 self.assertEqual(a, b)
1029 a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
1030 b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
1031 self.assertEqual(a, b)
1032 a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
1033 b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
1034 self.assertEqual(a, b)
1035 a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
1036 socket.AI_PASSIVE)
1037 b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
1038 type=socket.SOCK_STREAM, proto=0,
1039 flags=socket.AI_PASSIVE)
1040 self.assertEqual(a, b)
Alexander Belopolskye239d232010-12-08 23:31:48 +00001041 # Issue #6697.
1042 self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
Giampaolo Rodolà419f7042010-08-14 16:45:41 +00001043
Martin v. Löwis112c0f32010-08-25 07:38:15 +00001044 def test_getnameinfo(self):
1045 # only IP addresses are allowed
1046 self.assertRaises(socket.error, socket.getnameinfo, ('mail.python.org',0), 0)
1047
Daniel Stutzbach460ff3d2010-09-09 21:17:58 +00001048 @unittest.skipUnless(support.is_resource_enabled('network'),
1049 'network is not enabled')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001050 def test_idna(self):
Antoine Pitroud9107aa2010-09-04 18:50:35 +00001051 support.requires('network')
Martin v. Löwisfc0275a2010-08-22 19:33:47 +00001052 # these should all be successful
1053 socket.gethostbyname('испытание.python.org')
1054 socket.gethostbyname_ex('испытание.python.org')
Martin v. Löwis67e91ad2010-08-23 15:27:26 +00001055 socket.getaddrinfo('испытание.python.org',0,socket.AF_UNSPEC,socket.SOCK_STREAM)
1056 # this may not work if the forward lookup choses the IPv6 address, as that doesn't
1057 # have a reverse entry yet
1058 # socket.gethostbyaddr('испытание.python.org')
Christian Heimesfaf2f632008-01-06 16:59:19 +00001059
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001060 def check_sendall_interrupted(self, with_timeout):
1061 # socketpair() is not stricly required, but it makes things easier.
1062 if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
1063 self.skipTest("signal.alarm and socket.socketpair required for this test")
1064 # Our signal handlers clobber the C errno by calling a math function
1065 # with an invalid domain value.
1066 def ok_handler(*args):
1067 self.assertRaises(ValueError, math.acosh, 0)
1068 def raising_handler(*args):
1069 self.assertRaises(ValueError, math.acosh, 0)
1070 1 // 0
1071 c, s = socket.socketpair()
1072 old_alarm = signal.signal(signal.SIGALRM, raising_handler)
1073 try:
1074 if with_timeout:
1075 # Just above the one second minimum for signal.alarm
1076 c.settimeout(1.5)
1077 with self.assertRaises(ZeroDivisionError):
1078 signal.alarm(1)
1079 c.sendall(b"x" * (1024**2))
1080 if with_timeout:
1081 signal.signal(signal.SIGALRM, ok_handler)
1082 signal.alarm(1)
1083 self.assertRaises(socket.timeout, c.sendall, b"x" * (1024**2))
1084 finally:
1085 signal.signal(signal.SIGALRM, old_alarm)
1086 c.close()
1087 s.close()
1088
1089 def test_sendall_interrupted(self):
1090 self.check_sendall_interrupted(False)
1091
1092 def test_sendall_interrupted_with_timeout(self):
1093 self.check_sendall_interrupted(True)
1094
Antoine Pitroue033e062010-10-29 10:38:18 +00001095 def test_dealloc_warn(self):
1096 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1097 r = repr(sock)
1098 with self.assertWarns(ResourceWarning) as cm:
1099 sock = None
1100 support.gc_collect()
1101 self.assertIn(r, str(cm.warning.args[0]))
1102 # An open socket file object gets dereferenced after the socket
1103 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1104 f = sock.makefile('rb')
1105 r = repr(sock)
1106 sock = None
1107 support.gc_collect()
1108 with self.assertWarns(ResourceWarning):
1109 f = None
1110 support.gc_collect()
1111
Victor Stinnerc3a51ec2011-01-04 11:00:45 +00001112 def test_name_closed_socketio(self):
1113 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
1114 fp = sock.makefile("rb")
1115 fp.close()
1116 self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
1117
Antoine Pitrou6d58d642011-03-20 23:56:36 +01001118 def test_pickle(self):
1119 sock = socket.socket()
1120 with sock:
1121 for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
1122 self.assertRaises(TypeError, pickle.dumps, sock, protocol)
1123
Antoine Pitrou3cade992011-05-10 19:19:13 +02001124 def test_listen_backlog0(self):
Antoine Pitrou1be815a2011-05-10 19:16:29 +02001125 srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1126 srv.bind((HOST, 0))
1127 # backlog = 0
1128 srv.listen(0)
1129 srv.close()
1130
Antoine Pitrou6d7df632010-09-27 17:52:25 +00001131
Charles-François Natali47413c12011-10-06 19:47:44 +02001132@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1133class BasicCANTest(unittest.TestCase):
1134
1135 def testCrucialConstants(self):
1136 socket.AF_CAN
1137 socket.PF_CAN
1138 socket.CAN_RAW
1139
1140 def testCreateSocket(self):
1141 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1142 pass
1143
1144 def testBindAny(self):
1145 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1146 s.bind(('', ))
1147
1148 def testTooLongInterfaceName(self):
1149 # most systems limit IFNAMSIZ to 16, take 1024 to be sure
1150 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1151 self.assertRaisesRegexp(socket.error, 'interface name too long',
1152 s.bind, ('x' * 1024,))
1153
1154 @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
1155 'socket.CAN_RAW_LOOPBACK required for this test.')
1156 def testLoopback(self):
1157 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1158 for loopback in (0, 1):
1159 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
1160 loopback)
1161 self.assertEqual(loopback,
1162 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
1163
1164 @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
1165 'socket.CAN_RAW_FILTER required for this test.')
1166 def testFilter(self):
1167 can_id, can_mask = 0x200, 0x700
1168 can_filter = struct.pack("=II", can_id, can_mask)
1169 with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
1170 s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
1171 self.assertEqual(can_filter,
1172 s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
1173
1174
1175@unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
1176@unittest.skipUnless(thread, 'Threading required for this test.')
1177class CANTest(ThreadedCANSocketTest):
1178
1179 """The CAN frame structure is defined in <linux/can.h>:
1180
1181 struct can_frame {
1182 canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
1183 __u8 can_dlc; /* data length code: 0 .. 8 */
1184 __u8 data[8] __attribute__((aligned(8)));
1185 };
1186 """
1187 can_frame_fmt = "=IB3x8s"
1188
1189 def __init__(self, methodName='runTest'):
1190 ThreadedCANSocketTest.__init__(self, methodName=methodName)
1191
1192 @classmethod
1193 def build_can_frame(cls, can_id, data):
1194 """Build a CAN frame."""
1195 can_dlc = len(data)
1196 data = data.ljust(8, b'\x00')
1197 return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
1198
1199 @classmethod
1200 def dissect_can_frame(cls, frame):
1201 """Dissect a CAN frame."""
1202 can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
1203 return (can_id, can_dlc, data[:can_dlc])
1204
1205 def testSendFrame(self):
1206 cf, addr = self.s.recvfrom(self.bufsize)
1207 self.assertEqual(self.cf, cf)
1208 self.assertEqual(addr[0], self.interface)
1209 self.assertEqual(addr[1], socket.AF_CAN)
1210
1211 def _testSendFrame(self):
1212 self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
1213 self.cli.send(self.cf)
1214
1215 def testSendMaxFrame(self):
1216 cf, addr = self.s.recvfrom(self.bufsize)
1217 self.assertEqual(self.cf, cf)
1218
1219 def _testSendMaxFrame(self):
1220 self.cf = self.build_can_frame(0x00, b'\x07' * 8)
1221 self.cli.send(self.cf)
1222
1223 def testSendMultiFrames(self):
1224 cf, addr = self.s.recvfrom(self.bufsize)
1225 self.assertEqual(self.cf1, cf)
1226
1227 cf, addr = self.s.recvfrom(self.bufsize)
1228 self.assertEqual(self.cf2, cf)
1229
1230 def _testSendMultiFrames(self):
1231 self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
1232 self.cli.send(self.cf1)
1233
1234 self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
1235 self.cli.send(self.cf2)
1236
1237
Victor Stinner45df8202010-04-28 22:31:17 +00001238@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001239class BasicTCPTest(SocketConnectedTest):
1240
1241 def __init__(self, methodName='runTest'):
1242 SocketConnectedTest.__init__(self, methodName=methodName)
1243
1244 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001245 # Testing large receive over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001246 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001247 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001248
1249 def _testRecv(self):
1250 self.serv_conn.send(MSG)
1251
1252 def testOverFlowRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001253 # Testing receive in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001254 seg1 = self.cli_conn.recv(len(MSG) - 3)
1255 seg2 = self.cli_conn.recv(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001256 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001257 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001258
1259 def _testOverFlowRecv(self):
1260 self.serv_conn.send(MSG)
1261
1262 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001263 # Testing large recvfrom() over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001264 msg, addr = self.cli_conn.recvfrom(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001265 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001266
1267 def _testRecvFrom(self):
1268 self.serv_conn.send(MSG)
1269
1270 def testOverFlowRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001271 # Testing recvfrom() in chunks over TCP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001272 seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
1273 seg2, addr = self.cli_conn.recvfrom(1024)
Guido van Rossumab659962002-06-12 21:29:43 +00001274 msg = seg1 + seg2
Guido van Rossum76489682002-06-12 20:38:30 +00001275 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001276
1277 def _testOverFlowRecvFrom(self):
1278 self.serv_conn.send(MSG)
1279
1280 def testSendAll(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001281 # Testing sendall() with a 2048 byte string over TCP
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001282 msg = b''
Guido van Rossum24e4af82002-06-12 19:18:08 +00001283 while 1:
1284 read = self.cli_conn.recv(1024)
1285 if not read:
1286 break
Guido van Rossume531e292002-08-08 20:28:34 +00001287 msg += read
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001288 self.assertEqual(msg, b'f' * 2048)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001289
1290 def _testSendAll(self):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00001291 big_chunk = b'f' * 2048
Guido van Rossum24e4af82002-06-12 19:18:08 +00001292 self.serv_conn.sendall(big_chunk)
1293
1294 def testFromFd(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001295 # Testing fromfd()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001296 fd = self.cli_conn.fileno()
1297 sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001298 self.addCleanup(sock.close)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00001299 self.assertIsInstance(sock, socket.socket)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001300 msg = sock.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001301 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001302
1303 def _testFromFd(self):
1304 self.serv_conn.send(MSG)
1305
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001306 def testDup(self):
1307 # Testing dup()
1308 sock = self.cli_conn.dup()
Brian Curtin21ebbb72010-11-02 02:07:09 +00001309 self.addCleanup(sock.close)
Guido van Rossum39eb8fa2007-11-16 01:24:05 +00001310 msg = sock.recv(1024)
1311 self.assertEqual(msg, MSG)
1312
1313 def _testDup(self):
1314 self.serv_conn.send(MSG)
1315
Guido van Rossum24e4af82002-06-12 19:18:08 +00001316 def testShutdown(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001317 # Testing shutdown()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001318 msg = self.cli_conn.recv(1024)
Guido van Rossum76489682002-06-12 20:38:30 +00001319 self.assertEqual(msg, MSG)
Mark Dickinson29500f62009-01-15 15:36:10 +00001320 # wait for _testShutdown to finish: on OS X, when the server
1321 # closes the connection the client also becomes disconnected,
1322 # and the client's shutdown call will fail. (Issue #4397.)
1323 self.done.wait()
Guido van Rossum24e4af82002-06-12 19:18:08 +00001324
1325 def _testShutdown(self):
1326 self.serv_conn.send(MSG)
1327 self.serv_conn.shutdown(2)
1328
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001329 def testDetach(self):
1330 # Testing detach()
1331 fileno = self.cli_conn.fileno()
1332 f = self.cli_conn.detach()
1333 self.assertEqual(f, fileno)
1334 # cli_conn cannot be used anymore...
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001335 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
1336 self.cli_conn.close()
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001337 # ...but we can create another socket using the (still open)
1338 # file descriptor
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001339 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
Brian Curtin21ebbb72010-11-02 02:07:09 +00001340 self.addCleanup(sock.close)
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001341 msg = sock.recv(1024)
1342 self.assertEqual(msg, MSG)
1343
Antoine Pitrou6e451df2010-08-09 20:39:54 +00001344 def _testDetach(self):
Antoine Pitroue43f9d02010-08-08 23:24:50 +00001345 self.serv_conn.send(MSG)
1346
Victor Stinner45df8202010-04-28 22:31:17 +00001347@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00001348class BasicUDPTest(ThreadedUDPSocketTest):
1349
1350 def __init__(self, methodName='runTest'):
1351 ThreadedUDPSocketTest.__init__(self, methodName=methodName)
1352
1353 def testSendtoAndRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001354 # Testing sendto() and Recv() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001355 msg = self.serv.recv(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001356 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001357
1358 def _testSendtoAndRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001359 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001360
Guido van Rossum1c938012002-06-12 21:17:20 +00001361 def testRecvFrom(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00001362 # Testing recvfrom() over UDP
Guido van Rossum24e4af82002-06-12 19:18:08 +00001363 msg, addr = self.serv.recvfrom(len(MSG))
Guido van Rossum76489682002-06-12 20:38:30 +00001364 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00001365
Guido van Rossum1c938012002-06-12 21:17:20 +00001366 def _testRecvFrom(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001367 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00001368
Guido van Rossumd8faa362007-04-27 19:54:29 +00001369 def testRecvFromNegative(self):
1370 # Negative lengths passed to recvfrom should give ValueError.
1371 self.assertRaises(ValueError, self.serv.recvfrom, -1)
1372
1373 def _testRecvFromNegative(self):
Christian Heimes5e696852008-04-09 08:37:03 +00001374 self.cli.sendto(MSG, 0, (HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001375
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001376
1377# Tests for the sendmsg()/recvmsg() interface. Where possible, the
1378# same test code is used with different families and types of socket
1379# (e.g. stream, datagram), and tests using recvmsg() are repeated
1380# using recvmsg_into().
1381#
1382# The generic test classes such as SendmsgTests and
1383# RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
1384# supplied with sockets cli_sock and serv_sock representing the
1385# client's and the server's end of the connection respectively, and
1386# attributes cli_addr and serv_addr holding their (numeric where
1387# appropriate) addresses.
1388#
1389# The final concrete test classes combine these with subclasses of
1390# SocketTestBase which set up client and server sockets of a specific
1391# type, and with subclasses of SendrecvmsgBase such as
1392# SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
1393# sockets to cli_sock and serv_sock and override the methods and
1394# attributes of SendrecvmsgBase to fill in destination addresses if
1395# needed when sending, check for specific flags in msg_flags, etc.
1396#
1397# RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
1398# recvmsg_into().
1399
1400# XXX: like the other datagram (UDP) tests in this module, the code
1401# here assumes that datagram delivery on the local machine will be
1402# reliable.
1403
1404class SendrecvmsgBase(ThreadSafeCleanupTestCase):
1405 # Base class for sendmsg()/recvmsg() tests.
1406
1407 # Time in seconds to wait before considering a test failed, or
1408 # None for no timeout. Not all tests actually set a timeout.
1409 fail_timeout = 3.0
1410
1411 def setUp(self):
1412 self.misc_event = threading.Event()
1413 super().setUp()
1414
1415 def sendToServer(self, msg):
1416 # Send msg to the server.
1417 return self.cli_sock.send(msg)
1418
1419 # Tuple of alternative default arguments for sendmsg() when called
1420 # via sendmsgToServer() (e.g. to include a destination address).
1421 sendmsg_to_server_defaults = ()
1422
1423 def sendmsgToServer(self, *args):
1424 # Call sendmsg() on self.cli_sock with the given arguments,
1425 # filling in any arguments which are not supplied with the
1426 # corresponding items of self.sendmsg_to_server_defaults, if
1427 # any.
1428 return self.cli_sock.sendmsg(
1429 *(args + self.sendmsg_to_server_defaults[len(args):]))
1430
1431 def doRecvmsg(self, sock, bufsize, *args):
1432 # Call recvmsg() on sock with given arguments and return its
1433 # result. Should be used for tests which can use either
1434 # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
1435 # this method with one which emulates it using recvmsg_into(),
1436 # thus allowing the same test to be used for both methods.
1437 result = sock.recvmsg(bufsize, *args)
1438 self.registerRecvmsgResult(result)
1439 return result
1440
1441 def registerRecvmsgResult(self, result):
1442 # Called by doRecvmsg() with the return value of recvmsg() or
1443 # recvmsg_into(). Can be overridden to arrange cleanup based
1444 # on the returned ancillary data, for instance.
1445 pass
1446
1447 def checkRecvmsgAddress(self, addr1, addr2):
1448 # Called to compare the received address with the address of
1449 # the peer.
1450 self.assertEqual(addr1, addr2)
1451
1452 # Flags that are normally unset in msg_flags
1453 msg_flags_common_unset = 0
1454 for name in ("MSG_CTRUNC", "MSG_OOB"):
1455 msg_flags_common_unset |= getattr(socket, name, 0)
1456
1457 # Flags that are normally set
1458 msg_flags_common_set = 0
1459
1460 # Flags set when a complete record has been received (e.g. MSG_EOR
1461 # for SCTP)
1462 msg_flags_eor_indicator = 0
1463
1464 # Flags set when a complete record has not been received
1465 # (e.g. MSG_TRUNC for datagram sockets)
1466 msg_flags_non_eor_indicator = 0
1467
1468 def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
1469 # Method to check the value of msg_flags returned by recvmsg[_into]().
1470 #
1471 # Checks that all bits in msg_flags_common_set attribute are
1472 # set in "flags" and all bits in msg_flags_common_unset are
1473 # unset.
1474 #
1475 # The "eor" argument specifies whether the flags should
1476 # indicate that a full record (or datagram) has been received.
1477 # If "eor" is None, no checks are done; otherwise, checks
1478 # that:
1479 #
1480 # * if "eor" is true, all bits in msg_flags_eor_indicator are
1481 # set and all bits in msg_flags_non_eor_indicator are unset
1482 #
1483 # * if "eor" is false, all bits in msg_flags_non_eor_indicator
1484 # are set and all bits in msg_flags_eor_indicator are unset
1485 #
1486 # If "checkset" and/or "checkunset" are supplied, they require
1487 # the given bits to be set or unset respectively, overriding
1488 # what the attributes require for those bits.
1489 #
1490 # If any bits are set in "ignore", they will not be checked,
1491 # regardless of the other inputs.
1492 #
1493 # Will raise Exception if the inputs require a bit to be both
1494 # set and unset, and it is not ignored.
1495
1496 defaultset = self.msg_flags_common_set
1497 defaultunset = self.msg_flags_common_unset
1498
1499 if eor:
1500 defaultset |= self.msg_flags_eor_indicator
1501 defaultunset |= self.msg_flags_non_eor_indicator
1502 elif eor is not None:
1503 defaultset |= self.msg_flags_non_eor_indicator
1504 defaultunset |= self.msg_flags_eor_indicator
1505
1506 # Function arguments override defaults
1507 defaultset &= ~checkunset
1508 defaultunset &= ~checkset
1509
1510 # Merge arguments with remaining defaults, and check for conflicts
1511 checkset |= defaultset
1512 checkunset |= defaultunset
1513 inboth = checkset & checkunset & ~ignore
1514 if inboth:
1515 raise Exception("contradictory set, unset requirements for flags "
1516 "{0:#x}".format(inboth))
1517
1518 # Compare with given msg_flags value
1519 mask = (checkset | checkunset) & ~ignore
1520 self.assertEqual(flags & mask, checkset & mask)
1521
1522
1523class RecvmsgIntoMixin(SendrecvmsgBase):
1524 # Mixin to implement doRecvmsg() using recvmsg_into().
1525
1526 def doRecvmsg(self, sock, bufsize, *args):
1527 buf = bytearray(bufsize)
1528 result = sock.recvmsg_into([buf], *args)
1529 self.registerRecvmsgResult(result)
1530 self.assertGreaterEqual(result[0], 0)
1531 self.assertLessEqual(result[0], bufsize)
1532 return (bytes(buf[:result[0]]),) + result[1:]
1533
1534
1535class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
1536 # Defines flags to be checked in msg_flags for datagram sockets.
1537
1538 @property
1539 def msg_flags_non_eor_indicator(self):
1540 return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
1541
1542
1543class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
1544 # Defines flags to be checked in msg_flags for SCTP sockets.
1545
1546 @property
1547 def msg_flags_eor_indicator(self):
1548 return super().msg_flags_eor_indicator | socket.MSG_EOR
1549
1550
1551class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
1552 # Base class for tests on connectionless-mode sockets. Users must
1553 # supply sockets on attributes cli and serv to be mapped to
1554 # cli_sock and serv_sock respectively.
1555
1556 @property
1557 def serv_sock(self):
1558 return self.serv
1559
1560 @property
1561 def cli_sock(self):
1562 return self.cli
1563
1564 @property
1565 def sendmsg_to_server_defaults(self):
1566 return ([], [], 0, self.serv_addr)
1567
1568 def sendToServer(self, msg):
1569 return self.cli_sock.sendto(msg, self.serv_addr)
1570
1571
1572class SendrecvmsgConnectedBase(SendrecvmsgBase):
1573 # Base class for tests on connected sockets. Users must supply
1574 # sockets on attributes serv_conn and cli_conn (representing the
1575 # connections *to* the server and the client), to be mapped to
1576 # cli_sock and serv_sock respectively.
1577
1578 @property
1579 def serv_sock(self):
1580 return self.cli_conn
1581
1582 @property
1583 def cli_sock(self):
1584 return self.serv_conn
1585
1586 def checkRecvmsgAddress(self, addr1, addr2):
1587 # Address is currently "unspecified" for a connected socket,
1588 # so we don't examine it
1589 pass
1590
1591
1592class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
1593 # Base class to set a timeout on server's socket.
1594
1595 def setUp(self):
1596 super().setUp()
1597 self.serv_sock.settimeout(self.fail_timeout)
1598
1599
1600class SendmsgTests(SendrecvmsgServerTimeoutBase):
1601 # Tests for sendmsg() which can use any socket type and do not
1602 # involve recvmsg() or recvmsg_into().
1603
1604 def testSendmsg(self):
1605 # Send a simple message with sendmsg().
1606 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1607
1608 def _testSendmsg(self):
1609 self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
1610
1611 def testSendmsgDataGenerator(self):
1612 # Send from buffer obtained from a generator (not a sequence).
1613 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1614
1615 def _testSendmsgDataGenerator(self):
1616 self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
1617 len(MSG))
1618
1619 def testSendmsgAncillaryGenerator(self):
1620 # Gather (empty) ancillary data from a generator.
1621 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1622
1623 def _testSendmsgAncillaryGenerator(self):
1624 self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
1625 len(MSG))
1626
1627 def testSendmsgArray(self):
1628 # Send data from an array instead of the usual bytes object.
1629 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1630
1631 def _testSendmsgArray(self):
1632 self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
1633 len(MSG))
1634
1635 def testSendmsgGather(self):
1636 # Send message data from more than one buffer (gather write).
1637 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1638
1639 def _testSendmsgGather(self):
1640 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1641
1642 def testSendmsgBadArgs(self):
1643 # Check that sendmsg() rejects invalid arguments.
1644 self.assertEqual(self.serv_sock.recv(1000), b"done")
1645
1646 def _testSendmsgBadArgs(self):
1647 self.assertRaises(TypeError, self.cli_sock.sendmsg)
1648 self.assertRaises(TypeError, self.sendmsgToServer,
1649 b"not in an iterable")
1650 self.assertRaises(TypeError, self.sendmsgToServer,
1651 object())
1652 self.assertRaises(TypeError, self.sendmsgToServer,
1653 [object()])
1654 self.assertRaises(TypeError, self.sendmsgToServer,
1655 [MSG, object()])
1656 self.assertRaises(TypeError, self.sendmsgToServer,
1657 [MSG], object())
1658 self.assertRaises(TypeError, self.sendmsgToServer,
1659 [MSG], [], object())
1660 self.assertRaises(TypeError, self.sendmsgToServer,
1661 [MSG], [], 0, object())
1662 self.sendToServer(b"done")
1663
1664 def testSendmsgBadCmsg(self):
1665 # Check that invalid ancillary data items are rejected.
1666 self.assertEqual(self.serv_sock.recv(1000), b"done")
1667
1668 def _testSendmsgBadCmsg(self):
1669 self.assertRaises(TypeError, self.sendmsgToServer,
1670 [MSG], [object()])
1671 self.assertRaises(TypeError, self.sendmsgToServer,
1672 [MSG], [(object(), 0, b"data")])
1673 self.assertRaises(TypeError, self.sendmsgToServer,
1674 [MSG], [(0, object(), b"data")])
1675 self.assertRaises(TypeError, self.sendmsgToServer,
1676 [MSG], [(0, 0, object())])
1677 self.assertRaises(TypeError, self.sendmsgToServer,
1678 [MSG], [(0, 0)])
1679 self.assertRaises(TypeError, self.sendmsgToServer,
1680 [MSG], [(0, 0, b"data", 42)])
1681 self.sendToServer(b"done")
1682
1683 @requireAttrs(socket, "CMSG_SPACE")
1684 def testSendmsgBadMultiCmsg(self):
1685 # Check that invalid ancillary data items are rejected when
1686 # more than one item is present.
1687 self.assertEqual(self.serv_sock.recv(1000), b"done")
1688
1689 @testSendmsgBadMultiCmsg.client_skip
1690 def _testSendmsgBadMultiCmsg(self):
1691 self.assertRaises(TypeError, self.sendmsgToServer,
1692 [MSG], [0, 0, b""])
1693 self.assertRaises(TypeError, self.sendmsgToServer,
1694 [MSG], [(0, 0, b""), object()])
1695 self.sendToServer(b"done")
1696
1697 def testSendmsgExcessCmsgReject(self):
1698 # Check that sendmsg() rejects excess ancillary data items
1699 # when the number that can be sent is limited.
1700 self.assertEqual(self.serv_sock.recv(1000), b"done")
1701
1702 def _testSendmsgExcessCmsgReject(self):
1703 if not hasattr(socket, "CMSG_SPACE"):
1704 # Can only send one item
1705 with self.assertRaises(socket.error) as cm:
1706 self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
1707 self.assertIsNone(cm.exception.errno)
1708 self.sendToServer(b"done")
1709
1710 def testSendmsgAfterClose(self):
1711 # Check that sendmsg() fails on a closed socket.
1712 pass
1713
1714 def _testSendmsgAfterClose(self):
1715 self.cli_sock.close()
1716 self.assertRaises(socket.error, self.sendmsgToServer, [MSG])
1717
1718
1719class SendmsgStreamTests(SendmsgTests):
1720 # Tests for sendmsg() which require a stream socket and do not
1721 # involve recvmsg() or recvmsg_into().
1722
1723 def testSendmsgExplicitNoneAddr(self):
1724 # Check that peer address can be specified as None.
1725 self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
1726
1727 def _testSendmsgExplicitNoneAddr(self):
1728 self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
1729
1730 def testSendmsgTimeout(self):
1731 # Check that timeout works with sendmsg().
1732 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1733 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1734
1735 def _testSendmsgTimeout(self):
1736 try:
1737 self.cli_sock.settimeout(0.03)
1738 with self.assertRaises(socket.timeout):
1739 while True:
1740 self.sendmsgToServer([b"a"*512])
1741 finally:
1742 self.misc_event.set()
1743
1744 # XXX: would be nice to have more tests for sendmsg flags argument.
1745
1746 # Linux supports MSG_DONTWAIT when sending, but in general, it
1747 # only works when receiving. Could add other platforms if they
1748 # support it too.
1749 @skipWithClientIf(sys.platform not in {"linux2"},
1750 "MSG_DONTWAIT not known to work on this platform when "
1751 "sending")
1752 def testSendmsgDontWait(self):
1753 # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
1754 self.assertEqual(self.serv_sock.recv(512), b"a"*512)
1755 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1756
1757 @testSendmsgDontWait.client_skip
1758 def _testSendmsgDontWait(self):
1759 try:
1760 with self.assertRaises(socket.error) as cm:
1761 while True:
1762 self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
1763 self.assertIn(cm.exception.errno,
1764 (errno.EAGAIN, errno.EWOULDBLOCK))
1765 finally:
1766 self.misc_event.set()
1767
1768
1769class SendmsgConnectionlessTests(SendmsgTests):
1770 # Tests for sendmsg() which require a connectionless-mode
1771 # (e.g. datagram) socket, and do not involve recvmsg() or
1772 # recvmsg_into().
1773
1774 def testSendmsgNoDestAddr(self):
1775 # Check that sendmsg() fails when no destination address is
1776 # given for unconnected socket.
1777 pass
1778
1779 def _testSendmsgNoDestAddr(self):
1780 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1781 [MSG])
1782 self.assertRaises(socket.error, self.cli_sock.sendmsg,
1783 [MSG], [], 0, None)
1784
1785
1786class RecvmsgGenericTests(SendrecvmsgBase):
1787 # Tests for recvmsg() which can also be emulated using
1788 # recvmsg_into(), and can use any socket type.
1789
1790 def testRecvmsg(self):
1791 # Receive a simple message with recvmsg[_into]().
1792 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1793 self.assertEqual(msg, MSG)
1794 self.checkRecvmsgAddress(addr, self.cli_addr)
1795 self.assertEqual(ancdata, [])
1796 self.checkFlags(flags, eor=True)
1797
1798 def _testRecvmsg(self):
1799 self.sendToServer(MSG)
1800
1801 def testRecvmsgExplicitDefaults(self):
1802 # Test recvmsg[_into]() with default arguments provided explicitly.
1803 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1804 len(MSG), 0, 0)
1805 self.assertEqual(msg, MSG)
1806 self.checkRecvmsgAddress(addr, self.cli_addr)
1807 self.assertEqual(ancdata, [])
1808 self.checkFlags(flags, eor=True)
1809
1810 def _testRecvmsgExplicitDefaults(self):
1811 self.sendToServer(MSG)
1812
1813 def testRecvmsgShorter(self):
1814 # Receive a message smaller than buffer.
1815 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1816 len(MSG) + 42)
1817 self.assertEqual(msg, MSG)
1818 self.checkRecvmsgAddress(addr, self.cli_addr)
1819 self.assertEqual(ancdata, [])
1820 self.checkFlags(flags, eor=True)
1821
1822 def _testRecvmsgShorter(self):
1823 self.sendToServer(MSG)
1824
Charles-François Natali8619cd72011-10-03 19:43:15 +02001825 # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
1826 # datagram is received (issue #13001).
1827 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001828 def testRecvmsgTrunc(self):
1829 # Receive part of message, check for truncation indicators.
1830 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1831 len(MSG) - 3)
1832 self.assertEqual(msg, MSG[:-3])
1833 self.checkRecvmsgAddress(addr, self.cli_addr)
1834 self.assertEqual(ancdata, [])
1835 self.checkFlags(flags, eor=False)
1836
Charles-François Natali8619cd72011-10-03 19:43:15 +02001837 @support.requires_freebsd_version(8)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10001838 def _testRecvmsgTrunc(self):
1839 self.sendToServer(MSG)
1840
1841 def testRecvmsgShortAncillaryBuf(self):
1842 # Test ancillary data buffer too small to hold any ancillary data.
1843 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1844 len(MSG), 1)
1845 self.assertEqual(msg, MSG)
1846 self.checkRecvmsgAddress(addr, self.cli_addr)
1847 self.assertEqual(ancdata, [])
1848 self.checkFlags(flags, eor=True)
1849
1850 def _testRecvmsgShortAncillaryBuf(self):
1851 self.sendToServer(MSG)
1852
1853 def testRecvmsgLongAncillaryBuf(self):
1854 # Test large ancillary data buffer.
1855 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1856 len(MSG), 10240)
1857 self.assertEqual(msg, MSG)
1858 self.checkRecvmsgAddress(addr, self.cli_addr)
1859 self.assertEqual(ancdata, [])
1860 self.checkFlags(flags, eor=True)
1861
1862 def _testRecvmsgLongAncillaryBuf(self):
1863 self.sendToServer(MSG)
1864
1865 def testRecvmsgAfterClose(self):
1866 # Check that recvmsg[_into]() fails on a closed socket.
1867 self.serv_sock.close()
1868 self.assertRaises(socket.error, self.doRecvmsg, self.serv_sock, 1024)
1869
1870 def _testRecvmsgAfterClose(self):
1871 pass
1872
1873 def testRecvmsgTimeout(self):
1874 # Check that timeout works.
1875 try:
1876 self.serv_sock.settimeout(0.03)
1877 self.assertRaises(socket.timeout,
1878 self.doRecvmsg, self.serv_sock, len(MSG))
1879 finally:
1880 self.misc_event.set()
1881
1882 def _testRecvmsgTimeout(self):
1883 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
1884
1885 @requireAttrs(socket, "MSG_PEEK")
1886 def testRecvmsgPeek(self):
1887 # Check that MSG_PEEK in flags enables examination of pending
1888 # data without consuming it.
1889
1890 # Receive part of data with MSG_PEEK.
1891 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1892 len(MSG) - 3, 0,
1893 socket.MSG_PEEK)
1894 self.assertEqual(msg, MSG[:-3])
1895 self.checkRecvmsgAddress(addr, self.cli_addr)
1896 self.assertEqual(ancdata, [])
1897 # Ignoring MSG_TRUNC here (so this test is the same for stream
1898 # and datagram sockets). Some wording in POSIX seems to
1899 # suggest that it needn't be set when peeking, but that may
1900 # just be a slip.
1901 self.checkFlags(flags, eor=False,
1902 ignore=getattr(socket, "MSG_TRUNC", 0))
1903
1904 # Receive all data with MSG_PEEK.
1905 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1906 len(MSG), 0,
1907 socket.MSG_PEEK)
1908 self.assertEqual(msg, MSG)
1909 self.checkRecvmsgAddress(addr, self.cli_addr)
1910 self.assertEqual(ancdata, [])
1911 self.checkFlags(flags, eor=True)
1912
1913 # Check that the same data can still be received normally.
1914 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1915 self.assertEqual(msg, MSG)
1916 self.checkRecvmsgAddress(addr, self.cli_addr)
1917 self.assertEqual(ancdata, [])
1918 self.checkFlags(flags, eor=True)
1919
1920 @testRecvmsgPeek.client_skip
1921 def _testRecvmsgPeek(self):
1922 self.sendToServer(MSG)
1923
1924 @requireAttrs(socket.socket, "sendmsg")
1925 def testRecvmsgFromSendmsg(self):
1926 # Test receiving with recvmsg[_into]() when message is sent
1927 # using sendmsg().
1928 self.serv_sock.settimeout(self.fail_timeout)
1929 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
1930 self.assertEqual(msg, MSG)
1931 self.checkRecvmsgAddress(addr, self.cli_addr)
1932 self.assertEqual(ancdata, [])
1933 self.checkFlags(flags, eor=True)
1934
1935 @testRecvmsgFromSendmsg.client_skip
1936 def _testRecvmsgFromSendmsg(self):
1937 self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
1938
1939
1940class RecvmsgGenericStreamTests(RecvmsgGenericTests):
1941 # Tests which require a stream socket and can use either recvmsg()
1942 # or recvmsg_into().
1943
1944 def testRecvmsgEOF(self):
1945 # Receive end-of-stream indicator (b"", peer socket closed).
1946 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
1947 self.assertEqual(msg, b"")
1948 self.checkRecvmsgAddress(addr, self.cli_addr)
1949 self.assertEqual(ancdata, [])
1950 self.checkFlags(flags, eor=None) # Might not have end-of-record marker
1951
1952 def _testRecvmsgEOF(self):
1953 self.cli_sock.close()
1954
1955 def testRecvmsgOverflow(self):
1956 # Receive a message in more than one chunk.
1957 seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
1958 len(MSG) - 3)
1959 self.checkRecvmsgAddress(addr, self.cli_addr)
1960 self.assertEqual(ancdata, [])
1961 self.checkFlags(flags, eor=False)
1962
1963 seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
1964 self.checkRecvmsgAddress(addr, self.cli_addr)
1965 self.assertEqual(ancdata, [])
1966 self.checkFlags(flags, eor=True)
1967
1968 msg = seg1 + seg2
1969 self.assertEqual(msg, MSG)
1970
1971 def _testRecvmsgOverflow(self):
1972 self.sendToServer(MSG)
1973
1974
1975class RecvmsgTests(RecvmsgGenericTests):
1976 # Tests for recvmsg() which can use any socket type.
1977
1978 def testRecvmsgBadArgs(self):
1979 # Check that recvmsg() rejects invalid arguments.
1980 self.assertRaises(TypeError, self.serv_sock.recvmsg)
1981 self.assertRaises(ValueError, self.serv_sock.recvmsg,
1982 -1, 0, 0)
1983 self.assertRaises(ValueError, self.serv_sock.recvmsg,
1984 len(MSG), -1, 0)
1985 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1986 [bytearray(10)], 0, 0)
1987 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1988 object(), 0, 0)
1989 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1990 len(MSG), object(), 0)
1991 self.assertRaises(TypeError, self.serv_sock.recvmsg,
1992 len(MSG), 0, object())
1993
1994 msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
1995 self.assertEqual(msg, MSG)
1996 self.checkRecvmsgAddress(addr, self.cli_addr)
1997 self.assertEqual(ancdata, [])
1998 self.checkFlags(flags, eor=True)
1999
2000 def _testRecvmsgBadArgs(self):
2001 self.sendToServer(MSG)
2002
2003
2004class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
2005 # Tests for recvmsg_into() which can use any socket type.
2006
2007 def testRecvmsgIntoBadArgs(self):
2008 # Check that recvmsg_into() rejects invalid arguments.
2009 buf = bytearray(len(MSG))
2010 self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
2011 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2012 len(MSG), 0, 0)
2013 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2014 buf, 0, 0)
2015 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2016 [object()], 0, 0)
2017 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2018 [b"I'm not writable"], 0, 0)
2019 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2020 [buf, object()], 0, 0)
2021 self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
2022 [buf], -1, 0)
2023 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2024 [buf], object(), 0)
2025 self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
2026 [buf], 0, object())
2027
2028 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
2029 self.assertEqual(nbytes, len(MSG))
2030 self.assertEqual(buf, bytearray(MSG))
2031 self.checkRecvmsgAddress(addr, self.cli_addr)
2032 self.assertEqual(ancdata, [])
2033 self.checkFlags(flags, eor=True)
2034
2035 def _testRecvmsgIntoBadArgs(self):
2036 self.sendToServer(MSG)
2037
2038 def testRecvmsgIntoGenerator(self):
2039 # Receive into buffer obtained from a generator (not a sequence).
2040 buf = bytearray(len(MSG))
2041 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2042 (o for o in [buf]))
2043 self.assertEqual(nbytes, len(MSG))
2044 self.assertEqual(buf, bytearray(MSG))
2045 self.checkRecvmsgAddress(addr, self.cli_addr)
2046 self.assertEqual(ancdata, [])
2047 self.checkFlags(flags, eor=True)
2048
2049 def _testRecvmsgIntoGenerator(self):
2050 self.sendToServer(MSG)
2051
2052 def testRecvmsgIntoArray(self):
2053 # Receive into an array rather than the usual bytearray.
2054 buf = array.array("B", [0] * len(MSG))
2055 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
2056 self.assertEqual(nbytes, len(MSG))
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002057 self.assertEqual(buf.tobytes(), MSG)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002058 self.checkRecvmsgAddress(addr, self.cli_addr)
2059 self.assertEqual(ancdata, [])
2060 self.checkFlags(flags, eor=True)
2061
2062 def _testRecvmsgIntoArray(self):
2063 self.sendToServer(MSG)
2064
2065 def testRecvmsgIntoScatter(self):
2066 # Receive into multiple buffers (scatter write).
2067 b1 = bytearray(b"----")
2068 b2 = bytearray(b"0123456789")
2069 b3 = bytearray(b"--------------")
2070 nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
2071 [b1, memoryview(b2)[2:9], b3])
2072 self.assertEqual(nbytes, len(b"Mary had a little lamb"))
2073 self.assertEqual(b1, bytearray(b"Mary"))
2074 self.assertEqual(b2, bytearray(b"01 had a 9"))
2075 self.assertEqual(b3, bytearray(b"little lamb---"))
2076 self.checkRecvmsgAddress(addr, self.cli_addr)
2077 self.assertEqual(ancdata, [])
2078 self.checkFlags(flags, eor=True)
2079
2080 def _testRecvmsgIntoScatter(self):
2081 self.sendToServer(b"Mary had a little lamb")
2082
2083
2084class CmsgMacroTests(unittest.TestCase):
2085 # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
2086 # assumptions used by sendmsg() and recvmsg[_into](), which share
2087 # code with these functions.
2088
2089 # Match the definition in socketmodule.c
2090 socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
2091
2092 @requireAttrs(socket, "CMSG_LEN")
2093 def testCMSG_LEN(self):
2094 # Test CMSG_LEN() with various valid and invalid values,
2095 # checking the assumptions used by recvmsg() and sendmsg().
2096 toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
2097 values = list(range(257)) + list(range(toobig - 257, toobig))
2098
2099 # struct cmsghdr has at least three members, two of which are ints
2100 self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
2101 for n in values:
2102 ret = socket.CMSG_LEN(n)
2103 # This is how recvmsg() calculates the data size
2104 self.assertEqual(ret - socket.CMSG_LEN(0), n)
2105 self.assertLessEqual(ret, self.socklen_t_limit)
2106
2107 self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
2108 # sendmsg() shares code with these functions, and requires
2109 # that it reject values over the limit.
2110 self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
2111 self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
2112
2113 @requireAttrs(socket, "CMSG_SPACE")
2114 def testCMSG_SPACE(self):
2115 # Test CMSG_SPACE() with various valid and invalid values,
2116 # checking the assumptions used by sendmsg().
2117 toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
2118 values = list(range(257)) + list(range(toobig - 257, toobig))
2119
2120 last = socket.CMSG_SPACE(0)
2121 # struct cmsghdr has at least three members, two of which are ints
2122 self.assertGreater(last, array.array("i").itemsize * 2)
2123 for n in values:
2124 ret = socket.CMSG_SPACE(n)
2125 self.assertGreaterEqual(ret, last)
2126 self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
2127 self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
2128 self.assertLessEqual(ret, self.socklen_t_limit)
2129 last = ret
2130
2131 self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
2132 # sendmsg() shares code with these functions, and requires
2133 # that it reject values over the limit.
2134 self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
2135 self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
2136
2137
2138class SCMRightsTest(SendrecvmsgServerTimeoutBase):
2139 # Tests for file descriptor passing on Unix-domain sockets.
2140
2141 # Invalid file descriptor value that's unlikely to evaluate to a
2142 # real FD even if one of its bytes is replaced with a different
2143 # value (which shouldn't actually happen).
2144 badfd = -0x5555
2145
2146 def newFDs(self, n):
2147 # Return a list of n file descriptors for newly-created files
2148 # containing their list indices as ASCII numbers.
2149 fds = []
2150 for i in range(n):
2151 fd, path = tempfile.mkstemp()
2152 self.addCleanup(os.unlink, path)
2153 self.addCleanup(os.close, fd)
2154 os.write(fd, str(i).encode())
2155 fds.append(fd)
2156 return fds
2157
2158 def checkFDs(self, fds):
2159 # Check that the file descriptors in the given list contain
2160 # their correct list indices as ASCII numbers.
2161 for n, fd in enumerate(fds):
2162 os.lseek(fd, 0, os.SEEK_SET)
2163 self.assertEqual(os.read(fd, 1024), str(n).encode())
2164
2165 def registerRecvmsgResult(self, result):
2166 self.addCleanup(self.closeRecvmsgFDs, result)
2167
2168 def closeRecvmsgFDs(self, recvmsg_result):
2169 # Close all file descriptors specified in the ancillary data
2170 # of the given return value from recvmsg() or recvmsg_into().
2171 for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
2172 if (cmsg_level == socket.SOL_SOCKET and
2173 cmsg_type == socket.SCM_RIGHTS):
2174 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002175 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002176 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2177 for fd in fds:
2178 os.close(fd)
2179
2180 def createAndSendFDs(self, n):
2181 # Send n new file descriptors created by newFDs() to the
2182 # server, with the constant MSG as the non-ancillary data.
2183 self.assertEqual(
2184 self.sendmsgToServer([MSG],
2185 [(socket.SOL_SOCKET,
2186 socket.SCM_RIGHTS,
2187 array.array("i", self.newFDs(n)))]),
2188 len(MSG))
2189
2190 def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
2191 # Check that constant MSG was received with numfds file
2192 # descriptors in a maximum of maxcmsgs control messages (which
2193 # must contain only complete integers). By default, check
2194 # that MSG_CTRUNC is unset, but ignore any flags in
2195 # ignoreflags.
2196 msg, ancdata, flags, addr = result
2197 self.assertEqual(msg, MSG)
2198 self.checkRecvmsgAddress(addr, self.cli_addr)
2199 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2200 ignore=ignoreflags)
2201
2202 self.assertIsInstance(ancdata, list)
2203 self.assertLessEqual(len(ancdata), maxcmsgs)
2204 fds = array.array("i")
2205 for item in ancdata:
2206 self.assertIsInstance(item, tuple)
2207 cmsg_level, cmsg_type, cmsg_data = item
2208 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2209 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2210 self.assertIsInstance(cmsg_data, bytes)
2211 self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002212 fds.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002213
2214 self.assertEqual(len(fds), numfds)
2215 self.checkFDs(fds)
2216
2217 def testFDPassSimple(self):
2218 # Pass a single FD (array read from bytes object).
2219 self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
2220 len(MSG), 10240))
2221
2222 def _testFDPassSimple(self):
2223 self.assertEqual(
2224 self.sendmsgToServer(
2225 [MSG],
2226 [(socket.SOL_SOCKET,
2227 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002228 array.array("i", self.newFDs(1)).tobytes())]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002229 len(MSG))
2230
2231 def testMultipleFDPass(self):
2232 # Pass multiple FDs in a single array.
2233 self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
2234 len(MSG), 10240))
2235
2236 def _testMultipleFDPass(self):
2237 self.createAndSendFDs(4)
2238
2239 @requireAttrs(socket, "CMSG_SPACE")
2240 def testFDPassCMSG_SPACE(self):
2241 # Test using CMSG_SPACE() to calculate ancillary buffer size.
2242 self.checkRecvmsgFDs(
2243 4, self.doRecvmsg(self.serv_sock, len(MSG),
2244 socket.CMSG_SPACE(4 * SIZEOF_INT)))
2245
2246 @testFDPassCMSG_SPACE.client_skip
2247 def _testFDPassCMSG_SPACE(self):
2248 self.createAndSendFDs(4)
2249
2250 def testFDPassCMSG_LEN(self):
2251 # Test using CMSG_LEN() to calculate ancillary buffer size.
2252 self.checkRecvmsgFDs(1,
2253 self.doRecvmsg(self.serv_sock, len(MSG),
2254 socket.CMSG_LEN(4 * SIZEOF_INT)),
2255 # RFC 3542 says implementations may set
2256 # MSG_CTRUNC if there isn't enough space
2257 # for trailing padding.
2258 ignoreflags=socket.MSG_CTRUNC)
2259
2260 def _testFDPassCMSG_LEN(self):
2261 self.createAndSendFDs(1)
2262
Nick Coghlan2496f332011-09-19 20:26:31 +10002263 # Issue #12958: The following test has problems on Mac OS X
2264 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002265 @requireAttrs(socket, "CMSG_SPACE")
2266 def testFDPassSeparate(self):
2267 # Pass two FDs in two separate arrays. Arrays may be combined
2268 # into a single control message by the OS.
2269 self.checkRecvmsgFDs(2,
2270 self.doRecvmsg(self.serv_sock, len(MSG), 10240),
2271 maxcmsgs=2)
2272
2273 @testFDPassSeparate.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002274 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002275 def _testFDPassSeparate(self):
2276 fd0, fd1 = self.newFDs(2)
2277 self.assertEqual(
2278 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2279 socket.SCM_RIGHTS,
2280 array.array("i", [fd0])),
2281 (socket.SOL_SOCKET,
2282 socket.SCM_RIGHTS,
2283 array.array("i", [fd1]))]),
2284 len(MSG))
2285
Nick Coghlan2496f332011-09-19 20:26:31 +10002286 # Issue #12958: The following test has problems on Mac OS X
2287 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002288 @requireAttrs(socket, "CMSG_SPACE")
2289 def testFDPassSeparateMinSpace(self):
2290 # Pass two FDs in two separate arrays, receiving them into the
2291 # minimum space for two arrays.
2292 self.checkRecvmsgFDs(2,
2293 self.doRecvmsg(self.serv_sock, len(MSG),
2294 socket.CMSG_SPACE(SIZEOF_INT) +
2295 socket.CMSG_LEN(SIZEOF_INT)),
2296 maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
2297
2298 @testFDPassSeparateMinSpace.client_skip
Nick Coghlan2496f332011-09-19 20:26:31 +10002299 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002300 def _testFDPassSeparateMinSpace(self):
2301 fd0, fd1 = self.newFDs(2)
2302 self.assertEqual(
2303 self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
2304 socket.SCM_RIGHTS,
2305 array.array("i", [fd0])),
2306 (socket.SOL_SOCKET,
2307 socket.SCM_RIGHTS,
2308 array.array("i", [fd1]))]),
2309 len(MSG))
2310
2311 def sendAncillaryIfPossible(self, msg, ancdata):
2312 # Try to send msg and ancdata to server, but if the system
2313 # call fails, just send msg with no ancillary data.
2314 try:
2315 nbytes = self.sendmsgToServer([msg], ancdata)
2316 except socket.error as e:
2317 # Check that it was the system call that failed
2318 self.assertIsInstance(e.errno, int)
2319 nbytes = self.sendmsgToServer([msg])
2320 self.assertEqual(nbytes, len(msg))
2321
2322 def testFDPassEmpty(self):
2323 # Try to pass an empty FD array. Can receive either no array
2324 # or an empty array.
2325 self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
2326 len(MSG), 10240),
2327 ignoreflags=socket.MSG_CTRUNC)
2328
2329 def _testFDPassEmpty(self):
2330 self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
2331 socket.SCM_RIGHTS,
2332 b"")])
2333
2334 def testFDPassPartialInt(self):
2335 # Try to pass a truncated FD array.
2336 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2337 len(MSG), 10240)
2338 self.assertEqual(msg, MSG)
2339 self.checkRecvmsgAddress(addr, self.cli_addr)
2340 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2341 self.assertLessEqual(len(ancdata), 1)
2342 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2343 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2344 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2345 self.assertLess(len(cmsg_data), SIZEOF_INT)
2346
2347 def _testFDPassPartialInt(self):
2348 self.sendAncillaryIfPossible(
2349 MSG,
2350 [(socket.SOL_SOCKET,
2351 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002352 array.array("i", [self.badfd]).tobytes()[:-1])])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002353
2354 @requireAttrs(socket, "CMSG_SPACE")
2355 def testFDPassPartialIntInMiddle(self):
2356 # Try to pass two FD arrays, the first of which is truncated.
2357 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2358 len(MSG), 10240)
2359 self.assertEqual(msg, MSG)
2360 self.checkRecvmsgAddress(addr, self.cli_addr)
2361 self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
2362 self.assertLessEqual(len(ancdata), 2)
2363 fds = array.array("i")
2364 # Arrays may have been combined in a single control message
2365 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2366 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2367 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002368 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002369 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2370 self.assertLessEqual(len(fds), 2)
2371 self.checkFDs(fds)
2372
2373 @testFDPassPartialIntInMiddle.client_skip
2374 def _testFDPassPartialIntInMiddle(self):
2375 fd0, fd1 = self.newFDs(2)
2376 self.sendAncillaryIfPossible(
2377 MSG,
2378 [(socket.SOL_SOCKET,
2379 socket.SCM_RIGHTS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002380 array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002381 (socket.SOL_SOCKET,
2382 socket.SCM_RIGHTS,
2383 array.array("i", [fd1]))])
2384
2385 def checkTruncatedHeader(self, result, ignoreflags=0):
2386 # Check that no ancillary data items are returned when data is
2387 # truncated inside the cmsghdr structure.
2388 msg, ancdata, flags, addr = result
2389 self.assertEqual(msg, MSG)
2390 self.checkRecvmsgAddress(addr, self.cli_addr)
2391 self.assertEqual(ancdata, [])
2392 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2393 ignore=ignoreflags)
2394
2395 def testCmsgTruncNoBufSize(self):
2396 # Check that no ancillary data is received when no buffer size
2397 # is specified.
2398 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
2399 # BSD seems to set MSG_CTRUNC only
2400 # if an item has been partially
2401 # received.
2402 ignoreflags=socket.MSG_CTRUNC)
2403
2404 def _testCmsgTruncNoBufSize(self):
2405 self.createAndSendFDs(1)
2406
2407 def testCmsgTrunc0(self):
2408 # Check that no ancillary data is received when buffer size is 0.
2409 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
2410 ignoreflags=socket.MSG_CTRUNC)
2411
2412 def _testCmsgTrunc0(self):
2413 self.createAndSendFDs(1)
2414
2415 # Check that no ancillary data is returned for various non-zero
2416 # (but still too small) buffer sizes.
2417
2418 def testCmsgTrunc1(self):
2419 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
2420
2421 def _testCmsgTrunc1(self):
2422 self.createAndSendFDs(1)
2423
2424 def testCmsgTrunc2Int(self):
2425 # The cmsghdr structure has at least three members, two of
2426 # which are ints, so we still shouldn't see any ancillary
2427 # data.
2428 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2429 SIZEOF_INT * 2))
2430
2431 def _testCmsgTrunc2Int(self):
2432 self.createAndSendFDs(1)
2433
2434 def testCmsgTruncLen0Minus1(self):
2435 self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
2436 socket.CMSG_LEN(0) - 1))
2437
2438 def _testCmsgTruncLen0Minus1(self):
2439 self.createAndSendFDs(1)
2440
2441 # The following tests try to truncate the control message in the
2442 # middle of the FD array.
2443
2444 def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
2445 # Check that file descriptor data is truncated to between
2446 # mindata and maxdata bytes when received with buffer size
2447 # ancbuf, and that any complete file descriptor numbers are
2448 # valid.
2449 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2450 len(MSG), ancbuf)
2451 self.assertEqual(msg, MSG)
2452 self.checkRecvmsgAddress(addr, self.cli_addr)
2453 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2454
2455 if mindata == 0 and ancdata == []:
2456 return
2457 self.assertEqual(len(ancdata), 1)
2458 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2459 self.assertEqual(cmsg_level, socket.SOL_SOCKET)
2460 self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
2461 self.assertGreaterEqual(len(cmsg_data), mindata)
2462 self.assertLessEqual(len(cmsg_data), maxdata)
2463 fds = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002464 fds.frombytes(cmsg_data[:
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002465 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
2466 self.checkFDs(fds)
2467
2468 def testCmsgTruncLen0(self):
2469 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
2470
2471 def _testCmsgTruncLen0(self):
2472 self.createAndSendFDs(1)
2473
2474 def testCmsgTruncLen0Plus1(self):
2475 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
2476
2477 def _testCmsgTruncLen0Plus1(self):
2478 self.createAndSendFDs(2)
2479
2480 def testCmsgTruncLen1(self):
2481 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
2482 maxdata=SIZEOF_INT)
2483
2484 def _testCmsgTruncLen1(self):
2485 self.createAndSendFDs(2)
2486
2487 def testCmsgTruncLen2Minus1(self):
2488 self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
2489 maxdata=(2 * SIZEOF_INT) - 1)
2490
2491 def _testCmsgTruncLen2Minus1(self):
2492 self.createAndSendFDs(2)
2493
2494
2495class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
2496 # Test sendmsg() and recvmsg[_into]() using the ancillary data
2497 # features of the RFC 3542 Advanced Sockets API for IPv6.
2498 # Currently we can only handle certain data items (e.g. traffic
2499 # class, hop limit, MTU discovery and fragmentation settings)
2500 # without resorting to unportable means such as the struct module,
2501 # but the tests here are aimed at testing the ancillary data
2502 # handling in sendmsg() and recvmsg() rather than the IPv6 API
2503 # itself.
2504
2505 # Test value to use when setting hop limit of packet
2506 hop_limit = 2
2507
2508 # Test value to use when setting traffic class of packet.
2509 # -1 means "use kernel default".
2510 traffic_class = -1
2511
2512 def ancillaryMapping(self, ancdata):
2513 # Given ancillary data list ancdata, return a mapping from
2514 # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
2515 # Check that no (level, type) pair appears more than once.
2516 d = {}
2517 for cmsg_level, cmsg_type, cmsg_data in ancdata:
2518 self.assertNotIn((cmsg_level, cmsg_type), d)
2519 d[(cmsg_level, cmsg_type)] = cmsg_data
2520 return d
2521
2522 def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
2523 # Receive hop limit into ancbufsize bytes of ancillary data
2524 # space. Check that data is MSG, ancillary data is not
2525 # truncated (but ignore any flags in ignoreflags), and hop
2526 # limit is between 0 and maxhop inclusive.
2527 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2528 socket.IPV6_RECVHOPLIMIT, 1)
2529 self.misc_event.set()
2530 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2531 len(MSG), ancbufsize)
2532
2533 self.assertEqual(msg, MSG)
2534 self.checkRecvmsgAddress(addr, self.cli_addr)
2535 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2536 ignore=ignoreflags)
2537
2538 self.assertEqual(len(ancdata), 1)
2539 self.assertIsInstance(ancdata[0], tuple)
2540 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2541 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2542 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2543 self.assertIsInstance(cmsg_data, bytes)
2544 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2545 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002546 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002547 self.assertGreaterEqual(a[0], 0)
2548 self.assertLessEqual(a[0], maxhop)
2549
2550 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2551 def testRecvHopLimit(self):
2552 # Test receiving the packet hop limit as ancillary data.
2553 self.checkHopLimit(ancbufsize=10240)
2554
2555 @testRecvHopLimit.client_skip
2556 def _testRecvHopLimit(self):
2557 # Need to wait until server has asked to receive ancillary
2558 # data, as implementations are not required to buffer it
2559 # otherwise.
2560 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2561 self.sendToServer(MSG)
2562
2563 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2564 def testRecvHopLimitCMSG_SPACE(self):
2565 # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
2566 self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
2567
2568 @testRecvHopLimitCMSG_SPACE.client_skip
2569 def _testRecvHopLimitCMSG_SPACE(self):
2570 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2571 self.sendToServer(MSG)
2572
2573 # Could test receiving into buffer sized using CMSG_LEN, but RFC
2574 # 3542 says portable applications must provide space for trailing
2575 # padding. Implementations may set MSG_CTRUNC if there isn't
2576 # enough space for the padding.
2577
2578 @requireAttrs(socket.socket, "sendmsg")
2579 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2580 def testSetHopLimit(self):
2581 # Test setting hop limit on outgoing packet and receiving it
2582 # at the other end.
2583 self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
2584
2585 @testSetHopLimit.client_skip
2586 def _testSetHopLimit(self):
2587 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2588 self.assertEqual(
2589 self.sendmsgToServer([MSG],
2590 [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2591 array.array("i", [self.hop_limit]))]),
2592 len(MSG))
2593
2594 def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
2595 ignoreflags=0):
2596 # Receive traffic class and hop limit into ancbufsize bytes of
2597 # ancillary data space. Check that data is MSG, ancillary
2598 # data is not truncated (but ignore any flags in ignoreflags),
2599 # and traffic class and hop limit are in range (hop limit no
2600 # more than maxhop).
2601 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2602 socket.IPV6_RECVHOPLIMIT, 1)
2603 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2604 socket.IPV6_RECVTCLASS, 1)
2605 self.misc_event.set()
2606 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2607 len(MSG), ancbufsize)
2608
2609 self.assertEqual(msg, MSG)
2610 self.checkRecvmsgAddress(addr, self.cli_addr)
2611 self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
2612 ignore=ignoreflags)
2613 self.assertEqual(len(ancdata), 2)
2614 ancmap = self.ancillaryMapping(ancdata)
2615
2616 tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
2617 self.assertEqual(len(tcdata), SIZEOF_INT)
2618 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002619 a.frombytes(tcdata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002620 self.assertGreaterEqual(a[0], 0)
2621 self.assertLessEqual(a[0], 255)
2622
2623 hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
2624 self.assertEqual(len(hldata), SIZEOF_INT)
2625 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002626 a.frombytes(hldata)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002627 self.assertGreaterEqual(a[0], 0)
2628 self.assertLessEqual(a[0], maxhop)
2629
2630 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2631 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2632 def testRecvTrafficClassAndHopLimit(self):
2633 # Test receiving traffic class and hop limit as ancillary data.
2634 self.checkTrafficClassAndHopLimit(ancbufsize=10240)
2635
2636 @testRecvTrafficClassAndHopLimit.client_skip
2637 def _testRecvTrafficClassAndHopLimit(self):
2638 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2639 self.sendToServer(MSG)
2640
2641 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2642 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2643 def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2644 # Test receiving traffic class and hop limit, using
2645 # CMSG_SPACE() to calculate buffer size.
2646 self.checkTrafficClassAndHopLimit(
2647 ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
2648
2649 @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
2650 def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
2651 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2652 self.sendToServer(MSG)
2653
2654 @requireAttrs(socket.socket, "sendmsg")
2655 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2656 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2657 def testSetTrafficClassAndHopLimit(self):
2658 # Test setting traffic class and hop limit on outgoing packet,
2659 # and receiving them at the other end.
2660 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2661 maxhop=self.hop_limit)
2662
2663 @testSetTrafficClassAndHopLimit.client_skip
2664 def _testSetTrafficClassAndHopLimit(self):
2665 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2666 self.assertEqual(
2667 self.sendmsgToServer([MSG],
2668 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2669 array.array("i", [self.traffic_class])),
2670 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2671 array.array("i", [self.hop_limit]))]),
2672 len(MSG))
2673
2674 @requireAttrs(socket.socket, "sendmsg")
2675 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2676 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2677 def testOddCmsgSize(self):
2678 # Try to send ancillary data with first item one byte too
2679 # long. Fall back to sending with correct size if this fails,
2680 # and check that second item was handled correctly.
2681 self.checkTrafficClassAndHopLimit(ancbufsize=10240,
2682 maxhop=self.hop_limit)
2683
2684 @testOddCmsgSize.client_skip
2685 def _testOddCmsgSize(self):
2686 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2687 try:
2688 nbytes = self.sendmsgToServer(
2689 [MSG],
2690 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002691 array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002692 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2693 array.array("i", [self.hop_limit]))])
2694 except socket.error as e:
2695 self.assertIsInstance(e.errno, int)
2696 nbytes = self.sendmsgToServer(
2697 [MSG],
2698 [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
2699 array.array("i", [self.traffic_class])),
2700 (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
2701 array.array("i", [self.hop_limit]))])
2702 self.assertEqual(nbytes, len(MSG))
2703
2704 # Tests for proper handling of truncated ancillary data
2705
2706 def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
2707 # Receive hop limit into ancbufsize bytes of ancillary data
2708 # space, which should be too small to contain the ancillary
2709 # data header (if ancbufsize is None, pass no second argument
2710 # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
2711 # (unless included in ignoreflags), and no ancillary data is
2712 # returned.
2713 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2714 socket.IPV6_RECVHOPLIMIT, 1)
2715 self.misc_event.set()
2716 args = () if ancbufsize is None else (ancbufsize,)
2717 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2718 len(MSG), *args)
2719
2720 self.assertEqual(msg, MSG)
2721 self.checkRecvmsgAddress(addr, self.cli_addr)
2722 self.assertEqual(ancdata, [])
2723 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2724 ignore=ignoreflags)
2725
2726 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2727 def testCmsgTruncNoBufSize(self):
2728 # Check that no ancillary data is received when no ancillary
2729 # buffer size is provided.
2730 self.checkHopLimitTruncatedHeader(ancbufsize=None,
2731 # BSD seems to set
2732 # MSG_CTRUNC only if an item
2733 # has been partially
2734 # received.
2735 ignoreflags=socket.MSG_CTRUNC)
2736
2737 @testCmsgTruncNoBufSize.client_skip
2738 def _testCmsgTruncNoBufSize(self):
2739 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2740 self.sendToServer(MSG)
2741
2742 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2743 def testSingleCmsgTrunc0(self):
2744 # Check that no ancillary data is received when ancillary
2745 # buffer size is zero.
2746 self.checkHopLimitTruncatedHeader(ancbufsize=0,
2747 ignoreflags=socket.MSG_CTRUNC)
2748
2749 @testSingleCmsgTrunc0.client_skip
2750 def _testSingleCmsgTrunc0(self):
2751 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2752 self.sendToServer(MSG)
2753
2754 # Check that no ancillary data is returned for various non-zero
2755 # (but still too small) buffer sizes.
2756
2757 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2758 def testSingleCmsgTrunc1(self):
2759 self.checkHopLimitTruncatedHeader(ancbufsize=1)
2760
2761 @testSingleCmsgTrunc1.client_skip
2762 def _testSingleCmsgTrunc1(self):
2763 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2764 self.sendToServer(MSG)
2765
2766 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2767 def testSingleCmsgTrunc2Int(self):
2768 self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
2769
2770 @testSingleCmsgTrunc2Int.client_skip
2771 def _testSingleCmsgTrunc2Int(self):
2772 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2773 self.sendToServer(MSG)
2774
2775 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2776 def testSingleCmsgTruncLen0Minus1(self):
2777 self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
2778
2779 @testSingleCmsgTruncLen0Minus1.client_skip
2780 def _testSingleCmsgTruncLen0Minus1(self):
2781 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2782 self.sendToServer(MSG)
2783
2784 @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
2785 def testSingleCmsgTruncInData(self):
2786 # Test truncation of a control message inside its associated
2787 # data. The message may be returned with its data truncated,
2788 # or not returned at all.
2789 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2790 socket.IPV6_RECVHOPLIMIT, 1)
2791 self.misc_event.set()
2792 msg, ancdata, flags, addr = self.doRecvmsg(
2793 self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
2794
2795 self.assertEqual(msg, MSG)
2796 self.checkRecvmsgAddress(addr, self.cli_addr)
2797 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2798
2799 self.assertLessEqual(len(ancdata), 1)
2800 if ancdata:
2801 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2802 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2803 self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
2804 self.assertLess(len(cmsg_data), SIZEOF_INT)
2805
2806 @testSingleCmsgTruncInData.client_skip
2807 def _testSingleCmsgTruncInData(self):
2808 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2809 self.sendToServer(MSG)
2810
2811 def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
2812 # Receive traffic class and hop limit into ancbufsize bytes of
2813 # ancillary data space, which should be large enough to
2814 # contain the first item, but too small to contain the header
2815 # of the second. Check that data is MSG, MSG_CTRUNC is set
2816 # (unless included in ignoreflags), and only one ancillary
2817 # data item is returned.
2818 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2819 socket.IPV6_RECVHOPLIMIT, 1)
2820 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2821 socket.IPV6_RECVTCLASS, 1)
2822 self.misc_event.set()
2823 msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
2824 len(MSG), ancbufsize)
2825
2826 self.assertEqual(msg, MSG)
2827 self.checkRecvmsgAddress(addr, self.cli_addr)
2828 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
2829 ignore=ignoreflags)
2830
2831 self.assertEqual(len(ancdata), 1)
2832 cmsg_level, cmsg_type, cmsg_data = ancdata[0]
2833 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2834 self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
2835 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2836 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002837 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002838 self.assertGreaterEqual(a[0], 0)
2839 self.assertLessEqual(a[0], 255)
2840
2841 # Try the above test with various buffer sizes.
2842
2843 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2844 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2845 def testSecondCmsgTrunc0(self):
2846 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
2847 ignoreflags=socket.MSG_CTRUNC)
2848
2849 @testSecondCmsgTrunc0.client_skip
2850 def _testSecondCmsgTrunc0(self):
2851 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2852 self.sendToServer(MSG)
2853
2854 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2855 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2856 def testSecondCmsgTrunc1(self):
2857 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
2858
2859 @testSecondCmsgTrunc1.client_skip
2860 def _testSecondCmsgTrunc1(self):
2861 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2862 self.sendToServer(MSG)
2863
2864 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2865 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2866 def testSecondCmsgTrunc2Int(self):
2867 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
2868 2 * SIZEOF_INT)
2869
2870 @testSecondCmsgTrunc2Int.client_skip
2871 def _testSecondCmsgTrunc2Int(self):
2872 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2873 self.sendToServer(MSG)
2874
2875 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2876 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2877 def testSecondCmsgTruncLen0Minus1(self):
2878 self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
2879 socket.CMSG_LEN(0) - 1)
2880
2881 @testSecondCmsgTruncLen0Minus1.client_skip
2882 def _testSecondCmsgTruncLen0Minus1(self):
2883 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2884 self.sendToServer(MSG)
2885
2886 @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
2887 "IPV6_RECVTCLASS", "IPV6_TCLASS")
2888 def testSecomdCmsgTruncInData(self):
2889 # Test truncation of the second of two control messages inside
2890 # its associated data.
2891 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2892 socket.IPV6_RECVHOPLIMIT, 1)
2893 self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
2894 socket.IPV6_RECVTCLASS, 1)
2895 self.misc_event.set()
2896 msg, ancdata, flags, addr = self.doRecvmsg(
2897 self.serv_sock, len(MSG),
2898 socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
2899
2900 self.assertEqual(msg, MSG)
2901 self.checkRecvmsgAddress(addr, self.cli_addr)
2902 self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
2903
2904 cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
2905
2906 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
2907 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2908 cmsg_types.remove(cmsg_type)
2909 self.assertEqual(len(cmsg_data), SIZEOF_INT)
2910 a = array.array("i")
Nadeem Vawda3d1706f2011-08-22 09:46:56 +02002911 a.frombytes(cmsg_data)
Nick Coghlan96fe56a2011-08-22 11:55:57 +10002912 self.assertGreaterEqual(a[0], 0)
2913 self.assertLessEqual(a[0], 255)
2914
2915 if ancdata:
2916 cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
2917 self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
2918 cmsg_types.remove(cmsg_type)
2919 self.assertLess(len(cmsg_data), SIZEOF_INT)
2920
2921 self.assertEqual(ancdata, [])
2922
2923 @testSecomdCmsgTruncInData.client_skip
2924 def _testSecomdCmsgTruncInData(self):
2925 self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
2926 self.sendToServer(MSG)
2927
2928
2929# Derive concrete test classes for different socket types.
2930
2931class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
2932 SendrecvmsgConnectionlessBase,
2933 ThreadedSocketTestMixin, UDPTestBase):
2934 pass
2935
2936@requireAttrs(socket.socket, "sendmsg")
2937@unittest.skipUnless(thread, 'Threading required for this test.')
2938class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
2939 pass
2940
2941@requireAttrs(socket.socket, "recvmsg")
2942@unittest.skipUnless(thread, 'Threading required for this test.')
2943class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
2944 pass
2945
2946@requireAttrs(socket.socket, "recvmsg_into")
2947@unittest.skipUnless(thread, 'Threading required for this test.')
2948class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
2949 pass
2950
2951
2952class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
2953 SendrecvmsgConnectionlessBase,
2954 ThreadedSocketTestMixin, UDP6TestBase):
2955 pass
2956
2957@requireAttrs(socket.socket, "sendmsg")
2958@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2959@requireSocket("AF_INET6", "SOCK_DGRAM")
2960@unittest.skipUnless(thread, 'Threading required for this test.')
2961class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
2962 pass
2963
2964@requireAttrs(socket.socket, "recvmsg")
2965@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2966@requireSocket("AF_INET6", "SOCK_DGRAM")
2967@unittest.skipUnless(thread, 'Threading required for this test.')
2968class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
2969 pass
2970
2971@requireAttrs(socket.socket, "recvmsg_into")
2972@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2973@requireSocket("AF_INET6", "SOCK_DGRAM")
2974@unittest.skipUnless(thread, 'Threading required for this test.')
2975class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
2976 pass
2977
2978@requireAttrs(socket.socket, "recvmsg")
2979@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2980@requireAttrs(socket, "IPPROTO_IPV6")
2981@requireSocket("AF_INET6", "SOCK_DGRAM")
2982@unittest.skipUnless(thread, 'Threading required for this test.')
2983class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
2984 SendrecvmsgUDP6TestBase):
2985 pass
2986
2987@requireAttrs(socket.socket, "recvmsg_into")
2988@unittest.skipUnless(socket.has_ipv6, "Python not built with IPv6 support")
2989@requireAttrs(socket, "IPPROTO_IPV6")
2990@requireSocket("AF_INET6", "SOCK_DGRAM")
2991@unittest.skipUnless(thread, 'Threading required for this test.')
2992class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
2993 RFC3542AncillaryTest,
2994 SendrecvmsgUDP6TestBase):
2995 pass
2996
2997
2998class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
2999 ConnectedStreamTestMixin, TCPTestBase):
3000 pass
3001
3002@requireAttrs(socket.socket, "sendmsg")
3003@unittest.skipUnless(thread, 'Threading required for this test.')
3004class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
3005 pass
3006
3007@requireAttrs(socket.socket, "recvmsg")
3008@unittest.skipUnless(thread, 'Threading required for this test.')
3009class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
3010 SendrecvmsgTCPTestBase):
3011 pass
3012
3013@requireAttrs(socket.socket, "recvmsg_into")
3014@unittest.skipUnless(thread, 'Threading required for this test.')
3015class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3016 SendrecvmsgTCPTestBase):
3017 pass
3018
3019
3020class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
3021 SendrecvmsgConnectedBase,
3022 ConnectedStreamTestMixin, SCTPStreamBase):
3023 pass
3024
3025@requireAttrs(socket.socket, "sendmsg")
3026@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3027@unittest.skipUnless(thread, 'Threading required for this test.')
3028class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
3029 pass
3030
3031@requireAttrs(socket.socket, "recvmsg")
3032@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3033@unittest.skipUnless(thread, 'Threading required for this test.')
3034class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3035 SendrecvmsgSCTPStreamTestBase):
3036 pass
3037
3038@requireAttrs(socket.socket, "recvmsg_into")
3039@requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
3040@unittest.skipUnless(thread, 'Threading required for this test.')
3041class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3042 SendrecvmsgSCTPStreamTestBase):
3043 pass
3044
3045
3046class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
3047 ConnectedStreamTestMixin, UnixStreamBase):
3048 pass
3049
3050@requireAttrs(socket.socket, "sendmsg")
3051@requireAttrs(socket, "AF_UNIX")
3052@unittest.skipUnless(thread, 'Threading required for this test.')
3053class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
3054 pass
3055
3056@requireAttrs(socket.socket, "recvmsg")
3057@requireAttrs(socket, "AF_UNIX")
3058@unittest.skipUnless(thread, 'Threading required for this test.')
3059class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
3060 SendrecvmsgUnixStreamTestBase):
3061 pass
3062
3063@requireAttrs(socket.socket, "recvmsg_into")
3064@requireAttrs(socket, "AF_UNIX")
3065@unittest.skipUnless(thread, 'Threading required for this test.')
3066class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
3067 SendrecvmsgUnixStreamTestBase):
3068 pass
3069
3070@requireAttrs(socket.socket, "sendmsg", "recvmsg")
3071@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3072@unittest.skipUnless(thread, 'Threading required for this test.')
3073class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
3074 pass
3075
3076@requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
3077@requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
3078@unittest.skipUnless(thread, 'Threading required for this test.')
3079class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
3080 SendrecvmsgUnixStreamTestBase):
3081 pass
3082
3083
3084# Test interrupting the interruptible send/receive methods with a
3085# signal when a timeout is set. These tests avoid having multiple
3086# threads alive during the test so that the OS cannot deliver the
3087# signal to the wrong one.
3088
3089class InterruptedTimeoutBase(unittest.TestCase):
3090 # Base class for interrupted send/receive tests. Installs an
3091 # empty handler for SIGALRM and removes it on teardown, along with
3092 # any scheduled alarms.
3093
3094 def setUp(self):
3095 super().setUp()
3096 orig_alrm_handler = signal.signal(signal.SIGALRM,
3097 lambda signum, frame: None)
3098 self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
3099 self.addCleanup(self.setAlarm, 0)
3100
3101 # Timeout for socket operations
3102 timeout = 4.0
3103
3104 # Provide setAlarm() method to schedule delivery of SIGALRM after
3105 # given number of seconds, or cancel it if zero, and an
3106 # appropriate time value to use. Use setitimer() if available.
3107 if hasattr(signal, "setitimer"):
3108 alarm_time = 0.05
3109
3110 def setAlarm(self, seconds):
3111 signal.setitimer(signal.ITIMER_REAL, seconds)
3112 else:
3113 # Old systems may deliver the alarm up to one second early
3114 alarm_time = 2
3115
3116 def setAlarm(self, seconds):
3117 signal.alarm(seconds)
3118
3119
3120# Require siginterrupt() in order to ensure that system calls are
3121# interrupted by default.
3122@requireAttrs(signal, "siginterrupt")
3123@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3124 "Don't have signal.alarm or signal.setitimer")
3125class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
3126 # Test interrupting the recv*() methods with signals when a
3127 # timeout is set.
3128
3129 def setUp(self):
3130 super().setUp()
3131 self.serv.settimeout(self.timeout)
3132
3133 def checkInterruptedRecv(self, func, *args, **kwargs):
3134 # Check that func(*args, **kwargs) raises socket.error with an
3135 # errno of EINTR when interrupted by a signal.
3136 self.setAlarm(self.alarm_time)
3137 with self.assertRaises(socket.error) as cm:
3138 func(*args, **kwargs)
3139 self.assertNotIsInstance(cm.exception, socket.timeout)
3140 self.assertEqual(cm.exception.errno, errno.EINTR)
3141
3142 def testInterruptedRecvTimeout(self):
3143 self.checkInterruptedRecv(self.serv.recv, 1024)
3144
3145 def testInterruptedRecvIntoTimeout(self):
3146 self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
3147
3148 def testInterruptedRecvfromTimeout(self):
3149 self.checkInterruptedRecv(self.serv.recvfrom, 1024)
3150
3151 def testInterruptedRecvfromIntoTimeout(self):
3152 self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
3153
3154 @requireAttrs(socket.socket, "recvmsg")
3155 def testInterruptedRecvmsgTimeout(self):
3156 self.checkInterruptedRecv(self.serv.recvmsg, 1024)
3157
3158 @requireAttrs(socket.socket, "recvmsg_into")
3159 def testInterruptedRecvmsgIntoTimeout(self):
3160 self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
3161
3162
3163# Require siginterrupt() in order to ensure that system calls are
3164# interrupted by default.
3165@requireAttrs(signal, "siginterrupt")
3166@unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
3167 "Don't have signal.alarm or signal.setitimer")
3168@unittest.skipUnless(thread, 'Threading required for this test.')
3169class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
3170 ThreadSafeCleanupTestCase,
3171 SocketListeningTestMixin, TCPTestBase):
3172 # Test interrupting the interruptible send*() methods with signals
3173 # when a timeout is set.
3174
3175 def setUp(self):
3176 super().setUp()
3177 self.serv_conn = self.newSocket()
3178 self.addCleanup(self.serv_conn.close)
3179 # Use a thread to complete the connection, but wait for it to
3180 # terminate before running the test, so that there is only one
3181 # thread to accept the signal.
3182 cli_thread = threading.Thread(target=self.doConnect)
3183 cli_thread.start()
3184 self.cli_conn, addr = self.serv.accept()
3185 self.addCleanup(self.cli_conn.close)
3186 cli_thread.join()
3187 self.serv_conn.settimeout(self.timeout)
3188
3189 def doConnect(self):
3190 self.serv_conn.connect(self.serv_addr)
3191
3192 def checkInterruptedSend(self, func, *args, **kwargs):
3193 # Check that func(*args, **kwargs), run in a loop, raises
3194 # socket.error with an errno of EINTR when interrupted by a
3195 # signal.
3196 with self.assertRaises(socket.error) as cm:
3197 while True:
3198 self.setAlarm(self.alarm_time)
3199 func(*args, **kwargs)
3200 self.assertNotIsInstance(cm.exception, socket.timeout)
3201 self.assertEqual(cm.exception.errno, errno.EINTR)
3202
Nick Coghlan2496f332011-09-19 20:26:31 +10003203 # Issue #12958: The following tests have problems on Mac OS X
3204 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003205 def testInterruptedSendTimeout(self):
3206 self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
3207
Nick Coghlan2496f332011-09-19 20:26:31 +10003208 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003209 def testInterruptedSendtoTimeout(self):
3210 # Passing an actual address here as Python's wrapper for
3211 # sendto() doesn't allow passing a zero-length one; POSIX
3212 # requires that the address is ignored since the socket is
3213 # connection-mode, however.
3214 self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
3215 self.serv_addr)
3216
Nick Coghlan2496f332011-09-19 20:26:31 +10003217 @support.anticipate_failure(sys.platform == "darwin")
Nick Coghlan96fe56a2011-08-22 11:55:57 +10003218 @requireAttrs(socket.socket, "sendmsg")
3219 def testInterruptedSendmsgTimeout(self):
3220 self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
3221
3222
Victor Stinner45df8202010-04-28 22:31:17 +00003223@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003224class TCPCloserTest(ThreadedTCPSocketTest):
3225
3226 def testClose(self):
3227 conn, addr = self.serv.accept()
3228 conn.close()
3229
3230 sd = self.cli
3231 read, write, err = select.select([sd], [], [], 1.0)
3232 self.assertEqual(read, [sd])
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003233 self.assertEqual(sd.recv(1), b'')
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003234
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003235 # Calling close() many times should be safe.
3236 conn.close()
3237 conn.close()
3238
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003239 def _testClose(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003240 self.cli.connect((HOST, self.port))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003241 time.sleep(1.0)
3242
Victor Stinner45df8202010-04-28 22:31:17 +00003243@unittest.skipUnless(thread, 'Threading required for this test.')
Dave Cole331708b2004-08-09 04:51:41 +00003244class BasicSocketPairTest(SocketPairTest):
3245
3246 def __init__(self, methodName='runTest'):
3247 SocketPairTest.__init__(self, methodName=methodName)
3248
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003249 def _check_defaults(self, sock):
3250 self.assertIsInstance(sock, socket.socket)
3251 if hasattr(socket, 'AF_UNIX'):
3252 self.assertEqual(sock.family, socket.AF_UNIX)
3253 else:
3254 self.assertEqual(sock.family, socket.AF_INET)
3255 self.assertEqual(sock.type, socket.SOCK_STREAM)
3256 self.assertEqual(sock.proto, 0)
3257
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003258 def _testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003259 self._check_defaults(self.cli)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003260
3261 def testDefaults(self):
Antoine Pitrou2e55fec2010-09-14 21:24:25 +00003262 self._check_defaults(self.serv)
Antoine Pitrou9e0b8642010-09-14 18:00:02 +00003263
Dave Cole331708b2004-08-09 04:51:41 +00003264 def testRecv(self):
3265 msg = self.serv.recv(1024)
3266 self.assertEqual(msg, MSG)
3267
3268 def _testRecv(self):
3269 self.cli.send(MSG)
3270
3271 def testSend(self):
3272 self.serv.send(MSG)
3273
3274 def _testSend(self):
3275 msg = self.cli.recv(1024)
3276 self.assertEqual(msg, MSG)
3277
Victor Stinner45df8202010-04-28 22:31:17 +00003278@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003279class NonBlockingTCPTests(ThreadedTCPSocketTest):
3280
3281 def __init__(self, methodName='runTest'):
3282 ThreadedTCPSocketTest.__init__(self, methodName=methodName)
3283
3284 def testSetBlocking(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003285 # Testing whether set blocking works
Guido van Rossum24e4af82002-06-12 19:18:08 +00003286 self.serv.setblocking(0)
3287 start = time.time()
3288 try:
3289 self.serv.accept()
3290 except socket.error:
3291 pass
3292 end = time.time()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003293 self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
Guido van Rossum24e4af82002-06-12 19:18:08 +00003294
3295 def _testSetBlocking(self):
Barry Warsaw6870bba2001-03-23 17:40:16 +00003296 pass
Barry Warsawcf3d4b51997-01-03 20:03:32 +00003297
Antoine Pitroub1c54962010-10-14 15:05:38 +00003298 if hasattr(socket, "SOCK_NONBLOCK"):
Charles-François Natali239bb962011-06-03 12:55:15 +02003299 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003300 def testInitNonBlocking(self):
3301 # reinit server socket
3302 self.serv.close()
3303 self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
Antoine Pitrou1cae8b52010-10-23 17:05:13 +00003304 socket.SOCK_NONBLOCK)
Antoine Pitroub1c54962010-10-14 15:05:38 +00003305 self.port = support.bind_port(self.serv)
3306 self.serv.listen(1)
3307 # actual testing
3308 start = time.time()
3309 try:
3310 self.serv.accept()
3311 except socket.error:
3312 pass
3313 end = time.time()
3314 self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
3315
3316 def _testInitNonBlocking(self):
3317 pass
3318
Antoine Pitrou600232b2011-01-05 21:03:42 +00003319 def testInheritFlags(self):
3320 # Issue #7995: when calling accept() on a listening socket with a
3321 # timeout, the resulting socket should not be non-blocking.
3322 self.serv.settimeout(10)
3323 try:
3324 conn, addr = self.serv.accept()
3325 message = conn.recv(len(MSG))
3326 finally:
3327 conn.close()
3328 self.serv.settimeout(None)
3329
3330 def _testInheritFlags(self):
3331 time.sleep(0.1)
3332 self.cli.connect((HOST, self.port))
3333 time.sleep(0.5)
3334 self.cli.send(MSG)
3335
Guido van Rossum24e4af82002-06-12 19:18:08 +00003336 def testAccept(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003337 # Testing non-blocking accept
Guido van Rossum24e4af82002-06-12 19:18:08 +00003338 self.serv.setblocking(0)
Guido van Rossum41360a41998-03-26 19:42:58 +00003339 try:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003340 conn, addr = self.serv.accept()
3341 except socket.error:
3342 pass
3343 else:
3344 self.fail("Error trying to do non-blocking accept.")
3345 read, write, err = select.select([self.serv], [], [])
3346 if self.serv in read:
3347 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003348 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003349 else:
3350 self.fail("Error trying to do accept after select.")
Guido van Rossum67f7a382002-06-06 21:08:16 +00003351
Guido van Rossum24e4af82002-06-12 19:18:08 +00003352 def _testAccept(self):
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003353 time.sleep(0.1)
Christian Heimes5e696852008-04-09 08:37:03 +00003354 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003355
3356 def testConnect(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003357 # Testing non-blocking connect
Guido van Rossum24e4af82002-06-12 19:18:08 +00003358 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003359 conn.close()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003360
3361 def _testConnect(self):
Guido van Rossum7b8bac12002-06-13 16:07:04 +00003362 self.cli.settimeout(10)
Christian Heimes5e696852008-04-09 08:37:03 +00003363 self.cli.connect((HOST, self.port))
Guido van Rossum24e4af82002-06-12 19:18:08 +00003364
3365 def testRecv(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003366 # Testing non-blocking recv
Guido van Rossum24e4af82002-06-12 19:18:08 +00003367 conn, addr = self.serv.accept()
3368 conn.setblocking(0)
3369 try:
3370 msg = conn.recv(len(MSG))
3371 except socket.error:
3372 pass
3373 else:
3374 self.fail("Error trying to do non-blocking recv.")
3375 read, write, err = select.select([conn], [], [])
3376 if conn in read:
3377 msg = conn.recv(len(MSG))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003378 conn.close()
Guido van Rossum76489682002-06-12 20:38:30 +00003379 self.assertEqual(msg, MSG)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003380 else:
3381 self.fail("Error during select call to non-blocking socket.")
3382
3383 def _testRecv(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003384 self.cli.connect((HOST, self.port))
Guido van Rossumb6cc7d22002-07-19 12:46:46 +00003385 time.sleep(0.1)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003386 self.cli.send(MSG)
3387
Victor Stinner45df8202010-04-28 22:31:17 +00003388@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossum24e4af82002-06-12 19:18:08 +00003389class FileObjectClassTestCase(SocketConnectedTest):
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003390 """Unit tests for the object returned by socket.makefile()
3391
Antoine Pitrou834bd812010-10-13 16:17:14 +00003392 self.read_file is the io object returned by makefile() on
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003393 the client connection. You can read from this file to
3394 get output from the server.
3395
Antoine Pitrou834bd812010-10-13 16:17:14 +00003396 self.write_file is the io object returned by makefile() on the
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003397 server connection. You can write to this file to send output
3398 to the client.
3399 """
Guido van Rossum24e4af82002-06-12 19:18:08 +00003400
Guido van Rossume9f66142002-08-07 15:46:19 +00003401 bufsize = -1 # Use default buffer size
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003402 encoding = 'utf-8'
Antoine Pitrou834bd812010-10-13 16:17:14 +00003403 errors = 'strict'
3404 newline = None
3405
3406 read_mode = 'rb'
3407 read_msg = MSG
3408 write_mode = 'wb'
3409 write_msg = MSG
Guido van Rossume9f66142002-08-07 15:46:19 +00003410
Guido van Rossum24e4af82002-06-12 19:18:08 +00003411 def __init__(self, methodName='runTest'):
3412 SocketConnectedTest.__init__(self, methodName=methodName)
3413
3414 def setUp(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003415 self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
3416 threading.Event() for i in range(4)]
Guido van Rossum24e4af82002-06-12 19:18:08 +00003417 SocketConnectedTest.setUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003418 self.read_file = self.cli_conn.makefile(
3419 self.read_mode, self.bufsize,
3420 encoding = self.encoding,
3421 errors = self.errors,
3422 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003423
3424 def tearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003425 self.serv_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003426 self.read_file.close()
3427 self.assertTrue(self.read_file.closed)
3428 self.read_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003429 SocketConnectedTest.tearDown(self)
3430
3431 def clientSetUp(self):
3432 SocketConnectedTest.clientSetUp(self)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003433 self.write_file = self.serv_conn.makefile(
3434 self.write_mode, self.bufsize,
3435 encoding = self.encoding,
3436 errors = self.errors,
3437 newline = self.newline)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003438
3439 def clientTearDown(self):
Antoine Pitrou98b46702010-09-18 22:59:00 +00003440 self.cli_finished.set()
Antoine Pitrou834bd812010-10-13 16:17:14 +00003441 self.write_file.close()
3442 self.assertTrue(self.write_file.closed)
3443 self.write_file = None
Guido van Rossum24e4af82002-06-12 19:18:08 +00003444 SocketConnectedTest.clientTearDown(self)
3445
Antoine Pitrou68e5c042011-02-25 23:07:44 +00003446 def testReadAfterTimeout(self):
3447 # Issue #7322: A file object must disallow further reads
3448 # after a timeout has occurred.
3449 self.cli_conn.settimeout(1)
3450 self.read_file.read(3)
3451 # First read raises a timeout
3452 self.assertRaises(socket.timeout, self.read_file.read, 1)
3453 # Second read is disallowed
3454 with self.assertRaises(IOError) as ctx:
3455 self.read_file.read(1)
3456 self.assertIn("cannot read from timed out object", str(ctx.exception))
3457
3458 def _testReadAfterTimeout(self):
3459 self.write_file.write(self.write_msg[0:3])
3460 self.write_file.flush()
3461 self.serv_finished.wait()
3462
Guido van Rossum24e4af82002-06-12 19:18:08 +00003463 def testSmallRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003464 # Performing small file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003465 first_seg = self.read_file.read(len(self.read_msg)-3)
3466 second_seg = self.read_file.read(3)
Guido van Rossumab659962002-06-12 21:29:43 +00003467 msg = first_seg + second_seg
Antoine Pitrou834bd812010-10-13 16:17:14 +00003468 self.assertEqual(msg, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003469
3470 def _testSmallRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003471 self.write_file.write(self.write_msg)
3472 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003473
Guido van Rossum8c943832002-08-08 01:00:28 +00003474 def testFullRead(self):
3475 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003476 msg = self.read_file.read()
3477 self.assertEqual(msg, self.read_msg)
Guido van Rossum8c943832002-08-08 01:00:28 +00003478
3479 def _testFullRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003480 self.write_file.write(self.write_msg)
3481 self.write_file.close()
Guido van Rossum8c943832002-08-08 01:00:28 +00003482
Guido van Rossum24e4af82002-06-12 19:18:08 +00003483 def testUnbufferedRead(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003484 # Performing unbuffered file read test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003485 buf = type(self.read_msg)()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003486 while 1:
Antoine Pitrou834bd812010-10-13 16:17:14 +00003487 char = self.read_file.read(1)
Guido van Rossum8c943832002-08-08 01:00:28 +00003488 if not char:
Guido van Rossum24e4af82002-06-12 19:18:08 +00003489 break
Guido van Rossum8c943832002-08-08 01:00:28 +00003490 buf += char
Antoine Pitrou834bd812010-10-13 16:17:14 +00003491 self.assertEqual(buf, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003492
3493 def _testUnbufferedRead(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003494 self.write_file.write(self.write_msg)
3495 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003496
3497 def testReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003498 # Performing file readline test
Antoine Pitrou834bd812010-10-13 16:17:14 +00003499 line = self.read_file.readline()
3500 self.assertEqual(line, self.read_msg)
Guido van Rossum24e4af82002-06-12 19:18:08 +00003501
3502 def _testReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003503 self.write_file.write(self.write_msg)
3504 self.write_file.flush()
Guido van Rossum24e4af82002-06-12 19:18:08 +00003505
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003506 def testCloseAfterMakefile(self):
3507 # The file returned by makefile should keep the socket open.
3508 self.cli_conn.close()
3509 # read until EOF
Antoine Pitrou834bd812010-10-13 16:17:14 +00003510 msg = self.read_file.read()
3511 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003512
3513 def _testCloseAfterMakefile(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003514 self.write_file.write(self.write_msg)
3515 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003516
3517 def testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003518 self.read_file.close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003519 msg = self.cli_conn.recv(len(MSG))
Antoine Pitrou834bd812010-10-13 16:17:14 +00003520 if isinstance(self.read_msg, str):
3521 msg = msg.decode()
3522 self.assertEqual(msg, self.read_msg)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003523
3524 def _testMakefileAfterMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003525 self.write_file.write(self.write_msg)
3526 self.write_file.flush()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +00003527
Tim Peters116d83c2004-03-28 02:20:45 +00003528 def testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003529 self.assertTrue(not self.read_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003530
3531 def _testClosedAttr(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003532 self.assertTrue(not self.write_file.closed)
Tim Peters116d83c2004-03-28 02:20:45 +00003533
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003534 def testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003535 self.assertEqual(self.read_file.mode, self.read_mode)
3536 self.assertEqual(self.read_file.name, self.cli_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003537
3538 def _testAttributes(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003539 self.assertEqual(self.write_file.mode, self.write_mode)
3540 self.assertEqual(self.write_file.name, self.serv_conn.fileno())
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +00003541
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003542 def testRealClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003543 self.read_file.close()
3544 self.assertRaises(ValueError, self.read_file.fileno)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003545 self.cli_conn.close()
3546 self.assertRaises(socket.error, self.cli_conn.getsockname)
3547
3548 def _testRealClose(self):
3549 pass
3550
3551
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003552class FileObjectInterruptedTestCase(unittest.TestCase):
3553 """Test that the file object correctly handles EINTR internally."""
3554
3555 class MockSocket(object):
3556 def __init__(self, recv_funcs=()):
3557 # A generator that returns callables that we'll call for each
3558 # call to recv().
3559 self._recv_step = iter(recv_funcs)
3560
3561 def recv_into(self, buffer):
3562 data = next(self._recv_step)()
3563 assert len(buffer) >= len(data)
3564 buffer[:len(data)] = data
3565 return len(data)
3566
3567 def _decref_socketios(self):
3568 pass
3569
3570 def _textiowrap_for_test(self, buffering=-1):
3571 raw = socket.SocketIO(self, "r")
3572 if buffering < 0:
3573 buffering = io.DEFAULT_BUFFER_SIZE
3574 if buffering == 0:
3575 return raw
3576 buffer = io.BufferedReader(raw, buffering)
3577 text = io.TextIOWrapper(buffer, None, None)
3578 text.mode = "rb"
3579 return text
3580
3581 @staticmethod
3582 def _raise_eintr():
3583 raise socket.error(errno.EINTR)
3584
3585 def _textiowrap_mock_socket(self, mock, buffering=-1):
3586 raw = socket.SocketIO(mock, "r")
3587 if buffering < 0:
3588 buffering = io.DEFAULT_BUFFER_SIZE
3589 if buffering == 0:
3590 return raw
3591 buffer = io.BufferedReader(raw, buffering)
3592 text = io.TextIOWrapper(buffer, None, None)
3593 text.mode = "rb"
3594 return text
3595
3596 def _test_readline(self, size=-1, buffering=-1):
3597 mock_sock = self.MockSocket(recv_funcs=[
3598 lambda : b"This is the first line\nAnd the sec",
3599 self._raise_eintr,
3600 lambda : b"ond line is here\n",
3601 lambda : b"",
3602 lambda : b"", # XXX(gps): io library does an extra EOF read
3603 ])
3604 fo = mock_sock._textiowrap_for_test(buffering=buffering)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003605 self.assertEqual(fo.readline(size), "This is the first line\n")
3606 self.assertEqual(fo.readline(size), "And the second line is here\n")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003607
3608 def _test_read(self, size=-1, buffering=-1):
3609 mock_sock = self.MockSocket(recv_funcs=[
3610 lambda : b"This is the first line\nAnd the sec",
3611 self._raise_eintr,
3612 lambda : b"ond line is here\n",
3613 lambda : b"",
3614 lambda : b"", # XXX(gps): io library does an extra EOF read
3615 ])
3616 expecting = (b"This is the first line\n"
3617 b"And the second line is here\n")
3618 fo = mock_sock._textiowrap_for_test(buffering=buffering)
3619 if buffering == 0:
3620 data = b''
3621 else:
3622 data = ''
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003623 expecting = expecting.decode('utf-8')
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003624 while len(data) != len(expecting):
3625 part = fo.read(size)
3626 if not part:
3627 break
3628 data += part
Ezio Melottib3aedd42010-11-20 19:04:17 +00003629 self.assertEqual(data, expecting)
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003630
3631 def test_default(self):
3632 self._test_readline()
3633 self._test_readline(size=100)
3634 self._test_read()
3635 self._test_read(size=100)
3636
3637 def test_with_1k_buffer(self):
3638 self._test_readline(buffering=1024)
3639 self._test_readline(size=100, buffering=1024)
3640 self._test_read(buffering=1024)
3641 self._test_read(size=100, buffering=1024)
3642
3643 def _test_readline_no_buffer(self, size=-1):
3644 mock_sock = self.MockSocket(recv_funcs=[
3645 lambda : b"a",
3646 lambda : b"\n",
3647 lambda : b"B",
3648 self._raise_eintr,
3649 lambda : b"b",
3650 lambda : b"",
3651 ])
3652 fo = mock_sock._textiowrap_for_test(buffering=0)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003653 self.assertEqual(fo.readline(size), b"a\n")
3654 self.assertEqual(fo.readline(size), b"Bb")
Gregory P. Smithaafdca82010-01-04 04:50:36 +00003655
3656 def test_no_buffer(self):
3657 self._test_readline_no_buffer()
3658 self._test_readline_no_buffer(size=4)
3659 self._test_read(buffering=0)
3660 self._test_read(size=100, buffering=0)
3661
3662
Guido van Rossume9f66142002-08-07 15:46:19 +00003663class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
3664
3665 """Repeat the tests from FileObjectClassTestCase with bufsize==0.
Tim Peters469cdad2002-08-08 20:19:19 +00003666
Guido van Rossume9f66142002-08-07 15:46:19 +00003667 In this case (and in this case only), it should be possible to
3668 create a file object, read a line from it, create another file
3669 object, read another line from it, without loss of data in the
Georg Brandl24420152008-05-26 16:32:26 +00003670 first file object's buffer. Note that http.client relies on this
Guido van Rossume9f66142002-08-07 15:46:19 +00003671 when reading multiple requests from the same socket."""
3672
3673 bufsize = 0 # Use unbuffered mode
3674
3675 def testUnbufferedReadline(self):
Guido van Rossum8c943832002-08-08 01:00:28 +00003676 # Read a line, create a new file object, read another line with it
Antoine Pitrou834bd812010-10-13 16:17:14 +00003677 line = self.read_file.readline() # first line
3678 self.assertEqual(line, b"A. " + self.write_msg) # first line
3679 self.read_file = self.cli_conn.makefile('rb', 0)
3680 line = self.read_file.readline() # second line
3681 self.assertEqual(line, b"B. " + self.write_msg) # second line
Guido van Rossume9f66142002-08-07 15:46:19 +00003682
3683 def _testUnbufferedReadline(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003684 self.write_file.write(b"A. " + self.write_msg)
3685 self.write_file.write(b"B. " + self.write_msg)
3686 self.write_file.flush()
Guido van Rossume9f66142002-08-07 15:46:19 +00003687
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003688 def testMakefileClose(self):
3689 # The file returned by makefile should keep the socket open...
3690 self.cli_conn.close()
3691 msg = self.cli_conn.recv(1024)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003692 self.assertEqual(msg, self.read_msg)
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003693 # ...until the file is itself closed
Antoine Pitrou834bd812010-10-13 16:17:14 +00003694 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003695 self.assertRaises(socket.error, self.cli_conn.recv, 1024)
3696
3697 def _testMakefileClose(self):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003698 self.write_file.write(self.write_msg)
3699 self.write_file.flush()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003700
3701 def testMakefileCloseSocketDestroy(self):
3702 refcount_before = sys.getrefcount(self.cli_conn)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003703 self.read_file.close()
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003704 refcount_after = sys.getrefcount(self.cli_conn)
3705 self.assertEqual(refcount_before - 1, refcount_after)
3706
3707 def _testMakefileCloseSocketDestroy(self):
3708 pass
3709
Antoine Pitrou98b46702010-09-18 22:59:00 +00003710 # Non-blocking ops
Antoine Pitrou834bd812010-10-13 16:17:14 +00003711 # NOTE: to set `read_file` as non-blocking, we must call
Antoine Pitrou98b46702010-09-18 22:59:00 +00003712 # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
3713
3714 def testSmallReadNonBlocking(self):
3715 self.cli_conn.setblocking(False)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003716 self.assertEqual(self.read_file.readinto(bytearray(10)), None)
3717 self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003718 self.evt1.set()
3719 self.evt2.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003720 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou43bf0452011-04-04 01:21:37 +02003721 if first_seg is None:
3722 # Data not arrived (can happen under Windows), wait a bit
3723 time.sleep(0.5)
3724 first_seg = self.read_file.read(len(self.read_msg) - 3)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003725 buf = bytearray(10)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003726 n = self.read_file.readinto(buf)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003727 self.assertEqual(n, 3)
3728 msg = first_seg + buf[:n]
Antoine Pitrou834bd812010-10-13 16:17:14 +00003729 self.assertEqual(msg, self.read_msg)
3730 self.assertEqual(self.read_file.readinto(bytearray(16)), None)
3731 self.assertEqual(self.read_file.read(1), None)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003732
3733 def _testSmallReadNonBlocking(self):
3734 self.evt1.wait(1.0)
Antoine Pitrou834bd812010-10-13 16:17:14 +00003735 self.write_file.write(self.write_msg)
3736 self.write_file.flush()
Antoine Pitrou98b46702010-09-18 22:59:00 +00003737 self.evt2.set()
3738 # Avoid cloding the socket before the server test has finished,
3739 # otherwise system recv() will return 0 instead of EWOULDBLOCK.
3740 self.serv_finished.wait(5.0)
3741
3742 def testWriteNonBlocking(self):
3743 self.cli_finished.wait(5.0)
3744 # The client thread can't skip directly - the SkipTest exception
3745 # would appear as a failure.
3746 if self.serv_skipped:
3747 self.skipTest(self.serv_skipped)
3748
3749 def _testWriteNonBlocking(self):
3750 self.serv_skipped = None
3751 self.serv_conn.setblocking(False)
3752 # Try to saturate the socket buffer pipe with repeated large writes.
3753 BIG = b"x" * (1024 ** 2)
3754 LIMIT = 10
3755 # The first write() succeeds since a chunk of data can be buffered
Antoine Pitrou834bd812010-10-13 16:17:14 +00003756 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003757 self.assertGreater(n, 0)
3758 for i in range(LIMIT):
Antoine Pitrou834bd812010-10-13 16:17:14 +00003759 n = self.write_file.write(BIG)
Antoine Pitrou98b46702010-09-18 22:59:00 +00003760 if n is None:
3761 # Succeeded
3762 break
3763 self.assertGreater(n, 0)
3764 else:
3765 # Let us know that this test didn't manage to establish
3766 # the expected conditions. This is not a failure in itself but,
3767 # if it happens repeatedly, the test should be fixed.
3768 self.serv_skipped = "failed to saturate the socket buffer"
3769
Gregory P. Smithde3369f2009-01-12 04:50:11 +00003770
Guido van Rossum8c943832002-08-08 01:00:28 +00003771class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3772
3773 bufsize = 1 # Default-buffered for reading; line-buffered for writing
3774
3775
3776class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
3777
3778 bufsize = 2 # Exercise the buffering code
Guido van Rossume9f66142002-08-07 15:46:19 +00003779
Thomas Woutersb2137042007-02-01 18:02:27 +00003780
Antoine Pitrou834bd812010-10-13 16:17:14 +00003781class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
3782 """Tests for socket.makefile() in text mode (rather than binary)"""
3783
3784 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003785 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003786 write_mode = 'wb'
3787 write_msg = MSG
3788 newline = ''
3789
3790
3791class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
3792 """Tests for socket.makefile() in text mode (rather than binary)"""
3793
3794 read_mode = 'rb'
3795 read_msg = MSG
3796 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003797 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003798 newline = ''
3799
3800
3801class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
3802 """Tests for socket.makefile() in text mode (rather than binary)"""
3803
3804 read_mode = 'r'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003805 read_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003806 write_mode = 'w'
Marc-André Lemburg8f36af72011-02-25 15:42:01 +00003807 write_msg = MSG.decode('utf-8')
Antoine Pitrou834bd812010-10-13 16:17:14 +00003808 newline = ''
3809
3810
Guido van Rossumd8faa362007-04-27 19:54:29 +00003811class NetworkConnectionTest(object):
3812 """Prove network connection."""
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003813
Guido van Rossumd8faa362007-04-27 19:54:29 +00003814 def clientSetUp(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003815 # We're inherited below by BasicTCPTest2, which also inherits
3816 # BasicTCPTest, which defines self.port referenced below.
3817 self.cli = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003818 self.serv_conn = self.cli
3819
3820class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
3821 """Tests that NetworkConnection does not break existing TCP functionality.
3822 """
3823
3824class NetworkConnectionNoServer(unittest.TestCase):
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003825
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003826 class MockSocket(socket.socket):
3827 def connect(self, *args):
3828 raise socket.timeout('timed out')
3829
3830 @contextlib.contextmanager
3831 def mocked_socket_module(self):
3832 """Return a socket which times out on connect"""
3833 old_socket = socket.socket
3834 socket.socket = self.MockSocket
3835 try:
3836 yield
3837 finally:
3838 socket.socket = old_socket
3839
3840 def test_connect(self):
Benjamin Petersonee8712c2008-05-20 21:35:26 +00003841 port = support.find_unused_port()
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003842 cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003843 self.addCleanup(cli.close)
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +00003844 with self.assertRaises(socket.error) as cm:
3845 cli.connect((HOST, port))
3846 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
3847
3848 def test_create_connection(self):
3849 # Issue #9792: errors raised by create_connection() should have
3850 # a proper errno attribute.
3851 port = support.find_unused_port()
3852 with self.assertRaises(socket.error) as cm:
3853 socket.create_connection((HOST, port))
3854 self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
3855
3856 def test_create_connection_timeout(self):
3857 # Issue #9792: create_connection() should not recast timeout errors
3858 # as generic socket errors.
3859 with self.mocked_socket_module():
3860 with self.assertRaises(socket.timeout):
3861 socket.create_connection((HOST, 1234))
3862
Guido van Rossumd8faa362007-04-27 19:54:29 +00003863
Victor Stinner45df8202010-04-28 22:31:17 +00003864@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00003865class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
3866
3867 def __init__(self, methodName='runTest'):
3868 SocketTCPTest.__init__(self, methodName=methodName)
3869 ThreadableTest.__init__(self)
3870
3871 def clientSetUp(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00003872 self.source_port = support.find_unused_port()
Guido van Rossumd8faa362007-04-27 19:54:29 +00003873
3874 def clientTearDown(self):
3875 self.cli.close()
3876 self.cli = None
3877 ThreadableTest.clientTearDown(self)
3878
3879 def _justAccept(self):
3880 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003881 conn.close()
Guido van Rossumd8faa362007-04-27 19:54:29 +00003882
3883 testFamily = _justAccept
3884 def _testFamily(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003885 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003886 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003887 self.assertEqual(self.cli.family, 2)
3888
Gregory P. Smitha81d8812010-01-03 15:09:32 +00003889 testSourceAddress = _justAccept
3890 def _testSourceAddress(self):
Gregory P. Smithb4066372010-01-03 03:28:29 +00003891 self.cli = socket.create_connection((HOST, self.port), timeout=30,
3892 source_address=('', self.source_port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003893 self.addCleanup(self.cli.close)
Gregory P. Smithb4066372010-01-03 03:28:29 +00003894 self.assertEqual(self.cli.getsockname()[1], self.source_port)
Gregory P. Smitha81d8812010-01-03 15:09:32 +00003895 # The port number being used is sufficient to show that the bind()
3896 # call happened.
Gregory P. Smithb4066372010-01-03 03:28:29 +00003897
Guido van Rossumd8faa362007-04-27 19:54:29 +00003898 testTimeoutDefault = _justAccept
3899 def _testTimeoutDefault(self):
Georg Brandlf78e02b2008-06-10 17:40:04 +00003900 # passing no explicit timeout uses socket's global default
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003901 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003902 socket.setdefaulttimeout(42)
3903 try:
3904 self.cli = socket.create_connection((HOST, self.port))
Brian Curtin21ebbb72010-11-02 02:07:09 +00003905 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003906 finally:
3907 socket.setdefaulttimeout(None)
Ezio Melottib3aedd42010-11-20 19:04:17 +00003908 self.assertEqual(self.cli.gettimeout(), 42)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003909
3910 testTimeoutNone = _justAccept
3911 def _testTimeoutNone(self):
3912 # None timeout means the same as sock.settimeout(None)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003913 self.assertTrue(socket.getdefaulttimeout() is None)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003914 socket.setdefaulttimeout(30)
3915 try:
3916 self.cli = socket.create_connection((HOST, self.port), timeout=None)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003917 self.addCleanup(self.cli.close)
Georg Brandlf78e02b2008-06-10 17:40:04 +00003918 finally:
3919 socket.setdefaulttimeout(None)
3920 self.assertEqual(self.cli.gettimeout(), None)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003921
3922 testTimeoutValueNamed = _justAccept
3923 def _testTimeoutValueNamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003924 self.cli = socket.create_connection((HOST, self.port), timeout=30)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003925 self.assertEqual(self.cli.gettimeout(), 30)
3926
3927 testTimeoutValueNonamed = _justAccept
3928 def _testTimeoutValueNonamed(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003929 self.cli = socket.create_connection((HOST, self.port), 30)
Brian Curtin21ebbb72010-11-02 02:07:09 +00003930 self.addCleanup(self.cli.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003931 self.assertEqual(self.cli.gettimeout(), 30)
3932
Victor Stinner45df8202010-04-28 22:31:17 +00003933@unittest.skipUnless(thread, 'Threading required for this test.')
Guido van Rossumd8faa362007-04-27 19:54:29 +00003934class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
3935
3936 def __init__(self, methodName='runTest'):
3937 SocketTCPTest.__init__(self, methodName=methodName)
3938 ThreadableTest.__init__(self)
3939
3940 def clientSetUp(self):
3941 pass
3942
3943 def clientTearDown(self):
3944 self.cli.close()
3945 self.cli = None
3946 ThreadableTest.clientTearDown(self)
3947
3948 def testInsideTimeout(self):
3949 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00003950 self.addCleanup(conn.close)
Guido van Rossumd8faa362007-04-27 19:54:29 +00003951 time.sleep(3)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003952 conn.send(b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00003953 testOutsideTimeout = testInsideTimeout
3954
3955 def _testInsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003956 self.cli = sock = socket.create_connection((HOST, self.port))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003957 data = sock.recv(5)
Guido van Rossum7d0a8262007-05-21 23:13:11 +00003958 self.assertEqual(data, b"done!")
Guido van Rossumd8faa362007-04-27 19:54:29 +00003959
3960 def _testOutsideTimeout(self):
Christian Heimes5e696852008-04-09 08:37:03 +00003961 self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003962 self.assertRaises(socket.timeout, lambda: sock.recv(5))
Guido van Rossumd8faa362007-04-27 19:54:29 +00003963
3964
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003965class TCPTimeoutTest(SocketTCPTest):
3966
3967 def testTCPTimeout(self):
3968 def raise_timeout(*args, **kwargs):
3969 self.serv.settimeout(1.0)
3970 self.serv.accept()
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00003971 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00003972 "Error generating a timeout exception (TCP)")
3973
3974 def testTimeoutZero(self):
3975 ok = False
3976 try:
3977 self.serv.settimeout(0.0)
3978 foo = self.serv.accept()
3979 except socket.timeout:
3980 self.fail("caught timeout instead of error (TCP)")
3981 except socket.error:
3982 ok = True
3983 except:
3984 self.fail("caught unexpected exception (TCP)")
3985 if not ok:
3986 self.fail("accept() returned success when we did not expect it")
3987
Thomas Wouters0e3f5912006-08-11 14:57:12 +00003988 def testInterruptedTimeout(self):
3989 # XXX I don't know how to do this test on MSWindows or any other
3990 # plaform that doesn't support signal.alarm() or os.kill(), though
3991 # the bug should have existed on all platforms.
3992 if not hasattr(signal, "alarm"):
3993 return # can only test on *nix
3994 self.serv.settimeout(5.0) # must be longer than alarm
3995 class Alarm(Exception):
3996 pass
3997 def alarm_handler(signal, frame):
3998 raise Alarm
3999 old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
4000 try:
4001 signal.alarm(2) # POSIX allows alarm to be up to 1 second early
4002 try:
4003 foo = self.serv.accept()
4004 except socket.timeout:
4005 self.fail("caught timeout instead of Alarm")
4006 except Alarm:
4007 pass
4008 except:
Christian Heimesbbe741d2008-03-28 10:53:29 +00004009 self.fail("caught other exception instead of Alarm:"
4010 " %s(%s):\n%s" %
4011 (sys.exc_info()[:2] + (traceback.format_exc(),)))
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004012 else:
4013 self.fail("nothing caught")
Christian Heimesbbe741d2008-03-28 10:53:29 +00004014 finally:
4015 signal.alarm(0) # shut off alarm
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004016 except Alarm:
4017 self.fail("got Alarm in wrong place")
4018 finally:
4019 # no alarm can be pending. Safe to restore old handler.
4020 signal.signal(signal.SIGALRM, old_alarm)
4021
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004022class UDPTimeoutTest(SocketTCPTest):
4023
4024 def testUDPTimeout(self):
4025 def raise_timeout(*args, **kwargs):
4026 self.serv.settimeout(1.0)
4027 self.serv.recv(1024)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004028 self.assertRaises(socket.timeout, raise_timeout,
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004029 "Error generating a timeout exception (UDP)")
4030
4031 def testTimeoutZero(self):
4032 ok = False
4033 try:
4034 self.serv.settimeout(0.0)
4035 foo = self.serv.recv(1024)
4036 except socket.timeout:
4037 self.fail("caught timeout instead of error (UDP)")
4038 except socket.error:
4039 ok = True
4040 except:
4041 self.fail("caught unexpected exception (UDP)")
4042 if not ok:
4043 self.fail("recv() returned success when we did not expect it")
4044
4045class TestExceptions(unittest.TestCase):
4046
4047 def testExceptionTree(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +00004048 self.assertTrue(issubclass(socket.error, Exception))
4049 self.assertTrue(issubclass(socket.herror, socket.error))
4050 self.assertTrue(issubclass(socket.gaierror, socket.error))
4051 self.assertTrue(issubclass(socket.timeout, socket.error))
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004052
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004053class TestLinuxAbstractNamespace(unittest.TestCase):
4054
4055 UNIX_PATH_MAX = 108
4056
4057 def testLinuxAbstractNamespace(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004058 address = b"\x00python-test-hello\x00\xff"
Victor Stinner1d5eb342011-01-03 14:30:46 +00004059 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
4060 s1.bind(address)
4061 s1.listen(1)
4062 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
4063 s2.connect(s1.getsockname())
4064 with s1.accept()[0] as s3:
4065 self.assertEqual(s1.getsockname(), address)
4066 self.assertEqual(s2.getpeername(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004067
4068 def testMaxName(self):
Guido van Rossum32c4ac02007-08-15 03:56:40 +00004069 address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004070 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4071 s.bind(address)
4072 self.assertEqual(s.getsockname(), address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004073
4074 def testNameOverflow(self):
4075 address = "\x00" + "h" * self.UNIX_PATH_MAX
Victor Stinner1d5eb342011-01-03 14:30:46 +00004076 with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
4077 self.assertRaises(socket.error, s.bind, address)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004078
Raymond Hettinger11a35f52003-06-29 04:40:22 +00004079
Victor Stinner45df8202010-04-28 22:31:17 +00004080@unittest.skipUnless(thread, 'Threading required for this test.')
Thomas Wouters477c8d52006-05-27 19:21:47 +00004081class BufferIOTest(SocketConnectedTest):
4082 """
4083 Test the buffer versions of socket.recv() and socket.send().
4084 """
4085 def __init__(self, methodName='runTest'):
4086 SocketConnectedTest.__init__(self, methodName=methodName)
4087
Antoine Pitrou25480782010-03-17 22:50:28 +00004088 def testRecvIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004089 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004090 nbytes = self.cli_conn.recv_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004091 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004092 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004093 self.assertEqual(msg, MSG)
4094
Antoine Pitrou25480782010-03-17 22:50:28 +00004095 def _testRecvIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004096 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004097 self.serv_conn.send(buf)
4098
Antoine Pitrou25480782010-03-17 22:50:28 +00004099 def testRecvIntoBytearray(self):
4100 buf = bytearray(1024)
4101 nbytes = self.cli_conn.recv_into(buf)
4102 self.assertEqual(nbytes, len(MSG))
4103 msg = buf[:len(MSG)]
4104 self.assertEqual(msg, MSG)
4105
4106 _testRecvIntoBytearray = _testRecvIntoArray
4107
4108 def testRecvIntoMemoryview(self):
4109 buf = bytearray(1024)
4110 nbytes = self.cli_conn.recv_into(memoryview(buf))
4111 self.assertEqual(nbytes, len(MSG))
4112 msg = buf[:len(MSG)]
4113 self.assertEqual(msg, MSG)
4114
4115 _testRecvIntoMemoryview = _testRecvIntoArray
4116
4117 def testRecvFromIntoArray(self):
Antoine Pitrou2f89aa62008-08-02 21:02:48 +00004118 buf = bytearray(1024)
Thomas Wouters73e5a5b2006-06-08 15:35:45 +00004119 nbytes, addr = self.cli_conn.recvfrom_into(buf)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004120 self.assertEqual(nbytes, len(MSG))
Guido van Rossum7d0a8262007-05-21 23:13:11 +00004121 msg = buf[:len(MSG)]
Thomas Wouters477c8d52006-05-27 19:21:47 +00004122 self.assertEqual(msg, MSG)
4123
Antoine Pitrou25480782010-03-17 22:50:28 +00004124 def _testRecvFromIntoArray(self):
Guido van Rossumb5b22702007-05-18 18:55:53 +00004125 buf = bytes(MSG)
Thomas Wouters477c8d52006-05-27 19:21:47 +00004126 self.serv_conn.send(buf)
4127
Antoine Pitrou25480782010-03-17 22:50:28 +00004128 def testRecvFromIntoBytearray(self):
4129 buf = bytearray(1024)
4130 nbytes, addr = self.cli_conn.recvfrom_into(buf)
4131 self.assertEqual(nbytes, len(MSG))
4132 msg = buf[:len(MSG)]
4133 self.assertEqual(msg, MSG)
4134
4135 _testRecvFromIntoBytearray = _testRecvFromIntoArray
4136
4137 def testRecvFromIntoMemoryview(self):
4138 buf = bytearray(1024)
4139 nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
4140 self.assertEqual(nbytes, len(MSG))
4141 msg = buf[:len(MSG)]
4142 self.assertEqual(msg, MSG)
4143
4144 _testRecvFromIntoMemoryview = _testRecvFromIntoArray
4145
Christian Heimes043d6f62008-01-07 17:19:16 +00004146
4147TIPC_STYPE = 2000
4148TIPC_LOWER = 200
4149TIPC_UPPER = 210
4150
4151def isTipcAvailable():
4152 """Check if the TIPC module is loaded
4153
4154 The TIPC module is not loaded automatically on Ubuntu and probably
4155 other Linux distros.
4156 """
4157 if not hasattr(socket, "AF_TIPC"):
4158 return False
4159 if not os.path.isfile("/proc/modules"):
4160 return False
4161 with open("/proc/modules") as f:
4162 for line in f:
4163 if line.startswith("tipc "):
4164 return True
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004165 if support.verbose:
Christian Heimes043d6f62008-01-07 17:19:16 +00004166 print("TIPC module is not loaded, please 'sudo modprobe tipc'")
4167 return False
4168
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004169class TIPCTest(unittest.TestCase):
Christian Heimes043d6f62008-01-07 17:19:16 +00004170 def testRDM(self):
4171 srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
4172 cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004173 self.addCleanup(srv.close)
4174 self.addCleanup(cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004175
4176 srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4177 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4178 TIPC_LOWER, TIPC_UPPER)
4179 srv.bind(srvaddr)
4180
4181 sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4182 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4183 cli.sendto(MSG, sendaddr)
4184
4185 msg, recvaddr = srv.recvfrom(1024)
4186
4187 self.assertEqual(cli.getsockname(), recvaddr)
4188 self.assertEqual(msg, MSG)
4189
4190
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004191class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
Christian Heimes043d6f62008-01-07 17:19:16 +00004192 def __init__(self, methodName = 'runTest'):
4193 unittest.TestCase.__init__(self, methodName = methodName)
4194 ThreadableTest.__init__(self)
4195
4196 def setUp(self):
4197 self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004198 self.addCleanup(self.srv.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004199 self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
4200 srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
4201 TIPC_LOWER, TIPC_UPPER)
4202 self.srv.bind(srvaddr)
4203 self.srv.listen(5)
4204 self.serverExplicitReady()
4205 self.conn, self.connaddr = self.srv.accept()
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004206 self.addCleanup(self.conn.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004207
4208 def clientSetUp(self):
4209 # The is a hittable race between serverExplicitReady() and the
4210 # accept() call; sleep a little while to avoid it, otherwise
4211 # we could get an exception
4212 time.sleep(0.1)
4213 self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
Antoine Pitrou86aed0b2011-10-02 23:33:19 +02004214 self.addCleanup(self.cli.close)
Christian Heimes043d6f62008-01-07 17:19:16 +00004215 addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
4216 TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
4217 self.cli.connect(addr)
4218 self.cliaddr = self.cli.getsockname()
4219
4220 def testStream(self):
4221 msg = self.conn.recv(1024)
4222 self.assertEqual(msg, MSG)
4223 self.assertEqual(self.cliaddr, self.connaddr)
4224
4225 def _testStream(self):
4226 self.cli.send(MSG)
4227 self.cli.close()
4228
4229
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004230@unittest.skipUnless(thread, 'Threading required for this test.')
4231class ContextManagersTest(ThreadedTCPSocketTest):
4232
4233 def _testSocketClass(self):
4234 # base test
4235 with socket.socket() as sock:
4236 self.assertFalse(sock._closed)
4237 self.assertTrue(sock._closed)
4238 # close inside with block
4239 with socket.socket() as sock:
4240 sock.close()
4241 self.assertTrue(sock._closed)
4242 # exception inside with block
4243 with socket.socket() as sock:
4244 self.assertRaises(socket.error, sock.sendall, b'foo')
4245 self.assertTrue(sock._closed)
4246
4247 def testCreateConnectionBase(self):
4248 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004249 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004250 data = conn.recv(1024)
4251 conn.sendall(data)
4252
4253 def _testCreateConnectionBase(self):
4254 address = self.serv.getsockname()
4255 with socket.create_connection(address) as sock:
4256 self.assertFalse(sock._closed)
4257 sock.sendall(b'foo')
4258 self.assertEqual(sock.recv(1024), b'foo')
4259 self.assertTrue(sock._closed)
4260
4261 def testCreateConnectionClose(self):
4262 conn, addr = self.serv.accept()
Brian Curtin21ebbb72010-11-02 02:07:09 +00004263 self.addCleanup(conn.close)
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004264 data = conn.recv(1024)
4265 conn.sendall(data)
4266
4267 def _testCreateConnectionClose(self):
4268 address = self.serv.getsockname()
4269 with socket.create_connection(address) as sock:
4270 sock.close()
4271 self.assertTrue(sock._closed)
4272 self.assertRaises(socket.error, sock.sendall, b'foo')
4273
Antoine Pitrouacd0fda2010-10-23 17:01:44 +00004274
Antoine Pitroub1c54962010-10-14 15:05:38 +00004275@unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
4276 "SOCK_CLOEXEC not defined")
4277@unittest.skipUnless(fcntl, "module fcntl not available")
4278class CloexecConstantTest(unittest.TestCase):
Charles-François Natali239bb962011-06-03 12:55:15 +02004279 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004280 def test_SOCK_CLOEXEC(self):
Victor Stinner1d5eb342011-01-03 14:30:46 +00004281 with socket.socket(socket.AF_INET,
4282 socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
4283 self.assertTrue(s.type & socket.SOCK_CLOEXEC)
4284 self.assertTrue(fcntl.fcntl(s, fcntl.F_GETFD) & fcntl.FD_CLOEXEC)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004285
4286
4287@unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
4288 "SOCK_NONBLOCK not defined")
4289class NonblockConstantTest(unittest.TestCase):
4290 def checkNonblock(self, s, nonblock=True, timeout=0.0):
4291 if nonblock:
4292 self.assertTrue(s.type & socket.SOCK_NONBLOCK)
4293 self.assertEqual(s.gettimeout(), timeout)
4294 else:
4295 self.assertFalse(s.type & socket.SOCK_NONBLOCK)
4296 self.assertEqual(s.gettimeout(), None)
4297
Charles-François Natali239bb962011-06-03 12:55:15 +02004298 @support.requires_linux_version(2, 6, 28)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004299 def test_SOCK_NONBLOCK(self):
4300 # a lot of it seems silly and redundant, but I wanted to test that
4301 # changing back and forth worked ok
Victor Stinner1d5eb342011-01-03 14:30:46 +00004302 with socket.socket(socket.AF_INET,
4303 socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
4304 self.checkNonblock(s)
4305 s.setblocking(1)
4306 self.checkNonblock(s, False)
4307 s.setblocking(0)
4308 self.checkNonblock(s)
4309 s.settimeout(None)
4310 self.checkNonblock(s, False)
4311 s.settimeout(2.0)
4312 self.checkNonblock(s, timeout=2.0)
4313 s.setblocking(1)
4314 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004315 # defaulttimeout
4316 t = socket.getdefaulttimeout()
4317 socket.setdefaulttimeout(0.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004318 with socket.socket() as s:
4319 self.checkNonblock(s)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004320 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004321 with socket.socket() as s:
4322 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004323 socket.setdefaulttimeout(2.0)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004324 with socket.socket() as s:
4325 self.checkNonblock(s, timeout=2.0)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004326 socket.setdefaulttimeout(None)
Victor Stinner1d5eb342011-01-03 14:30:46 +00004327 with socket.socket() as s:
4328 self.checkNonblock(s, False)
Antoine Pitroub1c54962010-10-14 15:05:38 +00004329 socket.setdefaulttimeout(t)
4330
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004331
Guido van Rossumb995eb72002-07-31 16:08:40 +00004332def test_main():
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004333 tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
Ronald Oussoren94f25282010-05-05 19:11:21 +00004334 TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
Walter Dörwald21d3a322003-05-01 17:45:56 +00004335
4336 tests.extend([
4337 NonBlockingTCPTests,
4338 FileObjectClassTestCase,
Gregory P. Smithaafdca82010-01-04 04:50:36 +00004339 FileObjectInterruptedTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +00004340 UnbufferedFileObjectClassTestCase,
4341 LineBufferedFileObjectClassTestCase,
Thomas Woutersb2137042007-02-01 18:02:27 +00004342 SmallBufferedFileObjectClassTestCase,
Antoine Pitrou834bd812010-10-13 16:17:14 +00004343 UnicodeReadFileObjectClassTestCase,
4344 UnicodeWriteFileObjectClassTestCase,
4345 UnicodeReadWriteFileObjectClassTestCase,
Guido van Rossumd8faa362007-04-27 19:54:29 +00004346 NetworkConnectionNoServer,
4347 NetworkConnectionAttributesTest,
4348 NetworkConnectionBehaviourTest,
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +00004349 ContextManagersTest,
Antoine Pitroub1c54962010-10-14 15:05:38 +00004350 CloexecConstantTest,
4351 NonblockConstantTest
Walter Dörwald21d3a322003-05-01 17:45:56 +00004352 ])
Dave Cole331708b2004-08-09 04:51:41 +00004353 if hasattr(socket, "socketpair"):
4354 tests.append(BasicSocketPairTest)
Victor Stinnere6747472011-08-21 00:39:18 +02004355 if sys.platform == 'linux':
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004356 tests.append(TestLinuxAbstractNamespace)
Christian Heimes043d6f62008-01-07 17:19:16 +00004357 if isTipcAvailable():
4358 tests.append(TIPCTest)
Christian Heimes790c8232008-01-07 21:14:23 +00004359 tests.append(TIPCThreadableTest)
Charles-François Natali47413c12011-10-06 19:47:44 +02004360 tests.extend([BasicCANTest, CANTest])
Nick Coghlan96fe56a2011-08-22 11:55:57 +10004361 tests.extend([
4362 CmsgMacroTests,
4363 SendmsgUDPTest,
4364 RecvmsgUDPTest,
4365 RecvmsgIntoUDPTest,
4366 SendmsgUDP6Test,
4367 RecvmsgUDP6Test,
4368 RecvmsgRFC3542AncillaryUDP6Test,
4369 RecvmsgIntoRFC3542AncillaryUDP6Test,
4370 RecvmsgIntoUDP6Test,
4371 SendmsgTCPTest,
4372 RecvmsgTCPTest,
4373 RecvmsgIntoTCPTest,
4374 SendmsgSCTPStreamTest,
4375 RecvmsgSCTPStreamTest,
4376 RecvmsgIntoSCTPStreamTest,
4377 SendmsgUnixStreamTest,
4378 RecvmsgUnixStreamTest,
4379 RecvmsgIntoUnixStreamTest,
4380 RecvmsgSCMRightsStreamTest,
4381 RecvmsgIntoSCMRightsStreamTest,
4382 # These are slow when setitimer() is not available
4383 InterruptedRecvTimeoutTest,
4384 InterruptedSendTimeoutTest,
4385 ])
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004386
Benjamin Petersonee8712c2008-05-20 21:35:26 +00004387 thread_info = support.threading_setup()
4388 support.run_unittest(*tests)
4389 support.threading_cleanup(*thread_info)
Guido van Rossum24e4af82002-06-12 19:18:08 +00004390
4391if __name__ == "__main__":
Guido van Rossumb995eb72002-07-31 16:08:40 +00004392 test_main()