PageRenderTime 86ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 1ms

/Lib/test/test_socket.py

https://bitbucket.org/bluehorn/sampling_prof
Python | 5573 lines | 4996 code | 262 blank | 315 comment | 102 complexity | 40a0448fcedbe9f233b3dece173ad624 MD5 | raw file
Possible License(s): BSD-3-Clause, Unlicense, CC-BY-SA-3.0, 0BSD
  1. import unittest
  2. from test import support
  3. import errno
  4. import io
  5. import itertools
  6. import socket
  7. import select
  8. import tempfile
  9. import time
  10. import traceback
  11. import queue
  12. import sys
  13. import os
  14. import array
  15. import contextlib
  16. from weakref import proxy
  17. import signal
  18. import math
  19. import pickle
  20. import struct
  21. import random
  22. import string
  23. try:
  24. import multiprocessing
  25. except ImportError:
  26. multiprocessing = False
  27. try:
  28. import fcntl
  29. except ImportError:
  30. fcntl = None
  31. HOST = support.HOST
  32. MSG = 'Michael Gilfix was here\u1234\r\n'.encode('utf-8') ## test unicode string and carriage return
  33. try:
  34. import _thread as thread
  35. import threading
  36. except ImportError:
  37. thread = None
  38. threading = None
  39. try:
  40. import _socket
  41. except ImportError:
  42. _socket = None
  43. def _have_socket_can():
  44. """Check whether CAN sockets are supported on this host."""
  45. try:
  46. s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
  47. except (AttributeError, OSError):
  48. return False
  49. else:
  50. s.close()
  51. return True
  52. def _have_socket_rds():
  53. """Check whether RDS sockets are supported on this host."""
  54. try:
  55. s = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
  56. except (AttributeError, OSError):
  57. return False
  58. else:
  59. s.close()
  60. return True
  61. def _have_socket_alg():
  62. """Check whether AF_ALG sockets are supported on this host."""
  63. try:
  64. s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
  65. except (AttributeError, OSError):
  66. return False
  67. else:
  68. s.close()
  69. return True
  70. HAVE_SOCKET_CAN = _have_socket_can()
  71. HAVE_SOCKET_RDS = _have_socket_rds()
  72. HAVE_SOCKET_ALG = _have_socket_alg()
  73. # Size in bytes of the int type
  74. SIZEOF_INT = array.array("i").itemsize
  75. class SocketTCPTest(unittest.TestCase):
  76. def setUp(self):
  77. self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  78. self.port = support.bind_port(self.serv)
  79. self.serv.listen()
  80. def tearDown(self):
  81. self.serv.close()
  82. self.serv = None
  83. class SocketUDPTest(unittest.TestCase):
  84. def setUp(self):
  85. self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  86. self.port = support.bind_port(self.serv)
  87. def tearDown(self):
  88. self.serv.close()
  89. self.serv = None
  90. class ThreadSafeCleanupTestCase(unittest.TestCase):
  91. """Subclass of unittest.TestCase with thread-safe cleanup methods.
  92. This subclass protects the addCleanup() and doCleanups() methods
  93. with a recursive lock.
  94. """
  95. if threading:
  96. def __init__(self, *args, **kwargs):
  97. super().__init__(*args, **kwargs)
  98. self._cleanup_lock = threading.RLock()
  99. def addCleanup(self, *args, **kwargs):
  100. with self._cleanup_lock:
  101. return super().addCleanup(*args, **kwargs)
  102. def doCleanups(self, *args, **kwargs):
  103. with self._cleanup_lock:
  104. return super().doCleanups(*args, **kwargs)
  105. class SocketCANTest(unittest.TestCase):
  106. """To be able to run this test, a `vcan0` CAN interface can be created with
  107. the following commands:
  108. # modprobe vcan
  109. # ip link add dev vcan0 type vcan
  110. # ifconfig vcan0 up
  111. """
  112. interface = 'vcan0'
  113. bufsize = 128
  114. """The CAN frame structure is defined in <linux/can.h>:
  115. struct can_frame {
  116. canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
  117. __u8 can_dlc; /* data length code: 0 .. 8 */
  118. __u8 data[8] __attribute__((aligned(8)));
  119. };
  120. """
  121. can_frame_fmt = "=IB3x8s"
  122. can_frame_size = struct.calcsize(can_frame_fmt)
  123. """The Broadcast Management Command frame structure is defined
  124. in <linux/can/bcm.h>:
  125. struct bcm_msg_head {
  126. __u32 opcode;
  127. __u32 flags;
  128. __u32 count;
  129. struct timeval ival1, ival2;
  130. canid_t can_id;
  131. __u32 nframes;
  132. struct can_frame frames[0];
  133. }
  134. `bcm_msg_head` must be 8 bytes aligned because of the `frames` member (see
  135. `struct can_frame` definition). Must use native not standard types for packing.
  136. """
  137. bcm_cmd_msg_fmt = "@3I4l2I"
  138. bcm_cmd_msg_fmt += "x" * (struct.calcsize(bcm_cmd_msg_fmt) % 8)
  139. def setUp(self):
  140. self.s = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
  141. self.addCleanup(self.s.close)
  142. try:
  143. self.s.bind((self.interface,))
  144. except OSError:
  145. self.skipTest('network interface `%s` does not exist' %
  146. self.interface)
  147. class SocketRDSTest(unittest.TestCase):
  148. """To be able to run this test, the `rds` kernel module must be loaded:
  149. # modprobe rds
  150. """
  151. bufsize = 8192
  152. def setUp(self):
  153. self.serv = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
  154. self.addCleanup(self.serv.close)
  155. try:
  156. self.port = support.bind_port(self.serv)
  157. except OSError:
  158. self.skipTest('unable to bind RDS socket')
  159. class ThreadableTest:
  160. """Threadable Test class
  161. The ThreadableTest class makes it easy to create a threaded
  162. client/server pair from an existing unit test. To create a
  163. new threaded class from an existing unit test, use multiple
  164. inheritance:
  165. class NewClass (OldClass, ThreadableTest):
  166. pass
  167. This class defines two new fixture functions with obvious
  168. purposes for overriding:
  169. clientSetUp ()
  170. clientTearDown ()
  171. Any new test functions within the class must then define
  172. tests in pairs, where the test name is preceded with a
  173. '_' to indicate the client portion of the test. Ex:
  174. def testFoo(self):
  175. # Server portion
  176. def _testFoo(self):
  177. # Client portion
  178. Any exceptions raised by the clients during their tests
  179. are caught and transferred to the main thread to alert
  180. the testing framework.
  181. Note, the server setup function cannot call any blocking
  182. functions that rely on the client thread during setup,
  183. unless serverExplicitReady() is called just before
  184. the blocking call (such as in setting up a client/server
  185. connection and performing the accept() in setUp().
  186. """
  187. def __init__(self):
  188. # Swap the true setup function
  189. self.__setUp = self.setUp
  190. self.__tearDown = self.tearDown
  191. self.setUp = self._setUp
  192. self.tearDown = self._tearDown
  193. def serverExplicitReady(self):
  194. """This method allows the server to explicitly indicate that
  195. it wants the client thread to proceed. This is useful if the
  196. server is about to execute a blocking routine that is
  197. dependent upon the client thread during its setup routine."""
  198. self.server_ready.set()
  199. def _setUp(self):
  200. self.server_ready = threading.Event()
  201. self.client_ready = threading.Event()
  202. self.done = threading.Event()
  203. self.queue = queue.Queue(1)
  204. self.server_crashed = False
  205. # Do some munging to start the client test.
  206. methodname = self.id()
  207. i = methodname.rfind('.')
  208. methodname = methodname[i+1:]
  209. test_method = getattr(self, '_' + methodname)
  210. self.client_thread = thread.start_new_thread(
  211. self.clientRun, (test_method,))
  212. try:
  213. self.__setUp()
  214. except:
  215. self.server_crashed = True
  216. raise
  217. finally:
  218. self.server_ready.set()
  219. self.client_ready.wait()
  220. def _tearDown(self):
  221. self.__tearDown()
  222. self.done.wait()
  223. if self.queue.qsize():
  224. exc = self.queue.get()
  225. raise exc
  226. def clientRun(self, test_func):
  227. self.server_ready.wait()
  228. self.clientSetUp()
  229. self.client_ready.set()
  230. if self.server_crashed:
  231. self.clientTearDown()
  232. return
  233. if not hasattr(test_func, '__call__'):
  234. raise TypeError("test_func must be a callable function")
  235. try:
  236. test_func()
  237. except BaseException as e:
  238. self.queue.put(e)
  239. finally:
  240. self.clientTearDown()
  241. def clientSetUp(self):
  242. raise NotImplementedError("clientSetUp must be implemented.")
  243. def clientTearDown(self):
  244. self.done.set()
  245. thread.exit()
  246. class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
  247. def __init__(self, methodName='runTest'):
  248. SocketTCPTest.__init__(self, methodName=methodName)
  249. ThreadableTest.__init__(self)
  250. def clientSetUp(self):
  251. self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  252. def clientTearDown(self):
  253. self.cli.close()
  254. self.cli = None
  255. ThreadableTest.clientTearDown(self)
  256. class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
  257. def __init__(self, methodName='runTest'):
  258. SocketUDPTest.__init__(self, methodName=methodName)
  259. ThreadableTest.__init__(self)
  260. def clientSetUp(self):
  261. self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  262. def clientTearDown(self):
  263. self.cli.close()
  264. self.cli = None
  265. ThreadableTest.clientTearDown(self)
  266. class ThreadedCANSocketTest(SocketCANTest, ThreadableTest):
  267. def __init__(self, methodName='runTest'):
  268. SocketCANTest.__init__(self, methodName=methodName)
  269. ThreadableTest.__init__(self)
  270. def clientSetUp(self):
  271. self.cli = socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
  272. try:
  273. self.cli.bind((self.interface,))
  274. except OSError:
  275. # skipTest should not be called here, and will be called in the
  276. # server instead
  277. pass
  278. def clientTearDown(self):
  279. self.cli.close()
  280. self.cli = None
  281. ThreadableTest.clientTearDown(self)
  282. class ThreadedRDSSocketTest(SocketRDSTest, ThreadableTest):
  283. def __init__(self, methodName='runTest'):
  284. SocketRDSTest.__init__(self, methodName=methodName)
  285. ThreadableTest.__init__(self)
  286. def clientSetUp(self):
  287. self.cli = socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0)
  288. try:
  289. # RDS sockets must be bound explicitly to send or receive data
  290. self.cli.bind((HOST, 0))
  291. self.cli_addr = self.cli.getsockname()
  292. except OSError:
  293. # skipTest should not be called here, and will be called in the
  294. # server instead
  295. pass
  296. def clientTearDown(self):
  297. self.cli.close()
  298. self.cli = None
  299. ThreadableTest.clientTearDown(self)
  300. class SocketConnectedTest(ThreadedTCPSocketTest):
  301. """Socket tests for client-server connection.
  302. self.cli_conn is a client socket connected to the server. The
  303. setUp() method guarantees that it is connected to the server.
  304. """
  305. def __init__(self, methodName='runTest'):
  306. ThreadedTCPSocketTest.__init__(self, methodName=methodName)
  307. def setUp(self):
  308. ThreadedTCPSocketTest.setUp(self)
  309. # Indicate explicitly we're ready for the client thread to
  310. # proceed and then perform the blocking call to accept
  311. self.serverExplicitReady()
  312. conn, addr = self.serv.accept()
  313. self.cli_conn = conn
  314. def tearDown(self):
  315. self.cli_conn.close()
  316. self.cli_conn = None
  317. ThreadedTCPSocketTest.tearDown(self)
  318. def clientSetUp(self):
  319. ThreadedTCPSocketTest.clientSetUp(self)
  320. self.cli.connect((HOST, self.port))
  321. self.serv_conn = self.cli
  322. def clientTearDown(self):
  323. self.serv_conn.close()
  324. self.serv_conn = None
  325. ThreadedTCPSocketTest.clientTearDown(self)
  326. class SocketPairTest(unittest.TestCase, ThreadableTest):
  327. def __init__(self, methodName='runTest'):
  328. unittest.TestCase.__init__(self, methodName=methodName)
  329. ThreadableTest.__init__(self)
  330. def setUp(self):
  331. self.serv, self.cli = socket.socketpair()
  332. def tearDown(self):
  333. self.serv.close()
  334. self.serv = None
  335. def clientSetUp(self):
  336. pass
  337. def clientTearDown(self):
  338. self.cli.close()
  339. self.cli = None
  340. ThreadableTest.clientTearDown(self)
  341. # The following classes are used by the sendmsg()/recvmsg() tests.
  342. # Combining, for instance, ConnectedStreamTestMixin and TCPTestBase
  343. # gives a drop-in replacement for SocketConnectedTest, but different
  344. # address families can be used, and the attributes serv_addr and
  345. # cli_addr will be set to the addresses of the endpoints.
  346. class SocketTestBase(unittest.TestCase):
  347. """A base class for socket tests.
  348. Subclasses must provide methods newSocket() to return a new socket
  349. and bindSock(sock) to bind it to an unused address.
  350. Creates a socket self.serv and sets self.serv_addr to its address.
  351. """
  352. def setUp(self):
  353. self.serv = self.newSocket()
  354. self.bindServer()
  355. def bindServer(self):
  356. """Bind server socket and set self.serv_addr to its address."""
  357. self.bindSock(self.serv)
  358. self.serv_addr = self.serv.getsockname()
  359. def tearDown(self):
  360. self.serv.close()
  361. self.serv = None
  362. class SocketListeningTestMixin(SocketTestBase):
  363. """Mixin to listen on the server socket."""
  364. def setUp(self):
  365. super().setUp()
  366. self.serv.listen()
  367. class ThreadedSocketTestMixin(ThreadSafeCleanupTestCase, SocketTestBase,
  368. ThreadableTest):
  369. """Mixin to add client socket and allow client/server tests.
  370. Client socket is self.cli and its address is self.cli_addr. See
  371. ThreadableTest for usage information.
  372. """
  373. def __init__(self, *args, **kwargs):
  374. super().__init__(*args, **kwargs)
  375. ThreadableTest.__init__(self)
  376. def clientSetUp(self):
  377. self.cli = self.newClientSocket()
  378. self.bindClient()
  379. def newClientSocket(self):
  380. """Return a new socket for use as client."""
  381. return self.newSocket()
  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. def clientTearDown(self):
  387. self.cli.close()
  388. self.cli = None
  389. ThreadableTest.clientTearDown(self)
  390. class ConnectedStreamTestMixin(SocketListeningTestMixin,
  391. ThreadedSocketTestMixin):
  392. """Mixin to allow client/server stream tests with connected client.
  393. Server's socket representing connection to client is self.cli_conn
  394. and client's connection to server is self.serv_conn. (Based on
  395. SocketConnectedTest.)
  396. """
  397. def setUp(self):
  398. super().setUp()
  399. # Indicate explicitly we're ready for the client thread to
  400. # proceed and then perform the blocking call to accept
  401. self.serverExplicitReady()
  402. conn, addr = self.serv.accept()
  403. self.cli_conn = conn
  404. def tearDown(self):
  405. self.cli_conn.close()
  406. self.cli_conn = None
  407. super().tearDown()
  408. def clientSetUp(self):
  409. super().clientSetUp()
  410. self.cli.connect(self.serv_addr)
  411. self.serv_conn = self.cli
  412. def clientTearDown(self):
  413. self.serv_conn.close()
  414. self.serv_conn = None
  415. super().clientTearDown()
  416. class UnixSocketTestBase(SocketTestBase):
  417. """Base class for Unix-domain socket tests."""
  418. # This class is used for file descriptor passing tests, so we
  419. # create the sockets in a private directory so that other users
  420. # can't send anything that might be problematic for a privileged
  421. # user running the tests.
  422. def setUp(self):
  423. self.dir_path = tempfile.mkdtemp()
  424. self.addCleanup(os.rmdir, self.dir_path)
  425. super().setUp()
  426. def bindSock(self, sock):
  427. path = tempfile.mktemp(dir=self.dir_path)
  428. sock.bind(path)
  429. self.addCleanup(support.unlink, path)
  430. class UnixStreamBase(UnixSocketTestBase):
  431. """Base class for Unix-domain SOCK_STREAM tests."""
  432. def newSocket(self):
  433. return socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  434. class InetTestBase(SocketTestBase):
  435. """Base class for IPv4 socket tests."""
  436. host = HOST
  437. def setUp(self):
  438. super().setUp()
  439. self.port = self.serv_addr[1]
  440. def bindSock(self, sock):
  441. support.bind_port(sock, host=self.host)
  442. class TCPTestBase(InetTestBase):
  443. """Base class for TCP-over-IPv4 tests."""
  444. def newSocket(self):
  445. return socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  446. class UDPTestBase(InetTestBase):
  447. """Base class for UDP-over-IPv4 tests."""
  448. def newSocket(self):
  449. return socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  450. class SCTPStreamBase(InetTestBase):
  451. """Base class for SCTP tests in one-to-one (SOCK_STREAM) mode."""
  452. def newSocket(self):
  453. return socket.socket(socket.AF_INET, socket.SOCK_STREAM,
  454. socket.IPPROTO_SCTP)
  455. class Inet6TestBase(InetTestBase):
  456. """Base class for IPv6 socket tests."""
  457. host = support.HOSTv6
  458. class UDP6TestBase(Inet6TestBase):
  459. """Base class for UDP-over-IPv6 tests."""
  460. def newSocket(self):
  461. return socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
  462. # Test-skipping decorators for use with ThreadableTest.
  463. def skipWithClientIf(condition, reason):
  464. """Skip decorated test if condition is true, add client_skip decorator.
  465. If the decorated object is not a class, sets its attribute
  466. "client_skip" to a decorator which will return an empty function
  467. if the test is to be skipped, or the original function if it is
  468. not. This can be used to avoid running the client part of a
  469. skipped test when using ThreadableTest.
  470. """
  471. def client_pass(*args, **kwargs):
  472. pass
  473. def skipdec(obj):
  474. retval = unittest.skip(reason)(obj)
  475. if not isinstance(obj, type):
  476. retval.client_skip = lambda f: client_pass
  477. return retval
  478. def noskipdec(obj):
  479. if not (isinstance(obj, type) or hasattr(obj, "client_skip")):
  480. obj.client_skip = lambda f: f
  481. return obj
  482. return skipdec if condition else noskipdec
  483. def requireAttrs(obj, *attributes):
  484. """Skip decorated test if obj is missing any of the given attributes.
  485. Sets client_skip attribute as skipWithClientIf() does.
  486. """
  487. missing = [name for name in attributes if not hasattr(obj, name)]
  488. return skipWithClientIf(
  489. missing, "don't have " + ", ".join(name for name in missing))
  490. def requireSocket(*args):
  491. """Skip decorated test if a socket cannot be created with given arguments.
  492. When an argument is given as a string, will use the value of that
  493. attribute of the socket module, or skip the test if it doesn't
  494. exist. Sets client_skip attribute as skipWithClientIf() does.
  495. """
  496. err = None
  497. missing = [obj for obj in args if
  498. isinstance(obj, str) and not hasattr(socket, obj)]
  499. if missing:
  500. err = "don't have " + ", ".join(name for name in missing)
  501. else:
  502. callargs = [getattr(socket, obj) if isinstance(obj, str) else obj
  503. for obj in args]
  504. try:
  505. s = socket.socket(*callargs)
  506. except OSError as e:
  507. # XXX: check errno?
  508. err = str(e)
  509. else:
  510. s.close()
  511. return skipWithClientIf(
  512. err is not None,
  513. "can't create socket({0}): {1}".format(
  514. ", ".join(str(o) for o in args), err))
  515. #######################################################################
  516. ## Begin Tests
  517. class GeneralModuleTests(unittest.TestCase):
  518. def test_SocketType_is_socketobject(self):
  519. import _socket
  520. self.assertTrue(socket.SocketType is _socket.socket)
  521. s = socket.socket()
  522. self.assertIsInstance(s, socket.SocketType)
  523. s.close()
  524. def test_repr(self):
  525. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  526. with s:
  527. self.assertIn('fd=%i' % s.fileno(), repr(s))
  528. self.assertIn('family=%s' % socket.AF_INET, repr(s))
  529. self.assertIn('type=%s' % socket.SOCK_STREAM, repr(s))
  530. self.assertIn('proto=0', repr(s))
  531. self.assertNotIn('raddr', repr(s))
  532. s.bind(('127.0.0.1', 0))
  533. self.assertIn('laddr', repr(s))
  534. self.assertIn(str(s.getsockname()), repr(s))
  535. self.assertIn('[closed]', repr(s))
  536. self.assertNotIn('laddr', repr(s))
  537. @unittest.skipUnless(_socket is not None, 'need _socket module')
  538. def test_csocket_repr(self):
  539. s = _socket.socket(_socket.AF_INET, _socket.SOCK_STREAM)
  540. try:
  541. expected = ('<socket object, fd=%s, family=%s, type=%s, proto=%s>'
  542. % (s.fileno(), s.family, s.type, s.proto))
  543. self.assertEqual(repr(s), expected)
  544. finally:
  545. s.close()
  546. expected = ('<socket object, fd=-1, family=%s, type=%s, proto=%s>'
  547. % (s.family, s.type, s.proto))
  548. self.assertEqual(repr(s), expected)
  549. def test_weakref(self):
  550. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  551. p = proxy(s)
  552. self.assertEqual(p.fileno(), s.fileno())
  553. s.close()
  554. s = None
  555. try:
  556. p.fileno()
  557. except ReferenceError:
  558. pass
  559. else:
  560. self.fail('Socket proxy still exists')
  561. def testSocketError(self):
  562. # Testing socket module exceptions
  563. msg = "Error raising socket exception (%s)."
  564. with self.assertRaises(OSError, msg=msg % 'OSError'):
  565. raise OSError
  566. with self.assertRaises(OSError, msg=msg % 'socket.herror'):
  567. raise socket.herror
  568. with self.assertRaises(OSError, msg=msg % 'socket.gaierror'):
  569. raise socket.gaierror
  570. def testSendtoErrors(self):
  571. # Testing that sendto doesn't mask failures. See #10169.
  572. s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  573. self.addCleanup(s.close)
  574. s.bind(('', 0))
  575. sockname = s.getsockname()
  576. # 2 args
  577. with self.assertRaises(TypeError) as cm:
  578. s.sendto('\u2620', sockname)
  579. self.assertEqual(str(cm.exception),
  580. "a bytes-like object is required, not 'str'")
  581. with self.assertRaises(TypeError) as cm:
  582. s.sendto(5j, sockname)
  583. self.assertEqual(str(cm.exception),
  584. "a bytes-like object is required, not 'complex'")
  585. with self.assertRaises(TypeError) as cm:
  586. s.sendto(b'foo', None)
  587. self.assertIn('not NoneType',str(cm.exception))
  588. # 3 args
  589. with self.assertRaises(TypeError) as cm:
  590. s.sendto('\u2620', 0, sockname)
  591. self.assertEqual(str(cm.exception),
  592. "a bytes-like object is required, not 'str'")
  593. with self.assertRaises(TypeError) as cm:
  594. s.sendto(5j, 0, sockname)
  595. self.assertEqual(str(cm.exception),
  596. "a bytes-like object is required, not 'complex'")
  597. with self.assertRaises(TypeError) as cm:
  598. s.sendto(b'foo', 0, None)
  599. self.assertIn('not NoneType', str(cm.exception))
  600. with self.assertRaises(TypeError) as cm:
  601. s.sendto(b'foo', 'bar', sockname)
  602. self.assertIn('an integer is required', str(cm.exception))
  603. with self.assertRaises(TypeError) as cm:
  604. s.sendto(b'foo', None, None)
  605. self.assertIn('an integer is required', str(cm.exception))
  606. # wrong number of args
  607. with self.assertRaises(TypeError) as cm:
  608. s.sendto(b'foo')
  609. self.assertIn('(1 given)', str(cm.exception))
  610. with self.assertRaises(TypeError) as cm:
  611. s.sendto(b'foo', 0, sockname, 4)
  612. self.assertIn('(4 given)', str(cm.exception))
  613. def testCrucialConstants(self):
  614. # Testing for mission critical constants
  615. socket.AF_INET
  616. socket.SOCK_STREAM
  617. socket.SOCK_DGRAM
  618. socket.SOCK_RAW
  619. socket.SOCK_RDM
  620. socket.SOCK_SEQPACKET
  621. socket.SOL_SOCKET
  622. socket.SO_REUSEADDR
  623. def testHostnameRes(self):
  624. # Testing hostname resolution mechanisms
  625. hostname = socket.gethostname()
  626. try:
  627. ip = socket.gethostbyname(hostname)
  628. except OSError:
  629. # Probably name lookup wasn't set up right; skip this test
  630. self.skipTest('name lookup failure')
  631. self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
  632. try:
  633. hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
  634. except OSError:
  635. # Probably a similar problem as above; skip this test
  636. self.skipTest('name lookup failure')
  637. all_host_names = [hostname, hname] + aliases
  638. fqhn = socket.getfqdn(ip)
  639. if not fqhn in all_host_names:
  640. self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
  641. def test_host_resolution(self):
  642. for addr in ['0.1.1.~1', '1+.1.1.1', '::1q', '::1::2',
  643. '1:1:1:1:1:1:1:1:1']:
  644. self.assertRaises(OSError, socket.gethostbyname, addr)
  645. self.assertRaises(OSError, socket.gethostbyaddr, addr)
  646. for addr in [support.HOST, '10.0.0.1', '255.255.255.255']:
  647. self.assertEqual(socket.gethostbyname(addr), addr)
  648. # we don't test support.HOSTv6 because there's a chance it doesn't have
  649. # a matching name entry (e.g. 'ip6-localhost')
  650. for host in [support.HOST]:
  651. self.assertIn(host, socket.gethostbyaddr(host)[2])
  652. @unittest.skipUnless(hasattr(socket, 'sethostname'), "test needs socket.sethostname()")
  653. @unittest.skipUnless(hasattr(socket, 'gethostname'), "test needs socket.gethostname()")
  654. def test_sethostname(self):
  655. oldhn = socket.gethostname()
  656. try:
  657. socket.sethostname('new')
  658. except OSError as e:
  659. if e.errno == errno.EPERM:
  660. self.skipTest("test should be run as root")
  661. else:
  662. raise
  663. try:
  664. # running test as root!
  665. self.assertEqual(socket.gethostname(), 'new')
  666. # Should work with bytes objects too
  667. socket.sethostname(b'bar')
  668. self.assertEqual(socket.gethostname(), 'bar')
  669. finally:
  670. socket.sethostname(oldhn)
  671. @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
  672. 'socket.if_nameindex() not available.')
  673. def testInterfaceNameIndex(self):
  674. interfaces = socket.if_nameindex()
  675. for index, name in interfaces:
  676. self.assertIsInstance(index, int)
  677. self.assertIsInstance(name, str)
  678. # interface indices are non-zero integers
  679. self.assertGreater(index, 0)
  680. _index = socket.if_nametoindex(name)
  681. self.assertIsInstance(_index, int)
  682. self.assertEqual(index, _index)
  683. _name = socket.if_indextoname(index)
  684. self.assertIsInstance(_name, str)
  685. self.assertEqual(name, _name)
  686. @unittest.skipUnless(hasattr(socket, 'if_nameindex'),
  687. 'socket.if_nameindex() not available.')
  688. def testInvalidInterfaceNameIndex(self):
  689. # test nonexistent interface index/name
  690. self.assertRaises(OSError, socket.if_indextoname, 0)
  691. self.assertRaises(OSError, socket.if_nametoindex, '_DEADBEEF')
  692. # test with invalid values
  693. self.assertRaises(TypeError, socket.if_nametoindex, 0)
  694. self.assertRaises(TypeError, socket.if_indextoname, '_DEADBEEF')
  695. @unittest.skipUnless(hasattr(sys, 'getrefcount'),
  696. 'test needs sys.getrefcount()')
  697. def testRefCountGetNameInfo(self):
  698. # Testing reference count for getnameinfo
  699. try:
  700. # On some versions, this loses a reference
  701. orig = sys.getrefcount(__name__)
  702. socket.getnameinfo(__name__,0)
  703. except TypeError:
  704. if sys.getrefcount(__name__) != orig:
  705. self.fail("socket.getnameinfo loses a reference")
  706. def testInterpreterCrash(self):
  707. # Making sure getnameinfo doesn't crash the interpreter
  708. try:
  709. # On some versions, this crashes the interpreter.
  710. socket.getnameinfo(('x', 0, 0, 0), 0)
  711. except OSError:
  712. pass
  713. def testNtoH(self):
  714. # This just checks that htons etc. are their own inverse,
  715. # when looking at the lower 16 or 32 bits.
  716. sizes = {socket.htonl: 32, socket.ntohl: 32,
  717. socket.htons: 16, socket.ntohs: 16}
  718. for func, size in sizes.items():
  719. mask = (1<<size) - 1
  720. for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
  721. self.assertEqual(i & mask, func(func(i&mask)) & mask)
  722. swapped = func(mask)
  723. self.assertEqual(swapped & mask, mask)
  724. self.assertRaises(OverflowError, func, 1<<34)
  725. def testNtoHErrors(self):
  726. good_values = [ 1, 2, 3, 1, 2, 3 ]
  727. bad_values = [ -1, -2, -3, -1, -2, -3 ]
  728. for k in good_values:
  729. socket.ntohl(k)
  730. socket.ntohs(k)
  731. socket.htonl(k)
  732. socket.htons(k)
  733. for k in bad_values:
  734. self.assertRaises(OverflowError, socket.ntohl, k)
  735. self.assertRaises(OverflowError, socket.ntohs, k)
  736. self.assertRaises(OverflowError, socket.htonl, k)
  737. self.assertRaises(OverflowError, socket.htons, k)
  738. def testGetServBy(self):
  739. eq = self.assertEqual
  740. # Find one service that exists, then check all the related interfaces.
  741. # I've ordered this by protocols that have both a tcp and udp
  742. # protocol, at least for modern Linuxes.
  743. if (sys.platform.startswith(('freebsd', 'netbsd', 'gnukfreebsd'))
  744. or sys.platform in ('linux', 'darwin')):
  745. # avoid the 'echo' service on this platform, as there is an
  746. # assumption breaking non-standard port/protocol entry
  747. services = ('daytime', 'qotd', 'domain')
  748. else:
  749. services = ('echo', 'daytime', 'domain')
  750. for service in services:
  751. try:
  752. port = socket.getservbyname(service, 'tcp')
  753. break
  754. except OSError:
  755. pass
  756. else:
  757. raise OSError
  758. # Try same call with optional protocol omitted
  759. port2 = socket.getservbyname(service)
  760. eq(port, port2)
  761. # Try udp, but don't barf if it doesn't exist
  762. try:
  763. udpport = socket.getservbyname(service, 'udp')
  764. except OSError:
  765. udpport = None
  766. else:
  767. eq(udpport, port)
  768. # Now make sure the lookup by port returns the same service name
  769. eq(socket.getservbyport(port2), service)
  770. eq(socket.getservbyport(port, 'tcp'), service)
  771. if udpport is not None:
  772. eq(socket.getservbyport(udpport, 'udp'), service)
  773. # Make sure getservbyport does not accept out of range ports.
  774. self.assertRaises(OverflowError, socket.getservbyport, -1)
  775. self.assertRaises(OverflowError, socket.getservbyport, 65536)
  776. def testDefaultTimeout(self):
  777. # Testing default timeout
  778. # The default timeout should initially be None
  779. self.assertEqual(socket.getdefaulttimeout(), None)
  780. s = socket.socket()
  781. self.assertEqual(s.gettimeout(), None)
  782. s.close()
  783. # Set the default timeout to 10, and see if it propagates
  784. socket.setdefaulttimeout(10)
  785. self.assertEqual(socket.getdefaulttimeout(), 10)
  786. s = socket.socket()
  787. self.assertEqual(s.gettimeout(), 10)
  788. s.close()
  789. # Reset the default timeout to None, and see if it propagates
  790. socket.setdefaulttimeout(None)
  791. self.assertEqual(socket.getdefaulttimeout(), None)
  792. s = socket.socket()
  793. self.assertEqual(s.gettimeout(), None)
  794. s.close()
  795. # Check that setting it to an invalid value raises ValueError
  796. self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
  797. # Check that setting it to an invalid type raises TypeError
  798. self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
  799. @unittest.skipUnless(hasattr(socket, 'inet_aton'),
  800. 'test needs socket.inet_aton()')
  801. def testIPv4_inet_aton_fourbytes(self):
  802. # Test that issue1008086 and issue767150 are fixed.
  803. # It must return 4 bytes.
  804. self.assertEqual(b'\x00'*4, socket.inet_aton('0.0.0.0'))
  805. self.assertEqual(b'\xff'*4, socket.inet_aton('255.255.255.255'))
  806. @unittest.skipUnless(hasattr(socket, 'inet_pton'),
  807. 'test needs socket.inet_pton()')
  808. def testIPv4toString(self):
  809. from socket import inet_aton as f, inet_pton, AF_INET
  810. g = lambda a: inet_pton(AF_INET, a)
  811. assertInvalid = lambda func,a: self.assertRaises(
  812. (OSError, ValueError), func, a
  813. )
  814. self.assertEqual(b'\x00\x00\x00\x00', f('0.0.0.0'))
  815. self.assertEqual(b'\xff\x00\xff\x00', f('255.0.255.0'))
  816. self.assertEqual(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
  817. self.assertEqual(b'\x01\x02\x03\x04', f('1.2.3.4'))
  818. self.assertEqual(b'\xff\xff\xff\xff', f('255.255.255.255'))
  819. assertInvalid(f, '0.0.0.')
  820. assertInvalid(f, '300.0.0.0')
  821. assertInvalid(f, 'a.0.0.0')
  822. assertInvalid(f, '1.2.3.4.5')
  823. assertInvalid(f, '::1')
  824. self.assertEqual(b'\x00\x00\x00\x00', g('0.0.0.0'))
  825. self.assertEqual(b'\xff\x00\xff\x00', g('255.0.255.0'))
  826. self.assertEqual(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
  827. self.assertEqual(b'\xff\xff\xff\xff', g('255.255.255.255'))
  828. assertInvalid(g, '0.0.0.')
  829. assertInvalid(g, '300.0.0.0')
  830. assertInvalid(g, 'a.0.0.0')
  831. assertInvalid(g, '1.2.3.4.5')
  832. assertInvalid(g, '::1')
  833. @unittest.skipUnless(hasattr(socket, 'inet_pton'),
  834. 'test needs socket.inet_pton()')
  835. def testIPv6toString(self):
  836. try:
  837. from socket import inet_pton, AF_INET6, has_ipv6
  838. if not has_ipv6:
  839. self.skipTest('IPv6 not available')
  840. except ImportError:
  841. self.skipTest('could not import needed symbols from socket')
  842. if sys.platform == "win32":
  843. try:
  844. inet_pton(AF_INET6, '::')
  845. except OSError as e:
  846. if e.winerror == 10022:
  847. self.skipTest('IPv6 might not be supported')
  848. f = lambda a: inet_pton(AF_INET6, a)
  849. assertInvalid = lambda a: self.assertRaises(
  850. (OSError, ValueError), f, a
  851. )
  852. self.assertEqual(b'\x00' * 16, f('::'))
  853. self.assertEqual(b'\x00' * 16, f('0::0'))
  854. self.assertEqual(b'\x00\x01' + b'\x00' * 14, f('1::'))
  855. self.assertEqual(
  856. b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
  857. f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
  858. )
  859. self.assertEqual(
  860. b'\xad\x42\x0a\xbc' + b'\x00' * 4 + b'\x01\x27\x00\x00\x02\x54\x00\x02',
  861. f('ad42:abc::127:0:254:2')
  862. )
  863. self.assertEqual(b'\x00\x12\x00\x0a' + b'\x00' * 12, f('12:a::'))
  864. assertInvalid('0x20::')
  865. assertInvalid(':::')
  866. assertInvalid('::0::')
  867. assertInvalid('1::abc::')
  868. assertInvalid('1::abc::def')
  869. assertInvalid('1:2:3:4:5:6:')
  870. assertInvalid('1:2:3:4:5:6')
  871. assertInvalid('1:2:3:4:5:6:7:8:')
  872. assertInvalid('1:2:3:4:5:6:7:8:0')
  873. self.assertEqual(b'\x00' * 12 + b'\xfe\x2a\x17\x40',
  874. f('::254.42.23.64')
  875. )
  876. self.assertEqual(
  877. b'\x00\x42' + b'\x00' * 8 + b'\xa2\x9b\xfe\x2a\x17\x40',
  878. f('42::a29b:254.42.23.64')
  879. )
  880. self.assertEqual(
  881. b'\x00\x42\xa8\xb9\x00\x00\x00\x02\xff\xff\xa2\x9b\xfe\x2a\x17\x40',
  882. f('42:a8b9:0:2:ffff:a29b:254.42.23.64')
  883. )
  884. assertInvalid('255.254.253.252')
  885. assertInvalid('1::260.2.3.0')
  886. assertInvalid('1::0.be.e.0')
  887. assertInvalid('1:2:3:4:5:6:7:1.2.3.4')
  888. assertInvalid('::1.2.3.4:0')
  889. assertInvalid('0.100.200.0:3:4:5:6:7:8')
  890. @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
  891. 'test needs socket.inet_ntop()')
  892. def testStringToIPv4(self):
  893. from socket import inet_ntoa as f, inet_ntop, AF_INET
  894. g = lambda a: inet_ntop(AF_INET, a)
  895. assertInvalid = lambda func,a: self.assertRaises(
  896. (OSError, ValueError), func, a
  897. )
  898. self.assertEqual('1.0.1.0', f(b'\x01\x00\x01\x00'))
  899. self.assertEqual('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
  900. self.assertEqual('255.255.255.255', f(b'\xff\xff\xff\xff'))
  901. self.assertEqual('1.2.3.4', f(b'\x01\x02\x03\x04'))
  902. assertInvalid(f, b'\x00' * 3)
  903. assertInvalid(f, b'\x00' * 5)
  904. assertInvalid(f, b'\x00' * 16)
  905. self.assertEqual('170.85.170.85', f(bytearray(b'\xaa\x55\xaa\x55')))
  906. self.assertEqual('1.0.1.0', g(b'\x01\x00\x01\x00'))
  907. self.assertEqual('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
  908. self.assertEqual('255.255.255.255', g(b'\xff\xff\xff\xff'))
  909. assertInvalid(g, b'\x00' * 3)
  910. assertInvalid(g, b'\x00' * 5)
  911. assertInvalid(g, b'\x00' * 16)
  912. self.assertEqual('170.85.170.85', g(bytearray(b'\xaa\x55\xaa\x55')))
  913. @unittest.skipUnless(hasattr(socket, 'inet_ntop'),
  914. 'test needs socket.inet_ntop()')
  915. def testStringToIPv6(self):
  916. try:
  917. from socket import inet_ntop, AF_INET6, has_ipv6
  918. if not has_ipv6:
  919. self.skipTest('IPv6 not available')
  920. except ImportError:
  921. self.skipTest('could not import needed symbols from socket')
  922. if sys.platform == "win32":
  923. try:
  924. inet_ntop(AF_INET6, b'\x00' * 16)
  925. except OSError as e:
  926. if e.winerror == 10022:
  927. self.skipTest('IPv6 might not be supported')
  928. f = lambda a: inet_ntop(AF_INET6, a)
  929. assertInvalid = lambda a: self.assertRaises(
  930. (OSError, ValueError), f, a
  931. )
  932. self.assertEqual('::', f(b'\x00' * 16))
  933. self.assertEqual('::1', f(b'\x00' * 15 + b'\x01'))
  934. self.assertEqual(
  935. 'aef:b01:506:1001:ffff:9997:55:170',
  936. f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
  937. )
  938. self.assertEqual('::1', f(bytearray(b'\x00' * 15 + b'\x01')))
  939. assertInvalid(b'\x12' * 15)
  940. assertInvalid(b'\x12' * 17)
  941. assertInvalid(b'\x12' * 4)
  942. # XXX The following don't test module-level functionality...
  943. def testSockName(self):
  944. # Testing getsockname()
  945. port = support.find_unused_port()
  946. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  947. self.addCleanup(sock.close)
  948. sock.bind(("0.0.0.0", port))
  949. name = sock.getsockname()
  950. # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
  951. # it reasonable to get the host's addr in addition to 0.0.0.0.
  952. # At least for eCos. This is required for the S/390 to pass.
  953. try:
  954. my_ip_addr = socket.gethostbyname(socket.gethostname())
  955. except OSError:
  956. # Probably name lookup wasn't set up right; skip this test
  957. self.skipTest('name lookup failure')
  958. self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
  959. self.assertEqual(name[1], port)
  960. def testGetSockOpt(self):
  961. # Testing getsockopt()
  962. # We know a socket should start without reuse==0
  963. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  964. self.addCleanup(sock.close)
  965. reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
  966. self.assertFalse(reuse != 0, "initial mode is reuse")
  967. def testSetSockOpt(self):
  968. # Testing setsockopt()
  969. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  970. self.addCleanup(sock.close)
  971. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  972. reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
  973. self.assertFalse(reuse == 0, "failed to set reuse mode")
  974. def testSendAfterClose(self):
  975. # testing send() after close() with timeout
  976. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  977. sock.settimeout(1)
  978. sock.close()
  979. self.assertRaises(OSError, sock.send, b"spam")
  980. def testCloseException(self):
  981. sock = socket.socket()
  982. socket.socket(fileno=sock.fileno()).close()
  983. try:
  984. sock.close()
  985. except OSError as err:
  986. # Winsock apparently raises ENOTSOCK
  987. self.assertIn(err.errno, (errno.EBADF, errno.ENOTSOCK))
  988. else:
  989. self.fail("close() should raise EBADF/ENOTSOCK")
  990. def testNewAttributes(self):
  991. # testing .family, .type and .protocol
  992. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  993. self.assertEqual(sock.family, socket.AF_INET)
  994. if hasattr(socket, 'SOCK_CLOEXEC'):
  995. self.assertIn(sock.type,
  996. (socket.SOCK_STREAM | socket.SOCK_CLOEXEC,
  997. socket.SOCK_STREAM))
  998. else:
  999. self.assertEqual(sock.type, socket.SOCK_STREAM)
  1000. self.assertEqual(sock.proto, 0)
  1001. sock.close()
  1002. def test_getsockaddrarg(self):
  1003. sock = socket.socket()
  1004. self.addCleanup(sock.close)
  1005. port = support.find_unused_port()
  1006. big_port = port + 65536
  1007. neg_port = port - 65536
  1008. self.assertRaises(OverflowError, sock.bind, (HOST, big_port))
  1009. self.assertRaises(OverflowError, sock.bind, (HOST, neg_port))
  1010. # Since find_unused_port() is inherently subject to race conditions, we
  1011. # call it a couple times if necessary.
  1012. for i in itertools.count():
  1013. port = support.find_unused_port()
  1014. try:
  1015. sock.bind((HOST, port))
  1016. except OSError as e:
  1017. if e.errno != errno.EADDRINUSE or i == 5:
  1018. raise
  1019. else:
  1020. break
  1021. @unittest.skipUnless(os.name == "nt", "Windows specific")
  1022. def test_sock_ioctl(self):
  1023. self.assertTrue(hasattr(socket.socket, 'ioctl'))
  1024. self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
  1025. self.assertTrue(hasattr(socket, 'RCVALL_ON'))
  1026. self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
  1027. self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
  1028. s = socket.socket()
  1029. self.addCleanup(s.close)
  1030. self.assertRaises(ValueError, s.ioctl, -1, None)
  1031. s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
  1032. @unittest.skipUnless(os.name == "nt", "Windows specific")
  1033. @unittest.skipUnless(hasattr(socket, 'SIO_LOOPBACK_FAST_PATH'),
  1034. 'Loopback fast path support required for this test')
  1035. def test_sio_loopback_fast_path(self):
  1036. s = socket.socket()
  1037. self.addCleanup(s.close)
  1038. try:
  1039. s.ioctl(socket.SIO_LOOPBACK_FAST_PATH, True)
  1040. except OSError as exc:
  1041. WSAEOPNOTSUPP = 10045
  1042. if exc.winerror == WSAEOPNOTSUPP:
  1043. self.skipTest("SIO_LOOPBACK_FAST_PATH is defined but "
  1044. "doesn't implemented in this Windows version")
  1045. raise
  1046. self.assertRaises(TypeError, s.ioctl, socket.SIO_LOOPBACK_FAST_PATH, None)
  1047. def testGetaddrinfo(self):
  1048. try:
  1049. socket.getaddrinfo('localhost', 80)
  1050. except socket.gaierror as err:
  1051. if err.errno == socket.EAI_SERVICE:
  1052. # see http://bugs.python.org/issue1282647
  1053. self.skipTest("buggy libc version")
  1054. raise
  1055. # len of every sequence is supposed to be == 5
  1056. for info in socket.getaddrinfo(HOST, None):
  1057. self.assertEqual(len(info), 5)
  1058. # host can be a domain name, a string representation of an
  1059. # IPv4/v6 address or None
  1060. socket.getaddrinfo('localhost', 80)
  1061. socket.getaddrinfo('127.0.0.1', 80)
  1062. socket.getaddrinfo(None, 80)
  1063. if support.IPV6_ENABLED:
  1064. socket.getaddrinfo('::1', 80)
  1065. # port can be a string service name such as "http", a numeric
  1066. # port number or None
  1067. socket.getaddrinfo(HOST, "http")
  1068. socket.getaddrinfo(HOST, 80)
  1069. socket.getaddrinfo(HOST, None)
  1070. # test family and socktype filters
  1071. infos = socket.getaddrinfo(HOST, 80, socket.AF_INET, socket.SOCK_STREAM)
  1072. for family, type, _, _, _ in infos:
  1073. self.assertEqual(family, socket.AF_INET)
  1074. self.assertEqual(str(family), 'AddressFamily.AF_INET')
  1075. self.assertEqual(type, socket.SOCK_STREAM)
  1076. self.assertEqual(str(type), 'SocketKind.SOCK_STREAM')
  1077. infos = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
  1078. for _, socktype, _, _, _ in infos:
  1079. self.assertEqual(socktype, socket.SOCK_STREAM)
  1080. # test proto and flags arguments
  1081. socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
  1082. socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
  1083. # a server willing to support both IPv4 and IPv6 will
  1084. # usually do this
  1085. socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
  1086. socket.AI_PASSIVE)
  1087. # test keyword arguments
  1088. a = socket.getaddrinfo(HOST, None)
  1089. b = socket.getaddrinfo(host=HOST, port=None)
  1090. self.assertEqual(a, b)
  1091. a = socket.getaddrinfo(HOST, None, socket.AF_INET)
  1092. b = socket.getaddrinfo(HOST, None, family=socket.AF_INET)
  1093. self.assertEqual(a, b)
  1094. a = socket.getaddrinfo(HOST, None, 0, socket.SOCK_STREAM)
  1095. b = socket.getaddrinfo(HOST, None, type=socket.SOCK_STREAM)
  1096. self.assertEqual(a, b)
  1097. a = socket.getaddrinfo(HOST, None, 0, 0, socket.SOL_TCP)
  1098. b = socket.getaddrinfo(HOST, None, proto=socket.SOL_TCP)
  1099. self.assertEqual(a, b)
  1100. a = socket.getaddrinfo(HOST, None, 0, 0, 0, socket.AI_PASSIVE)
  1101. b = socket.getaddrinfo(HOST, None, flags=socket.AI_PASSIVE)
  1102. self.assertEqual(a, b)
  1103. a = socket.getaddrinfo(None, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, 0,
  1104. socket.AI_PASSIVE)
  1105. b = socket.getaddrinfo(host=None, port=0, family=socket.AF_UNSPEC,
  1106. type=socket.SOCK_STREAM, proto=0,
  1107. flags=socket.AI_PASSIVE)
  1108. self.assertEqual(a, b)
  1109. # Issue #6697.
  1110. self.assertRaises(UnicodeEncodeError, socket.getaddrinfo, 'localhost', '\uD800')
  1111. # Issue 17269: test workaround for OS X platform bug segfault
  1112. if hasattr(socket, 'AI_NUMERICSERV'):
  1113. try:
  1114. # The arguments here are undefined and the call may succeed
  1115. # or fail. All we care here is that it doesn't segfault.
  1116. socket.getaddrinfo("localhost", None, 0, 0, 0,
  1117. socket.AI_NUMERICSERV)
  1118. except socket.gaierror:
  1119. pass
  1120. def test_getnameinfo(self):
  1121. # only IP addresses are allowed
  1122. self.assertRaises(OSError, socket.getnameinfo, ('mail.python.org',0), 0)
  1123. @unittest.skipUnless(support.is_resource_enabled('network'),
  1124. 'network is not enabled')
  1125. def test_idna(self):
  1126. # Check for internet access before running test
  1127. # (issue #12804, issue #25138).
  1128. with support.transient_internet('python.org'):
  1129. socket.gethostbyname('python.org')
  1130. # these should all be successful
  1131. domain = 'испытание.pythontest.net'
  1132. socket.gethostbyname(domain)
  1133. socket.gethostbyname_ex(domain)
  1134. socket.getaddrinfo(domain,0,socket.AF_UNSPEC,socket.SOCK_STREAM)
  1135. # this may not work if the forward lookup choses the IPv6 address, as that doesn't
  1136. # have a reverse entry yet
  1137. # socket.gethostbyaddr('испытание.python.org')
  1138. def check_sendall_interrupted(self, with_timeout):
  1139. # socketpair() is not strictly required, but it makes things easier.
  1140. if not hasattr(signal, 'alarm') or not hasattr(socket, 'socketpair'):
  1141. self.skipTest("signal.alarm and socket.socketpair required for this test")
  1142. # Our signal handlers clobber the C errno by calling a math function
  1143. # with an invalid domain value.
  1144. def ok_handler(*args):
  1145. self.assertRaises(ValueError, math.acosh, 0)
  1146. def raising_handler(*args):
  1147. self.assertRaises(ValueError, math.acosh, 0)
  1148. 1 // 0
  1149. c, s = socket.socketpair()
  1150. old_alarm = signal.signal(signal.SIGALRM, raising_handler)
  1151. try:
  1152. if with_timeout:
  1153. # Just above the one second minimum for signal.alarm
  1154. c.settimeout(1.5)
  1155. with self.assertRaises(ZeroDivisionError):
  1156. signal.alarm(1)
  1157. c.sendall(b"x" * support.SOCK_MAX_SIZE)
  1158. if with_timeout:
  1159. signal.signal(signal.SIGALRM, ok_handler)
  1160. signal.alarm(1)
  1161. self.assertRaises(socket.timeout, c.sendall,
  1162. b"x" * support.SOCK_MAX_SIZE)
  1163. finally:
  1164. signal.alarm(0)
  1165. signal.signal(signal.SIGALRM, old_alarm)
  1166. c.close()
  1167. s.close()
  1168. def test_sendall_interrupted(self):
  1169. self.check_sendall_interrupted(False)
  1170. def test_sendall_interrupted_with_timeout(self):
  1171. self.check_sendall_interrupted(True)
  1172. def test_dealloc_warn(self):
  1173. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  1174. r = repr(sock)
  1175. with self.assertWarns(ResourceWarning) as cm:
  1176. sock = None
  1177. support.gc_collect()
  1178. self.assertIn(r, str(cm.warning.args[0]))
  1179. # An open socket file object gets dereferenced after the socket
  1180. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  1181. f = sock.makefile('rb')
  1182. r = repr(sock)
  1183. sock = None
  1184. support.gc_collect()
  1185. with self.assertWarns(ResourceWarning):
  1186. f = None
  1187. support.gc_collect()
  1188. def test_name_closed_socketio(self):
  1189. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
  1190. fp = sock.makefile("rb")
  1191. fp.close()
  1192. self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
  1193. def test_unusable_closed_socketio(self):
  1194. with socket.socket() as sock:
  1195. fp = sock.makefile("rb", buffering=0)
  1196. self.assertTrue(fp.readable())
  1197. self.assertFalse(fp.writable())
  1198. self.assertFalse(fp.seekable())
  1199. fp.close()
  1200. self.assertRaises(ValueError, fp.readable)
  1201. self.assertRaises(ValueError, fp.writable)
  1202. self.assertRaises(ValueError, fp.seekable)
  1203. def test_makefile_mode(self):
  1204. for mode in 'r', 'rb', 'rw', 'w', 'wb':
  1205. with self.subTest(mode=mode):
  1206. with socket.socket() as sock:
  1207. with sock.makefile(mode) as fp:
  1208. self.assertEqual(fp.mode, mode)
  1209. def test_makefile_invalid_mode(self):
  1210. for mode in 'rt', 'x', '+', 'a':
  1211. with self.subTest(mode=mode):
  1212. with socket.socket() as sock:
  1213. with self.assertRaisesRegex(ValueError, 'invalid mode'):
  1214. sock.makefile(mode)
  1215. def test_pickle(self):
  1216. sock = socket.socket()
  1217. with sock:
  1218. for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
  1219. self.assertRaises(TypeError, pickle.dumps, sock, protocol)
  1220. for protocol in range(pickle.HIGHEST_PROTOCOL + 1):
  1221. family = pickle.loads(pickle.dumps(socket.AF_INET, protocol))
  1222. self.assertEqual(family, socket.AF_INET)
  1223. type = pickle.loads(pickle.dumps(socket.SOCK_STREAM, protocol))
  1224. self.assertEqual(type, socket.SOCK_STREAM)
  1225. def test_listen_backlog(self):
  1226. for backlog in 0, -1:
  1227. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
  1228. srv.bind((HOST, 0))
  1229. srv.listen(backlog)
  1230. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as srv:
  1231. srv.bind((HOST, 0))
  1232. srv.listen()
  1233. @support.cpython_only
  1234. def test_listen_backlog_overflow(self):
  1235. # Issue 15989
  1236. import _testcapi
  1237. srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  1238. srv.bind((HOST, 0))
  1239. self.assertRaises(OverflowError, srv.listen, _testcapi.INT_MAX + 1)
  1240. srv.close()
  1241. @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
  1242. def test_flowinfo(self):
  1243. self.assertRaises(OverflowError, socket.getnameinfo,
  1244. (support.HOSTv6, 0, 0xffffffff), 0)
  1245. with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as s:
  1246. self.assertRaises(OverflowError, s.bind, (support.HOSTv6, 0, -10))
  1247. def test_str_for_enums(self):
  1248. # Make sure that the AF_* and SOCK_* constants have enum-like string
  1249. # reprs.
  1250. with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
  1251. self.assertEqual(str(s.family), 'AddressFamily.AF_INET')
  1252. self.assertEqual(str(s.type), 'SocketKind.SOCK_STREAM')
  1253. @unittest.skipIf(os.name == 'nt', 'Will not work on Windows')
  1254. def test_uknown_socket_family_repr(self):
  1255. # Test that when created with a family that's not one of the known
  1256. # AF_*/SOCK_* constants, socket.family just returns the number.
  1257. #
  1258. # To do this we fool socket.socket into believing it already has an
  1259. # open fd because on this path it doesn't actually verify the family and
  1260. # type and populates the socket object.
  1261. #
  1262. # On Windows this trick won't work, so the test is skipped.
  1263. fd, _ = tempfile.mkstemp()
  1264. with socket.socket(family=42424, type=13331, fileno=fd) as s:
  1265. self.assertEqual(s.family, 42424)
  1266. self.assertEqual(s.type, 13331)
  1267. @unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
  1268. class BasicCANTest(unittest.TestCase):
  1269. def testCrucialConstants(self):
  1270. socket.AF_CAN
  1271. socket.PF_CAN
  1272. socket.CAN_RAW
  1273. @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
  1274. 'socket.CAN_BCM required for this test.')
  1275. def testBCMConstants(self):
  1276. socket.CAN_BCM
  1277. # opcodes
  1278. socket.CAN_BCM_TX_SETUP # create (cyclic) transmission task
  1279. socket.CAN_BCM_TX_DELETE # remove (cyclic) transmission task
  1280. socket.CAN_BCM_TX_READ # read properties of (cyclic) transmission task
  1281. socket.CAN_BCM_TX_SEND # send one CAN frame
  1282. socket.CAN_BCM_RX_SETUP # create RX content filter subscription
  1283. socket.CAN_BCM_RX_DELETE # remove RX content filter subscription
  1284. socket.CAN_BCM_RX_READ # read properties of RX content filter subscription
  1285. socket.CAN_BCM_TX_STATUS # reply to TX_READ request
  1286. socket.CAN_BCM_TX_EXPIRED # notification on performed transmissions (count=0)
  1287. socket.CAN_BCM_RX_STATUS # reply to RX_READ request
  1288. socket.CAN_BCM_RX_TIMEOUT # cyclic message is absent
  1289. socket.CAN_BCM_RX_CHANGED # updated CAN frame (detected content change)
  1290. def testCreateSocket(self):
  1291. with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
  1292. pass
  1293. @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
  1294. 'socket.CAN_BCM required for this test.')
  1295. def testCreateBCMSocket(self):
  1296. with socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM) as s:
  1297. pass
  1298. def testBindAny(self):
  1299. with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
  1300. s.bind(('', ))
  1301. def testTooLongInterfaceName(self):
  1302. # most systems limit IFNAMSIZ to 16, take 1024 to be sure
  1303. with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
  1304. self.assertRaisesRegex(OSError, 'interface name too long',
  1305. s.bind, ('x' * 1024,))
  1306. @unittest.skipUnless(hasattr(socket, "CAN_RAW_LOOPBACK"),
  1307. 'socket.CAN_RAW_LOOPBACK required for this test.')
  1308. def testLoopback(self):
  1309. with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
  1310. for loopback in (0, 1):
  1311. s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK,
  1312. loopback)
  1313. self.assertEqual(loopback,
  1314. s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_LOOPBACK))
  1315. @unittest.skipUnless(hasattr(socket, "CAN_RAW_FILTER"),
  1316. 'socket.CAN_RAW_FILTER required for this test.')
  1317. def testFilter(self):
  1318. can_id, can_mask = 0x200, 0x700
  1319. can_filter = struct.pack("=II", can_id, can_mask)
  1320. with socket.socket(socket.PF_CAN, socket.SOCK_RAW, socket.CAN_RAW) as s:
  1321. s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, can_filter)
  1322. self.assertEqual(can_filter,
  1323. s.getsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, 8))
  1324. s.setsockopt(socket.SOL_CAN_RAW, socket.CAN_RAW_FILTER, bytearray(can_filter))
  1325. @unittest.skipUnless(HAVE_SOCKET_CAN, 'SocketCan required for this test.')
  1326. @unittest.skipUnless(thread, 'Threading required for this test.')
  1327. class CANTest(ThreadedCANSocketTest):
  1328. def __init__(self, methodName='runTest'):
  1329. ThreadedCANSocketTest.__init__(self, methodName=methodName)
  1330. @classmethod
  1331. def build_can_frame(cls, can_id, data):
  1332. """Build a CAN frame."""
  1333. can_dlc = len(data)
  1334. data = data.ljust(8, b'\x00')
  1335. return struct.pack(cls.can_frame_fmt, can_id, can_dlc, data)
  1336. @classmethod
  1337. def dissect_can_frame(cls, frame):
  1338. """Dissect a CAN frame."""
  1339. can_id, can_dlc, data = struct.unpack(cls.can_frame_fmt, frame)
  1340. return (can_id, can_dlc, data[:can_dlc])
  1341. def testSendFrame(self):
  1342. cf, addr = self.s.recvfrom(self.bufsize)
  1343. self.assertEqual(self.cf, cf)
  1344. self.assertEqual(addr[0], self.interface)
  1345. self.assertEqual(addr[1], socket.AF_CAN)
  1346. def _testSendFrame(self):
  1347. self.cf = self.build_can_frame(0x00, b'\x01\x02\x03\x04\x05')
  1348. self.cli.send(self.cf)
  1349. def testSendMaxFrame(self):
  1350. cf, addr = self.s.recvfrom(self.bufsize)
  1351. self.assertEqual(self.cf, cf)
  1352. def _testSendMaxFrame(self):
  1353. self.cf = self.build_can_frame(0x00, b'\x07' * 8)
  1354. self.cli.send(self.cf)
  1355. def testSendMultiFrames(self):
  1356. cf, addr = self.s.recvfrom(self.bufsize)
  1357. self.assertEqual(self.cf1, cf)
  1358. cf, addr = self.s.recvfrom(self.bufsize)
  1359. self.assertEqual(self.cf2, cf)
  1360. def _testSendMultiFrames(self):
  1361. self.cf1 = self.build_can_frame(0x07, b'\x44\x33\x22\x11')
  1362. self.cli.send(self.cf1)
  1363. self.cf2 = self.build_can_frame(0x12, b'\x99\x22\x33')
  1364. self.cli.send(self.cf2)
  1365. @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
  1366. 'socket.CAN_BCM required for this test.')
  1367. def _testBCM(self):
  1368. cf, addr = self.cli.recvfrom(self.bufsize)
  1369. self.assertEqual(self.cf, cf)
  1370. can_id, can_dlc, data = self.dissect_can_frame(cf)
  1371. self.assertEqual(self.can_id, can_id)
  1372. self.assertEqual(self.data, data)
  1373. @unittest.skipUnless(hasattr(socket, "CAN_BCM"),
  1374. 'socket.CAN_BCM required for this test.')
  1375. def testBCM(self):
  1376. bcm = socket.socket(socket.PF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)
  1377. self.addCleanup(bcm.close)
  1378. bcm.connect((self.interface,))
  1379. self.can_id = 0x123
  1380. self.data = bytes([0xc0, 0xff, 0xee])
  1381. self.cf = self.build_can_frame(self.can_id, self.data)
  1382. opcode = socket.CAN_BCM_TX_SEND
  1383. flags = 0
  1384. count = 0
  1385. ival1_seconds = ival1_usec = ival2_seconds = ival2_usec = 0
  1386. bcm_can_id = 0x0222
  1387. nframes = 1
  1388. assert len(self.cf) == 16
  1389. header = struct.pack(self.bcm_cmd_msg_fmt,
  1390. opcode,
  1391. flags,
  1392. count,
  1393. ival1_seconds,
  1394. ival1_usec,
  1395. ival2_seconds,
  1396. ival2_usec,
  1397. bcm_can_id,
  1398. nframes,
  1399. )
  1400. header_plus_frame = header + self.cf
  1401. bytes_sent = bcm.send(header_plus_frame)
  1402. self.assertEqual(bytes_sent, len(header_plus_frame))
  1403. @unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
  1404. class BasicRDSTest(unittest.TestCase):
  1405. def testCrucialConstants(self):
  1406. socket.AF_RDS
  1407. socket.PF_RDS
  1408. def testCreateSocket(self):
  1409. with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
  1410. pass
  1411. def testSocketBufferSize(self):
  1412. bufsize = 16384
  1413. with socket.socket(socket.PF_RDS, socket.SOCK_SEQPACKET, 0) as s:
  1414. s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, bufsize)
  1415. s.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, bufsize)
  1416. @unittest.skipUnless(HAVE_SOCKET_RDS, 'RDS sockets required for this test.')
  1417. @unittest.skipUnless(thread, 'Threading required for this test.')
  1418. class RDSTest(ThreadedRDSSocketTest):
  1419. def __init__(self, methodName='runTest'):
  1420. ThreadedRDSSocketTest.__init__(self, methodName=methodName)
  1421. def setUp(self):
  1422. super().setUp()
  1423. self.evt = threading.Event()
  1424. def testSendAndRecv(self):
  1425. data, addr = self.serv.recvfrom(self.bufsize)
  1426. self.assertEqual(self.data, data)
  1427. self.assertEqual(self.cli_addr, addr)
  1428. def _testSendAndRecv(self):
  1429. self.data = b'spam'
  1430. self.cli.sendto(self.data, 0, (HOST, self.port))
  1431. def testPeek(self):
  1432. data, addr = self.serv.recvfrom(self.bufsize, socket.MSG_PEEK)
  1433. self.assertEqual(self.data, data)
  1434. data, addr = self.serv.recvfrom(self.bufsize)
  1435. self.assertEqual(self.data, data)
  1436. def _testPeek(self):
  1437. self.data = b'spam'
  1438. self.cli.sendto(self.data, 0, (HOST, self.port))
  1439. @requireAttrs(socket.socket, 'recvmsg')
  1440. def testSendAndRecvMsg(self):
  1441. data, ancdata, msg_flags, addr = self.serv.recvmsg(self.bufsize)
  1442. self.assertEqual(self.data, data)
  1443. @requireAttrs(socket.socket, 'sendmsg')
  1444. def _testSendAndRecvMsg(self):
  1445. self.data = b'hello ' * 10
  1446. self.cli.sendmsg([self.data], (), 0, (HOST, self.port))
  1447. def testSendAndRecvMulti(self):
  1448. data, addr = self.serv.recvfrom(self.bufsize)
  1449. self.assertEqual(self.data1, data)
  1450. data, addr = self.serv.recvfrom(self.bufsize)
  1451. self.assertEqual(self.data2, data)
  1452. def _testSendAndRecvMulti(self):
  1453. self.data1 = b'bacon'
  1454. self.cli.sendto(self.data1, 0, (HOST, self.port))
  1455. self.data2 = b'egg'
  1456. self.cli.sendto(self.data2, 0, (HOST, self.port))
  1457. def testSelect(self):
  1458. r, w, x = select.select([self.serv], [], [], 3.0)
  1459. self.assertIn(self.serv, r)
  1460. data, addr = self.serv.recvfrom(self.bufsize)
  1461. self.assertEqual(self.data, data)
  1462. def _testSelect(self):
  1463. self.data = b'select'
  1464. self.cli.sendto(self.data, 0, (HOST, self.port))
  1465. def testCongestion(self):
  1466. # wait until the sender is done
  1467. self.evt.wait()
  1468. def _testCongestion(self):
  1469. # test the behavior in case of congestion
  1470. self.data = b'fill'
  1471. self.cli.setblocking(False)
  1472. try:
  1473. # try to lower the receiver's socket buffer size
  1474. self.cli.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16384)
  1475. except OSError:
  1476. pass
  1477. with self.assertRaises(OSError) as cm:
  1478. try:
  1479. # fill the receiver's socket buffer
  1480. while True:
  1481. self.cli.sendto(self.data, 0, (HOST, self.port))
  1482. finally:
  1483. # signal the receiver we're done
  1484. self.evt.set()
  1485. # sendto() should have failed with ENOBUFS
  1486. self.assertEqual(cm.exception.errno, errno.ENOBUFS)
  1487. # and we should have received a congestion notification through poll
  1488. r, w, x = select.select([self.serv], [], [], 3.0)
  1489. self.assertIn(self.serv, r)
  1490. @unittest.skipUnless(thread, 'Threading required for this test.')
  1491. class BasicTCPTest(SocketConnectedTest):
  1492. def __init__(self, methodName='runTest'):
  1493. SocketConnectedTest.__init__(self, methodName=methodName)
  1494. def testRecv(self):
  1495. # Testing large receive over TCP
  1496. msg = self.cli_conn.recv(1024)
  1497. self.assertEqual(msg, MSG)
  1498. def _testRecv(self):
  1499. self.serv_conn.send(MSG)
  1500. def testOverFlowRecv(self):
  1501. # Testing receive in chunks over TCP
  1502. seg1 = self.cli_conn.recv(len(MSG) - 3)
  1503. seg2 = self.cli_conn.recv(1024)
  1504. msg = seg1 + seg2
  1505. self.assertEqual(msg, MSG)
  1506. def _testOverFlowRecv(self):
  1507. self.serv_conn.send(MSG)
  1508. def testRecvFrom(self):
  1509. # Testing large recvfrom() over TCP
  1510. msg, addr = self.cli_conn.recvfrom(1024)
  1511. self.assertEqual(msg, MSG)
  1512. def _testRecvFrom(self):
  1513. self.serv_conn.send(MSG)
  1514. def testOverFlowRecvFrom(self):
  1515. # Testing recvfrom() in chunks over TCP
  1516. seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
  1517. seg2, addr = self.cli_conn.recvfrom(1024)
  1518. msg = seg1 + seg2
  1519. self.assertEqual(msg, MSG)
  1520. def _testOverFlowRecvFrom(self):
  1521. self.serv_conn.send(MSG)
  1522. def testSendAll(self):
  1523. # Testing sendall() with a 2048 byte string over TCP
  1524. msg = b''
  1525. while 1:
  1526. read = self.cli_conn.recv(1024)
  1527. if not read:
  1528. break
  1529. msg += read
  1530. self.assertEqual(msg, b'f' * 2048)
  1531. def _testSendAll(self):
  1532. big_chunk = b'f' * 2048
  1533. self.serv_conn.sendall(big_chunk)
  1534. def testFromFd(self):
  1535. # Testing fromfd()
  1536. fd = self.cli_conn.fileno()
  1537. sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
  1538. self.addCleanup(sock.close)
  1539. self.assertIsInstance(sock, socket.socket)
  1540. msg = sock.recv(1024)
  1541. self.assertEqual(msg, MSG)
  1542. def _testFromFd(self):
  1543. self.serv_conn.send(MSG)
  1544. def testDup(self):
  1545. # Testing dup()
  1546. sock = self.cli_conn.dup()
  1547. self.addCleanup(sock.close)
  1548. msg = sock.recv(1024)
  1549. self.assertEqual(msg, MSG)
  1550. def _testDup(self):
  1551. self.serv_conn.send(MSG)
  1552. def testShutdown(self):
  1553. # Testing shutdown()
  1554. msg = self.cli_conn.recv(1024)
  1555. self.assertEqual(msg, MSG)
  1556. # wait for _testShutdown to finish: on OS X, when the server
  1557. # closes the connection the client also becomes disconnected,
  1558. # and the client's shutdown call will fail. (Issue #4397.)
  1559. self.done.wait()
  1560. def _testShutdown(self):
  1561. self.serv_conn.send(MSG)
  1562. self.serv_conn.shutdown(2)
  1563. testShutdown_overflow = support.cpython_only(testShutdown)
  1564. @support.cpython_only
  1565. def _testShutdown_overflow(self):
  1566. import _testcapi
  1567. self.serv_conn.send(MSG)
  1568. # Issue 15989
  1569. self.assertRaises(OverflowError, self.serv_conn.shutdown,
  1570. _testcapi.INT_MAX + 1)
  1571. self.assertRaises(OverflowError, self.serv_conn.shutdown,
  1572. 2 + (_testcapi.UINT_MAX + 1))
  1573. self.serv_conn.shutdown(2)
  1574. def testDetach(self):
  1575. # Testing detach()
  1576. fileno = self.cli_conn.fileno()
  1577. f = self.cli_conn.detach()
  1578. self.assertEqual(f, fileno)
  1579. # cli_conn cannot be used anymore...
  1580. self.assertTrue(self.cli_conn._closed)
  1581. self.assertRaises(OSError, self.cli_conn.recv, 1024)
  1582. self.cli_conn.close()
  1583. # ...but we can create another socket using the (still open)
  1584. # file descriptor
  1585. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, fileno=f)
  1586. self.addCleanup(sock.close)
  1587. msg = sock.recv(1024)
  1588. self.assertEqual(msg, MSG)
  1589. def _testDetach(self):
  1590. self.serv_conn.send(MSG)
  1591. @unittest.skipUnless(thread, 'Threading required for this test.')
  1592. class BasicUDPTest(ThreadedUDPSocketTest):
  1593. def __init__(self, methodName='runTest'):
  1594. ThreadedUDPSocketTest.__init__(self, methodName=methodName)
  1595. def testSendtoAndRecv(self):
  1596. # Testing sendto() and Recv() over UDP
  1597. msg = self.serv.recv(len(MSG))
  1598. self.assertEqual(msg, MSG)
  1599. def _testSendtoAndRecv(self):
  1600. self.cli.sendto(MSG, 0, (HOST, self.port))
  1601. def testRecvFrom(self):
  1602. # Testing recvfrom() over UDP
  1603. msg, addr = self.serv.recvfrom(len(MSG))
  1604. self.assertEqual(msg, MSG)
  1605. def _testRecvFrom(self):
  1606. self.cli.sendto(MSG, 0, (HOST, self.port))
  1607. def testRecvFromNegative(self):
  1608. # Negative lengths passed to recvfrom should give ValueError.
  1609. self.assertRaises(ValueError, self.serv.recvfrom, -1)
  1610. def _testRecvFromNegative(self):
  1611. self.cli.sendto(MSG, 0, (HOST, self.port))
  1612. # Tests for the sendmsg()/recvmsg() interface. Where possible, the
  1613. # same test code is used with different families and types of socket
  1614. # (e.g. stream, datagram), and tests using recvmsg() are repeated
  1615. # using recvmsg_into().
  1616. #
  1617. # The generic test classes such as SendmsgTests and
  1618. # RecvmsgGenericTests inherit from SendrecvmsgBase and expect to be
  1619. # supplied with sockets cli_sock and serv_sock representing the
  1620. # client's and the server's end of the connection respectively, and
  1621. # attributes cli_addr and serv_addr holding their (numeric where
  1622. # appropriate) addresses.
  1623. #
  1624. # The final concrete test classes combine these with subclasses of
  1625. # SocketTestBase which set up client and server sockets of a specific
  1626. # type, and with subclasses of SendrecvmsgBase such as
  1627. # SendrecvmsgDgramBase and SendrecvmsgConnectedBase which map these
  1628. # sockets to cli_sock and serv_sock and override the methods and
  1629. # attributes of SendrecvmsgBase to fill in destination addresses if
  1630. # needed when sending, check for specific flags in msg_flags, etc.
  1631. #
  1632. # RecvmsgIntoMixin provides a version of doRecvmsg() implemented using
  1633. # recvmsg_into().
  1634. # XXX: like the other datagram (UDP) tests in this module, the code
  1635. # here assumes that datagram delivery on the local machine will be
  1636. # reliable.
  1637. class SendrecvmsgBase(ThreadSafeCleanupTestCase):
  1638. # Base class for sendmsg()/recvmsg() tests.
  1639. # Time in seconds to wait before considering a test failed, or
  1640. # None for no timeout. Not all tests actually set a timeout.
  1641. fail_timeout = 3.0
  1642. def setUp(self):
  1643. self.misc_event = threading.Event()
  1644. super().setUp()
  1645. def sendToServer(self, msg):
  1646. # Send msg to the server.
  1647. return self.cli_sock.send(msg)
  1648. # Tuple of alternative default arguments for sendmsg() when called
  1649. # via sendmsgToServer() (e.g. to include a destination address).
  1650. sendmsg_to_server_defaults = ()
  1651. def sendmsgToServer(self, *args):
  1652. # Call sendmsg() on self.cli_sock with the given arguments,
  1653. # filling in any arguments which are not supplied with the
  1654. # corresponding items of self.sendmsg_to_server_defaults, if
  1655. # any.
  1656. return self.cli_sock.sendmsg(
  1657. *(args + self.sendmsg_to_server_defaults[len(args):]))
  1658. def doRecvmsg(self, sock, bufsize, *args):
  1659. # Call recvmsg() on sock with given arguments and return its
  1660. # result. Should be used for tests which can use either
  1661. # recvmsg() or recvmsg_into() - RecvmsgIntoMixin overrides
  1662. # this method with one which emulates it using recvmsg_into(),
  1663. # thus allowing the same test to be used for both methods.
  1664. result = sock.recvmsg(bufsize, *args)
  1665. self.registerRecvmsgResult(result)
  1666. return result
  1667. def registerRecvmsgResult(self, result):
  1668. # Called by doRecvmsg() with the return value of recvmsg() or
  1669. # recvmsg_into(). Can be overridden to arrange cleanup based
  1670. # on the returned ancillary data, for instance.
  1671. pass
  1672. def checkRecvmsgAddress(self, addr1, addr2):
  1673. # Called to compare the received address with the address of
  1674. # the peer.
  1675. self.assertEqual(addr1, addr2)
  1676. # Flags that are normally unset in msg_flags
  1677. msg_flags_common_unset = 0
  1678. for name in ("MSG_CTRUNC", "MSG_OOB"):
  1679. msg_flags_common_unset |= getattr(socket, name, 0)
  1680. # Flags that are normally set
  1681. msg_flags_common_set = 0
  1682. # Flags set when a complete record has been received (e.g. MSG_EOR
  1683. # for SCTP)
  1684. msg_flags_eor_indicator = 0
  1685. # Flags set when a complete record has not been received
  1686. # (e.g. MSG_TRUNC for datagram sockets)
  1687. msg_flags_non_eor_indicator = 0
  1688. def checkFlags(self, flags, eor=None, checkset=0, checkunset=0, ignore=0):
  1689. # Method to check the value of msg_flags returned by recvmsg[_into]().
  1690. #
  1691. # Checks that all bits in msg_flags_common_set attribute are
  1692. # set in "flags" and all bits in msg_flags_common_unset are
  1693. # unset.
  1694. #
  1695. # The "eor" argument specifies whether the flags should
  1696. # indicate that a full record (or datagram) has been received.
  1697. # If "eor" is None, no checks are done; otherwise, checks
  1698. # that:
  1699. #
  1700. # * if "eor" is true, all bits in msg_flags_eor_indicator are
  1701. # set and all bits in msg_flags_non_eor_indicator are unset
  1702. #
  1703. # * if "eor" is false, all bits in msg_flags_non_eor_indicator
  1704. # are set and all bits in msg_flags_eor_indicator are unset
  1705. #
  1706. # If "checkset" and/or "checkunset" are supplied, they require
  1707. # the given bits to be set or unset respectively, overriding
  1708. # what the attributes require for those bits.
  1709. #
  1710. # If any bits are set in "ignore", they will not be checked,
  1711. # regardless of the other inputs.
  1712. #
  1713. # Will raise Exception if the inputs require a bit to be both
  1714. # set and unset, and it is not ignored.
  1715. defaultset = self.msg_flags_common_set
  1716. defaultunset = self.msg_flags_common_unset
  1717. if eor:
  1718. defaultset |= self.msg_flags_eor_indicator
  1719. defaultunset |= self.msg_flags_non_eor_indicator
  1720. elif eor is not None:
  1721. defaultset |= self.msg_flags_non_eor_indicator
  1722. defaultunset |= self.msg_flags_eor_indicator
  1723. # Function arguments override defaults
  1724. defaultset &= ~checkunset
  1725. defaultunset &= ~checkset
  1726. # Merge arguments with remaining defaults, and check for conflicts
  1727. checkset |= defaultset
  1728. checkunset |= defaultunset
  1729. inboth = checkset & checkunset & ~ignore
  1730. if inboth:
  1731. raise Exception("contradictory set, unset requirements for flags "
  1732. "{0:#x}".format(inboth))
  1733. # Compare with given msg_flags value
  1734. mask = (checkset | checkunset) & ~ignore
  1735. self.assertEqual(flags & mask, checkset & mask)
  1736. class RecvmsgIntoMixin(SendrecvmsgBase):
  1737. # Mixin to implement doRecvmsg() using recvmsg_into().
  1738. def doRecvmsg(self, sock, bufsize, *args):
  1739. buf = bytearray(bufsize)
  1740. result = sock.recvmsg_into([buf], *args)
  1741. self.registerRecvmsgResult(result)
  1742. self.assertGreaterEqual(result[0], 0)
  1743. self.assertLessEqual(result[0], bufsize)
  1744. return (bytes(buf[:result[0]]),) + result[1:]
  1745. class SendrecvmsgDgramFlagsBase(SendrecvmsgBase):
  1746. # Defines flags to be checked in msg_flags for datagram sockets.
  1747. @property
  1748. def msg_flags_non_eor_indicator(self):
  1749. return super().msg_flags_non_eor_indicator | socket.MSG_TRUNC
  1750. class SendrecvmsgSCTPFlagsBase(SendrecvmsgBase):
  1751. # Defines flags to be checked in msg_flags for SCTP sockets.
  1752. @property
  1753. def msg_flags_eor_indicator(self):
  1754. return super().msg_flags_eor_indicator | socket.MSG_EOR
  1755. class SendrecvmsgConnectionlessBase(SendrecvmsgBase):
  1756. # Base class for tests on connectionless-mode sockets. Users must
  1757. # supply sockets on attributes cli and serv to be mapped to
  1758. # cli_sock and serv_sock respectively.
  1759. @property
  1760. def serv_sock(self):
  1761. return self.serv
  1762. @property
  1763. def cli_sock(self):
  1764. return self.cli
  1765. @property
  1766. def sendmsg_to_server_defaults(self):
  1767. return ([], [], 0, self.serv_addr)
  1768. def sendToServer(self, msg):
  1769. return self.cli_sock.sendto(msg, self.serv_addr)
  1770. class SendrecvmsgConnectedBase(SendrecvmsgBase):
  1771. # Base class for tests on connected sockets. Users must supply
  1772. # sockets on attributes serv_conn and cli_conn (representing the
  1773. # connections *to* the server and the client), to be mapped to
  1774. # cli_sock and serv_sock respectively.
  1775. @property
  1776. def serv_sock(self):
  1777. return self.cli_conn
  1778. @property
  1779. def cli_sock(self):
  1780. return self.serv_conn
  1781. def checkRecvmsgAddress(self, addr1, addr2):
  1782. # Address is currently "unspecified" for a connected socket,
  1783. # so we don't examine it
  1784. pass
  1785. class SendrecvmsgServerTimeoutBase(SendrecvmsgBase):
  1786. # Base class to set a timeout on server's socket.
  1787. def setUp(self):
  1788. super().setUp()
  1789. self.serv_sock.settimeout(self.fail_timeout)
  1790. class SendmsgTests(SendrecvmsgServerTimeoutBase):
  1791. # Tests for sendmsg() which can use any socket type and do not
  1792. # involve recvmsg() or recvmsg_into().
  1793. def testSendmsg(self):
  1794. # Send a simple message with sendmsg().
  1795. self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
  1796. def _testSendmsg(self):
  1797. self.assertEqual(self.sendmsgToServer([MSG]), len(MSG))
  1798. def testSendmsgDataGenerator(self):
  1799. # Send from buffer obtained from a generator (not a sequence).
  1800. self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
  1801. def _testSendmsgDataGenerator(self):
  1802. self.assertEqual(self.sendmsgToServer((o for o in [MSG])),
  1803. len(MSG))
  1804. def testSendmsgAncillaryGenerator(self):
  1805. # Gather (empty) ancillary data from a generator.
  1806. self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
  1807. def _testSendmsgAncillaryGenerator(self):
  1808. self.assertEqual(self.sendmsgToServer([MSG], (o for o in [])),
  1809. len(MSG))
  1810. def testSendmsgArray(self):
  1811. # Send data from an array instead of the usual bytes object.
  1812. self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
  1813. def _testSendmsgArray(self):
  1814. self.assertEqual(self.sendmsgToServer([array.array("B", MSG)]),
  1815. len(MSG))
  1816. def testSendmsgGather(self):
  1817. # Send message data from more than one buffer (gather write).
  1818. self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
  1819. def _testSendmsgGather(self):
  1820. self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
  1821. def testSendmsgBadArgs(self):
  1822. # Check that sendmsg() rejects invalid arguments.
  1823. self.assertEqual(self.serv_sock.recv(1000), b"done")
  1824. def _testSendmsgBadArgs(self):
  1825. self.assertRaises(TypeError, self.cli_sock.sendmsg)
  1826. self.assertRaises(TypeError, self.sendmsgToServer,
  1827. b"not in an iterable")
  1828. self.assertRaises(TypeError, self.sendmsgToServer,
  1829. object())
  1830. self.assertRaises(TypeError, self.sendmsgToServer,
  1831. [object()])
  1832. self.assertRaises(TypeError, self.sendmsgToServer,
  1833. [MSG, object()])
  1834. self.assertRaises(TypeError, self.sendmsgToServer,
  1835. [MSG], object())
  1836. self.assertRaises(TypeError, self.sendmsgToServer,
  1837. [MSG], [], object())
  1838. self.assertRaises(TypeError, self.sendmsgToServer,
  1839. [MSG], [], 0, object())
  1840. self.sendToServer(b"done")
  1841. def testSendmsgBadCmsg(self):
  1842. # Check that invalid ancillary data items are rejected.
  1843. self.assertEqual(self.serv_sock.recv(1000), b"done")
  1844. def _testSendmsgBadCmsg(self):
  1845. self.assertRaises(TypeError, self.sendmsgToServer,
  1846. [MSG], [object()])
  1847. self.assertRaises(TypeError, self.sendmsgToServer,
  1848. [MSG], [(object(), 0, b"data")])
  1849. self.assertRaises(TypeError, self.sendmsgToServer,
  1850. [MSG], [(0, object(), b"data")])
  1851. self.assertRaises(TypeError, self.sendmsgToServer,
  1852. [MSG], [(0, 0, object())])
  1853. self.assertRaises(TypeError, self.sendmsgToServer,
  1854. [MSG], [(0, 0)])
  1855. self.assertRaises(TypeError, self.sendmsgToServer,
  1856. [MSG], [(0, 0, b"data", 42)])
  1857. self.sendToServer(b"done")
  1858. @requireAttrs(socket, "CMSG_SPACE")
  1859. def testSendmsgBadMultiCmsg(self):
  1860. # Check that invalid ancillary data items are rejected when
  1861. # more than one item is present.
  1862. self.assertEqual(self.serv_sock.recv(1000), b"done")
  1863. @testSendmsgBadMultiCmsg.client_skip
  1864. def _testSendmsgBadMultiCmsg(self):
  1865. self.assertRaises(TypeError, self.sendmsgToServer,
  1866. [MSG], [0, 0, b""])
  1867. self.assertRaises(TypeError, self.sendmsgToServer,
  1868. [MSG], [(0, 0, b""), object()])
  1869. self.sendToServer(b"done")
  1870. def testSendmsgExcessCmsgReject(self):
  1871. # Check that sendmsg() rejects excess ancillary data items
  1872. # when the number that can be sent is limited.
  1873. self.assertEqual(self.serv_sock.recv(1000), b"done")
  1874. def _testSendmsgExcessCmsgReject(self):
  1875. if not hasattr(socket, "CMSG_SPACE"):
  1876. # Can only send one item
  1877. with self.assertRaises(OSError) as cm:
  1878. self.sendmsgToServer([MSG], [(0, 0, b""), (0, 0, b"")])
  1879. self.assertIsNone(cm.exception.errno)
  1880. self.sendToServer(b"done")
  1881. def testSendmsgAfterClose(self):
  1882. # Check that sendmsg() fails on a closed socket.
  1883. pass
  1884. def _testSendmsgAfterClose(self):
  1885. self.cli_sock.close()
  1886. self.assertRaises(OSError, self.sendmsgToServer, [MSG])
  1887. class SendmsgStreamTests(SendmsgTests):
  1888. # Tests for sendmsg() which require a stream socket and do not
  1889. # involve recvmsg() or recvmsg_into().
  1890. def testSendmsgExplicitNoneAddr(self):
  1891. # Check that peer address can be specified as None.
  1892. self.assertEqual(self.serv_sock.recv(len(MSG)), MSG)
  1893. def _testSendmsgExplicitNoneAddr(self):
  1894. self.assertEqual(self.sendmsgToServer([MSG], [], 0, None), len(MSG))
  1895. def testSendmsgTimeout(self):
  1896. # Check that timeout works with sendmsg().
  1897. self.assertEqual(self.serv_sock.recv(512), b"a"*512)
  1898. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  1899. def _testSendmsgTimeout(self):
  1900. try:
  1901. self.cli_sock.settimeout(0.03)
  1902. with self.assertRaises(socket.timeout):
  1903. while True:
  1904. self.sendmsgToServer([b"a"*512])
  1905. finally:
  1906. self.misc_event.set()
  1907. # XXX: would be nice to have more tests for sendmsg flags argument.
  1908. # Linux supports MSG_DONTWAIT when sending, but in general, it
  1909. # only works when receiving. Could add other platforms if they
  1910. # support it too.
  1911. @skipWithClientIf(sys.platform not in {"linux"},
  1912. "MSG_DONTWAIT not known to work on this platform when "
  1913. "sending")
  1914. def testSendmsgDontWait(self):
  1915. # Check that MSG_DONTWAIT in flags causes non-blocking behaviour.
  1916. self.assertEqual(self.serv_sock.recv(512), b"a"*512)
  1917. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  1918. @testSendmsgDontWait.client_skip
  1919. def _testSendmsgDontWait(self):
  1920. try:
  1921. with self.assertRaises(OSError) as cm:
  1922. while True:
  1923. self.sendmsgToServer([b"a"*512], [], socket.MSG_DONTWAIT)
  1924. self.assertIn(cm.exception.errno,
  1925. (errno.EAGAIN, errno.EWOULDBLOCK))
  1926. finally:
  1927. self.misc_event.set()
  1928. class SendmsgConnectionlessTests(SendmsgTests):
  1929. # Tests for sendmsg() which require a connectionless-mode
  1930. # (e.g. datagram) socket, and do not involve recvmsg() or
  1931. # recvmsg_into().
  1932. def testSendmsgNoDestAddr(self):
  1933. # Check that sendmsg() fails when no destination address is
  1934. # given for unconnected socket.
  1935. pass
  1936. def _testSendmsgNoDestAddr(self):
  1937. self.assertRaises(OSError, self.cli_sock.sendmsg,
  1938. [MSG])
  1939. self.assertRaises(OSError, self.cli_sock.sendmsg,
  1940. [MSG], [], 0, None)
  1941. class RecvmsgGenericTests(SendrecvmsgBase):
  1942. # Tests for recvmsg() which can also be emulated using
  1943. # recvmsg_into(), and can use any socket type.
  1944. def testRecvmsg(self):
  1945. # Receive a simple message with recvmsg[_into]().
  1946. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
  1947. self.assertEqual(msg, MSG)
  1948. self.checkRecvmsgAddress(addr, self.cli_addr)
  1949. self.assertEqual(ancdata, [])
  1950. self.checkFlags(flags, eor=True)
  1951. def _testRecvmsg(self):
  1952. self.sendToServer(MSG)
  1953. def testRecvmsgExplicitDefaults(self):
  1954. # Test recvmsg[_into]() with default arguments provided explicitly.
  1955. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  1956. len(MSG), 0, 0)
  1957. self.assertEqual(msg, MSG)
  1958. self.checkRecvmsgAddress(addr, self.cli_addr)
  1959. self.assertEqual(ancdata, [])
  1960. self.checkFlags(flags, eor=True)
  1961. def _testRecvmsgExplicitDefaults(self):
  1962. self.sendToServer(MSG)
  1963. def testRecvmsgShorter(self):
  1964. # Receive a message smaller than buffer.
  1965. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  1966. len(MSG) + 42)
  1967. self.assertEqual(msg, MSG)
  1968. self.checkRecvmsgAddress(addr, self.cli_addr)
  1969. self.assertEqual(ancdata, [])
  1970. self.checkFlags(flags, eor=True)
  1971. def _testRecvmsgShorter(self):
  1972. self.sendToServer(MSG)
  1973. # FreeBSD < 8 doesn't always set the MSG_TRUNC flag when a truncated
  1974. # datagram is received (issue #13001).
  1975. @support.requires_freebsd_version(8)
  1976. def testRecvmsgTrunc(self):
  1977. # Receive part of message, check for truncation indicators.
  1978. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  1979. len(MSG) - 3)
  1980. self.assertEqual(msg, MSG[:-3])
  1981. self.checkRecvmsgAddress(addr, self.cli_addr)
  1982. self.assertEqual(ancdata, [])
  1983. self.checkFlags(flags, eor=False)
  1984. @support.requires_freebsd_version(8)
  1985. def _testRecvmsgTrunc(self):
  1986. self.sendToServer(MSG)
  1987. def testRecvmsgShortAncillaryBuf(self):
  1988. # Test ancillary data buffer too small to hold any ancillary data.
  1989. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  1990. len(MSG), 1)
  1991. self.assertEqual(msg, MSG)
  1992. self.checkRecvmsgAddress(addr, self.cli_addr)
  1993. self.assertEqual(ancdata, [])
  1994. self.checkFlags(flags, eor=True)
  1995. def _testRecvmsgShortAncillaryBuf(self):
  1996. self.sendToServer(MSG)
  1997. def testRecvmsgLongAncillaryBuf(self):
  1998. # Test large ancillary data buffer.
  1999. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2000. len(MSG), 10240)
  2001. self.assertEqual(msg, MSG)
  2002. self.checkRecvmsgAddress(addr, self.cli_addr)
  2003. self.assertEqual(ancdata, [])
  2004. self.checkFlags(flags, eor=True)
  2005. def _testRecvmsgLongAncillaryBuf(self):
  2006. self.sendToServer(MSG)
  2007. def testRecvmsgAfterClose(self):
  2008. # Check that recvmsg[_into]() fails on a closed socket.
  2009. self.serv_sock.close()
  2010. self.assertRaises(OSError, self.doRecvmsg, self.serv_sock, 1024)
  2011. def _testRecvmsgAfterClose(self):
  2012. pass
  2013. def testRecvmsgTimeout(self):
  2014. # Check that timeout works.
  2015. try:
  2016. self.serv_sock.settimeout(0.03)
  2017. self.assertRaises(socket.timeout,
  2018. self.doRecvmsg, self.serv_sock, len(MSG))
  2019. finally:
  2020. self.misc_event.set()
  2021. def _testRecvmsgTimeout(self):
  2022. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2023. @requireAttrs(socket, "MSG_PEEK")
  2024. def testRecvmsgPeek(self):
  2025. # Check that MSG_PEEK in flags enables examination of pending
  2026. # data without consuming it.
  2027. # Receive part of data with MSG_PEEK.
  2028. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2029. len(MSG) - 3, 0,
  2030. socket.MSG_PEEK)
  2031. self.assertEqual(msg, MSG[:-3])
  2032. self.checkRecvmsgAddress(addr, self.cli_addr)
  2033. self.assertEqual(ancdata, [])
  2034. # Ignoring MSG_TRUNC here (so this test is the same for stream
  2035. # and datagram sockets). Some wording in POSIX seems to
  2036. # suggest that it needn't be set when peeking, but that may
  2037. # just be a slip.
  2038. self.checkFlags(flags, eor=False,
  2039. ignore=getattr(socket, "MSG_TRUNC", 0))
  2040. # Receive all data with MSG_PEEK.
  2041. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2042. len(MSG), 0,
  2043. socket.MSG_PEEK)
  2044. self.assertEqual(msg, MSG)
  2045. self.checkRecvmsgAddress(addr, self.cli_addr)
  2046. self.assertEqual(ancdata, [])
  2047. self.checkFlags(flags, eor=True)
  2048. # Check that the same data can still be received normally.
  2049. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
  2050. self.assertEqual(msg, MSG)
  2051. self.checkRecvmsgAddress(addr, self.cli_addr)
  2052. self.assertEqual(ancdata, [])
  2053. self.checkFlags(flags, eor=True)
  2054. @testRecvmsgPeek.client_skip
  2055. def _testRecvmsgPeek(self):
  2056. self.sendToServer(MSG)
  2057. @requireAttrs(socket.socket, "sendmsg")
  2058. def testRecvmsgFromSendmsg(self):
  2059. # Test receiving with recvmsg[_into]() when message is sent
  2060. # using sendmsg().
  2061. self.serv_sock.settimeout(self.fail_timeout)
  2062. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, len(MSG))
  2063. self.assertEqual(msg, MSG)
  2064. self.checkRecvmsgAddress(addr, self.cli_addr)
  2065. self.assertEqual(ancdata, [])
  2066. self.checkFlags(flags, eor=True)
  2067. @testRecvmsgFromSendmsg.client_skip
  2068. def _testRecvmsgFromSendmsg(self):
  2069. self.assertEqual(self.sendmsgToServer([MSG[:3], MSG[3:]]), len(MSG))
  2070. class RecvmsgGenericStreamTests(RecvmsgGenericTests):
  2071. # Tests which require a stream socket and can use either recvmsg()
  2072. # or recvmsg_into().
  2073. def testRecvmsgEOF(self):
  2074. # Receive end-of-stream indicator (b"", peer socket closed).
  2075. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
  2076. self.assertEqual(msg, b"")
  2077. self.checkRecvmsgAddress(addr, self.cli_addr)
  2078. self.assertEqual(ancdata, [])
  2079. self.checkFlags(flags, eor=None) # Might not have end-of-record marker
  2080. def _testRecvmsgEOF(self):
  2081. self.cli_sock.close()
  2082. def testRecvmsgOverflow(self):
  2083. # Receive a message in more than one chunk.
  2084. seg1, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2085. len(MSG) - 3)
  2086. self.checkRecvmsgAddress(addr, self.cli_addr)
  2087. self.assertEqual(ancdata, [])
  2088. self.checkFlags(flags, eor=False)
  2089. seg2, ancdata, flags, addr = self.doRecvmsg(self.serv_sock, 1024)
  2090. self.checkRecvmsgAddress(addr, self.cli_addr)
  2091. self.assertEqual(ancdata, [])
  2092. self.checkFlags(flags, eor=True)
  2093. msg = seg1 + seg2
  2094. self.assertEqual(msg, MSG)
  2095. def _testRecvmsgOverflow(self):
  2096. self.sendToServer(MSG)
  2097. class RecvmsgTests(RecvmsgGenericTests):
  2098. # Tests for recvmsg() which can use any socket type.
  2099. def testRecvmsgBadArgs(self):
  2100. # Check that recvmsg() rejects invalid arguments.
  2101. self.assertRaises(TypeError, self.serv_sock.recvmsg)
  2102. self.assertRaises(ValueError, self.serv_sock.recvmsg,
  2103. -1, 0, 0)
  2104. self.assertRaises(ValueError, self.serv_sock.recvmsg,
  2105. len(MSG), -1, 0)
  2106. self.assertRaises(TypeError, self.serv_sock.recvmsg,
  2107. [bytearray(10)], 0, 0)
  2108. self.assertRaises(TypeError, self.serv_sock.recvmsg,
  2109. object(), 0, 0)
  2110. self.assertRaises(TypeError, self.serv_sock.recvmsg,
  2111. len(MSG), object(), 0)
  2112. self.assertRaises(TypeError, self.serv_sock.recvmsg,
  2113. len(MSG), 0, object())
  2114. msg, ancdata, flags, addr = self.serv_sock.recvmsg(len(MSG), 0, 0)
  2115. self.assertEqual(msg, MSG)
  2116. self.checkRecvmsgAddress(addr, self.cli_addr)
  2117. self.assertEqual(ancdata, [])
  2118. self.checkFlags(flags, eor=True)
  2119. def _testRecvmsgBadArgs(self):
  2120. self.sendToServer(MSG)
  2121. class RecvmsgIntoTests(RecvmsgIntoMixin, RecvmsgGenericTests):
  2122. # Tests for recvmsg_into() which can use any socket type.
  2123. def testRecvmsgIntoBadArgs(self):
  2124. # Check that recvmsg_into() rejects invalid arguments.
  2125. buf = bytearray(len(MSG))
  2126. self.assertRaises(TypeError, self.serv_sock.recvmsg_into)
  2127. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2128. len(MSG), 0, 0)
  2129. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2130. buf, 0, 0)
  2131. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2132. [object()], 0, 0)
  2133. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2134. [b"I'm not writable"], 0, 0)
  2135. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2136. [buf, object()], 0, 0)
  2137. self.assertRaises(ValueError, self.serv_sock.recvmsg_into,
  2138. [buf], -1, 0)
  2139. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2140. [buf], object(), 0)
  2141. self.assertRaises(TypeError, self.serv_sock.recvmsg_into,
  2142. [buf], 0, object())
  2143. nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf], 0, 0)
  2144. self.assertEqual(nbytes, len(MSG))
  2145. self.assertEqual(buf, bytearray(MSG))
  2146. self.checkRecvmsgAddress(addr, self.cli_addr)
  2147. self.assertEqual(ancdata, [])
  2148. self.checkFlags(flags, eor=True)
  2149. def _testRecvmsgIntoBadArgs(self):
  2150. self.sendToServer(MSG)
  2151. def testRecvmsgIntoGenerator(self):
  2152. # Receive into buffer obtained from a generator (not a sequence).
  2153. buf = bytearray(len(MSG))
  2154. nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
  2155. (o for o in [buf]))
  2156. self.assertEqual(nbytes, len(MSG))
  2157. self.assertEqual(buf, bytearray(MSG))
  2158. self.checkRecvmsgAddress(addr, self.cli_addr)
  2159. self.assertEqual(ancdata, [])
  2160. self.checkFlags(flags, eor=True)
  2161. def _testRecvmsgIntoGenerator(self):
  2162. self.sendToServer(MSG)
  2163. def testRecvmsgIntoArray(self):
  2164. # Receive into an array rather than the usual bytearray.
  2165. buf = array.array("B", [0] * len(MSG))
  2166. nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into([buf])
  2167. self.assertEqual(nbytes, len(MSG))
  2168. self.assertEqual(buf.tobytes(), MSG)
  2169. self.checkRecvmsgAddress(addr, self.cli_addr)
  2170. self.assertEqual(ancdata, [])
  2171. self.checkFlags(flags, eor=True)
  2172. def _testRecvmsgIntoArray(self):
  2173. self.sendToServer(MSG)
  2174. def testRecvmsgIntoScatter(self):
  2175. # Receive into multiple buffers (scatter write).
  2176. b1 = bytearray(b"----")
  2177. b2 = bytearray(b"0123456789")
  2178. b3 = bytearray(b"--------------")
  2179. nbytes, ancdata, flags, addr = self.serv_sock.recvmsg_into(
  2180. [b1, memoryview(b2)[2:9], b3])
  2181. self.assertEqual(nbytes, len(b"Mary had a little lamb"))
  2182. self.assertEqual(b1, bytearray(b"Mary"))
  2183. self.assertEqual(b2, bytearray(b"01 had a 9"))
  2184. self.assertEqual(b3, bytearray(b"little lamb---"))
  2185. self.checkRecvmsgAddress(addr, self.cli_addr)
  2186. self.assertEqual(ancdata, [])
  2187. self.checkFlags(flags, eor=True)
  2188. def _testRecvmsgIntoScatter(self):
  2189. self.sendToServer(b"Mary had a little lamb")
  2190. class CmsgMacroTests(unittest.TestCase):
  2191. # Test the functions CMSG_LEN() and CMSG_SPACE(). Tests
  2192. # assumptions used by sendmsg() and recvmsg[_into](), which share
  2193. # code with these functions.
  2194. # Match the definition in socketmodule.c
  2195. try:
  2196. import _testcapi
  2197. except ImportError:
  2198. socklen_t_limit = 0x7fffffff
  2199. else:
  2200. socklen_t_limit = min(0x7fffffff, _testcapi.INT_MAX)
  2201. @requireAttrs(socket, "CMSG_LEN")
  2202. def testCMSG_LEN(self):
  2203. # Test CMSG_LEN() with various valid and invalid values,
  2204. # checking the assumptions used by recvmsg() and sendmsg().
  2205. toobig = self.socklen_t_limit - socket.CMSG_LEN(0) + 1
  2206. values = list(range(257)) + list(range(toobig - 257, toobig))
  2207. # struct cmsghdr has at least three members, two of which are ints
  2208. self.assertGreater(socket.CMSG_LEN(0), array.array("i").itemsize * 2)
  2209. for n in values:
  2210. ret = socket.CMSG_LEN(n)
  2211. # This is how recvmsg() calculates the data size
  2212. self.assertEqual(ret - socket.CMSG_LEN(0), n)
  2213. self.assertLessEqual(ret, self.socklen_t_limit)
  2214. self.assertRaises(OverflowError, socket.CMSG_LEN, -1)
  2215. # sendmsg() shares code with these functions, and requires
  2216. # that it reject values over the limit.
  2217. self.assertRaises(OverflowError, socket.CMSG_LEN, toobig)
  2218. self.assertRaises(OverflowError, socket.CMSG_LEN, sys.maxsize)
  2219. @requireAttrs(socket, "CMSG_SPACE")
  2220. def testCMSG_SPACE(self):
  2221. # Test CMSG_SPACE() with various valid and invalid values,
  2222. # checking the assumptions used by sendmsg().
  2223. toobig = self.socklen_t_limit - socket.CMSG_SPACE(1) + 1
  2224. values = list(range(257)) + list(range(toobig - 257, toobig))
  2225. last = socket.CMSG_SPACE(0)
  2226. # struct cmsghdr has at least three members, two of which are ints
  2227. self.assertGreater(last, array.array("i").itemsize * 2)
  2228. for n in values:
  2229. ret = socket.CMSG_SPACE(n)
  2230. self.assertGreaterEqual(ret, last)
  2231. self.assertGreaterEqual(ret, socket.CMSG_LEN(n))
  2232. self.assertGreaterEqual(ret, n + socket.CMSG_LEN(0))
  2233. self.assertLessEqual(ret, self.socklen_t_limit)
  2234. last = ret
  2235. self.assertRaises(OverflowError, socket.CMSG_SPACE, -1)
  2236. # sendmsg() shares code with these functions, and requires
  2237. # that it reject values over the limit.
  2238. self.assertRaises(OverflowError, socket.CMSG_SPACE, toobig)
  2239. self.assertRaises(OverflowError, socket.CMSG_SPACE, sys.maxsize)
  2240. class SCMRightsTest(SendrecvmsgServerTimeoutBase):
  2241. # Tests for file descriptor passing on Unix-domain sockets.
  2242. # Invalid file descriptor value that's unlikely to evaluate to a
  2243. # real FD even if one of its bytes is replaced with a different
  2244. # value (which shouldn't actually happen).
  2245. badfd = -0x5555
  2246. def newFDs(self, n):
  2247. # Return a list of n file descriptors for newly-created files
  2248. # containing their list indices as ASCII numbers.
  2249. fds = []
  2250. for i in range(n):
  2251. fd, path = tempfile.mkstemp()
  2252. self.addCleanup(os.unlink, path)
  2253. self.addCleanup(os.close, fd)
  2254. os.write(fd, str(i).encode())
  2255. fds.append(fd)
  2256. return fds
  2257. def checkFDs(self, fds):
  2258. # Check that the file descriptors in the given list contain
  2259. # their correct list indices as ASCII numbers.
  2260. for n, fd in enumerate(fds):
  2261. os.lseek(fd, 0, os.SEEK_SET)
  2262. self.assertEqual(os.read(fd, 1024), str(n).encode())
  2263. def registerRecvmsgResult(self, result):
  2264. self.addCleanup(self.closeRecvmsgFDs, result)
  2265. def closeRecvmsgFDs(self, recvmsg_result):
  2266. # Close all file descriptors specified in the ancillary data
  2267. # of the given return value from recvmsg() or recvmsg_into().
  2268. for cmsg_level, cmsg_type, cmsg_data in recvmsg_result[1]:
  2269. if (cmsg_level == socket.SOL_SOCKET and
  2270. cmsg_type == socket.SCM_RIGHTS):
  2271. fds = array.array("i")
  2272. fds.frombytes(cmsg_data[:
  2273. len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
  2274. for fd in fds:
  2275. os.close(fd)
  2276. def createAndSendFDs(self, n):
  2277. # Send n new file descriptors created by newFDs() to the
  2278. # server, with the constant MSG as the non-ancillary data.
  2279. self.assertEqual(
  2280. self.sendmsgToServer([MSG],
  2281. [(socket.SOL_SOCKET,
  2282. socket.SCM_RIGHTS,
  2283. array.array("i", self.newFDs(n)))]),
  2284. len(MSG))
  2285. def checkRecvmsgFDs(self, numfds, result, maxcmsgs=1, ignoreflags=0):
  2286. # Check that constant MSG was received with numfds file
  2287. # descriptors in a maximum of maxcmsgs control messages (which
  2288. # must contain only complete integers). By default, check
  2289. # that MSG_CTRUNC is unset, but ignore any flags in
  2290. # ignoreflags.
  2291. msg, ancdata, flags, addr = result
  2292. self.assertEqual(msg, MSG)
  2293. self.checkRecvmsgAddress(addr, self.cli_addr)
  2294. self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
  2295. ignore=ignoreflags)
  2296. self.assertIsInstance(ancdata, list)
  2297. self.assertLessEqual(len(ancdata), maxcmsgs)
  2298. fds = array.array("i")
  2299. for item in ancdata:
  2300. self.assertIsInstance(item, tuple)
  2301. cmsg_level, cmsg_type, cmsg_data = item
  2302. self.assertEqual(cmsg_level, socket.SOL_SOCKET)
  2303. self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
  2304. self.assertIsInstance(cmsg_data, bytes)
  2305. self.assertEqual(len(cmsg_data) % SIZEOF_INT, 0)
  2306. fds.frombytes(cmsg_data)
  2307. self.assertEqual(len(fds), numfds)
  2308. self.checkFDs(fds)
  2309. def testFDPassSimple(self):
  2310. # Pass a single FD (array read from bytes object).
  2311. self.checkRecvmsgFDs(1, self.doRecvmsg(self.serv_sock,
  2312. len(MSG), 10240))
  2313. def _testFDPassSimple(self):
  2314. self.assertEqual(
  2315. self.sendmsgToServer(
  2316. [MSG],
  2317. [(socket.SOL_SOCKET,
  2318. socket.SCM_RIGHTS,
  2319. array.array("i", self.newFDs(1)).tobytes())]),
  2320. len(MSG))
  2321. def testMultipleFDPass(self):
  2322. # Pass multiple FDs in a single array.
  2323. self.checkRecvmsgFDs(4, self.doRecvmsg(self.serv_sock,
  2324. len(MSG), 10240))
  2325. def _testMultipleFDPass(self):
  2326. self.createAndSendFDs(4)
  2327. @requireAttrs(socket, "CMSG_SPACE")
  2328. def testFDPassCMSG_SPACE(self):
  2329. # Test using CMSG_SPACE() to calculate ancillary buffer size.
  2330. self.checkRecvmsgFDs(
  2331. 4, self.doRecvmsg(self.serv_sock, len(MSG),
  2332. socket.CMSG_SPACE(4 * SIZEOF_INT)))
  2333. @testFDPassCMSG_SPACE.client_skip
  2334. def _testFDPassCMSG_SPACE(self):
  2335. self.createAndSendFDs(4)
  2336. def testFDPassCMSG_LEN(self):
  2337. # Test using CMSG_LEN() to calculate ancillary buffer size.
  2338. self.checkRecvmsgFDs(1,
  2339. self.doRecvmsg(self.serv_sock, len(MSG),
  2340. socket.CMSG_LEN(4 * SIZEOF_INT)),
  2341. # RFC 3542 says implementations may set
  2342. # MSG_CTRUNC if there isn't enough space
  2343. # for trailing padding.
  2344. ignoreflags=socket.MSG_CTRUNC)
  2345. def _testFDPassCMSG_LEN(self):
  2346. self.createAndSendFDs(1)
  2347. @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
  2348. @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
  2349. @requireAttrs(socket, "CMSG_SPACE")
  2350. def testFDPassSeparate(self):
  2351. # Pass two FDs in two separate arrays. Arrays may be combined
  2352. # into a single control message by the OS.
  2353. self.checkRecvmsgFDs(2,
  2354. self.doRecvmsg(self.serv_sock, len(MSG), 10240),
  2355. maxcmsgs=2)
  2356. @testFDPassSeparate.client_skip
  2357. @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
  2358. @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
  2359. def _testFDPassSeparate(self):
  2360. fd0, fd1 = self.newFDs(2)
  2361. self.assertEqual(
  2362. self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
  2363. socket.SCM_RIGHTS,
  2364. array.array("i", [fd0])),
  2365. (socket.SOL_SOCKET,
  2366. socket.SCM_RIGHTS,
  2367. array.array("i", [fd1]))]),
  2368. len(MSG))
  2369. @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
  2370. @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
  2371. @requireAttrs(socket, "CMSG_SPACE")
  2372. def testFDPassSeparateMinSpace(self):
  2373. # Pass two FDs in two separate arrays, receiving them into the
  2374. # minimum space for two arrays.
  2375. self.checkRecvmsgFDs(2,
  2376. self.doRecvmsg(self.serv_sock, len(MSG),
  2377. socket.CMSG_SPACE(SIZEOF_INT) +
  2378. socket.CMSG_LEN(SIZEOF_INT)),
  2379. maxcmsgs=2, ignoreflags=socket.MSG_CTRUNC)
  2380. @testFDPassSeparateMinSpace.client_skip
  2381. @unittest.skipIf(sys.platform == "darwin", "skipping, see issue #12958")
  2382. @unittest.skipIf(sys.platform.startswith("aix"), "skipping, see issue #22397")
  2383. def _testFDPassSeparateMinSpace(self):
  2384. fd0, fd1 = self.newFDs(2)
  2385. self.assertEqual(
  2386. self.sendmsgToServer([MSG], [(socket.SOL_SOCKET,
  2387. socket.SCM_RIGHTS,
  2388. array.array("i", [fd0])),
  2389. (socket.SOL_SOCKET,
  2390. socket.SCM_RIGHTS,
  2391. array.array("i", [fd1]))]),
  2392. len(MSG))
  2393. def sendAncillaryIfPossible(self, msg, ancdata):
  2394. # Try to send msg and ancdata to server, but if the system
  2395. # call fails, just send msg with no ancillary data.
  2396. try:
  2397. nbytes = self.sendmsgToServer([msg], ancdata)
  2398. except OSError as e:
  2399. # Check that it was the system call that failed
  2400. self.assertIsInstance(e.errno, int)
  2401. nbytes = self.sendmsgToServer([msg])
  2402. self.assertEqual(nbytes, len(msg))
  2403. @unittest.skipIf(sys.platform == "darwin", "see issue #24725")
  2404. def testFDPassEmpty(self):
  2405. # Try to pass an empty FD array. Can receive either no array
  2406. # or an empty array.
  2407. self.checkRecvmsgFDs(0, self.doRecvmsg(self.serv_sock,
  2408. len(MSG), 10240),
  2409. ignoreflags=socket.MSG_CTRUNC)
  2410. def _testFDPassEmpty(self):
  2411. self.sendAncillaryIfPossible(MSG, [(socket.SOL_SOCKET,
  2412. socket.SCM_RIGHTS,
  2413. b"")])
  2414. def testFDPassPartialInt(self):
  2415. # Try to pass a truncated FD array.
  2416. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2417. len(MSG), 10240)
  2418. self.assertEqual(msg, MSG)
  2419. self.checkRecvmsgAddress(addr, self.cli_addr)
  2420. self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
  2421. self.assertLessEqual(len(ancdata), 1)
  2422. for cmsg_level, cmsg_type, cmsg_data in ancdata:
  2423. self.assertEqual(cmsg_level, socket.SOL_SOCKET)
  2424. self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
  2425. self.assertLess(len(cmsg_data), SIZEOF_INT)
  2426. def _testFDPassPartialInt(self):
  2427. self.sendAncillaryIfPossible(
  2428. MSG,
  2429. [(socket.SOL_SOCKET,
  2430. socket.SCM_RIGHTS,
  2431. array.array("i", [self.badfd]).tobytes()[:-1])])
  2432. @requireAttrs(socket, "CMSG_SPACE")
  2433. def testFDPassPartialIntInMiddle(self):
  2434. # Try to pass two FD arrays, the first of which is truncated.
  2435. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2436. len(MSG), 10240)
  2437. self.assertEqual(msg, MSG)
  2438. self.checkRecvmsgAddress(addr, self.cli_addr)
  2439. self.checkFlags(flags, eor=True, ignore=socket.MSG_CTRUNC)
  2440. self.assertLessEqual(len(ancdata), 2)
  2441. fds = array.array("i")
  2442. # Arrays may have been combined in a single control message
  2443. for cmsg_level, cmsg_type, cmsg_data in ancdata:
  2444. self.assertEqual(cmsg_level, socket.SOL_SOCKET)
  2445. self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
  2446. fds.frombytes(cmsg_data[:
  2447. len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
  2448. self.assertLessEqual(len(fds), 2)
  2449. self.checkFDs(fds)
  2450. @testFDPassPartialIntInMiddle.client_skip
  2451. def _testFDPassPartialIntInMiddle(self):
  2452. fd0, fd1 = self.newFDs(2)
  2453. self.sendAncillaryIfPossible(
  2454. MSG,
  2455. [(socket.SOL_SOCKET,
  2456. socket.SCM_RIGHTS,
  2457. array.array("i", [fd0, self.badfd]).tobytes()[:-1]),
  2458. (socket.SOL_SOCKET,
  2459. socket.SCM_RIGHTS,
  2460. array.array("i", [fd1]))])
  2461. def checkTruncatedHeader(self, result, ignoreflags=0):
  2462. # Check that no ancillary data items are returned when data is
  2463. # truncated inside the cmsghdr structure.
  2464. msg, ancdata, flags, addr = result
  2465. self.assertEqual(msg, MSG)
  2466. self.checkRecvmsgAddress(addr, self.cli_addr)
  2467. self.assertEqual(ancdata, [])
  2468. self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
  2469. ignore=ignoreflags)
  2470. def testCmsgTruncNoBufSize(self):
  2471. # Check that no ancillary data is received when no buffer size
  2472. # is specified.
  2473. self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG)),
  2474. # BSD seems to set MSG_CTRUNC only
  2475. # if an item has been partially
  2476. # received.
  2477. ignoreflags=socket.MSG_CTRUNC)
  2478. def _testCmsgTruncNoBufSize(self):
  2479. self.createAndSendFDs(1)
  2480. def testCmsgTrunc0(self):
  2481. # Check that no ancillary data is received when buffer size is 0.
  2482. self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 0),
  2483. ignoreflags=socket.MSG_CTRUNC)
  2484. def _testCmsgTrunc0(self):
  2485. self.createAndSendFDs(1)
  2486. # Check that no ancillary data is returned for various non-zero
  2487. # (but still too small) buffer sizes.
  2488. def testCmsgTrunc1(self):
  2489. self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG), 1))
  2490. def _testCmsgTrunc1(self):
  2491. self.createAndSendFDs(1)
  2492. def testCmsgTrunc2Int(self):
  2493. # The cmsghdr structure has at least three members, two of
  2494. # which are ints, so we still shouldn't see any ancillary
  2495. # data.
  2496. self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
  2497. SIZEOF_INT * 2))
  2498. def _testCmsgTrunc2Int(self):
  2499. self.createAndSendFDs(1)
  2500. def testCmsgTruncLen0Minus1(self):
  2501. self.checkTruncatedHeader(self.doRecvmsg(self.serv_sock, len(MSG),
  2502. socket.CMSG_LEN(0) - 1))
  2503. def _testCmsgTruncLen0Minus1(self):
  2504. self.createAndSendFDs(1)
  2505. # The following tests try to truncate the control message in the
  2506. # middle of the FD array.
  2507. def checkTruncatedArray(self, ancbuf, maxdata, mindata=0):
  2508. # Check that file descriptor data is truncated to between
  2509. # mindata and maxdata bytes when received with buffer size
  2510. # ancbuf, and that any complete file descriptor numbers are
  2511. # valid.
  2512. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2513. len(MSG), ancbuf)
  2514. self.assertEqual(msg, MSG)
  2515. self.checkRecvmsgAddress(addr, self.cli_addr)
  2516. self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
  2517. if mindata == 0 and ancdata == []:
  2518. return
  2519. self.assertEqual(len(ancdata), 1)
  2520. cmsg_level, cmsg_type, cmsg_data = ancdata[0]
  2521. self.assertEqual(cmsg_level, socket.SOL_SOCKET)
  2522. self.assertEqual(cmsg_type, socket.SCM_RIGHTS)
  2523. self.assertGreaterEqual(len(cmsg_data), mindata)
  2524. self.assertLessEqual(len(cmsg_data), maxdata)
  2525. fds = array.array("i")
  2526. fds.frombytes(cmsg_data[:
  2527. len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
  2528. self.checkFDs(fds)
  2529. def testCmsgTruncLen0(self):
  2530. self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0), maxdata=0)
  2531. def _testCmsgTruncLen0(self):
  2532. self.createAndSendFDs(1)
  2533. def testCmsgTruncLen0Plus1(self):
  2534. self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(0) + 1, maxdata=1)
  2535. def _testCmsgTruncLen0Plus1(self):
  2536. self.createAndSendFDs(2)
  2537. def testCmsgTruncLen1(self):
  2538. self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(SIZEOF_INT),
  2539. maxdata=SIZEOF_INT)
  2540. def _testCmsgTruncLen1(self):
  2541. self.createAndSendFDs(2)
  2542. def testCmsgTruncLen2Minus1(self):
  2543. self.checkTruncatedArray(ancbuf=socket.CMSG_LEN(2 * SIZEOF_INT) - 1,
  2544. maxdata=(2 * SIZEOF_INT) - 1)
  2545. def _testCmsgTruncLen2Minus1(self):
  2546. self.createAndSendFDs(2)
  2547. class RFC3542AncillaryTest(SendrecvmsgServerTimeoutBase):
  2548. # Test sendmsg() and recvmsg[_into]() using the ancillary data
  2549. # features of the RFC 3542 Advanced Sockets API for IPv6.
  2550. # Currently we can only handle certain data items (e.g. traffic
  2551. # class, hop limit, MTU discovery and fragmentation settings)
  2552. # without resorting to unportable means such as the struct module,
  2553. # but the tests here are aimed at testing the ancillary data
  2554. # handling in sendmsg() and recvmsg() rather than the IPv6 API
  2555. # itself.
  2556. # Test value to use when setting hop limit of packet
  2557. hop_limit = 2
  2558. # Test value to use when setting traffic class of packet.
  2559. # -1 means "use kernel default".
  2560. traffic_class = -1
  2561. def ancillaryMapping(self, ancdata):
  2562. # Given ancillary data list ancdata, return a mapping from
  2563. # pairs (cmsg_level, cmsg_type) to corresponding cmsg_data.
  2564. # Check that no (level, type) pair appears more than once.
  2565. d = {}
  2566. for cmsg_level, cmsg_type, cmsg_data in ancdata:
  2567. self.assertNotIn((cmsg_level, cmsg_type), d)
  2568. d[(cmsg_level, cmsg_type)] = cmsg_data
  2569. return d
  2570. def checkHopLimit(self, ancbufsize, maxhop=255, ignoreflags=0):
  2571. # Receive hop limit into ancbufsize bytes of ancillary data
  2572. # space. Check that data is MSG, ancillary data is not
  2573. # truncated (but ignore any flags in ignoreflags), and hop
  2574. # limit is between 0 and maxhop inclusive.
  2575. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  2576. socket.IPV6_RECVHOPLIMIT, 1)
  2577. self.misc_event.set()
  2578. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2579. len(MSG), ancbufsize)
  2580. self.assertEqual(msg, MSG)
  2581. self.checkRecvmsgAddress(addr, self.cli_addr)
  2582. self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
  2583. ignore=ignoreflags)
  2584. self.assertEqual(len(ancdata), 1)
  2585. self.assertIsInstance(ancdata[0], tuple)
  2586. cmsg_level, cmsg_type, cmsg_data = ancdata[0]
  2587. self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
  2588. self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
  2589. self.assertIsInstance(cmsg_data, bytes)
  2590. self.assertEqual(len(cmsg_data), SIZEOF_INT)
  2591. a = array.array("i")
  2592. a.frombytes(cmsg_data)
  2593. self.assertGreaterEqual(a[0], 0)
  2594. self.assertLessEqual(a[0], maxhop)
  2595. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  2596. def testRecvHopLimit(self):
  2597. # Test receiving the packet hop limit as ancillary data.
  2598. self.checkHopLimit(ancbufsize=10240)
  2599. @testRecvHopLimit.client_skip
  2600. def _testRecvHopLimit(self):
  2601. # Need to wait until server has asked to receive ancillary
  2602. # data, as implementations are not required to buffer it
  2603. # otherwise.
  2604. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2605. self.sendToServer(MSG)
  2606. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  2607. def testRecvHopLimitCMSG_SPACE(self):
  2608. # Test receiving hop limit, using CMSG_SPACE to calculate buffer size.
  2609. self.checkHopLimit(ancbufsize=socket.CMSG_SPACE(SIZEOF_INT))
  2610. @testRecvHopLimitCMSG_SPACE.client_skip
  2611. def _testRecvHopLimitCMSG_SPACE(self):
  2612. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2613. self.sendToServer(MSG)
  2614. # Could test receiving into buffer sized using CMSG_LEN, but RFC
  2615. # 3542 says portable applications must provide space for trailing
  2616. # padding. Implementations may set MSG_CTRUNC if there isn't
  2617. # enough space for the padding.
  2618. @requireAttrs(socket.socket, "sendmsg")
  2619. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  2620. def testSetHopLimit(self):
  2621. # Test setting hop limit on outgoing packet and receiving it
  2622. # at the other end.
  2623. self.checkHopLimit(ancbufsize=10240, maxhop=self.hop_limit)
  2624. @testSetHopLimit.client_skip
  2625. def _testSetHopLimit(self):
  2626. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2627. self.assertEqual(
  2628. self.sendmsgToServer([MSG],
  2629. [(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
  2630. array.array("i", [self.hop_limit]))]),
  2631. len(MSG))
  2632. def checkTrafficClassAndHopLimit(self, ancbufsize, maxhop=255,
  2633. ignoreflags=0):
  2634. # Receive traffic class and hop limit into ancbufsize bytes of
  2635. # ancillary data space. Check that data is MSG, ancillary
  2636. # data is not truncated (but ignore any flags in ignoreflags),
  2637. # and traffic class and hop limit are in range (hop limit no
  2638. # more than maxhop).
  2639. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  2640. socket.IPV6_RECVHOPLIMIT, 1)
  2641. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  2642. socket.IPV6_RECVTCLASS, 1)
  2643. self.misc_event.set()
  2644. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2645. len(MSG), ancbufsize)
  2646. self.assertEqual(msg, MSG)
  2647. self.checkRecvmsgAddress(addr, self.cli_addr)
  2648. self.checkFlags(flags, eor=True, checkunset=socket.MSG_CTRUNC,
  2649. ignore=ignoreflags)
  2650. self.assertEqual(len(ancdata), 2)
  2651. ancmap = self.ancillaryMapping(ancdata)
  2652. tcdata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_TCLASS)]
  2653. self.assertEqual(len(tcdata), SIZEOF_INT)
  2654. a = array.array("i")
  2655. a.frombytes(tcdata)
  2656. self.assertGreaterEqual(a[0], 0)
  2657. self.assertLessEqual(a[0], 255)
  2658. hldata = ancmap[(socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT)]
  2659. self.assertEqual(len(hldata), SIZEOF_INT)
  2660. a = array.array("i")
  2661. a.frombytes(hldata)
  2662. self.assertGreaterEqual(a[0], 0)
  2663. self.assertLessEqual(a[0], maxhop)
  2664. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  2665. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  2666. def testRecvTrafficClassAndHopLimit(self):
  2667. # Test receiving traffic class and hop limit as ancillary data.
  2668. self.checkTrafficClassAndHopLimit(ancbufsize=10240)
  2669. @testRecvTrafficClassAndHopLimit.client_skip
  2670. def _testRecvTrafficClassAndHopLimit(self):
  2671. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2672. self.sendToServer(MSG)
  2673. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  2674. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  2675. def testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
  2676. # Test receiving traffic class and hop limit, using
  2677. # CMSG_SPACE() to calculate buffer size.
  2678. self.checkTrafficClassAndHopLimit(
  2679. ancbufsize=socket.CMSG_SPACE(SIZEOF_INT) * 2)
  2680. @testRecvTrafficClassAndHopLimitCMSG_SPACE.client_skip
  2681. def _testRecvTrafficClassAndHopLimitCMSG_SPACE(self):
  2682. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2683. self.sendToServer(MSG)
  2684. @requireAttrs(socket.socket, "sendmsg")
  2685. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  2686. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  2687. def testSetTrafficClassAndHopLimit(self):
  2688. # Test setting traffic class and hop limit on outgoing packet,
  2689. # and receiving them at the other end.
  2690. self.checkTrafficClassAndHopLimit(ancbufsize=10240,
  2691. maxhop=self.hop_limit)
  2692. @testSetTrafficClassAndHopLimit.client_skip
  2693. def _testSetTrafficClassAndHopLimit(self):
  2694. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2695. self.assertEqual(
  2696. self.sendmsgToServer([MSG],
  2697. [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
  2698. array.array("i", [self.traffic_class])),
  2699. (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
  2700. array.array("i", [self.hop_limit]))]),
  2701. len(MSG))
  2702. @requireAttrs(socket.socket, "sendmsg")
  2703. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  2704. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  2705. def testOddCmsgSize(self):
  2706. # Try to send ancillary data with first item one byte too
  2707. # long. Fall back to sending with correct size if this fails,
  2708. # and check that second item was handled correctly.
  2709. self.checkTrafficClassAndHopLimit(ancbufsize=10240,
  2710. maxhop=self.hop_limit)
  2711. @testOddCmsgSize.client_skip
  2712. def _testOddCmsgSize(self):
  2713. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2714. try:
  2715. nbytes = self.sendmsgToServer(
  2716. [MSG],
  2717. [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
  2718. array.array("i", [self.traffic_class]).tobytes() + b"\x00"),
  2719. (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
  2720. array.array("i", [self.hop_limit]))])
  2721. except OSError as e:
  2722. self.assertIsInstance(e.errno, int)
  2723. nbytes = self.sendmsgToServer(
  2724. [MSG],
  2725. [(socket.IPPROTO_IPV6, socket.IPV6_TCLASS,
  2726. array.array("i", [self.traffic_class])),
  2727. (socket.IPPROTO_IPV6, socket.IPV6_HOPLIMIT,
  2728. array.array("i", [self.hop_limit]))])
  2729. self.assertEqual(nbytes, len(MSG))
  2730. # Tests for proper handling of truncated ancillary data
  2731. def checkHopLimitTruncatedHeader(self, ancbufsize, ignoreflags=0):
  2732. # Receive hop limit into ancbufsize bytes of ancillary data
  2733. # space, which should be too small to contain the ancillary
  2734. # data header (if ancbufsize is None, pass no second argument
  2735. # to recvmsg()). Check that data is MSG, MSG_CTRUNC is set
  2736. # (unless included in ignoreflags), and no ancillary data is
  2737. # returned.
  2738. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  2739. socket.IPV6_RECVHOPLIMIT, 1)
  2740. self.misc_event.set()
  2741. args = () if ancbufsize is None else (ancbufsize,)
  2742. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2743. len(MSG), *args)
  2744. self.assertEqual(msg, MSG)
  2745. self.checkRecvmsgAddress(addr, self.cli_addr)
  2746. self.assertEqual(ancdata, [])
  2747. self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
  2748. ignore=ignoreflags)
  2749. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  2750. def testCmsgTruncNoBufSize(self):
  2751. # Check that no ancillary data is received when no ancillary
  2752. # buffer size is provided.
  2753. self.checkHopLimitTruncatedHeader(ancbufsize=None,
  2754. # BSD seems to set
  2755. # MSG_CTRUNC only if an item
  2756. # has been partially
  2757. # received.
  2758. ignoreflags=socket.MSG_CTRUNC)
  2759. @testCmsgTruncNoBufSize.client_skip
  2760. def _testCmsgTruncNoBufSize(self):
  2761. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2762. self.sendToServer(MSG)
  2763. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  2764. def testSingleCmsgTrunc0(self):
  2765. # Check that no ancillary data is received when ancillary
  2766. # buffer size is zero.
  2767. self.checkHopLimitTruncatedHeader(ancbufsize=0,
  2768. ignoreflags=socket.MSG_CTRUNC)
  2769. @testSingleCmsgTrunc0.client_skip
  2770. def _testSingleCmsgTrunc0(self):
  2771. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2772. self.sendToServer(MSG)
  2773. # Check that no ancillary data is returned for various non-zero
  2774. # (but still too small) buffer sizes.
  2775. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  2776. def testSingleCmsgTrunc1(self):
  2777. self.checkHopLimitTruncatedHeader(ancbufsize=1)
  2778. @testSingleCmsgTrunc1.client_skip
  2779. def _testSingleCmsgTrunc1(self):
  2780. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2781. self.sendToServer(MSG)
  2782. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  2783. def testSingleCmsgTrunc2Int(self):
  2784. self.checkHopLimitTruncatedHeader(ancbufsize=2 * SIZEOF_INT)
  2785. @testSingleCmsgTrunc2Int.client_skip
  2786. def _testSingleCmsgTrunc2Int(self):
  2787. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2788. self.sendToServer(MSG)
  2789. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  2790. def testSingleCmsgTruncLen0Minus1(self):
  2791. self.checkHopLimitTruncatedHeader(ancbufsize=socket.CMSG_LEN(0) - 1)
  2792. @testSingleCmsgTruncLen0Minus1.client_skip
  2793. def _testSingleCmsgTruncLen0Minus1(self):
  2794. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2795. self.sendToServer(MSG)
  2796. @requireAttrs(socket, "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT")
  2797. def testSingleCmsgTruncInData(self):
  2798. # Test truncation of a control message inside its associated
  2799. # data. The message may be returned with its data truncated,
  2800. # or not returned at all.
  2801. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  2802. socket.IPV6_RECVHOPLIMIT, 1)
  2803. self.misc_event.set()
  2804. msg, ancdata, flags, addr = self.doRecvmsg(
  2805. self.serv_sock, len(MSG), socket.CMSG_LEN(SIZEOF_INT) - 1)
  2806. self.assertEqual(msg, MSG)
  2807. self.checkRecvmsgAddress(addr, self.cli_addr)
  2808. self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
  2809. self.assertLessEqual(len(ancdata), 1)
  2810. if ancdata:
  2811. cmsg_level, cmsg_type, cmsg_data = ancdata[0]
  2812. self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
  2813. self.assertEqual(cmsg_type, socket.IPV6_HOPLIMIT)
  2814. self.assertLess(len(cmsg_data), SIZEOF_INT)
  2815. @testSingleCmsgTruncInData.client_skip
  2816. def _testSingleCmsgTruncInData(self):
  2817. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2818. self.sendToServer(MSG)
  2819. def checkTruncatedSecondHeader(self, ancbufsize, ignoreflags=0):
  2820. # Receive traffic class and hop limit into ancbufsize bytes of
  2821. # ancillary data space, which should be large enough to
  2822. # contain the first item, but too small to contain the header
  2823. # of the second. Check that data is MSG, MSG_CTRUNC is set
  2824. # (unless included in ignoreflags), and only one ancillary
  2825. # data item is returned.
  2826. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  2827. socket.IPV6_RECVHOPLIMIT, 1)
  2828. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  2829. socket.IPV6_RECVTCLASS, 1)
  2830. self.misc_event.set()
  2831. msg, ancdata, flags, addr = self.doRecvmsg(self.serv_sock,
  2832. len(MSG), ancbufsize)
  2833. self.assertEqual(msg, MSG)
  2834. self.checkRecvmsgAddress(addr, self.cli_addr)
  2835. self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC,
  2836. ignore=ignoreflags)
  2837. self.assertEqual(len(ancdata), 1)
  2838. cmsg_level, cmsg_type, cmsg_data = ancdata[0]
  2839. self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
  2840. self.assertIn(cmsg_type, {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT})
  2841. self.assertEqual(len(cmsg_data), SIZEOF_INT)
  2842. a = array.array("i")
  2843. a.frombytes(cmsg_data)
  2844. self.assertGreaterEqual(a[0], 0)
  2845. self.assertLessEqual(a[0], 255)
  2846. # Try the above test with various buffer sizes.
  2847. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  2848. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  2849. def testSecondCmsgTrunc0(self):
  2850. self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT),
  2851. ignoreflags=socket.MSG_CTRUNC)
  2852. @testSecondCmsgTrunc0.client_skip
  2853. def _testSecondCmsgTrunc0(self):
  2854. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2855. self.sendToServer(MSG)
  2856. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  2857. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  2858. def testSecondCmsgTrunc1(self):
  2859. self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) + 1)
  2860. @testSecondCmsgTrunc1.client_skip
  2861. def _testSecondCmsgTrunc1(self):
  2862. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2863. self.sendToServer(MSG)
  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. @testSecondCmsgTrunc2Int.client_skip
  2870. def _testSecondCmsgTrunc2Int(self):
  2871. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2872. self.sendToServer(MSG)
  2873. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  2874. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  2875. def testSecondCmsgTruncLen0Minus1(self):
  2876. self.checkTruncatedSecondHeader(socket.CMSG_SPACE(SIZEOF_INT) +
  2877. socket.CMSG_LEN(0) - 1)
  2878. @testSecondCmsgTruncLen0Minus1.client_skip
  2879. def _testSecondCmsgTruncLen0Minus1(self):
  2880. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2881. self.sendToServer(MSG)
  2882. @requireAttrs(socket, "CMSG_SPACE", "IPV6_RECVHOPLIMIT", "IPV6_HOPLIMIT",
  2883. "IPV6_RECVTCLASS", "IPV6_TCLASS")
  2884. def testSecomdCmsgTruncInData(self):
  2885. # Test truncation of the second of two control messages inside
  2886. # its associated data.
  2887. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  2888. socket.IPV6_RECVHOPLIMIT, 1)
  2889. self.serv_sock.setsockopt(socket.IPPROTO_IPV6,
  2890. socket.IPV6_RECVTCLASS, 1)
  2891. self.misc_event.set()
  2892. msg, ancdata, flags, addr = self.doRecvmsg(
  2893. self.serv_sock, len(MSG),
  2894. socket.CMSG_SPACE(SIZEOF_INT) + socket.CMSG_LEN(SIZEOF_INT) - 1)
  2895. self.assertEqual(msg, MSG)
  2896. self.checkRecvmsgAddress(addr, self.cli_addr)
  2897. self.checkFlags(flags, eor=True, checkset=socket.MSG_CTRUNC)
  2898. cmsg_types = {socket.IPV6_TCLASS, socket.IPV6_HOPLIMIT}
  2899. cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
  2900. self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
  2901. cmsg_types.remove(cmsg_type)
  2902. self.assertEqual(len(cmsg_data), SIZEOF_INT)
  2903. a = array.array("i")
  2904. a.frombytes(cmsg_data)
  2905. self.assertGreaterEqual(a[0], 0)
  2906. self.assertLessEqual(a[0], 255)
  2907. if ancdata:
  2908. cmsg_level, cmsg_type, cmsg_data = ancdata.pop(0)
  2909. self.assertEqual(cmsg_level, socket.IPPROTO_IPV6)
  2910. cmsg_types.remove(cmsg_type)
  2911. self.assertLess(len(cmsg_data), SIZEOF_INT)
  2912. self.assertEqual(ancdata, [])
  2913. @testSecomdCmsgTruncInData.client_skip
  2914. def _testSecomdCmsgTruncInData(self):
  2915. self.assertTrue(self.misc_event.wait(timeout=self.fail_timeout))
  2916. self.sendToServer(MSG)
  2917. # Derive concrete test classes for different socket types.
  2918. class SendrecvmsgUDPTestBase(SendrecvmsgDgramFlagsBase,
  2919. SendrecvmsgConnectionlessBase,
  2920. ThreadedSocketTestMixin, UDPTestBase):
  2921. pass
  2922. @requireAttrs(socket.socket, "sendmsg")
  2923. @unittest.skipUnless(thread, 'Threading required for this test.')
  2924. class SendmsgUDPTest(SendmsgConnectionlessTests, SendrecvmsgUDPTestBase):
  2925. pass
  2926. @requireAttrs(socket.socket, "recvmsg")
  2927. @unittest.skipUnless(thread, 'Threading required for this test.')
  2928. class RecvmsgUDPTest(RecvmsgTests, SendrecvmsgUDPTestBase):
  2929. pass
  2930. @requireAttrs(socket.socket, "recvmsg_into")
  2931. @unittest.skipUnless(thread, 'Threading required for this test.')
  2932. class RecvmsgIntoUDPTest(RecvmsgIntoTests, SendrecvmsgUDPTestBase):
  2933. pass
  2934. class SendrecvmsgUDP6TestBase(SendrecvmsgDgramFlagsBase,
  2935. SendrecvmsgConnectionlessBase,
  2936. ThreadedSocketTestMixin, UDP6TestBase):
  2937. def checkRecvmsgAddress(self, addr1, addr2):
  2938. # Called to compare the received address with the address of
  2939. # the peer, ignoring scope ID
  2940. self.assertEqual(addr1[:-1], addr2[:-1])
  2941. @requireAttrs(socket.socket, "sendmsg")
  2942. @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
  2943. @requireSocket("AF_INET6", "SOCK_DGRAM")
  2944. @unittest.skipUnless(thread, 'Threading required for this test.')
  2945. class SendmsgUDP6Test(SendmsgConnectionlessTests, SendrecvmsgUDP6TestBase):
  2946. pass
  2947. @requireAttrs(socket.socket, "recvmsg")
  2948. @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
  2949. @requireSocket("AF_INET6", "SOCK_DGRAM")
  2950. @unittest.skipUnless(thread, 'Threading required for this test.')
  2951. class RecvmsgUDP6Test(RecvmsgTests, SendrecvmsgUDP6TestBase):
  2952. pass
  2953. @requireAttrs(socket.socket, "recvmsg_into")
  2954. @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
  2955. @requireSocket("AF_INET6", "SOCK_DGRAM")
  2956. @unittest.skipUnless(thread, 'Threading required for this test.')
  2957. class RecvmsgIntoUDP6Test(RecvmsgIntoTests, SendrecvmsgUDP6TestBase):
  2958. pass
  2959. @requireAttrs(socket.socket, "recvmsg")
  2960. @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
  2961. @requireAttrs(socket, "IPPROTO_IPV6")
  2962. @requireSocket("AF_INET6", "SOCK_DGRAM")
  2963. @unittest.skipUnless(thread, 'Threading required for this test.')
  2964. class RecvmsgRFC3542AncillaryUDP6Test(RFC3542AncillaryTest,
  2965. SendrecvmsgUDP6TestBase):
  2966. pass
  2967. @requireAttrs(socket.socket, "recvmsg_into")
  2968. @unittest.skipUnless(support.IPV6_ENABLED, 'IPv6 required for this test.')
  2969. @requireAttrs(socket, "IPPROTO_IPV6")
  2970. @requireSocket("AF_INET6", "SOCK_DGRAM")
  2971. @unittest.skipUnless(thread, 'Threading required for this test.')
  2972. class RecvmsgIntoRFC3542AncillaryUDP6Test(RecvmsgIntoMixin,
  2973. RFC3542AncillaryTest,
  2974. SendrecvmsgUDP6TestBase):
  2975. pass
  2976. class SendrecvmsgTCPTestBase(SendrecvmsgConnectedBase,
  2977. ConnectedStreamTestMixin, TCPTestBase):
  2978. pass
  2979. @requireAttrs(socket.socket, "sendmsg")
  2980. @unittest.skipUnless(thread, 'Threading required for this test.')
  2981. class SendmsgTCPTest(SendmsgStreamTests, SendrecvmsgTCPTestBase):
  2982. pass
  2983. @requireAttrs(socket.socket, "recvmsg")
  2984. @unittest.skipUnless(thread, 'Threading required for this test.')
  2985. class RecvmsgTCPTest(RecvmsgTests, RecvmsgGenericStreamTests,
  2986. SendrecvmsgTCPTestBase):
  2987. pass
  2988. @requireAttrs(socket.socket, "recvmsg_into")
  2989. @unittest.skipUnless(thread, 'Threading required for this test.')
  2990. class RecvmsgIntoTCPTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
  2991. SendrecvmsgTCPTestBase):
  2992. pass
  2993. class SendrecvmsgSCTPStreamTestBase(SendrecvmsgSCTPFlagsBase,
  2994. SendrecvmsgConnectedBase,
  2995. ConnectedStreamTestMixin, SCTPStreamBase):
  2996. pass
  2997. @requireAttrs(socket.socket, "sendmsg")
  2998. @requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
  2999. @unittest.skipUnless(thread, 'Threading required for this test.')
  3000. class SendmsgSCTPStreamTest(SendmsgStreamTests, SendrecvmsgSCTPStreamTestBase):
  3001. pass
  3002. @requireAttrs(socket.socket, "recvmsg")
  3003. @requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
  3004. @unittest.skipUnless(thread, 'Threading required for this test.')
  3005. class RecvmsgSCTPStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
  3006. SendrecvmsgSCTPStreamTestBase):
  3007. def testRecvmsgEOF(self):
  3008. try:
  3009. super(RecvmsgSCTPStreamTest, self).testRecvmsgEOF()
  3010. except OSError as e:
  3011. if e.errno != errno.ENOTCONN:
  3012. raise
  3013. self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
  3014. @requireAttrs(socket.socket, "recvmsg_into")
  3015. @requireSocket("AF_INET", "SOCK_STREAM", "IPPROTO_SCTP")
  3016. @unittest.skipUnless(thread, 'Threading required for this test.')
  3017. class RecvmsgIntoSCTPStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
  3018. SendrecvmsgSCTPStreamTestBase):
  3019. def testRecvmsgEOF(self):
  3020. try:
  3021. super(RecvmsgIntoSCTPStreamTest, self).testRecvmsgEOF()
  3022. except OSError as e:
  3023. if e.errno != errno.ENOTCONN:
  3024. raise
  3025. self.skipTest("sporadic ENOTCONN (kernel issue?) - see issue #13876")
  3026. class SendrecvmsgUnixStreamTestBase(SendrecvmsgConnectedBase,
  3027. ConnectedStreamTestMixin, UnixStreamBase):
  3028. pass
  3029. @requireAttrs(socket.socket, "sendmsg")
  3030. @requireAttrs(socket, "AF_UNIX")
  3031. @unittest.skipUnless(thread, 'Threading required for this test.')
  3032. class SendmsgUnixStreamTest(SendmsgStreamTests, SendrecvmsgUnixStreamTestBase):
  3033. pass
  3034. @requireAttrs(socket.socket, "recvmsg")
  3035. @requireAttrs(socket, "AF_UNIX")
  3036. @unittest.skipUnless(thread, 'Threading required for this test.')
  3037. class RecvmsgUnixStreamTest(RecvmsgTests, RecvmsgGenericStreamTests,
  3038. SendrecvmsgUnixStreamTestBase):
  3039. pass
  3040. @requireAttrs(socket.socket, "recvmsg_into")
  3041. @requireAttrs(socket, "AF_UNIX")
  3042. @unittest.skipUnless(thread, 'Threading required for this test.')
  3043. class RecvmsgIntoUnixStreamTest(RecvmsgIntoTests, RecvmsgGenericStreamTests,
  3044. SendrecvmsgUnixStreamTestBase):
  3045. pass
  3046. @requireAttrs(socket.socket, "sendmsg", "recvmsg")
  3047. @requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
  3048. @unittest.skipUnless(thread, 'Threading required for this test.')
  3049. class RecvmsgSCMRightsStreamTest(SCMRightsTest, SendrecvmsgUnixStreamTestBase):
  3050. pass
  3051. @requireAttrs(socket.socket, "sendmsg", "recvmsg_into")
  3052. @requireAttrs(socket, "AF_UNIX", "SOL_SOCKET", "SCM_RIGHTS")
  3053. @unittest.skipUnless(thread, 'Threading required for this test.')
  3054. class RecvmsgIntoSCMRightsStreamTest(RecvmsgIntoMixin, SCMRightsTest,
  3055. SendrecvmsgUnixStreamTestBase):
  3056. pass
  3057. # Test interrupting the interruptible send/receive methods with a
  3058. # signal when a timeout is set. These tests avoid having multiple
  3059. # threads alive during the test so that the OS cannot deliver the
  3060. # signal to the wrong one.
  3061. class InterruptedTimeoutBase(unittest.TestCase):
  3062. # Base class for interrupted send/receive tests. Installs an
  3063. # empty handler for SIGALRM and removes it on teardown, along with
  3064. # any scheduled alarms.
  3065. def setUp(self):
  3066. super().setUp()
  3067. orig_alrm_handler = signal.signal(signal.SIGALRM,
  3068. lambda signum, frame: 1 / 0)
  3069. self.addCleanup(signal.signal, signal.SIGALRM, orig_alrm_handler)
  3070. self.addCleanup(self.setAlarm, 0)
  3071. # Timeout for socket operations
  3072. timeout = 4.0
  3073. # Provide setAlarm() method to schedule delivery of SIGALRM after
  3074. # given number of seconds, or cancel it if zero, and an
  3075. # appropriate time value to use. Use setitimer() if available.
  3076. if hasattr(signal, "setitimer"):
  3077. alarm_time = 0.05
  3078. def setAlarm(self, seconds):
  3079. signal.setitimer(signal.ITIMER_REAL, seconds)
  3080. else:
  3081. # Old systems may deliver the alarm up to one second early
  3082. alarm_time = 2
  3083. def setAlarm(self, seconds):
  3084. signal.alarm(seconds)
  3085. # Require siginterrupt() in order to ensure that system calls are
  3086. # interrupted by default.
  3087. @requireAttrs(signal, "siginterrupt")
  3088. @unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
  3089. "Don't have signal.alarm or signal.setitimer")
  3090. class InterruptedRecvTimeoutTest(InterruptedTimeoutBase, UDPTestBase):
  3091. # Test interrupting the recv*() methods with signals when a
  3092. # timeout is set.
  3093. def setUp(self):
  3094. super().setUp()
  3095. self.serv.settimeout(self.timeout)
  3096. def checkInterruptedRecv(self, func, *args, **kwargs):
  3097. # Check that func(*args, **kwargs) raises
  3098. # errno of EINTR when interrupted by a signal.
  3099. self.setAlarm(self.alarm_time)
  3100. with self.assertRaises(ZeroDivisionError) as cm:
  3101. func(*args, **kwargs)
  3102. def testInterruptedRecvTimeout(self):
  3103. self.checkInterruptedRecv(self.serv.recv, 1024)
  3104. def testInterruptedRecvIntoTimeout(self):
  3105. self.checkInterruptedRecv(self.serv.recv_into, bytearray(1024))
  3106. def testInterruptedRecvfromTimeout(self):
  3107. self.checkInterruptedRecv(self.serv.recvfrom, 1024)
  3108. def testInterruptedRecvfromIntoTimeout(self):
  3109. self.checkInterruptedRecv(self.serv.recvfrom_into, bytearray(1024))
  3110. @requireAttrs(socket.socket, "recvmsg")
  3111. def testInterruptedRecvmsgTimeout(self):
  3112. self.checkInterruptedRecv(self.serv.recvmsg, 1024)
  3113. @requireAttrs(socket.socket, "recvmsg_into")
  3114. def testInterruptedRecvmsgIntoTimeout(self):
  3115. self.checkInterruptedRecv(self.serv.recvmsg_into, [bytearray(1024)])
  3116. # Require siginterrupt() in order to ensure that system calls are
  3117. # interrupted by default.
  3118. @requireAttrs(signal, "siginterrupt")
  3119. @unittest.skipUnless(hasattr(signal, "alarm") or hasattr(signal, "setitimer"),
  3120. "Don't have signal.alarm or signal.setitimer")
  3121. @unittest.skipUnless(thread, 'Threading required for this test.')
  3122. class InterruptedSendTimeoutTest(InterruptedTimeoutBase,
  3123. ThreadSafeCleanupTestCase,
  3124. SocketListeningTestMixin, TCPTestBase):
  3125. # Test interrupting the interruptible send*() methods with signals
  3126. # when a timeout is set.
  3127. def setUp(self):
  3128. super().setUp()
  3129. self.serv_conn = self.newSocket()
  3130. self.addCleanup(self.serv_conn.close)
  3131. # Use a thread to complete the connection, but wait for it to
  3132. # terminate before running the test, so that there is only one
  3133. # thread to accept the signal.
  3134. cli_thread = threading.Thread(target=self.doConnect)
  3135. cli_thread.start()
  3136. self.cli_conn, addr = self.serv.accept()
  3137. self.addCleanup(self.cli_conn.close)
  3138. cli_thread.join()
  3139. self.serv_conn.settimeout(self.timeout)
  3140. def doConnect(self):
  3141. self.serv_conn.connect(self.serv_addr)
  3142. def checkInterruptedSend(self, func, *args, **kwargs):
  3143. # Check that func(*args, **kwargs), run in a loop, raises
  3144. # OSError with an errno of EINTR when interrupted by a
  3145. # signal.
  3146. with self.assertRaises(ZeroDivisionError) as cm:
  3147. while True:
  3148. self.setAlarm(self.alarm_time)
  3149. func(*args, **kwargs)
  3150. # Issue #12958: The following tests have problems on OS X prior to 10.7
  3151. @support.requires_mac_ver(10, 7)
  3152. def testInterruptedSendTimeout(self):
  3153. self.checkInterruptedSend(self.serv_conn.send, b"a"*512)
  3154. @support.requires_mac_ver(10, 7)
  3155. def testInterruptedSendtoTimeout(self):
  3156. # Passing an actual address here as Python's wrapper for
  3157. # sendto() doesn't allow passing a zero-length one; POSIX
  3158. # requires that the address is ignored since the socket is
  3159. # connection-mode, however.
  3160. self.checkInterruptedSend(self.serv_conn.sendto, b"a"*512,
  3161. self.serv_addr)
  3162. @support.requires_mac_ver(10, 7)
  3163. @requireAttrs(socket.socket, "sendmsg")
  3164. def testInterruptedSendmsgTimeout(self):
  3165. self.checkInterruptedSend(self.serv_conn.sendmsg, [b"a"*512])
  3166. @unittest.skipUnless(thread, 'Threading required for this test.')
  3167. class TCPCloserTest(ThreadedTCPSocketTest):
  3168. def testClose(self):
  3169. conn, addr = self.serv.accept()
  3170. conn.close()
  3171. sd = self.cli
  3172. read, write, err = select.select([sd], [], [], 1.0)
  3173. self.assertEqual(read, [sd])
  3174. self.assertEqual(sd.recv(1), b'')
  3175. # Calling close() many times should be safe.
  3176. conn.close()
  3177. conn.close()
  3178. def _testClose(self):
  3179. self.cli.connect((HOST, self.port))
  3180. time.sleep(1.0)
  3181. @unittest.skipUnless(thread, 'Threading required for this test.')
  3182. class BasicSocketPairTest(SocketPairTest):
  3183. def __init__(self, methodName='runTest'):
  3184. SocketPairTest.__init__(self, methodName=methodName)
  3185. def _check_defaults(self, sock):
  3186. self.assertIsInstance(sock, socket.socket)
  3187. if hasattr(socket, 'AF_UNIX'):
  3188. self.assertEqual(sock.family, socket.AF_UNIX)
  3189. else:
  3190. self.assertEqual(sock.family, socket.AF_INET)
  3191. self.assertEqual(sock.type, socket.SOCK_STREAM)
  3192. self.assertEqual(sock.proto, 0)
  3193. def _testDefaults(self):
  3194. self._check_defaults(self.cli)
  3195. def testDefaults(self):
  3196. self._check_defaults(self.serv)
  3197. def testRecv(self):
  3198. msg = self.serv.recv(1024)
  3199. self.assertEqual(msg, MSG)
  3200. def _testRecv(self):
  3201. self.cli.send(MSG)
  3202. def testSend(self):
  3203. self.serv.send(MSG)
  3204. def _testSend(self):
  3205. msg = self.cli.recv(1024)
  3206. self.assertEqual(msg, MSG)
  3207. @unittest.skipUnless(thread, 'Threading required for this test.')
  3208. class NonBlockingTCPTests(ThreadedTCPSocketTest):
  3209. def __init__(self, methodName='runTest'):
  3210. ThreadedTCPSocketTest.__init__(self, methodName=methodName)
  3211. def testSetBlocking(self):
  3212. # Testing whether set blocking works
  3213. self.serv.setblocking(True)
  3214. self.assertIsNone(self.serv.gettimeout())
  3215. self.serv.setblocking(False)
  3216. self.assertEqual(self.serv.gettimeout(), 0.0)
  3217. start = time.time()
  3218. try:
  3219. self.serv.accept()
  3220. except OSError:
  3221. pass
  3222. end = time.time()
  3223. self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
  3224. def _testSetBlocking(self):
  3225. pass
  3226. @support.cpython_only
  3227. def testSetBlocking_overflow(self):
  3228. # Issue 15989
  3229. import _testcapi
  3230. if _testcapi.UINT_MAX >= _testcapi.ULONG_MAX:
  3231. self.skipTest('needs UINT_MAX < ULONG_MAX')
  3232. self.serv.setblocking(False)
  3233. self.assertEqual(self.serv.gettimeout(), 0.0)
  3234. self.serv.setblocking(_testcapi.UINT_MAX + 1)
  3235. self.assertIsNone(self.serv.gettimeout())
  3236. _testSetBlocking_overflow = support.cpython_only(_testSetBlocking)
  3237. @unittest.skipUnless(hasattr(socket, 'SOCK_NONBLOCK'),
  3238. 'test needs socket.SOCK_NONBLOCK')
  3239. @support.requires_linux_version(2, 6, 28)
  3240. def testInitNonBlocking(self):
  3241. # reinit server socket
  3242. self.serv.close()
  3243. self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM |
  3244. socket.SOCK_NONBLOCK)
  3245. self.port = support.bind_port(self.serv)
  3246. self.serv.listen()
  3247. # actual testing
  3248. start = time.time()
  3249. try:
  3250. self.serv.accept()
  3251. except OSError:
  3252. pass
  3253. end = time.time()
  3254. self.assertTrue((end - start) < 1.0, "Error creating with non-blocking mode.")
  3255. def _testInitNonBlocking(self):
  3256. pass
  3257. def testInheritFlags(self):
  3258. # Issue #7995: when calling accept() on a listening socket with a
  3259. # timeout, the resulting socket should not be non-blocking.
  3260. self.serv.settimeout(10)
  3261. try:
  3262. conn, addr = self.serv.accept()
  3263. message = conn.recv(len(MSG))
  3264. finally:
  3265. conn.close()
  3266. self.serv.settimeout(None)
  3267. def _testInheritFlags(self):
  3268. time.sleep(0.1)
  3269. self.cli.connect((HOST, self.port))
  3270. time.sleep(0.5)
  3271. self.cli.send(MSG)
  3272. def testAccept(self):
  3273. # Testing non-blocking accept
  3274. self.serv.setblocking(0)
  3275. try:
  3276. conn, addr = self.serv.accept()
  3277. except OSError:
  3278. pass
  3279. else:
  3280. self.fail("Error trying to do non-blocking accept.")
  3281. read, write, err = select.select([self.serv], [], [])
  3282. if self.serv in read:
  3283. conn, addr = self.serv.accept()
  3284. self.assertIsNone(conn.gettimeout())
  3285. conn.close()
  3286. else:
  3287. self.fail("Error trying to do accept after select.")
  3288. def _testAccept(self):
  3289. time.sleep(0.1)
  3290. self.cli.connect((HOST, self.port))
  3291. def testConnect(self):
  3292. # Testing non-blocking connect
  3293. conn, addr = self.serv.accept()
  3294. conn.close()
  3295. def _testConnect(self):
  3296. self.cli.settimeout(10)
  3297. self.cli.connect((HOST, self.port))
  3298. def testRecv(self):
  3299. # Testing non-blocking recv
  3300. conn, addr = self.serv.accept()
  3301. conn.setblocking(0)
  3302. try:
  3303. msg = conn.recv(len(MSG))
  3304. except OSError:
  3305. pass
  3306. else:
  3307. self.fail("Error trying to do non-blocking recv.")
  3308. read, write, err = select.select([conn], [], [])
  3309. if conn in read:
  3310. msg = conn.recv(len(MSG))
  3311. conn.close()
  3312. self.assertEqual(msg, MSG)
  3313. else:
  3314. self.fail("Error during select call to non-blocking socket.")
  3315. def _testRecv(self):
  3316. self.cli.connect((HOST, self.port))
  3317. time.sleep(0.1)
  3318. self.cli.send(MSG)
  3319. @unittest.skipUnless(thread, 'Threading required for this test.')
  3320. class FileObjectClassTestCase(SocketConnectedTest):
  3321. """Unit tests for the object returned by socket.makefile()
  3322. self.read_file is the io object returned by makefile() on
  3323. the client connection. You can read from this file to
  3324. get output from the server.
  3325. self.write_file is the io object returned by makefile() on the
  3326. server connection. You can write to this file to send output
  3327. to the client.
  3328. """
  3329. bufsize = -1 # Use default buffer size
  3330. encoding = 'utf-8'
  3331. errors = 'strict'
  3332. newline = None
  3333. read_mode = 'rb'
  3334. read_msg = MSG
  3335. write_mode = 'wb'
  3336. write_msg = MSG
  3337. def __init__(self, methodName='runTest'):
  3338. SocketConnectedTest.__init__(self, methodName=methodName)
  3339. def setUp(self):
  3340. self.evt1, self.evt2, self.serv_finished, self.cli_finished = [
  3341. threading.Event() for i in range(4)]
  3342. SocketConnectedTest.setUp(self)
  3343. self.read_file = self.cli_conn.makefile(
  3344. self.read_mode, self.bufsize,
  3345. encoding = self.encoding,
  3346. errors = self.errors,
  3347. newline = self.newline)
  3348. def tearDown(self):
  3349. self.serv_finished.set()
  3350. self.read_file.close()
  3351. self.assertTrue(self.read_file.closed)
  3352. self.read_file = None
  3353. SocketConnectedTest.tearDown(self)
  3354. def clientSetUp(self):
  3355. SocketConnectedTest.clientSetUp(self)
  3356. self.write_file = self.serv_conn.makefile(
  3357. self.write_mode, self.bufsize,
  3358. encoding = self.encoding,
  3359. errors = self.errors,
  3360. newline = self.newline)
  3361. def clientTearDown(self):
  3362. self.cli_finished.set()
  3363. self.write_file.close()
  3364. self.assertTrue(self.write_file.closed)
  3365. self.write_file = None
  3366. SocketConnectedTest.clientTearDown(self)
  3367. def testReadAfterTimeout(self):
  3368. # Issue #7322: A file object must disallow further reads
  3369. # after a timeout has occurred.
  3370. self.cli_conn.settimeout(1)
  3371. self.read_file.read(3)
  3372. # First read raises a timeout
  3373. self.assertRaises(socket.timeout, self.read_file.read, 1)
  3374. # Second read is disallowed
  3375. with self.assertRaises(OSError) as ctx:
  3376. self.read_file.read(1)
  3377. self.assertIn("cannot read from timed out object", str(ctx.exception))
  3378. def _testReadAfterTimeout(self):
  3379. self.write_file.write(self.write_msg[0:3])
  3380. self.write_file.flush()
  3381. self.serv_finished.wait()
  3382. def testSmallRead(self):
  3383. # Performing small file read test
  3384. first_seg = self.read_file.read(len(self.read_msg)-3)
  3385. second_seg = self.read_file.read(3)
  3386. msg = first_seg + second_seg
  3387. self.assertEqual(msg, self.read_msg)
  3388. def _testSmallRead(self):
  3389. self.write_file.write(self.write_msg)
  3390. self.write_file.flush()
  3391. def testFullRead(self):
  3392. # read until EOF
  3393. msg = self.read_file.read()
  3394. self.assertEqual(msg, self.read_msg)
  3395. def _testFullRead(self):
  3396. self.write_file.write(self.write_msg)
  3397. self.write_file.close()
  3398. def testUnbufferedRead(self):
  3399. # Performing unbuffered file read test
  3400. buf = type(self.read_msg)()
  3401. while 1:
  3402. char = self.read_file.read(1)
  3403. if not char:
  3404. break
  3405. buf += char
  3406. self.assertEqual(buf, self.read_msg)
  3407. def _testUnbufferedRead(self):
  3408. self.write_file.write(self.write_msg)
  3409. self.write_file.flush()
  3410. def testReadline(self):
  3411. # Performing file readline test
  3412. line = self.read_file.readline()
  3413. self.assertEqual(line, self.read_msg)
  3414. def _testReadline(self):
  3415. self.write_file.write(self.write_msg)
  3416. self.write_file.flush()
  3417. def testCloseAfterMakefile(self):
  3418. # The file returned by makefile should keep the socket open.
  3419. self.cli_conn.close()
  3420. # read until EOF
  3421. msg = self.read_file.read()
  3422. self.assertEqual(msg, self.read_msg)
  3423. def _testCloseAfterMakefile(self):
  3424. self.write_file.write(self.write_msg)
  3425. self.write_file.flush()
  3426. def testMakefileAfterMakefileClose(self):
  3427. self.read_file.close()
  3428. msg = self.cli_conn.recv(len(MSG))
  3429. if isinstance(self.read_msg, str):
  3430. msg = msg.decode()
  3431. self.assertEqual(msg, self.read_msg)
  3432. def _testMakefileAfterMakefileClose(self):
  3433. self.write_file.write(self.write_msg)
  3434. self.write_file.flush()
  3435. def testClosedAttr(self):
  3436. self.assertTrue(not self.read_file.closed)
  3437. def _testClosedAttr(self):
  3438. self.assertTrue(not self.write_file.closed)
  3439. def testAttributes(self):
  3440. self.assertEqual(self.read_file.mode, self.read_mode)
  3441. self.assertEqual(self.read_file.name, self.cli_conn.fileno())
  3442. def _testAttributes(self):
  3443. self.assertEqual(self.write_file.mode, self.write_mode)
  3444. self.assertEqual(self.write_file.name, self.serv_conn.fileno())
  3445. def testRealClose(self):
  3446. self.read_file.close()
  3447. self.assertRaises(ValueError, self.read_file.fileno)
  3448. self.cli_conn.close()
  3449. self.assertRaises(OSError, self.cli_conn.getsockname)
  3450. def _testRealClose(self):
  3451. pass
  3452. class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
  3453. """Repeat the tests from FileObjectClassTestCase with bufsize==0.
  3454. In this case (and in this case only), it should be possible to
  3455. create a file object, read a line from it, create another file
  3456. object, read another line from it, without loss of data in the
  3457. first file object's buffer. Note that http.client relies on this
  3458. when reading multiple requests from the same socket."""
  3459. bufsize = 0 # Use unbuffered mode
  3460. def testUnbufferedReadline(self):
  3461. # Read a line, create a new file object, read another line with it
  3462. line = self.read_file.readline() # first line
  3463. self.assertEqual(line, b"A. " + self.write_msg) # first line
  3464. self.read_file = self.cli_conn.makefile('rb', 0)
  3465. line = self.read_file.readline() # second line
  3466. self.assertEqual(line, b"B. " + self.write_msg) # second line
  3467. def _testUnbufferedReadline(self):
  3468. self.write_file.write(b"A. " + self.write_msg)
  3469. self.write_file.write(b"B. " + self.write_msg)
  3470. self.write_file.flush()
  3471. def testMakefileClose(self):
  3472. # The file returned by makefile should keep the socket open...
  3473. self.cli_conn.close()
  3474. msg = self.cli_conn.recv(1024)
  3475. self.assertEqual(msg, self.read_msg)
  3476. # ...until the file is itself closed
  3477. self.read_file.close()
  3478. self.assertRaises(OSError, self.cli_conn.recv, 1024)
  3479. def _testMakefileClose(self):
  3480. self.write_file.write(self.write_msg)
  3481. self.write_file.flush()
  3482. def testMakefileCloseSocketDestroy(self):
  3483. refcount_before = sys.getrefcount(self.cli_conn)
  3484. self.read_file.close()
  3485. refcount_after = sys.getrefcount(self.cli_conn)
  3486. self.assertEqual(refcount_before - 1, refcount_after)
  3487. def _testMakefileCloseSocketDestroy(self):
  3488. pass
  3489. # Non-blocking ops
  3490. # NOTE: to set `read_file` as non-blocking, we must call
  3491. # `cli_conn.setblocking` and vice-versa (see setUp / clientSetUp).
  3492. def testSmallReadNonBlocking(self):
  3493. self.cli_conn.setblocking(False)
  3494. self.assertEqual(self.read_file.readinto(bytearray(10)), None)
  3495. self.assertEqual(self.read_file.read(len(self.read_msg) - 3), None)
  3496. self.evt1.set()
  3497. self.evt2.wait(1.0)
  3498. first_seg = self.read_file.read(len(self.read_msg) - 3)
  3499. if first_seg is None:
  3500. # Data not arrived (can happen under Windows), wait a bit
  3501. time.sleep(0.5)
  3502. first_seg = self.read_file.read(len(self.read_msg) - 3)
  3503. buf = bytearray(10)
  3504. n = self.read_file.readinto(buf)
  3505. self.assertEqual(n, 3)
  3506. msg = first_seg + buf[:n]
  3507. self.assertEqual(msg, self.read_msg)
  3508. self.assertEqual(self.read_file.readinto(bytearray(16)), None)
  3509. self.assertEqual(self.read_file.read(1), None)
  3510. def _testSmallReadNonBlocking(self):
  3511. self.evt1.wait(1.0)
  3512. self.write_file.write(self.write_msg)
  3513. self.write_file.flush()
  3514. self.evt2.set()
  3515. # Avoid cloding the socket before the server test has finished,
  3516. # otherwise system recv() will return 0 instead of EWOULDBLOCK.
  3517. self.serv_finished.wait(5.0)
  3518. def testWriteNonBlocking(self):
  3519. self.cli_finished.wait(5.0)
  3520. # The client thread can't skip directly - the SkipTest exception
  3521. # would appear as a failure.
  3522. if self.serv_skipped:
  3523. self.skipTest(self.serv_skipped)
  3524. def _testWriteNonBlocking(self):
  3525. self.serv_skipped = None
  3526. self.serv_conn.setblocking(False)
  3527. # Try to saturate the socket buffer pipe with repeated large writes.
  3528. BIG = b"x" * support.SOCK_MAX_SIZE
  3529. LIMIT = 10
  3530. # The first write() succeeds since a chunk of data can be buffered
  3531. n = self.write_file.write(BIG)
  3532. self.assertGreater(n, 0)
  3533. for i in range(LIMIT):
  3534. n = self.write_file.write(BIG)
  3535. if n is None:
  3536. # Succeeded
  3537. break
  3538. self.assertGreater(n, 0)
  3539. else:
  3540. # Let us know that this test didn't manage to establish
  3541. # the expected conditions. This is not a failure in itself but,
  3542. # if it happens repeatedly, the test should be fixed.
  3543. self.serv_skipped = "failed to saturate the socket buffer"
  3544. class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
  3545. bufsize = 1 # Default-buffered for reading; line-buffered for writing
  3546. class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
  3547. bufsize = 2 # Exercise the buffering code
  3548. class UnicodeReadFileObjectClassTestCase(FileObjectClassTestCase):
  3549. """Tests for socket.makefile() in text mode (rather than binary)"""
  3550. read_mode = 'r'
  3551. read_msg = MSG.decode('utf-8')
  3552. write_mode = 'wb'
  3553. write_msg = MSG
  3554. newline = ''
  3555. class UnicodeWriteFileObjectClassTestCase(FileObjectClassTestCase):
  3556. """Tests for socket.makefile() in text mode (rather than binary)"""
  3557. read_mode = 'rb'
  3558. read_msg = MSG
  3559. write_mode = 'w'
  3560. write_msg = MSG.decode('utf-8')
  3561. newline = ''
  3562. class UnicodeReadWriteFileObjectClassTestCase(FileObjectClassTestCase):
  3563. """Tests for socket.makefile() in text mode (rather than binary)"""
  3564. read_mode = 'r'
  3565. read_msg = MSG.decode('utf-8')
  3566. write_mode = 'w'
  3567. write_msg = MSG.decode('utf-8')
  3568. newline = ''
  3569. class NetworkConnectionTest(object):
  3570. """Prove network connection."""
  3571. def clientSetUp(self):
  3572. # We're inherited below by BasicTCPTest2, which also inherits
  3573. # BasicTCPTest, which defines self.port referenced below.
  3574. self.cli = socket.create_connection((HOST, self.port))
  3575. self.serv_conn = self.cli
  3576. class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
  3577. """Tests that NetworkConnection does not break existing TCP functionality.
  3578. """
  3579. class NetworkConnectionNoServer(unittest.TestCase):
  3580. class MockSocket(socket.socket):
  3581. def connect(self, *args):
  3582. raise socket.timeout('timed out')
  3583. @contextlib.contextmanager
  3584. def mocked_socket_module(self):
  3585. """Return a socket which times out on connect"""
  3586. old_socket = socket.socket
  3587. socket.socket = self.MockSocket
  3588. try:
  3589. yield
  3590. finally:
  3591. socket.socket = old_socket
  3592. def test_connect(self):
  3593. port = support.find_unused_port()
  3594. cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  3595. self.addCleanup(cli.close)
  3596. with self.assertRaises(OSError) as cm:
  3597. cli.connect((HOST, port))
  3598. self.assertEqual(cm.exception.errno, errno.ECONNREFUSED)
  3599. def test_create_connection(self):
  3600. # Issue #9792: errors raised by create_connection() should have
  3601. # a proper errno attribute.
  3602. port = support.find_unused_port()
  3603. with self.assertRaises(OSError) as cm:
  3604. socket.create_connection((HOST, port))
  3605. # Issue #16257: create_connection() calls getaddrinfo() against
  3606. # 'localhost'. This may result in an IPV6 addr being returned
  3607. # as well as an IPV4 one:
  3608. # >>> socket.getaddrinfo('localhost', port, 0, SOCK_STREAM)
  3609. # >>> [(2, 2, 0, '', ('127.0.0.1', 41230)),
  3610. # (26, 2, 0, '', ('::1', 41230, 0, 0))]
  3611. #
  3612. # create_connection() enumerates through all the addresses returned
  3613. # and if it doesn't successfully bind to any of them, it propagates
  3614. # the last exception it encountered.
  3615. #
  3616. # On Solaris, ENETUNREACH is returned in this circumstance instead
  3617. # of ECONNREFUSED. So, if that errno exists, add it to our list of
  3618. # expected errnos.
  3619. expected_errnos = [ errno.ECONNREFUSED, ]
  3620. if hasattr(errno, 'ENETUNREACH'):
  3621. expected_errnos.append(errno.ENETUNREACH)
  3622. self.assertIn(cm.exception.errno, expected_errnos)
  3623. def test_create_connection_timeout(self):
  3624. # Issue #9792: create_connection() should not recast timeout errors
  3625. # as generic socket errors.
  3626. with self.mocked_socket_module():
  3627. with self.assertRaises(socket.timeout):
  3628. socket.create_connection((HOST, 1234))
  3629. @unittest.skipUnless(thread, 'Threading required for this test.')
  3630. class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
  3631. def __init__(self, methodName='runTest'):
  3632. SocketTCPTest.__init__(self, methodName=methodName)
  3633. ThreadableTest.__init__(self)
  3634. def clientSetUp(self):
  3635. self.source_port = support.find_unused_port()
  3636. def clientTearDown(self):
  3637. self.cli.close()
  3638. self.cli = None
  3639. ThreadableTest.clientTearDown(self)
  3640. def _justAccept(self):
  3641. conn, addr = self.serv.accept()
  3642. conn.close()
  3643. testFamily = _justAccept
  3644. def _testFamily(self):
  3645. self.cli = socket.create_connection((HOST, self.port), timeout=30)
  3646. self.addCleanup(self.cli.close)
  3647. self.assertEqual(self.cli.family, 2)
  3648. testSourceAddress = _justAccept
  3649. def _testSourceAddress(self):
  3650. self.cli = socket.create_connection((HOST, self.port), timeout=30,
  3651. source_address=('', self.source_port))
  3652. self.addCleanup(self.cli.close)
  3653. self.assertEqual(self.cli.getsockname()[1], self.source_port)
  3654. # The port number being used is sufficient to show that the bind()
  3655. # call happened.
  3656. testTimeoutDefault = _justAccept
  3657. def _testTimeoutDefault(self):
  3658. # passing no explicit timeout uses socket's global default
  3659. self.assertTrue(socket.getdefaulttimeout() is None)
  3660. socket.setdefaulttimeout(42)
  3661. try:
  3662. self.cli = socket.create_connection((HOST, self.port))
  3663. self.addCleanup(self.cli.close)
  3664. finally:
  3665. socket.setdefaulttimeout(None)
  3666. self.assertEqual(self.cli.gettimeout(), 42)
  3667. testTimeoutNone = _justAccept
  3668. def _testTimeoutNone(self):
  3669. # None timeout means the same as sock.settimeout(None)
  3670. self.assertTrue(socket.getdefaulttimeout() is None)
  3671. socket.setdefaulttimeout(30)
  3672. try:
  3673. self.cli = socket.create_connection((HOST, self.port), timeout=None)
  3674. self.addCleanup(self.cli.close)
  3675. finally:
  3676. socket.setdefaulttimeout(None)
  3677. self.assertEqual(self.cli.gettimeout(), None)
  3678. testTimeoutValueNamed = _justAccept
  3679. def _testTimeoutValueNamed(self):
  3680. self.cli = socket.create_connection((HOST, self.port), timeout=30)
  3681. self.assertEqual(self.cli.gettimeout(), 30)
  3682. testTimeoutValueNonamed = _justAccept
  3683. def _testTimeoutValueNonamed(self):
  3684. self.cli = socket.create_connection((HOST, self.port), 30)
  3685. self.addCleanup(self.cli.close)
  3686. self.assertEqual(self.cli.gettimeout(), 30)
  3687. @unittest.skipUnless(thread, 'Threading required for this test.')
  3688. class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
  3689. def __init__(self, methodName='runTest'):
  3690. SocketTCPTest.__init__(self, methodName=methodName)
  3691. ThreadableTest.__init__(self)
  3692. def clientSetUp(self):
  3693. pass
  3694. def clientTearDown(self):
  3695. self.cli.close()
  3696. self.cli = None
  3697. ThreadableTest.clientTearDown(self)
  3698. def testInsideTimeout(self):
  3699. conn, addr = self.serv.accept()
  3700. self.addCleanup(conn.close)
  3701. time.sleep(3)
  3702. conn.send(b"done!")
  3703. testOutsideTimeout = testInsideTimeout
  3704. def _testInsideTimeout(self):
  3705. self.cli = sock = socket.create_connection((HOST, self.port))
  3706. data = sock.recv(5)
  3707. self.assertEqual(data, b"done!")
  3708. def _testOutsideTimeout(self):
  3709. self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
  3710. self.assertRaises(socket.timeout, lambda: sock.recv(5))
  3711. class TCPTimeoutTest(SocketTCPTest):
  3712. def testTCPTimeout(self):
  3713. def raise_timeout(*args, **kwargs):
  3714. self.serv.settimeout(1.0)
  3715. self.serv.accept()
  3716. self.assertRaises(socket.timeout, raise_timeout,
  3717. "Error generating a timeout exception (TCP)")
  3718. def testTimeoutZero(self):
  3719. ok = False
  3720. try:
  3721. self.serv.settimeout(0.0)
  3722. foo = self.serv.accept()
  3723. except socket.timeout:
  3724. self.fail("caught timeout instead of error (TCP)")
  3725. except OSError:
  3726. ok = True
  3727. except:
  3728. self.fail("caught unexpected exception (TCP)")
  3729. if not ok:
  3730. self.fail("accept() returned success when we did not expect it")
  3731. @unittest.skipUnless(hasattr(signal, 'alarm'),
  3732. 'test needs signal.alarm()')
  3733. def testInterruptedTimeout(self):
  3734. # XXX I don't know how to do this test on MSWindows or any other
  3735. # plaform that doesn't support signal.alarm() or os.kill(), though
  3736. # the bug should have existed on all platforms.
  3737. self.serv.settimeout(5.0) # must be longer than alarm
  3738. class Alarm(Exception):
  3739. pass
  3740. def alarm_handler(signal, frame):
  3741. raise Alarm
  3742. old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
  3743. try:
  3744. signal.alarm(2) # POSIX allows alarm to be up to 1 second early
  3745. try:
  3746. foo = self.serv.accept()
  3747. except socket.timeout:
  3748. self.fail("caught timeout instead of Alarm")
  3749. except Alarm:
  3750. pass
  3751. except:
  3752. self.fail("caught other exception instead of Alarm:"
  3753. " %s(%s):\n%s" %
  3754. (sys.exc_info()[:2] + (traceback.format_exc(),)))
  3755. else:
  3756. self.fail("nothing caught")
  3757. finally:
  3758. signal.alarm(0) # shut off alarm
  3759. except Alarm:
  3760. self.fail("got Alarm in wrong place")
  3761. finally:
  3762. # no alarm can be pending. Safe to restore old handler.
  3763. signal.signal(signal.SIGALRM, old_alarm)
  3764. class UDPTimeoutTest(SocketUDPTest):
  3765. def testUDPTimeout(self):
  3766. def raise_timeout(*args, **kwargs):
  3767. self.serv.settimeout(1.0)
  3768. self.serv.recv(1024)
  3769. self.assertRaises(socket.timeout, raise_timeout,
  3770. "Error generating a timeout exception (UDP)")
  3771. def testTimeoutZero(self):
  3772. ok = False
  3773. try:
  3774. self.serv.settimeout(0.0)
  3775. foo = self.serv.recv(1024)
  3776. except socket.timeout:
  3777. self.fail("caught timeout instead of error (UDP)")
  3778. except OSError:
  3779. ok = True
  3780. except:
  3781. self.fail("caught unexpected exception (UDP)")
  3782. if not ok:
  3783. self.fail("recv() returned success when we did not expect it")
  3784. class TestExceptions(unittest.TestCase):
  3785. def testExceptionTree(self):
  3786. self.assertTrue(issubclass(OSError, Exception))
  3787. self.assertTrue(issubclass(socket.herror, OSError))
  3788. self.assertTrue(issubclass(socket.gaierror, OSError))
  3789. self.assertTrue(issubclass(socket.timeout, OSError))
  3790. @unittest.skipUnless(sys.platform == 'linux', 'Linux specific test')
  3791. class TestLinuxAbstractNamespace(unittest.TestCase):
  3792. UNIX_PATH_MAX = 108
  3793. def testLinuxAbstractNamespace(self):
  3794. address = b"\x00python-test-hello\x00\xff"
  3795. with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s1:
  3796. s1.bind(address)
  3797. s1.listen()
  3798. with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s2:
  3799. s2.connect(s1.getsockname())
  3800. with s1.accept()[0] as s3:
  3801. self.assertEqual(s1.getsockname(), address)
  3802. self.assertEqual(s2.getpeername(), address)
  3803. def testMaxName(self):
  3804. address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
  3805. with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
  3806. s.bind(address)
  3807. self.assertEqual(s.getsockname(), address)
  3808. def testNameOverflow(self):
  3809. address = "\x00" + "h" * self.UNIX_PATH_MAX
  3810. with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
  3811. self.assertRaises(OSError, s.bind, address)
  3812. def testStrName(self):
  3813. # Check that an abstract name can be passed as a string.
  3814. s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  3815. try:
  3816. s.bind("\x00python\x00test\x00")
  3817. self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
  3818. finally:
  3819. s.close()
  3820. def testBytearrayName(self):
  3821. # Check that an abstract name can be passed as a bytearray.
  3822. with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as s:
  3823. s.bind(bytearray(b"\x00python\x00test\x00"))
  3824. self.assertEqual(s.getsockname(), b"\x00python\x00test\x00")
  3825. @unittest.skipUnless(hasattr(socket, 'AF_UNIX'), 'test needs socket.AF_UNIX')
  3826. class TestUnixDomain(unittest.TestCase):
  3827. def setUp(self):
  3828. self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  3829. def tearDown(self):
  3830. self.sock.close()
  3831. def encoded(self, path):
  3832. # Return the given path encoded in the file system encoding,
  3833. # or skip the test if this is not possible.
  3834. try:
  3835. return os.fsencode(path)
  3836. except UnicodeEncodeError:
  3837. self.skipTest(
  3838. "Pathname {0!a} cannot be represented in file "
  3839. "system encoding {1!r}".format(
  3840. path, sys.getfilesystemencoding()))
  3841. def bind(self, sock, path):
  3842. # Bind the socket
  3843. try:
  3844. sock.bind(path)
  3845. except OSError as e:
  3846. if str(e) == "AF_UNIX path too long":
  3847. self.skipTest(
  3848. "Pathname {0!a} is too long to serve as an AF_UNIX path"
  3849. .format(path))
  3850. else:
  3851. raise
  3852. def testStrAddr(self):
  3853. # Test binding to and retrieving a normal string pathname.
  3854. path = os.path.abspath(support.TESTFN)
  3855. self.bind(self.sock, path)
  3856. self.addCleanup(support.unlink, path)
  3857. self.assertEqual(self.sock.getsockname(), path)
  3858. def testBytesAddr(self):
  3859. # Test binding to a bytes pathname.
  3860. path = os.path.abspath(support.TESTFN)
  3861. self.bind(self.sock, self.encoded(path))
  3862. self.addCleanup(support.unlink, path)
  3863. self.assertEqual(self.sock.getsockname(), path)
  3864. def testSurrogateescapeBind(self):
  3865. # Test binding to a valid non-ASCII pathname, with the
  3866. # non-ASCII bytes supplied using surrogateescape encoding.
  3867. path = os.path.abspath(support.TESTFN_UNICODE)
  3868. b = self.encoded(path)
  3869. self.bind(self.sock, b.decode("ascii", "surrogateescape"))
  3870. self.addCleanup(support.unlink, path)
  3871. self.assertEqual(self.sock.getsockname(), path)
  3872. def testUnencodableAddr(self):
  3873. # Test binding to a pathname that cannot be encoded in the
  3874. # file system encoding.
  3875. if support.TESTFN_UNENCODABLE is None:
  3876. self.skipTest("No unencodable filename available")
  3877. path = os.path.abspath(support.TESTFN_UNENCODABLE)
  3878. self.bind(self.sock, path)
  3879. self.addCleanup(support.unlink, path)
  3880. self.assertEqual(self.sock.getsockname(), path)
  3881. @unittest.skipUnless(thread, 'Threading required for this test.')
  3882. class BufferIOTest(SocketConnectedTest):
  3883. """
  3884. Test the buffer versions of socket.recv() and socket.send().
  3885. """
  3886. def __init__(self, methodName='runTest'):
  3887. SocketConnectedTest.__init__(self, methodName=methodName)
  3888. def testRecvIntoArray(self):
  3889. buf = bytearray(1024)
  3890. nbytes = self.cli_conn.recv_into(buf)
  3891. self.assertEqual(nbytes, len(MSG))
  3892. msg = buf[:len(MSG)]
  3893. self.assertEqual(msg, MSG)
  3894. def _testRecvIntoArray(self):
  3895. buf = bytes(MSG)
  3896. self.serv_conn.send(buf)
  3897. def testRecvIntoBytearray(self):
  3898. buf = bytearray(1024)
  3899. nbytes = self.cli_conn.recv_into(buf)
  3900. self.assertEqual(nbytes, len(MSG))
  3901. msg = buf[:len(MSG)]
  3902. self.assertEqual(msg, MSG)
  3903. _testRecvIntoBytearray = _testRecvIntoArray
  3904. def testRecvIntoMemoryview(self):
  3905. buf = bytearray(1024)
  3906. nbytes = self.cli_conn.recv_into(memoryview(buf))
  3907. self.assertEqual(nbytes, len(MSG))
  3908. msg = buf[:len(MSG)]
  3909. self.assertEqual(msg, MSG)
  3910. _testRecvIntoMemoryview = _testRecvIntoArray
  3911. def testRecvFromIntoArray(self):
  3912. buf = bytearray(1024)
  3913. nbytes, addr = self.cli_conn.recvfrom_into(buf)
  3914. self.assertEqual(nbytes, len(MSG))
  3915. msg = buf[:len(MSG)]
  3916. self.assertEqual(msg, MSG)
  3917. def _testRecvFromIntoArray(self):
  3918. buf = bytes(MSG)
  3919. self.serv_conn.send(buf)
  3920. def testRecvFromIntoBytearray(self):
  3921. buf = bytearray(1024)
  3922. nbytes, addr = self.cli_conn.recvfrom_into(buf)
  3923. self.assertEqual(nbytes, len(MSG))
  3924. msg = buf[:len(MSG)]
  3925. self.assertEqual(msg, MSG)
  3926. _testRecvFromIntoBytearray = _testRecvFromIntoArray
  3927. def testRecvFromIntoMemoryview(self):
  3928. buf = bytearray(1024)
  3929. nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
  3930. self.assertEqual(nbytes, len(MSG))
  3931. msg = buf[:len(MSG)]
  3932. self.assertEqual(msg, MSG)
  3933. _testRecvFromIntoMemoryview = _testRecvFromIntoArray
  3934. def testRecvFromIntoSmallBuffer(self):
  3935. # See issue #20246.
  3936. buf = bytearray(8)
  3937. self.assertRaises(ValueError, self.cli_conn.recvfrom_into, buf, 1024)
  3938. def _testRecvFromIntoSmallBuffer(self):
  3939. self.serv_conn.send(MSG)
  3940. def testRecvFromIntoEmptyBuffer(self):
  3941. buf = bytearray()
  3942. self.cli_conn.recvfrom_into(buf)
  3943. self.cli_conn.recvfrom_into(buf, 0)
  3944. _testRecvFromIntoEmptyBuffer = _testRecvFromIntoArray
  3945. TIPC_STYPE = 2000
  3946. TIPC_LOWER = 200
  3947. TIPC_UPPER = 210
  3948. def isTipcAvailable():
  3949. """Check if the TIPC module is loaded
  3950. The TIPC module is not loaded automatically on Ubuntu and probably
  3951. other Linux distros.
  3952. """
  3953. if not hasattr(socket, "AF_TIPC"):
  3954. return False
  3955. if not os.path.isfile("/proc/modules"):
  3956. return False
  3957. with open("/proc/modules") as f:
  3958. for line in f:
  3959. if line.startswith("tipc "):
  3960. return True
  3961. return False
  3962. @unittest.skipUnless(isTipcAvailable(),
  3963. "TIPC module is not loaded, please 'sudo modprobe tipc'")
  3964. class TIPCTest(unittest.TestCase):
  3965. def testRDM(self):
  3966. srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
  3967. cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
  3968. self.addCleanup(srv.close)
  3969. self.addCleanup(cli.close)
  3970. srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  3971. srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
  3972. TIPC_LOWER, TIPC_UPPER)
  3973. srv.bind(srvaddr)
  3974. sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
  3975. TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
  3976. cli.sendto(MSG, sendaddr)
  3977. msg, recvaddr = srv.recvfrom(1024)
  3978. self.assertEqual(cli.getsockname(), recvaddr)
  3979. self.assertEqual(msg, MSG)
  3980. @unittest.skipUnless(isTipcAvailable(),
  3981. "TIPC module is not loaded, please 'sudo modprobe tipc'")
  3982. class TIPCThreadableTest(unittest.TestCase, ThreadableTest):
  3983. def __init__(self, methodName = 'runTest'):
  3984. unittest.TestCase.__init__(self, methodName = methodName)
  3985. ThreadableTest.__init__(self)
  3986. def setUp(self):
  3987. self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
  3988. self.addCleanup(self.srv.close)
  3989. self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  3990. srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
  3991. TIPC_LOWER, TIPC_UPPER)
  3992. self.srv.bind(srvaddr)
  3993. self.srv.listen()
  3994. self.serverExplicitReady()
  3995. self.conn, self.connaddr = self.srv.accept()
  3996. self.addCleanup(self.conn.close)
  3997. def clientSetUp(self):
  3998. # There is a hittable race between serverExplicitReady() and the
  3999. # accept() call; sleep a little while to avoid it, otherwise
  4000. # we could get an exception
  4001. time.sleep(0.1)
  4002. self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
  4003. self.addCleanup(self.cli.close)
  4004. addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
  4005. TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
  4006. self.cli.connect(addr)
  4007. self.cliaddr = self.cli.getsockname()
  4008. def testStream(self):
  4009. msg = self.conn.recv(1024)
  4010. self.assertEqual(msg, MSG)
  4011. self.assertEqual(self.cliaddr, self.connaddr)
  4012. def _testStream(self):
  4013. self.cli.send(MSG)
  4014. self.cli.close()
  4015. @unittest.skipUnless(thread, 'Threading required for this test.')
  4016. class ContextManagersTest(ThreadedTCPSocketTest):
  4017. def _testSocketClass(self):
  4018. # base test
  4019. with socket.socket() as sock:
  4020. self.assertFalse(sock._closed)
  4021. self.assertTrue(sock._closed)
  4022. # close inside with block
  4023. with socket.socket() as sock:
  4024. sock.close()
  4025. self.assertTrue(sock._closed)
  4026. # exception inside with block
  4027. with socket.socket() as sock:
  4028. self.assertRaises(OSError, sock.sendall, b'foo')
  4029. self.assertTrue(sock._closed)
  4030. def testCreateConnectionBase(self):
  4031. conn, addr = self.serv.accept()
  4032. self.addCleanup(conn.close)
  4033. data = conn.recv(1024)
  4034. conn.sendall(data)
  4035. def _testCreateConnectionBase(self):
  4036. address = self.serv.getsockname()
  4037. with socket.create_connection(address) as sock:
  4038. self.assertFalse(sock._closed)
  4039. sock.sendall(b'foo')
  4040. self.assertEqual(sock.recv(1024), b'foo')
  4041. self.assertTrue(sock._closed)
  4042. def testCreateConnectionClose(self):
  4043. conn, addr = self.serv.accept()
  4044. self.addCleanup(conn.close)
  4045. data = conn.recv(1024)
  4046. conn.sendall(data)
  4047. def _testCreateConnectionClose(self):
  4048. address = self.serv.getsockname()
  4049. with socket.create_connection(address) as sock:
  4050. sock.close()
  4051. self.assertTrue(sock._closed)
  4052. self.assertRaises(OSError, sock.sendall, b'foo')
  4053. class InheritanceTest(unittest.TestCase):
  4054. @unittest.skipUnless(hasattr(socket, "SOCK_CLOEXEC"),
  4055. "SOCK_CLOEXEC not defined")
  4056. @support.requires_linux_version(2, 6, 28)
  4057. def test_SOCK_CLOEXEC(self):
  4058. with socket.socket(socket.AF_INET,
  4059. socket.SOCK_STREAM | socket.SOCK_CLOEXEC) as s:
  4060. self.assertTrue(s.type & socket.SOCK_CLOEXEC)
  4061. self.assertFalse(s.get_inheritable())
  4062. def test_default_inheritable(self):
  4063. sock = socket.socket()
  4064. with sock:
  4065. self.assertEqual(sock.get_inheritable(), False)
  4066. def test_dup(self):
  4067. sock = socket.socket()
  4068. with sock:
  4069. newsock = sock.dup()
  4070. sock.close()
  4071. with newsock:
  4072. self.assertEqual(newsock.get_inheritable(), False)
  4073. def test_set_inheritable(self):
  4074. sock = socket.socket()
  4075. with sock:
  4076. sock.set_inheritable(True)
  4077. self.assertEqual(sock.get_inheritable(), True)
  4078. sock.set_inheritable(False)
  4079. self.assertEqual(sock.get_inheritable(), False)
  4080. @unittest.skipIf(fcntl is None, "need fcntl")
  4081. def test_get_inheritable_cloexec(self):
  4082. sock = socket.socket()
  4083. with sock:
  4084. fd = sock.fileno()
  4085. self.assertEqual(sock.get_inheritable(), False)
  4086. # clear FD_CLOEXEC flag
  4087. flags = fcntl.fcntl(fd, fcntl.F_GETFD)
  4088. flags &= ~fcntl.FD_CLOEXEC
  4089. fcntl.fcntl(fd, fcntl.F_SETFD, flags)
  4090. self.assertEqual(sock.get_inheritable(), True)
  4091. @unittest.skipIf(fcntl is None, "need fcntl")
  4092. def test_set_inheritable_cloexec(self):
  4093. sock = socket.socket()
  4094. with sock:
  4095. fd = sock.fileno()
  4096. self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
  4097. fcntl.FD_CLOEXEC)
  4098. sock.set_inheritable(True)
  4099. self.assertEqual(fcntl.fcntl(fd, fcntl.F_GETFD) & fcntl.FD_CLOEXEC,
  4100. 0)
  4101. @unittest.skipUnless(hasattr(socket, "socketpair"),
  4102. "need socket.socketpair()")
  4103. def test_socketpair(self):
  4104. s1, s2 = socket.socketpair()
  4105. self.addCleanup(s1.close)
  4106. self.addCleanup(s2.close)
  4107. self.assertEqual(s1.get_inheritable(), False)
  4108. self.assertEqual(s2.get_inheritable(), False)
  4109. @unittest.skipUnless(hasattr(socket, "SOCK_NONBLOCK"),
  4110. "SOCK_NONBLOCK not defined")
  4111. class NonblockConstantTest(unittest.TestCase):
  4112. def checkNonblock(self, s, nonblock=True, timeout=0.0):
  4113. if nonblock:
  4114. self.assertTrue(s.type & socket.SOCK_NONBLOCK)
  4115. self.assertEqual(s.gettimeout(), timeout)
  4116. else:
  4117. self.assertFalse(s.type & socket.SOCK_NONBLOCK)
  4118. self.assertEqual(s.gettimeout(), None)
  4119. @support.requires_linux_version(2, 6, 28)
  4120. def test_SOCK_NONBLOCK(self):
  4121. # a lot of it seems silly and redundant, but I wanted to test that
  4122. # changing back and forth worked ok
  4123. with socket.socket(socket.AF_INET,
  4124. socket.SOCK_STREAM | socket.SOCK_NONBLOCK) as s:
  4125. self.checkNonblock(s)
  4126. s.setblocking(1)
  4127. self.checkNonblock(s, False)
  4128. s.setblocking(0)
  4129. self.checkNonblock(s)
  4130. s.settimeout(None)
  4131. self.checkNonblock(s, False)
  4132. s.settimeout(2.0)
  4133. self.checkNonblock(s, timeout=2.0)
  4134. s.setblocking(1)
  4135. self.checkNonblock(s, False)
  4136. # defaulttimeout
  4137. t = socket.getdefaulttimeout()
  4138. socket.setdefaulttimeout(0.0)
  4139. with socket.socket() as s:
  4140. self.checkNonblock(s)
  4141. socket.setdefaulttimeout(None)
  4142. with socket.socket() as s:
  4143. self.checkNonblock(s, False)
  4144. socket.setdefaulttimeout(2.0)
  4145. with socket.socket() as s:
  4146. self.checkNonblock(s, timeout=2.0)
  4147. socket.setdefaulttimeout(None)
  4148. with socket.socket() as s:
  4149. self.checkNonblock(s, False)
  4150. socket.setdefaulttimeout(t)
  4151. @unittest.skipUnless(os.name == "nt", "Windows specific")
  4152. @unittest.skipUnless(multiprocessing, "need multiprocessing")
  4153. class TestSocketSharing(SocketTCPTest):
  4154. # This must be classmethod and not staticmethod or multiprocessing
  4155. # won't be able to bootstrap it.
  4156. @classmethod
  4157. def remoteProcessServer(cls, q):
  4158. # Recreate socket from shared data
  4159. sdata = q.get()
  4160. message = q.get()
  4161. s = socket.fromshare(sdata)
  4162. s2, c = s.accept()
  4163. # Send the message
  4164. s2.sendall(message)
  4165. s2.close()
  4166. s.close()
  4167. def testShare(self):
  4168. # Transfer the listening server socket to another process
  4169. # and service it from there.
  4170. # Create process:
  4171. q = multiprocessing.Queue()
  4172. p = multiprocessing.Process(target=self.remoteProcessServer, args=(q,))
  4173. p.start()
  4174. # Get the shared socket data
  4175. data = self.serv.share(p.pid)
  4176. # Pass the shared socket to the other process
  4177. addr = self.serv.getsockname()
  4178. self.serv.close()
  4179. q.put(data)
  4180. # The data that the server will send us
  4181. message = b"slapmahfro"
  4182. q.put(message)
  4183. # Connect
  4184. s = socket.create_connection(addr)
  4185. # listen for the data
  4186. m = []
  4187. while True:
  4188. data = s.recv(100)
  4189. if not data:
  4190. break
  4191. m.append(data)
  4192. s.close()
  4193. received = b"".join(m)
  4194. self.assertEqual(received, message)
  4195. p.join()
  4196. def testShareLength(self):
  4197. data = self.serv.share(os.getpid())
  4198. self.assertRaises(ValueError, socket.fromshare, data[:-1])
  4199. self.assertRaises(ValueError, socket.fromshare, data+b"foo")
  4200. def compareSockets(self, org, other):
  4201. # socket sharing is expected to work only for blocking socket
  4202. # since the internal python timeout value isn't transferred.
  4203. self.assertEqual(org.gettimeout(), None)
  4204. self.assertEqual(org.gettimeout(), other.gettimeout())
  4205. self.assertEqual(org.family, other.family)
  4206. self.assertEqual(org.type, other.type)
  4207. # If the user specified "0" for proto, then
  4208. # internally windows will have picked the correct value.
  4209. # Python introspection on the socket however will still return
  4210. # 0. For the shared socket, the python value is recreated
  4211. # from the actual value, so it may not compare correctly.
  4212. if org.proto != 0:
  4213. self.assertEqual(org.proto, other.proto)
  4214. def testShareLocal(self):
  4215. data = self.serv.share(os.getpid())
  4216. s = socket.fromshare(data)
  4217. try:
  4218. self.compareSockets(self.serv, s)
  4219. finally:
  4220. s.close()
  4221. def testTypes(self):
  4222. families = [socket.AF_INET, socket.AF_INET6]
  4223. types = [socket.SOCK_STREAM, socket.SOCK_DGRAM]
  4224. for f in families:
  4225. for t in types:
  4226. try:
  4227. source = socket.socket(f, t)
  4228. except OSError:
  4229. continue # This combination is not supported
  4230. try:
  4231. data = source.share(os.getpid())
  4232. shared = socket.fromshare(data)
  4233. try:
  4234. self.compareSockets(source, shared)
  4235. finally:
  4236. shared.close()
  4237. finally:
  4238. source.close()
  4239. @unittest.skipUnless(thread, 'Threading required for this test.')
  4240. class SendfileUsingSendTest(ThreadedTCPSocketTest):
  4241. """
  4242. Test the send() implementation of socket.sendfile().
  4243. """
  4244. FILESIZE = (10 * 1024 * 1024) # 10MB
  4245. BUFSIZE = 8192
  4246. FILEDATA = b""
  4247. TIMEOUT = 2
  4248. @classmethod
  4249. def setUpClass(cls):
  4250. def chunks(total, step):
  4251. assert total >= step
  4252. while total > step:
  4253. yield step
  4254. total -= step
  4255. if total:
  4256. yield total
  4257. chunk = b"".join([random.choice(string.ascii_letters).encode()
  4258. for i in range(cls.BUFSIZE)])
  4259. with open(support.TESTFN, 'wb') as f:
  4260. for csize in chunks(cls.FILESIZE, cls.BUFSIZE):
  4261. f.write(chunk)
  4262. with open(support.TESTFN, 'rb') as f:
  4263. cls.FILEDATA = f.read()
  4264. assert len(cls.FILEDATA) == cls.FILESIZE
  4265. @classmethod
  4266. def tearDownClass(cls):
  4267. support.unlink(support.TESTFN)
  4268. def accept_conn(self):
  4269. self.serv.settimeout(self.TIMEOUT)
  4270. conn, addr = self.serv.accept()
  4271. conn.settimeout(self.TIMEOUT)
  4272. self.addCleanup(conn.close)
  4273. return conn
  4274. def recv_data(self, conn):
  4275. received = []
  4276. while True:
  4277. chunk = conn.recv(self.BUFSIZE)
  4278. if not chunk:
  4279. break
  4280. received.append(chunk)
  4281. return b''.join(received)
  4282. def meth_from_sock(self, sock):
  4283. # Depending on the mixin class being run return either send()
  4284. # or sendfile() method implementation.
  4285. return getattr(sock, "_sendfile_use_send")
  4286. # regular file
  4287. def _testRegularFile(self):
  4288. address = self.serv.getsockname()
  4289. file = open(support.TESTFN, 'rb')
  4290. with socket.create_connection(address) as sock, file as file:
  4291. meth = self.meth_from_sock(sock)
  4292. sent = meth(file)
  4293. self.assertEqual(sent, self.FILESIZE)
  4294. self.assertEqual(file.tell(), self.FILESIZE)
  4295. def testRegularFile(self):
  4296. conn = self.accept_conn()
  4297. data = self.recv_data(conn)
  4298. self.assertEqual(len(data), self.FILESIZE)
  4299. self.assertEqual(data, self.FILEDATA)
  4300. # non regular file
  4301. def _testNonRegularFile(self):
  4302. address = self.serv.getsockname()
  4303. file = io.BytesIO(self.FILEDATA)
  4304. with socket.create_connection(address) as sock, file as file:
  4305. sent = sock.sendfile(file)
  4306. self.assertEqual(sent, self.FILESIZE)
  4307. self.assertEqual(file.tell(), self.FILESIZE)
  4308. self.assertRaises(socket._GiveupOnSendfile,
  4309. sock._sendfile_use_sendfile, file)
  4310. def testNonRegularFile(self):
  4311. conn = self.accept_conn()
  4312. data = self.recv_data(conn)
  4313. self.assertEqual(len(data), self.FILESIZE)
  4314. self.assertEqual(data, self.FILEDATA)
  4315. # empty file
  4316. def _testEmptyFileSend(self):
  4317. address = self.serv.getsockname()
  4318. filename = support.TESTFN + "2"
  4319. with open(filename, 'wb'):
  4320. self.addCleanup(support.unlink, filename)
  4321. file = open(filename, 'rb')
  4322. with socket.create_connection(address) as sock, file as file:
  4323. meth = self.meth_from_sock(sock)
  4324. sent = meth(file)
  4325. self.assertEqual(sent, 0)
  4326. self.assertEqual(file.tell(), 0)
  4327. def testEmptyFileSend(self):
  4328. conn = self.accept_conn()
  4329. data = self.recv_data(conn)
  4330. self.assertEqual(data, b"")
  4331. # offset
  4332. def _testOffset(self):
  4333. address = self.serv.getsockname()
  4334. file = open(support.TESTFN, 'rb')
  4335. with socket.create_connection(address) as sock, file as file:
  4336. meth = self.meth_from_sock(sock)
  4337. sent = meth(file, offset=5000)
  4338. self.assertEqual(sent, self.FILESIZE - 5000)
  4339. self.assertEqual(file.tell(), self.FILESIZE)
  4340. def testOffset(self):
  4341. conn = self.accept_conn()
  4342. data = self.recv_data(conn)
  4343. self.assertEqual(len(data), self.FILESIZE - 5000)
  4344. self.assertEqual(data, self.FILEDATA[5000:])
  4345. # count
  4346. def _testCount(self):
  4347. address = self.serv.getsockname()
  4348. file = open(support.TESTFN, 'rb')
  4349. with socket.create_connection(address, timeout=2) as sock, file as file:
  4350. count = 5000007
  4351. meth = self.meth_from_sock(sock)
  4352. sent = meth(file, count=count)
  4353. self.assertEqual(sent, count)
  4354. self.assertEqual(file.tell(), count)
  4355. def testCount(self):
  4356. count = 5000007
  4357. conn = self.accept_conn()
  4358. data = self.recv_data(conn)
  4359. self.assertEqual(len(data), count)
  4360. self.assertEqual(data, self.FILEDATA[:count])
  4361. # count small
  4362. def _testCountSmall(self):
  4363. address = self.serv.getsockname()
  4364. file = open(support.TESTFN, 'rb')
  4365. with socket.create_connection(address, timeout=2) as sock, file as file:
  4366. count = 1
  4367. meth = self.meth_from_sock(sock)
  4368. sent = meth(file, count=count)
  4369. self.assertEqual(sent, count)
  4370. self.assertEqual(file.tell(), count)
  4371. def testCountSmall(self):
  4372. count = 1
  4373. conn = self.accept_conn()
  4374. data = self.recv_data(conn)
  4375. self.assertEqual(len(data), count)
  4376. self.assertEqual(data, self.FILEDATA[:count])
  4377. # count + offset
  4378. def _testCountWithOffset(self):
  4379. address = self.serv.getsockname()
  4380. file = open(support.TESTFN, 'rb')
  4381. with socket.create_connection(address, timeout=2) as sock, file as file:
  4382. count = 100007
  4383. meth = self.meth_from_sock(sock)
  4384. sent = meth(file, offset=2007, count=count)
  4385. self.assertEqual(sent, count)
  4386. self.assertEqual(file.tell(), count + 2007)
  4387. def testCountWithOffset(self):
  4388. count = 100007
  4389. conn = self.accept_conn()
  4390. data = self.recv_data(conn)
  4391. self.assertEqual(len(data), count)
  4392. self.assertEqual(data, self.FILEDATA[2007:count+2007])
  4393. # non blocking sockets are not supposed to work
  4394. def _testNonBlocking(self):
  4395. address = self.serv.getsockname()
  4396. file = open(support.TESTFN, 'rb')
  4397. with socket.create_connection(address) as sock, file as file:
  4398. sock.setblocking(False)
  4399. meth = self.meth_from_sock(sock)
  4400. self.assertRaises(ValueError, meth, file)
  4401. self.assertRaises(ValueError, sock.sendfile, file)
  4402. def testNonBlocking(self):
  4403. conn = self.accept_conn()
  4404. if conn.recv(8192):
  4405. self.fail('was not supposed to receive any data')
  4406. # timeout (non-triggered)
  4407. def _testWithTimeout(self):
  4408. address = self.serv.getsockname()
  4409. file = open(support.TESTFN, 'rb')
  4410. with socket.create_connection(address, timeout=2) as sock, file as file:
  4411. meth = self.meth_from_sock(sock)
  4412. sent = meth(file)
  4413. self.assertEqual(sent, self.FILESIZE)
  4414. def testWithTimeout(self):
  4415. conn = self.accept_conn()
  4416. data = self.recv_data(conn)
  4417. self.assertEqual(len(data), self.FILESIZE)
  4418. self.assertEqual(data, self.FILEDATA)
  4419. # timeout (triggered)
  4420. def _testWithTimeoutTriggeredSend(self):
  4421. address = self.serv.getsockname()
  4422. file = open(support.TESTFN, 'rb')
  4423. with socket.create_connection(address, timeout=0.01) as sock, \
  4424. file as file:
  4425. meth = self.meth_from_sock(sock)
  4426. self.assertRaises(socket.timeout, meth, file)
  4427. def testWithTimeoutTriggeredSend(self):
  4428. conn = self.accept_conn()
  4429. conn.recv(88192)
  4430. # errors
  4431. def _test_errors(self):
  4432. pass
  4433. def test_errors(self):
  4434. with open(support.TESTFN, 'rb') as file:
  4435. with socket.socket(type=socket.SOCK_DGRAM) as s:
  4436. meth = self.meth_from_sock(s)
  4437. self.assertRaisesRegex(
  4438. ValueError, "SOCK_STREAM", meth, file)
  4439. with open(support.TESTFN, 'rt') as file:
  4440. with socket.socket() as s:
  4441. meth = self.meth_from_sock(s)
  4442. self.assertRaisesRegex(
  4443. ValueError, "binary mode", meth, file)
  4444. with open(support.TESTFN, 'rb') as file:
  4445. with socket.socket() as s:
  4446. meth = self.meth_from_sock(s)
  4447. self.assertRaisesRegex(TypeError, "positive integer",
  4448. meth, file, count='2')
  4449. self.assertRaisesRegex(TypeError, "positive integer",
  4450. meth, file, count=0.1)
  4451. self.assertRaisesRegex(ValueError, "positive integer",
  4452. meth, file, count=0)
  4453. self.assertRaisesRegex(ValueError, "positive integer",
  4454. meth, file, count=-1)
  4455. @unittest.skipUnless(thread, 'Threading required for this test.')
  4456. @unittest.skipUnless(hasattr(os, "sendfile"),
  4457. 'os.sendfile() required for this test.')
  4458. class SendfileUsingSendfileTest(SendfileUsingSendTest):
  4459. """
  4460. Test the sendfile() implementation of socket.sendfile().
  4461. """
  4462. def meth_from_sock(self, sock):
  4463. return getattr(sock, "_sendfile_use_sendfile")
  4464. @unittest.skipUnless(HAVE_SOCKET_ALG, 'AF_ALG required')
  4465. class LinuxKernelCryptoAPI(unittest.TestCase):
  4466. # tests for AF_ALG
  4467. def create_alg(self, typ, name):
  4468. sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
  4469. try:
  4470. sock.bind((typ, name))
  4471. except FileNotFoundError as e:
  4472. # type / algorithm is not available
  4473. raise unittest.SkipTest(str(e), typ, name)
  4474. return sock
  4475. def test_sha256(self):
  4476. expected = bytes.fromhex("ba7816bf8f01cfea414140de5dae2223b00361a396"
  4477. "177a9cb410ff61f20015ad")
  4478. with self.create_alg('hash', 'sha256') as algo:
  4479. op, _ = algo.accept()
  4480. with op:
  4481. op.sendall(b"abc")
  4482. self.assertEqual(op.recv(512), expected)
  4483. op, _ = algo.accept()
  4484. with op:
  4485. op.send(b'a', socket.MSG_MORE)
  4486. op.send(b'b', socket.MSG_MORE)
  4487. op.send(b'c', socket.MSG_MORE)
  4488. op.send(b'')
  4489. self.assertEqual(op.recv(512), expected)
  4490. def test_hmac_sha1(self):
  4491. expected = bytes.fromhex("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79")
  4492. with self.create_alg('hash', 'hmac(sha1)') as algo:
  4493. algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, b"Jefe")
  4494. op, _ = algo.accept()
  4495. with op:
  4496. op.sendall(b"what do ya want for nothing?")
  4497. self.assertEqual(op.recv(512), expected)
  4498. @support.requires_linux_version(3, 19)
  4499. def test_aes_cbc(self):
  4500. key = bytes.fromhex('06a9214036b8a15b512e03d534120006')
  4501. iv = bytes.fromhex('3dafba429d9eb430b422da802c9fac41')
  4502. msg = b"Single block msg"
  4503. ciphertext = bytes.fromhex('e353779c1079aeb82708942dbe77181a')
  4504. msglen = len(msg)
  4505. with self.create_alg('skcipher', 'cbc(aes)') as algo:
  4506. algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
  4507. op, _ = algo.accept()
  4508. with op:
  4509. op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
  4510. flags=socket.MSG_MORE)
  4511. op.sendall(msg)
  4512. self.assertEqual(op.recv(msglen), ciphertext)
  4513. op, _ = algo.accept()
  4514. with op:
  4515. op.sendmsg_afalg([ciphertext],
  4516. op=socket.ALG_OP_DECRYPT, iv=iv)
  4517. self.assertEqual(op.recv(msglen), msg)
  4518. # long message
  4519. multiplier = 1024
  4520. longmsg = [msg] * multiplier
  4521. op, _ = algo.accept()
  4522. with op:
  4523. op.sendmsg_afalg(longmsg,
  4524. op=socket.ALG_OP_ENCRYPT, iv=iv)
  4525. enc = op.recv(msglen * multiplier)
  4526. self.assertEqual(len(enc), msglen * multiplier)
  4527. self.assertTrue(enc[:msglen], ciphertext)
  4528. op, _ = algo.accept()
  4529. with op:
  4530. op.sendmsg_afalg([enc],
  4531. op=socket.ALG_OP_DECRYPT, iv=iv)
  4532. dec = op.recv(msglen * multiplier)
  4533. self.assertEqual(len(dec), msglen * multiplier)
  4534. self.assertEqual(dec, msg * multiplier)
  4535. @support.requires_linux_version(3, 19)
  4536. def test_aead_aes_gcm(self):
  4537. key = bytes.fromhex('c939cc13397c1d37de6ae0e1cb7c423c')
  4538. iv = bytes.fromhex('b3d8cc017cbb89b39e0f67e2')
  4539. plain = bytes.fromhex('c3b3c41f113a31b73d9a5cd432103069')
  4540. assoc = bytes.fromhex('24825602bd12a984e0092d3e448eda5f')
  4541. expected_ct = bytes.fromhex('93fe7d9e9bfd10348a5606e5cafa7354')
  4542. expected_tag = bytes.fromhex('0032a1dc85f1c9786925a2e71d8272dd')
  4543. taglen = len(expected_tag)
  4544. assoclen = len(assoc)
  4545. with self.create_alg('aead', 'gcm(aes)') as algo:
  4546. algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, key)
  4547. algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_AEAD_AUTHSIZE,
  4548. None, taglen)
  4549. # send assoc, plain and tag buffer in separate steps
  4550. op, _ = algo.accept()
  4551. with op:
  4552. op.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, iv=iv,
  4553. assoclen=assoclen, flags=socket.MSG_MORE)
  4554. op.sendall(assoc, socket.MSG_MORE)
  4555. op.sendall(plain, socket.MSG_MORE)
  4556. op.sendall(b'\x00' * taglen)
  4557. res = op.recv(assoclen + len(plain) + taglen)
  4558. self.assertEqual(expected_ct, res[assoclen:-taglen])
  4559. self.assertEqual(expected_tag, res[-taglen:])
  4560. # now with msg
  4561. op, _ = algo.accept()
  4562. with op:
  4563. msg = assoc + plain + b'\x00' * taglen
  4564. op.sendmsg_afalg([msg], op=socket.ALG_OP_ENCRYPT, iv=iv,
  4565. assoclen=assoclen)
  4566. res = op.recv(assoclen + len(plain) + taglen)
  4567. self.assertEqual(expected_ct, res[assoclen:-taglen])
  4568. self.assertEqual(expected_tag, res[-taglen:])
  4569. # create anc data manually
  4570. pack_uint32 = struct.Struct('I').pack
  4571. op, _ = algo.accept()
  4572. with op:
  4573. msg = assoc + plain + b'\x00' * taglen
  4574. op.sendmsg(
  4575. [msg],
  4576. ([socket.SOL_ALG, socket.ALG_SET_OP, pack_uint32(socket.ALG_OP_ENCRYPT)],
  4577. [socket.SOL_ALG, socket.ALG_SET_IV, pack_uint32(len(iv)) + iv],
  4578. [socket.SOL_ALG, socket.ALG_SET_AEAD_ASSOCLEN, pack_uint32(assoclen)],
  4579. )
  4580. )
  4581. res = op.recv(len(msg))
  4582. self.assertEqual(expected_ct, res[assoclen:-taglen])
  4583. self.assertEqual(expected_tag, res[-taglen:])
  4584. # decrypt and verify
  4585. op, _ = algo.accept()
  4586. with op:
  4587. msg = assoc + expected_ct + expected_tag
  4588. op.sendmsg_afalg([msg], op=socket.ALG_OP_DECRYPT, iv=iv,
  4589. assoclen=assoclen)
  4590. res = op.recv(len(msg))
  4591. self.assertEqual(plain, res[assoclen:-taglen])
  4592. @support.requires_linux_version(3, 19)
  4593. def test_drbg_pr_sha256(self):
  4594. # deterministic random bit generator, prediction resistance, sha256
  4595. with self.create_alg('rng', 'drbg_pr_sha256') as algo:
  4596. extra_seed = os.urandom(32)
  4597. algo.setsockopt(socket.SOL_ALG, socket.ALG_SET_KEY, extra_seed)
  4598. op, _ = algo.accept()
  4599. with op:
  4600. rn = op.recv(32)
  4601. self.assertEqual(len(rn), 32)
  4602. def test_sendmsg_afalg_args(self):
  4603. sock = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0)
  4604. with self.assertRaises(TypeError):
  4605. sock.sendmsg_afalg()
  4606. with self.assertRaises(TypeError):
  4607. sock.sendmsg_afalg(op=None)
  4608. with self.assertRaises(TypeError):
  4609. sock.sendmsg_afalg(1)
  4610. with self.assertRaises(TypeError):
  4611. sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=None)
  4612. with self.assertRaises(TypeError):
  4613. sock.sendmsg_afalg(op=socket.ALG_OP_ENCRYPT, assoclen=-1)
  4614. def test_main():
  4615. tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
  4616. TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
  4617. tests.extend([
  4618. NonBlockingTCPTests,
  4619. FileObjectClassTestCase,
  4620. UnbufferedFileObjectClassTestCase,
  4621. LineBufferedFileObjectClassTestCase,
  4622. SmallBufferedFileObjectClassTestCase,
  4623. UnicodeReadFileObjectClassTestCase,
  4624. UnicodeWriteFileObjectClassTestCase,
  4625. UnicodeReadWriteFileObjectClassTestCase,
  4626. NetworkConnectionNoServer,
  4627. NetworkConnectionAttributesTest,
  4628. NetworkConnectionBehaviourTest,
  4629. ContextManagersTest,
  4630. InheritanceTest,
  4631. NonblockConstantTest
  4632. ])
  4633. tests.append(BasicSocketPairTest)
  4634. tests.append(TestUnixDomain)
  4635. tests.append(TestLinuxAbstractNamespace)
  4636. tests.extend([TIPCTest, TIPCThreadableTest])
  4637. tests.extend([BasicCANTest, CANTest])
  4638. tests.extend([BasicRDSTest, RDSTest])
  4639. tests.append(LinuxKernelCryptoAPI)
  4640. tests.extend([
  4641. CmsgMacroTests,
  4642. SendmsgUDPTest,
  4643. RecvmsgUDPTest,
  4644. RecvmsgIntoUDPTest,
  4645. SendmsgUDP6Test,
  4646. RecvmsgUDP6Test,
  4647. RecvmsgRFC3542AncillaryUDP6Test,
  4648. RecvmsgIntoRFC3542AncillaryUDP6Test,
  4649. RecvmsgIntoUDP6Test,
  4650. SendmsgTCPTest,
  4651. RecvmsgTCPTest,
  4652. RecvmsgIntoTCPTest,
  4653. SendmsgSCTPStreamTest,
  4654. RecvmsgSCTPStreamTest,
  4655. RecvmsgIntoSCTPStreamTest,
  4656. SendmsgUnixStreamTest,
  4657. RecvmsgUnixStreamTest,
  4658. RecvmsgIntoUnixStreamTest,
  4659. RecvmsgSCMRightsStreamTest,
  4660. RecvmsgIntoSCMRightsStreamTest,
  4661. # These are slow when setitimer() is not available
  4662. InterruptedRecvTimeoutTest,
  4663. InterruptedSendTimeoutTest,
  4664. TestSocketSharing,
  4665. SendfileUsingSendTest,
  4666. SendfileUsingSendfileTest,
  4667. ])
  4668. thread_info = support.threading_setup()
  4669. support.run_unittest(*tests)
  4670. support.threading_cleanup(*thread_info)
  4671. if __name__ == "__main__":
  4672. test_main()