PageRenderTime 56ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/policy-and-header-refactor/Lib/test/test_socket.py

https://bitbucket.org/l0nwlf/policy-and-header-refactor
Python | 1494 lines | 1320 code | 93 blank | 81 comment | 53 complexity | ee7c37a0587e75be1c7602442c7083c8 MD5 | raw file
Possible License(s): BSD-3-Clause, 0BSD, GPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. #!/usr/bin/env python3
  2. import unittest
  3. from test import support
  4. import errno
  5. import io
  6. import socket
  7. import select
  8. import time
  9. import traceback
  10. import queue
  11. import sys
  12. import os
  13. import array
  14. from weakref import proxy
  15. import signal
  16. HOST = support.HOST
  17. MSG = b'Michael Gilfix was here\n'
  18. try:
  19. import _thread as thread
  20. import threading
  21. except ImportError:
  22. thread = None
  23. threading = None
  24. class SocketTCPTest(unittest.TestCase):
  25. def setUp(self):
  26. self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  27. self.port = support.bind_port(self.serv)
  28. self.serv.listen(1)
  29. def tearDown(self):
  30. self.serv.close()
  31. self.serv = None
  32. class SocketUDPTest(unittest.TestCase):
  33. def setUp(self):
  34. self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  35. self.port = support.bind_port(self.serv)
  36. def tearDown(self):
  37. self.serv.close()
  38. self.serv = None
  39. class ThreadableTest:
  40. """Threadable Test class
  41. The ThreadableTest class makes it easy to create a threaded
  42. client/server pair from an existing unit test. To create a
  43. new threaded class from an existing unit test, use multiple
  44. inheritance:
  45. class NewClass (OldClass, ThreadableTest):
  46. pass
  47. This class defines two new fixture functions with obvious
  48. purposes for overriding:
  49. clientSetUp ()
  50. clientTearDown ()
  51. Any new test functions within the class must then define
  52. tests in pairs, where the test name is preceeded with a
  53. '_' to indicate the client portion of the test. Ex:
  54. def testFoo(self):
  55. # Server portion
  56. def _testFoo(self):
  57. # Client portion
  58. Any exceptions raised by the clients during their tests
  59. are caught and transferred to the main thread to alert
  60. the testing framework.
  61. Note, the server setup function cannot call any blocking
  62. functions that rely on the client thread during setup,
  63. unless serverExplicitReady() is called just before
  64. the blocking call (such as in setting up a client/server
  65. connection and performing the accept() in setUp().
  66. """
  67. def __init__(self):
  68. # Swap the true setup function
  69. self.__setUp = self.setUp
  70. self.__tearDown = self.tearDown
  71. self.setUp = self._setUp
  72. self.tearDown = self._tearDown
  73. def serverExplicitReady(self):
  74. """This method allows the server to explicitly indicate that
  75. it wants the client thread to proceed. This is useful if the
  76. server is about to execute a blocking routine that is
  77. dependent upon the client thread during its setup routine."""
  78. self.server_ready.set()
  79. def _setUp(self):
  80. self.server_ready = threading.Event()
  81. self.client_ready = threading.Event()
  82. self.done = threading.Event()
  83. self.queue = queue.Queue(1)
  84. # Do some munging to start the client test.
  85. methodname = self.id()
  86. i = methodname.rfind('.')
  87. methodname = methodname[i+1:]
  88. test_method = getattr(self, '_' + methodname)
  89. self.client_thread = thread.start_new_thread(
  90. self.clientRun, (test_method,))
  91. self.__setUp()
  92. if not self.server_ready.is_set():
  93. self.server_ready.set()
  94. self.client_ready.wait()
  95. def _tearDown(self):
  96. self.__tearDown()
  97. self.done.wait()
  98. if self.queue.qsize():
  99. msg = self.queue.get()
  100. self.fail(msg)
  101. def clientRun(self, test_func):
  102. self.server_ready.wait()
  103. self.client_ready.set()
  104. self.clientSetUp()
  105. if not hasattr(test_func, '__call__'):
  106. raise TypeError("test_func must be a callable function")
  107. try:
  108. test_func()
  109. except Exception as strerror:
  110. self.queue.put(strerror)
  111. self.clientTearDown()
  112. def clientSetUp(self):
  113. raise NotImplementedError("clientSetUp must be implemented.")
  114. def clientTearDown(self):
  115. self.done.set()
  116. thread.exit()
  117. class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
  118. def __init__(self, methodName='runTest'):
  119. SocketTCPTest.__init__(self, methodName=methodName)
  120. ThreadableTest.__init__(self)
  121. def clientSetUp(self):
  122. self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  123. def clientTearDown(self):
  124. self.cli.close()
  125. self.cli = None
  126. ThreadableTest.clientTearDown(self)
  127. class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
  128. def __init__(self, methodName='runTest'):
  129. SocketUDPTest.__init__(self, methodName=methodName)
  130. ThreadableTest.__init__(self)
  131. def clientSetUp(self):
  132. self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  133. class SocketConnectedTest(ThreadedTCPSocketTest):
  134. """Socket tests for client-server connection.
  135. self.cli_conn is a client socket connected to the server. The
  136. setUp() method guarantees that it is connected to the server.
  137. """
  138. def __init__(self, methodName='runTest'):
  139. ThreadedTCPSocketTest.__init__(self, methodName=methodName)
  140. def setUp(self):
  141. ThreadedTCPSocketTest.setUp(self)
  142. # Indicate explicitly we're ready for the client thread to
  143. # proceed and then perform the blocking call to accept
  144. self.serverExplicitReady()
  145. conn, addr = self.serv.accept()
  146. self.cli_conn = conn
  147. def tearDown(self):
  148. self.cli_conn.close()
  149. self.cli_conn = None
  150. ThreadedTCPSocketTest.tearDown(self)
  151. def clientSetUp(self):
  152. ThreadedTCPSocketTest.clientSetUp(self)
  153. self.cli.connect((HOST, self.port))
  154. self.serv_conn = self.cli
  155. def clientTearDown(self):
  156. self.serv_conn.close()
  157. self.serv_conn = None
  158. ThreadedTCPSocketTest.clientTearDown(self)
  159. class SocketPairTest(unittest.TestCase, ThreadableTest):
  160. def __init__(self, methodName='runTest'):
  161. unittest.TestCase.__init__(self, methodName=methodName)
  162. ThreadableTest.__init__(self)
  163. def setUp(self):
  164. self.serv, self.cli = socket.socketpair()
  165. def tearDown(self):
  166. self.serv.close()
  167. self.serv = None
  168. def clientSetUp(self):
  169. pass
  170. def clientTearDown(self):
  171. self.cli.close()
  172. self.cli = None
  173. ThreadableTest.clientTearDown(self)
  174. #######################################################################
  175. ## Begin Tests
  176. class GeneralModuleTests(unittest.TestCase):
  177. def test_repr(self):
  178. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  179. self.assertTrue(repr(s).startswith("<socket.socket object"))
  180. def test_weakref(self):
  181. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  182. p = proxy(s)
  183. self.assertEqual(p.fileno(), s.fileno())
  184. s.close()
  185. s = None
  186. try:
  187. p.fileno()
  188. except ReferenceError:
  189. pass
  190. else:
  191. self.fail('Socket proxy still exists')
  192. def testSocketError(self):
  193. # Testing socket module exceptions
  194. def raise_error(*args, **kwargs):
  195. raise socket.error
  196. def raise_herror(*args, **kwargs):
  197. raise socket.herror
  198. def raise_gaierror(*args, **kwargs):
  199. raise socket.gaierror
  200. self.assertRaises(socket.error, raise_error,
  201. "Error raising socket exception.")
  202. self.assertRaises(socket.error, raise_herror,
  203. "Error raising socket exception.")
  204. self.assertRaises(socket.error, raise_gaierror,
  205. "Error raising socket exception.")
  206. def testCrucialConstants(self):
  207. # Testing for mission critical constants
  208. socket.AF_INET
  209. socket.SOCK_STREAM
  210. socket.SOCK_DGRAM
  211. socket.SOCK_RAW
  212. socket.SOCK_RDM
  213. socket.SOCK_SEQPACKET
  214. socket.SOL_SOCKET
  215. socket.SO_REUSEADDR
  216. def testHostnameRes(self):
  217. # Testing hostname resolution mechanisms
  218. hostname = socket.gethostname()
  219. try:
  220. ip = socket.gethostbyname(hostname)
  221. except socket.error:
  222. # Probably name lookup wasn't set up right; skip this test
  223. return
  224. self.assertTrue(ip.find('.') >= 0, "Error resolving host to ip.")
  225. try:
  226. hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
  227. except socket.error:
  228. # Probably a similar problem as above; skip this test
  229. return
  230. all_host_names = [hostname, hname] + aliases
  231. fqhn = socket.getfqdn(ip)
  232. if not fqhn in all_host_names:
  233. self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
  234. def testRefCountGetNameInfo(self):
  235. # Testing reference count for getnameinfo
  236. if hasattr(sys, "getrefcount"):
  237. try:
  238. # On some versions, this loses a reference
  239. orig = sys.getrefcount(__name__)
  240. socket.getnameinfo(__name__,0)
  241. except TypeError:
  242. if sys.getrefcount(__name__) != orig:
  243. self.fail("socket.getnameinfo loses a reference")
  244. def testInterpreterCrash(self):
  245. # Making sure getnameinfo doesn't crash the interpreter
  246. try:
  247. # On some versions, this crashes the interpreter.
  248. socket.getnameinfo(('x', 0, 0, 0), 0)
  249. except socket.error:
  250. pass
  251. def testNtoH(self):
  252. # This just checks that htons etc. are their own inverse,
  253. # when looking at the lower 16 or 32 bits.
  254. sizes = {socket.htonl: 32, socket.ntohl: 32,
  255. socket.htons: 16, socket.ntohs: 16}
  256. for func, size in sizes.items():
  257. mask = (1<<size) - 1
  258. for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
  259. self.assertEqual(i & mask, func(func(i&mask)) & mask)
  260. swapped = func(mask)
  261. self.assertEqual(swapped & mask, mask)
  262. self.assertRaises(OverflowError, func, 1<<34)
  263. def testNtoHErrors(self):
  264. good_values = [ 1, 2, 3, 1, 2, 3 ]
  265. bad_values = [ -1, -2, -3, -1, -2, -3 ]
  266. for k in good_values:
  267. socket.ntohl(k)
  268. socket.ntohs(k)
  269. socket.htonl(k)
  270. socket.htons(k)
  271. for k in bad_values:
  272. self.assertRaises(OverflowError, socket.ntohl, k)
  273. self.assertRaises(OverflowError, socket.ntohs, k)
  274. self.assertRaises(OverflowError, socket.htonl, k)
  275. self.assertRaises(OverflowError, socket.htons, k)
  276. def testGetServBy(self):
  277. eq = self.assertEqual
  278. # Find one service that exists, then check all the related interfaces.
  279. # I've ordered this by protocols that have both a tcp and udp
  280. # protocol, at least for modern Linuxes.
  281. if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
  282. 'freebsd7', 'freebsd8', 'darwin'):
  283. # avoid the 'echo' service on this platform, as there is an
  284. # assumption breaking non-standard port/protocol entry
  285. services = ('daytime', 'qotd', 'domain')
  286. else:
  287. services = ('echo', 'daytime', 'domain')
  288. for service in services:
  289. try:
  290. port = socket.getservbyname(service, 'tcp')
  291. break
  292. except socket.error:
  293. pass
  294. else:
  295. raise socket.error
  296. # Try same call with optional protocol omitted
  297. port2 = socket.getservbyname(service)
  298. eq(port, port2)
  299. # Try udp, but don't barf it it doesn't exist
  300. try:
  301. udpport = socket.getservbyname(service, 'udp')
  302. except socket.error:
  303. udpport = None
  304. else:
  305. eq(udpport, port)
  306. # Now make sure the lookup by port returns the same service name
  307. eq(socket.getservbyport(port2), service)
  308. eq(socket.getservbyport(port, 'tcp'), service)
  309. if udpport is not None:
  310. eq(socket.getservbyport(udpport, 'udp'), service)
  311. # Make sure getservbyport does not accept out of range ports.
  312. self.assertRaises(OverflowError, socket.getservbyport, -1)
  313. self.assertRaises(OverflowError, socket.getservbyport, 65536)
  314. def testDefaultTimeout(self):
  315. # Testing default timeout
  316. # The default timeout should initially be None
  317. self.assertEqual(socket.getdefaulttimeout(), None)
  318. s = socket.socket()
  319. self.assertEqual(s.gettimeout(), None)
  320. s.close()
  321. # Set the default timeout to 10, and see if it propagates
  322. socket.setdefaulttimeout(10)
  323. self.assertEqual(socket.getdefaulttimeout(), 10)
  324. s = socket.socket()
  325. self.assertEqual(s.gettimeout(), 10)
  326. s.close()
  327. # Reset the default timeout to None, and see if it propagates
  328. socket.setdefaulttimeout(None)
  329. self.assertEqual(socket.getdefaulttimeout(), None)
  330. s = socket.socket()
  331. self.assertEqual(s.gettimeout(), None)
  332. s.close()
  333. # Check that setting it to an invalid value raises ValueError
  334. self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
  335. # Check that setting it to an invalid type raises TypeError
  336. self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
  337. def testIPv4_inet_aton_fourbytes(self):
  338. if not hasattr(socket, 'inet_aton'):
  339. return # No inet_aton, nothing to check
  340. # Test that issue1008086 and issue767150 are fixed.
  341. # It must return 4 bytes.
  342. self.assertEquals(b'\x00'*4, socket.inet_aton('0.0.0.0'))
  343. self.assertEquals(b'\xff'*4, socket.inet_aton('255.255.255.255'))
  344. def testIPv4toString(self):
  345. if not hasattr(socket, 'inet_pton'):
  346. return # No inet_pton() on this platform
  347. from socket import inet_aton as f, inet_pton, AF_INET
  348. g = lambda a: inet_pton(AF_INET, a)
  349. self.assertEquals(b'\x00\x00\x00\x00', f('0.0.0.0'))
  350. self.assertEquals(b'\xff\x00\xff\x00', f('255.0.255.0'))
  351. self.assertEquals(b'\xaa\xaa\xaa\xaa', f('170.170.170.170'))
  352. self.assertEquals(b'\x01\x02\x03\x04', f('1.2.3.4'))
  353. self.assertEquals(b'\xff\xff\xff\xff', f('255.255.255.255'))
  354. self.assertEquals(b'\x00\x00\x00\x00', g('0.0.0.0'))
  355. self.assertEquals(b'\xff\x00\xff\x00', g('255.0.255.0'))
  356. self.assertEquals(b'\xaa\xaa\xaa\xaa', g('170.170.170.170'))
  357. self.assertEquals(b'\xff\xff\xff\xff', g('255.255.255.255'))
  358. def testIPv6toString(self):
  359. if not hasattr(socket, 'inet_pton'):
  360. return # No inet_pton() on this platform
  361. try:
  362. from socket import inet_pton, AF_INET6, has_ipv6
  363. if not has_ipv6:
  364. return
  365. except ImportError:
  366. return
  367. f = lambda a: inet_pton(AF_INET6, a)
  368. self.assertEquals(b'\x00' * 16, f('::'))
  369. self.assertEquals(b'\x00' * 16, f('0::0'))
  370. self.assertEquals(b'\x00\x01' + b'\x00' * 14, f('1::'))
  371. self.assertEquals(
  372. b'\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
  373. f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
  374. )
  375. def testStringToIPv4(self):
  376. if not hasattr(socket, 'inet_ntop'):
  377. return # No inet_ntop() on this platform
  378. from socket import inet_ntoa as f, inet_ntop, AF_INET
  379. g = lambda a: inet_ntop(AF_INET, a)
  380. self.assertEquals('1.0.1.0', f(b'\x01\x00\x01\x00'))
  381. self.assertEquals('170.85.170.85', f(b'\xaa\x55\xaa\x55'))
  382. self.assertEquals('255.255.255.255', f(b'\xff\xff\xff\xff'))
  383. self.assertEquals('1.2.3.4', f(b'\x01\x02\x03\x04'))
  384. self.assertEquals('1.0.1.0', g(b'\x01\x00\x01\x00'))
  385. self.assertEquals('170.85.170.85', g(b'\xaa\x55\xaa\x55'))
  386. self.assertEquals('255.255.255.255', g(b'\xff\xff\xff\xff'))
  387. def testStringToIPv6(self):
  388. if not hasattr(socket, 'inet_ntop'):
  389. return # No inet_ntop() on this platform
  390. try:
  391. from socket import inet_ntop, AF_INET6, has_ipv6
  392. if not has_ipv6:
  393. return
  394. except ImportError:
  395. return
  396. f = lambda a: inet_ntop(AF_INET6, a)
  397. self.assertEquals('::', f(b'\x00' * 16))
  398. self.assertEquals('::1', f(b'\x00' * 15 + b'\x01'))
  399. self.assertEquals(
  400. 'aef:b01:506:1001:ffff:9997:55:170',
  401. f(b'\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
  402. )
  403. # XXX The following don't test module-level functionality...
  404. def _get_unused_port(self, bind_address='0.0.0.0'):
  405. """Use a temporary socket to elicit an unused ephemeral port.
  406. Args:
  407. bind_address: Hostname or IP address to search for a port on.
  408. Returns: A most likely to be unused port.
  409. """
  410. tempsock = socket.socket()
  411. tempsock.bind((bind_address, 0))
  412. host, port = tempsock.getsockname()
  413. tempsock.close()
  414. return port
  415. def testSockName(self):
  416. # Testing getsockname()
  417. port = self._get_unused_port()
  418. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  419. sock.bind(("0.0.0.0", port))
  420. name = sock.getsockname()
  421. # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
  422. # it reasonable to get the host's addr in addition to 0.0.0.0.
  423. # At least for eCos. This is required for the S/390 to pass.
  424. my_ip_addr = socket.gethostbyname(socket.gethostname())
  425. self.assertIn(name[0], ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
  426. self.assertEqual(name[1], port)
  427. def testGetSockOpt(self):
  428. # Testing getsockopt()
  429. # We know a socket should start without reuse==0
  430. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  431. reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
  432. self.assertFalse(reuse != 0, "initial mode is reuse")
  433. def testSetSockOpt(self):
  434. # Testing setsockopt()
  435. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  436. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  437. reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
  438. self.assertFalse(reuse == 0, "failed to set reuse mode")
  439. def testSendAfterClose(self):
  440. # testing send() after close() with timeout
  441. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  442. sock.settimeout(1)
  443. sock.close()
  444. self.assertRaises(socket.error, sock.send, b"spam")
  445. def testNewAttributes(self):
  446. # testing .family, .type and .protocol
  447. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  448. self.assertEqual(sock.family, socket.AF_INET)
  449. self.assertEqual(sock.type, socket.SOCK_STREAM)
  450. self.assertEqual(sock.proto, 0)
  451. sock.close()
  452. def test_getsockaddrarg(self):
  453. host = '0.0.0.0'
  454. port = self._get_unused_port(bind_address=host)
  455. big_port = port + 65536
  456. neg_port = port - 65536
  457. sock = socket.socket()
  458. try:
  459. self.assertRaises(OverflowError, sock.bind, (host, big_port))
  460. self.assertRaises(OverflowError, sock.bind, (host, neg_port))
  461. sock.bind((host, port))
  462. finally:
  463. sock.close()
  464. def test_sock_ioctl(self):
  465. if os.name != "nt":
  466. return
  467. self.assertTrue(hasattr(socket.socket, 'ioctl'))
  468. self.assertTrue(hasattr(socket, 'SIO_RCVALL'))
  469. self.assertTrue(hasattr(socket, 'RCVALL_ON'))
  470. self.assertTrue(hasattr(socket, 'RCVALL_OFF'))
  471. self.assertTrue(hasattr(socket, 'SIO_KEEPALIVE_VALS'))
  472. s = socket.socket()
  473. self.assertRaises(ValueError, s.ioctl, -1, None)
  474. s.ioctl(socket.SIO_KEEPALIVE_VALS, (1, 100, 100))
  475. @unittest.skipUnless(thread, 'Threading required for this test.')
  476. class BasicTCPTest(SocketConnectedTest):
  477. def __init__(self, methodName='runTest'):
  478. SocketConnectedTest.__init__(self, methodName=methodName)
  479. def testRecv(self):
  480. # Testing large receive over TCP
  481. msg = self.cli_conn.recv(1024)
  482. self.assertEqual(msg, MSG)
  483. def _testRecv(self):
  484. self.serv_conn.send(MSG)
  485. def testOverFlowRecv(self):
  486. # Testing receive in chunks over TCP
  487. seg1 = self.cli_conn.recv(len(MSG) - 3)
  488. seg2 = self.cli_conn.recv(1024)
  489. msg = seg1 + seg2
  490. self.assertEqual(msg, MSG)
  491. def _testOverFlowRecv(self):
  492. self.serv_conn.send(MSG)
  493. def testRecvFrom(self):
  494. # Testing large recvfrom() over TCP
  495. msg, addr = self.cli_conn.recvfrom(1024)
  496. self.assertEqual(msg, MSG)
  497. def _testRecvFrom(self):
  498. self.serv_conn.send(MSG)
  499. def testOverFlowRecvFrom(self):
  500. # Testing recvfrom() in chunks over TCP
  501. seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
  502. seg2, addr = self.cli_conn.recvfrom(1024)
  503. msg = seg1 + seg2
  504. self.assertEqual(msg, MSG)
  505. def _testOverFlowRecvFrom(self):
  506. self.serv_conn.send(MSG)
  507. def testSendAll(self):
  508. # Testing sendall() with a 2048 byte string over TCP
  509. msg = b''
  510. while 1:
  511. read = self.cli_conn.recv(1024)
  512. if not read:
  513. break
  514. msg += read
  515. self.assertEqual(msg, b'f' * 2048)
  516. def _testSendAll(self):
  517. big_chunk = b'f' * 2048
  518. self.serv_conn.sendall(big_chunk)
  519. def testFromFd(self):
  520. # Testing fromfd()
  521. if not hasattr(socket, "fromfd"):
  522. return # On Windows, this doesn't exist
  523. fd = self.cli_conn.fileno()
  524. sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
  525. msg = sock.recv(1024)
  526. self.assertEqual(msg, MSG)
  527. def _testFromFd(self):
  528. self.serv_conn.send(MSG)
  529. def testDup(self):
  530. # Testing dup()
  531. sock = self.cli_conn.dup()
  532. msg = sock.recv(1024)
  533. self.assertEqual(msg, MSG)
  534. def _testDup(self):
  535. self.serv_conn.send(MSG)
  536. def testShutdown(self):
  537. # Testing shutdown()
  538. msg = self.cli_conn.recv(1024)
  539. self.assertEqual(msg, MSG)
  540. # wait for _testShutdown to finish: on OS X, when the server
  541. # closes the connection the client also becomes disconnected,
  542. # and the client's shutdown call will fail. (Issue #4397.)
  543. self.done.wait()
  544. def _testShutdown(self):
  545. self.serv_conn.send(MSG)
  546. self.serv_conn.shutdown(2)
  547. @unittest.skipUnless(thread, 'Threading required for this test.')
  548. class BasicUDPTest(ThreadedUDPSocketTest):
  549. def __init__(self, methodName='runTest'):
  550. ThreadedUDPSocketTest.__init__(self, methodName=methodName)
  551. def testSendtoAndRecv(self):
  552. # Testing sendto() and Recv() over UDP
  553. msg = self.serv.recv(len(MSG))
  554. self.assertEqual(msg, MSG)
  555. def _testSendtoAndRecv(self):
  556. self.cli.sendto(MSG, 0, (HOST, self.port))
  557. def testRecvFrom(self):
  558. # Testing recvfrom() over UDP
  559. msg, addr = self.serv.recvfrom(len(MSG))
  560. self.assertEqual(msg, MSG)
  561. def _testRecvFrom(self):
  562. self.cli.sendto(MSG, 0, (HOST, self.port))
  563. def testRecvFromNegative(self):
  564. # Negative lengths passed to recvfrom should give ValueError.
  565. self.assertRaises(ValueError, self.serv.recvfrom, -1)
  566. def _testRecvFromNegative(self):
  567. self.cli.sendto(MSG, 0, (HOST, self.port))
  568. @unittest.skipUnless(thread, 'Threading required for this test.')
  569. class TCPCloserTest(ThreadedTCPSocketTest):
  570. def testClose(self):
  571. conn, addr = self.serv.accept()
  572. conn.close()
  573. sd = self.cli
  574. read, write, err = select.select([sd], [], [], 1.0)
  575. self.assertEqual(read, [sd])
  576. self.assertEqual(sd.recv(1), b'')
  577. # Calling close() many times should be safe.
  578. conn.close()
  579. conn.close()
  580. def _testClose(self):
  581. self.cli.connect((HOST, self.port))
  582. time.sleep(1.0)
  583. @unittest.skipUnless(thread, 'Threading required for this test.')
  584. class BasicSocketPairTest(SocketPairTest):
  585. def __init__(self, methodName='runTest'):
  586. SocketPairTest.__init__(self, methodName=methodName)
  587. def testRecv(self):
  588. msg = self.serv.recv(1024)
  589. self.assertEqual(msg, MSG)
  590. def _testRecv(self):
  591. self.cli.send(MSG)
  592. def testSend(self):
  593. self.serv.send(MSG)
  594. def _testSend(self):
  595. msg = self.cli.recv(1024)
  596. self.assertEqual(msg, MSG)
  597. @unittest.skipUnless(thread, 'Threading required for this test.')
  598. class NonBlockingTCPTests(ThreadedTCPSocketTest):
  599. def __init__(self, methodName='runTest'):
  600. ThreadedTCPSocketTest.__init__(self, methodName=methodName)
  601. def testSetBlocking(self):
  602. # Testing whether set blocking works
  603. self.serv.setblocking(0)
  604. start = time.time()
  605. try:
  606. self.serv.accept()
  607. except socket.error:
  608. pass
  609. end = time.time()
  610. self.assertTrue((end - start) < 1.0, "Error setting non-blocking mode.")
  611. def _testSetBlocking(self):
  612. pass
  613. def testAccept(self):
  614. # Testing non-blocking accept
  615. self.serv.setblocking(0)
  616. try:
  617. conn, addr = self.serv.accept()
  618. except socket.error:
  619. pass
  620. else:
  621. self.fail("Error trying to do non-blocking accept.")
  622. read, write, err = select.select([self.serv], [], [])
  623. if self.serv in read:
  624. conn, addr = self.serv.accept()
  625. else:
  626. self.fail("Error trying to do accept after select.")
  627. def _testAccept(self):
  628. time.sleep(0.1)
  629. self.cli.connect((HOST, self.port))
  630. def testConnect(self):
  631. # Testing non-blocking connect
  632. conn, addr = self.serv.accept()
  633. def _testConnect(self):
  634. self.cli.settimeout(10)
  635. self.cli.connect((HOST, self.port))
  636. def testRecv(self):
  637. # Testing non-blocking recv
  638. conn, addr = self.serv.accept()
  639. conn.setblocking(0)
  640. try:
  641. msg = conn.recv(len(MSG))
  642. except socket.error:
  643. pass
  644. else:
  645. self.fail("Error trying to do non-blocking recv.")
  646. read, write, err = select.select([conn], [], [])
  647. if conn in read:
  648. msg = conn.recv(len(MSG))
  649. self.assertEqual(msg, MSG)
  650. else:
  651. self.fail("Error during select call to non-blocking socket.")
  652. def _testRecv(self):
  653. self.cli.connect((HOST, self.port))
  654. time.sleep(0.1)
  655. self.cli.send(MSG)
  656. @unittest.skipUnless(thread, 'Threading required for this test.')
  657. class FileObjectClassTestCase(SocketConnectedTest):
  658. """Unit tests for the object returned by socket.makefile()
  659. self.serv_file is the io object returned by makefile() on
  660. the client connection. You can read from this file to
  661. get output from the server.
  662. self.cli_file is the io object returned by makefile() on the
  663. server connection. You can write to this file to send output
  664. to the client.
  665. """
  666. bufsize = -1 # Use default buffer size
  667. def __init__(self, methodName='runTest'):
  668. SocketConnectedTest.__init__(self, methodName=methodName)
  669. def setUp(self):
  670. SocketConnectedTest.setUp(self)
  671. self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
  672. def tearDown(self):
  673. self.serv_file.close()
  674. self.assertTrue(self.serv_file.closed)
  675. self.serv_file = None
  676. SocketConnectedTest.tearDown(self)
  677. def clientSetUp(self):
  678. SocketConnectedTest.clientSetUp(self)
  679. self.cli_file = self.serv_conn.makefile('wb')
  680. def clientTearDown(self):
  681. self.cli_file.close()
  682. self.assertTrue(self.cli_file.closed)
  683. self.cli_file = None
  684. SocketConnectedTest.clientTearDown(self)
  685. def testSmallRead(self):
  686. # Performing small file read test
  687. first_seg = self.serv_file.read(len(MSG)-3)
  688. second_seg = self.serv_file.read(3)
  689. msg = first_seg + second_seg
  690. self.assertEqual(msg, MSG)
  691. def _testSmallRead(self):
  692. self.cli_file.write(MSG)
  693. self.cli_file.flush()
  694. def testFullRead(self):
  695. # read until EOF
  696. msg = self.serv_file.read()
  697. self.assertEqual(msg, MSG)
  698. def _testFullRead(self):
  699. self.cli_file.write(MSG)
  700. self.cli_file.close()
  701. def testUnbufferedRead(self):
  702. # Performing unbuffered file read test
  703. buf = b''
  704. while 1:
  705. char = self.serv_file.read(1)
  706. if not char:
  707. break
  708. buf += char
  709. self.assertEqual(buf, MSG)
  710. def _testUnbufferedRead(self):
  711. self.cli_file.write(MSG)
  712. self.cli_file.flush()
  713. def testReadline(self):
  714. # Performing file readline test
  715. line = self.serv_file.readline()
  716. self.assertEqual(line, MSG)
  717. def _testReadline(self):
  718. self.cli_file.write(MSG)
  719. self.cli_file.flush()
  720. def testCloseAfterMakefile(self):
  721. # The file returned by makefile should keep the socket open.
  722. self.cli_conn.close()
  723. # read until EOF
  724. msg = self.serv_file.read()
  725. self.assertEqual(msg, MSG)
  726. def _testCloseAfterMakefile(self):
  727. self.cli_file.write(MSG)
  728. self.cli_file.flush()
  729. def testMakefileAfterMakefileClose(self):
  730. self.serv_file.close()
  731. msg = self.cli_conn.recv(len(MSG))
  732. self.assertEqual(msg, MSG)
  733. def _testMakefileAfterMakefileClose(self):
  734. self.cli_file.write(MSG)
  735. self.cli_file.flush()
  736. def testClosedAttr(self):
  737. self.assertTrue(not self.serv_file.closed)
  738. def _testClosedAttr(self):
  739. self.assertTrue(not self.cli_file.closed)
  740. def testAttributes(self):
  741. self.assertEqual(self.serv_file.mode, 'rb')
  742. self.assertEqual(self.serv_file.name, self.cli_conn.fileno())
  743. def _testAttributes(self):
  744. self.assertEqual(self.cli_file.mode, 'wb')
  745. self.assertEqual(self.cli_file.name, self.serv_conn.fileno())
  746. def testRealClose(self):
  747. self.serv_file.close()
  748. self.assertRaises(ValueError, self.serv_file.fileno)
  749. self.cli_conn.close()
  750. self.assertRaises(socket.error, self.cli_conn.getsockname)
  751. def _testRealClose(self):
  752. pass
  753. class FileObjectInterruptedTestCase(unittest.TestCase):
  754. """Test that the file object correctly handles EINTR internally."""
  755. class MockSocket(object):
  756. def __init__(self, recv_funcs=()):
  757. # A generator that returns callables that we'll call for each
  758. # call to recv().
  759. self._recv_step = iter(recv_funcs)
  760. def recv_into(self, buffer):
  761. data = next(self._recv_step)()
  762. assert len(buffer) >= len(data)
  763. buffer[:len(data)] = data
  764. return len(data)
  765. def _decref_socketios(self):
  766. pass
  767. def _textiowrap_for_test(self, buffering=-1):
  768. raw = socket.SocketIO(self, "r")
  769. if buffering < 0:
  770. buffering = io.DEFAULT_BUFFER_SIZE
  771. if buffering == 0:
  772. return raw
  773. buffer = io.BufferedReader(raw, buffering)
  774. text = io.TextIOWrapper(buffer, None, None)
  775. text.mode = "rb"
  776. return text
  777. @staticmethod
  778. def _raise_eintr():
  779. raise socket.error(errno.EINTR)
  780. def _textiowrap_mock_socket(self, mock, buffering=-1):
  781. raw = socket.SocketIO(mock, "r")
  782. if buffering < 0:
  783. buffering = io.DEFAULT_BUFFER_SIZE
  784. if buffering == 0:
  785. return raw
  786. buffer = io.BufferedReader(raw, buffering)
  787. text = io.TextIOWrapper(buffer, None, None)
  788. text.mode = "rb"
  789. return text
  790. def _test_readline(self, size=-1, buffering=-1):
  791. mock_sock = self.MockSocket(recv_funcs=[
  792. lambda : b"This is the first line\nAnd the sec",
  793. self._raise_eintr,
  794. lambda : b"ond line is here\n",
  795. lambda : b"",
  796. lambda : b"", # XXX(gps): io library does an extra EOF read
  797. ])
  798. fo = mock_sock._textiowrap_for_test(buffering=buffering)
  799. self.assertEquals(fo.readline(size), "This is the first line\n")
  800. self.assertEquals(fo.readline(size), "And the second line is here\n")
  801. def _test_read(self, size=-1, buffering=-1):
  802. mock_sock = self.MockSocket(recv_funcs=[
  803. lambda : b"This is the first line\nAnd the sec",
  804. self._raise_eintr,
  805. lambda : b"ond line is here\n",
  806. lambda : b"",
  807. lambda : b"", # XXX(gps): io library does an extra EOF read
  808. ])
  809. expecting = (b"This is the first line\n"
  810. b"And the second line is here\n")
  811. fo = mock_sock._textiowrap_for_test(buffering=buffering)
  812. if buffering == 0:
  813. data = b''
  814. else:
  815. data = ''
  816. expecting = expecting.decode('utf8')
  817. while len(data) != len(expecting):
  818. part = fo.read(size)
  819. if not part:
  820. break
  821. data += part
  822. self.assertEquals(data, expecting)
  823. def test_default(self):
  824. self._test_readline()
  825. self._test_readline(size=100)
  826. self._test_read()
  827. self._test_read(size=100)
  828. def test_with_1k_buffer(self):
  829. self._test_readline(buffering=1024)
  830. self._test_readline(size=100, buffering=1024)
  831. self._test_read(buffering=1024)
  832. self._test_read(size=100, buffering=1024)
  833. def _test_readline_no_buffer(self, size=-1):
  834. mock_sock = self.MockSocket(recv_funcs=[
  835. lambda : b"a",
  836. lambda : b"\n",
  837. lambda : b"B",
  838. self._raise_eintr,
  839. lambda : b"b",
  840. lambda : b"",
  841. ])
  842. fo = mock_sock._textiowrap_for_test(buffering=0)
  843. self.assertEquals(fo.readline(size), b"a\n")
  844. self.assertEquals(fo.readline(size), b"Bb")
  845. def test_no_buffer(self):
  846. self._test_readline_no_buffer()
  847. self._test_readline_no_buffer(size=4)
  848. self._test_read(buffering=0)
  849. self._test_read(size=100, buffering=0)
  850. class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
  851. """Repeat the tests from FileObjectClassTestCase with bufsize==0.
  852. In this case (and in this case only), it should be possible to
  853. create a file object, read a line from it, create another file
  854. object, read another line from it, without loss of data in the
  855. first file object's buffer. Note that http.client relies on this
  856. when reading multiple requests from the same socket."""
  857. bufsize = 0 # Use unbuffered mode
  858. def testUnbufferedReadline(self):
  859. # Read a line, create a new file object, read another line with it
  860. line = self.serv_file.readline() # first line
  861. self.assertEqual(line, b"A. " + MSG) # first line
  862. self.serv_file = self.cli_conn.makefile('rb', 0)
  863. line = self.serv_file.readline() # second line
  864. self.assertEqual(line, b"B. " + MSG) # second line
  865. def _testUnbufferedReadline(self):
  866. self.cli_file.write(b"A. " + MSG)
  867. self.cli_file.write(b"B. " + MSG)
  868. self.cli_file.flush()
  869. def testMakefileClose(self):
  870. # The file returned by makefile should keep the socket open...
  871. self.cli_conn.close()
  872. msg = self.cli_conn.recv(1024)
  873. self.assertEqual(msg, MSG)
  874. # ...until the file is itself closed
  875. self.serv_file.close()
  876. self.assertRaises(socket.error, self.cli_conn.recv, 1024)
  877. def _testMakefileClose(self):
  878. self.cli_file.write(MSG)
  879. self.cli_file.flush()
  880. def testMakefileCloseSocketDestroy(self):
  881. refcount_before = sys.getrefcount(self.cli_conn)
  882. self.serv_file.close()
  883. refcount_after = sys.getrefcount(self.cli_conn)
  884. self.assertEqual(refcount_before - 1, refcount_after)
  885. def _testMakefileCloseSocketDestroy(self):
  886. pass
  887. class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
  888. bufsize = 1 # Default-buffered for reading; line-buffered for writing
  889. class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
  890. bufsize = 2 # Exercise the buffering code
  891. class NetworkConnectionTest(object):
  892. """Prove network connection."""
  893. def clientSetUp(self):
  894. # We're inherited below by BasicTCPTest2, which also inherits
  895. # BasicTCPTest, which defines self.port referenced below.
  896. self.cli = socket.create_connection((HOST, self.port))
  897. self.serv_conn = self.cli
  898. class BasicTCPTest2(NetworkConnectionTest, BasicTCPTest):
  899. """Tests that NetworkConnection does not break existing TCP functionality.
  900. """
  901. class NetworkConnectionNoServer(unittest.TestCase):
  902. def testWithoutServer(self):
  903. port = support.find_unused_port()
  904. self.assertRaises(
  905. socket.error,
  906. lambda: socket.create_connection((HOST, port))
  907. )
  908. @unittest.skipUnless(thread, 'Threading required for this test.')
  909. class NetworkConnectionAttributesTest(SocketTCPTest, ThreadableTest):
  910. def __init__(self, methodName='runTest'):
  911. SocketTCPTest.__init__(self, methodName=methodName)
  912. ThreadableTest.__init__(self)
  913. def clientSetUp(self):
  914. self.source_port = support.find_unused_port()
  915. def clientTearDown(self):
  916. self.cli.close()
  917. self.cli = None
  918. ThreadableTest.clientTearDown(self)
  919. def _justAccept(self):
  920. conn, addr = self.serv.accept()
  921. testFamily = _justAccept
  922. def _testFamily(self):
  923. self.cli = socket.create_connection((HOST, self.port), timeout=30)
  924. self.assertEqual(self.cli.family, 2)
  925. testSourceAddress = _justAccept
  926. def _testSourceAddress(self):
  927. self.cli = socket.create_connection((HOST, self.port), timeout=30,
  928. source_address=('', self.source_port))
  929. self.assertEqual(self.cli.getsockname()[1], self.source_port)
  930. # The port number being used is sufficient to show that the bind()
  931. # call happened.
  932. testTimeoutDefault = _justAccept
  933. def _testTimeoutDefault(self):
  934. # passing no explicit timeout uses socket's global default
  935. self.assertTrue(socket.getdefaulttimeout() is None)
  936. socket.setdefaulttimeout(42)
  937. try:
  938. self.cli = socket.create_connection((HOST, self.port))
  939. finally:
  940. socket.setdefaulttimeout(None)
  941. self.assertEquals(self.cli.gettimeout(), 42)
  942. testTimeoutNone = _justAccept
  943. def _testTimeoutNone(self):
  944. # None timeout means the same as sock.settimeout(None)
  945. self.assertTrue(socket.getdefaulttimeout() is None)
  946. socket.setdefaulttimeout(30)
  947. try:
  948. self.cli = socket.create_connection((HOST, self.port), timeout=None)
  949. finally:
  950. socket.setdefaulttimeout(None)
  951. self.assertEqual(self.cli.gettimeout(), None)
  952. testTimeoutValueNamed = _justAccept
  953. def _testTimeoutValueNamed(self):
  954. self.cli = socket.create_connection((HOST, self.port), timeout=30)
  955. self.assertEqual(self.cli.gettimeout(), 30)
  956. testTimeoutValueNonamed = _justAccept
  957. def _testTimeoutValueNonamed(self):
  958. self.cli = socket.create_connection((HOST, self.port), 30)
  959. self.assertEqual(self.cli.gettimeout(), 30)
  960. @unittest.skipUnless(thread, 'Threading required for this test.')
  961. class NetworkConnectionBehaviourTest(SocketTCPTest, ThreadableTest):
  962. def __init__(self, methodName='runTest'):
  963. SocketTCPTest.__init__(self, methodName=methodName)
  964. ThreadableTest.__init__(self)
  965. def clientSetUp(self):
  966. pass
  967. def clientTearDown(self):
  968. self.cli.close()
  969. self.cli = None
  970. ThreadableTest.clientTearDown(self)
  971. def testInsideTimeout(self):
  972. conn, addr = self.serv.accept()
  973. time.sleep(3)
  974. conn.send(b"done!")
  975. testOutsideTimeout = testInsideTimeout
  976. def _testInsideTimeout(self):
  977. self.cli = sock = socket.create_connection((HOST, self.port))
  978. data = sock.recv(5)
  979. self.assertEqual(data, b"done!")
  980. def _testOutsideTimeout(self):
  981. self.cli = sock = socket.create_connection((HOST, self.port), timeout=1)
  982. self.assertRaises(socket.timeout, lambda: sock.recv(5))
  983. class TCPTimeoutTest(SocketTCPTest):
  984. def testTCPTimeout(self):
  985. def raise_timeout(*args, **kwargs):
  986. self.serv.settimeout(1.0)
  987. self.serv.accept()
  988. self.assertRaises(socket.timeout, raise_timeout,
  989. "Error generating a timeout exception (TCP)")
  990. def testTimeoutZero(self):
  991. ok = False
  992. try:
  993. self.serv.settimeout(0.0)
  994. foo = self.serv.accept()
  995. except socket.timeout:
  996. self.fail("caught timeout instead of error (TCP)")
  997. except socket.error:
  998. ok = True
  999. except:
  1000. self.fail("caught unexpected exception (TCP)")
  1001. if not ok:
  1002. self.fail("accept() returned success when we did not expect it")
  1003. def testInterruptedTimeout(self):
  1004. # XXX I don't know how to do this test on MSWindows or any other
  1005. # plaform that doesn't support signal.alarm() or os.kill(), though
  1006. # the bug should have existed on all platforms.
  1007. if not hasattr(signal, "alarm"):
  1008. return # can only test on *nix
  1009. self.serv.settimeout(5.0) # must be longer than alarm
  1010. class Alarm(Exception):
  1011. pass
  1012. def alarm_handler(signal, frame):
  1013. raise Alarm
  1014. old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
  1015. try:
  1016. signal.alarm(2) # POSIX allows alarm to be up to 1 second early
  1017. try:
  1018. foo = self.serv.accept()
  1019. except socket.timeout:
  1020. self.fail("caught timeout instead of Alarm")
  1021. except Alarm:
  1022. pass
  1023. except:
  1024. self.fail("caught other exception instead of Alarm:"
  1025. " %s(%s):\n%s" %
  1026. (sys.exc_info()[:2] + (traceback.format_exc(),)))
  1027. else:
  1028. self.fail("nothing caught")
  1029. finally:
  1030. signal.alarm(0) # shut off alarm
  1031. except Alarm:
  1032. self.fail("got Alarm in wrong place")
  1033. finally:
  1034. # no alarm can be pending. Safe to restore old handler.
  1035. signal.signal(signal.SIGALRM, old_alarm)
  1036. class UDPTimeoutTest(SocketTCPTest):
  1037. def testUDPTimeout(self):
  1038. def raise_timeout(*args, **kwargs):
  1039. self.serv.settimeout(1.0)
  1040. self.serv.recv(1024)
  1041. self.assertRaises(socket.timeout, raise_timeout,
  1042. "Error generating a timeout exception (UDP)")
  1043. def testTimeoutZero(self):
  1044. ok = False
  1045. try:
  1046. self.serv.settimeout(0.0)
  1047. foo = self.serv.recv(1024)
  1048. except socket.timeout:
  1049. self.fail("caught timeout instead of error (UDP)")
  1050. except socket.error:
  1051. ok = True
  1052. except:
  1053. self.fail("caught unexpected exception (UDP)")
  1054. if not ok:
  1055. self.fail("recv() returned success when we did not expect it")
  1056. class TestExceptions(unittest.TestCase):
  1057. def testExceptionTree(self):
  1058. self.assertTrue(issubclass(socket.error, Exception))
  1059. self.assertTrue(issubclass(socket.herror, socket.error))
  1060. self.assertTrue(issubclass(socket.gaierror, socket.error))
  1061. self.assertTrue(issubclass(socket.timeout, socket.error))
  1062. class TestLinuxAbstractNamespace(unittest.TestCase):
  1063. UNIX_PATH_MAX = 108
  1064. def testLinuxAbstractNamespace(self):
  1065. address = b"\x00python-test-hello\x00\xff"
  1066. s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  1067. s1.bind(address)
  1068. s1.listen(1)
  1069. s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  1070. s2.connect(s1.getsockname())
  1071. s1.accept()
  1072. self.assertEqual(s1.getsockname(), address)
  1073. self.assertEqual(s2.getpeername(), address)
  1074. def testMaxName(self):
  1075. address = b"\x00" + b"h" * (self.UNIX_PATH_MAX - 1)
  1076. s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  1077. s.bind(address)
  1078. self.assertEqual(s.getsockname(), address)
  1079. def testNameOverflow(self):
  1080. address = "\x00" + "h" * self.UNIX_PATH_MAX
  1081. s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  1082. self.assertRaises(socket.error, s.bind, address)
  1083. @unittest.skipUnless(thread, 'Threading required for this test.')
  1084. class BufferIOTest(SocketConnectedTest):
  1085. """
  1086. Test the buffer versions of socket.recv() and socket.send().
  1087. """
  1088. def __init__(self, methodName='runTest'):
  1089. SocketConnectedTest.__init__(self, methodName=methodName)
  1090. def testRecvIntoArray(self):
  1091. buf = bytearray(1024)
  1092. nbytes = self.cli_conn.recv_into(buf)
  1093. self.assertEqual(nbytes, len(MSG))
  1094. msg = buf[:len(MSG)]
  1095. self.assertEqual(msg, MSG)
  1096. def _testRecvIntoArray(self):
  1097. buf = bytes(MSG)
  1098. self.serv_conn.send(buf)
  1099. def testRecvIntoBytearray(self):
  1100. buf = bytearray(1024)
  1101. nbytes = self.cli_conn.recv_into(buf)
  1102. self.assertEqual(nbytes, len(MSG))
  1103. msg = buf[:len(MSG)]
  1104. self.assertEqual(msg, MSG)
  1105. _testRecvIntoBytearray = _testRecvIntoArray
  1106. def testRecvIntoMemoryview(self):
  1107. buf = bytearray(1024)
  1108. nbytes = self.cli_conn.recv_into(memoryview(buf))
  1109. self.assertEqual(nbytes, len(MSG))
  1110. msg = buf[:len(MSG)]
  1111. self.assertEqual(msg, MSG)
  1112. _testRecvIntoMemoryview = _testRecvIntoArray
  1113. def testRecvFromIntoArray(self):
  1114. buf = bytearray(1024)
  1115. nbytes, addr = self.cli_conn.recvfrom_into(buf)
  1116. self.assertEqual(nbytes, len(MSG))
  1117. msg = buf[:len(MSG)]
  1118. self.assertEqual(msg, MSG)
  1119. def _testRecvFromIntoArray(self):
  1120. buf = bytes(MSG)
  1121. self.serv_conn.send(buf)
  1122. def testRecvFromIntoBytearray(self):
  1123. buf = bytearray(1024)
  1124. nbytes, addr = self.cli_conn.recvfrom_into(buf)
  1125. self.assertEqual(nbytes, len(MSG))
  1126. msg = buf[:len(MSG)]
  1127. self.assertEqual(msg, MSG)
  1128. _testRecvFromIntoBytearray = _testRecvFromIntoArray
  1129. def testRecvFromIntoMemoryview(self):
  1130. buf = bytearray(1024)
  1131. nbytes, addr = self.cli_conn.recvfrom_into(memoryview(buf))
  1132. self.assertEqual(nbytes, len(MSG))
  1133. msg = buf[:len(MSG)]
  1134. self.assertEqual(msg, MSG)
  1135. _testRecvFromIntoMemoryview = _testRecvFromIntoArray
  1136. TIPC_STYPE = 2000
  1137. TIPC_LOWER = 200
  1138. TIPC_UPPER = 210
  1139. def isTipcAvailable():
  1140. """Check if the TIPC module is loaded
  1141. The TIPC module is not loaded automatically on Ubuntu and probably
  1142. other Linux distros.
  1143. """
  1144. if not hasattr(socket, "AF_TIPC"):
  1145. return False
  1146. if not os.path.isfile("/proc/modules"):
  1147. return False
  1148. with open("/proc/modules") as f:
  1149. for line in f:
  1150. if line.startswith("tipc "):
  1151. return True
  1152. if support.verbose:
  1153. print("TIPC module is not loaded, please 'sudo modprobe tipc'")
  1154. return False
  1155. class TIPCTest (unittest.TestCase):
  1156. def testRDM(self):
  1157. srv = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
  1158. cli = socket.socket(socket.AF_TIPC, socket.SOCK_RDM)
  1159. srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  1160. srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
  1161. TIPC_LOWER, TIPC_UPPER)
  1162. srv.bind(srvaddr)
  1163. sendaddr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
  1164. TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
  1165. cli.sendto(MSG, sendaddr)
  1166. msg, recvaddr = srv.recvfrom(1024)
  1167. self.assertEqual(cli.getsockname(), recvaddr)
  1168. self.assertEqual(msg, MSG)
  1169. class TIPCThreadableTest (unittest.TestCase, ThreadableTest):
  1170. def __init__(self, methodName = 'runTest'):
  1171. unittest.TestCase.__init__(self, methodName = methodName)
  1172. ThreadableTest.__init__(self)
  1173. def setUp(self):
  1174. self.srv = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
  1175. self.srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  1176. srvaddr = (socket.TIPC_ADDR_NAMESEQ, TIPC_STYPE,
  1177. TIPC_LOWER, TIPC_UPPER)
  1178. self.srv.bind(srvaddr)
  1179. self.srv.listen(5)
  1180. self.serverExplicitReady()
  1181. self.conn, self.connaddr = self.srv.accept()
  1182. def clientSetUp(self):
  1183. # The is a hittable race between serverExplicitReady() and the
  1184. # accept() call; sleep a little while to avoid it, otherwise
  1185. # we could get an exception
  1186. time.sleep(0.1)
  1187. self.cli = socket.socket(socket.AF_TIPC, socket.SOCK_STREAM)
  1188. addr = (socket.TIPC_ADDR_NAME, TIPC_STYPE,
  1189. TIPC_LOWER + int((TIPC_UPPER - TIPC_LOWER) / 2), 0)
  1190. self.cli.connect(addr)
  1191. self.cliaddr = self.cli.getsockname()
  1192. def testStream(self):
  1193. msg = self.conn.recv(1024)
  1194. self.assertEqual(msg, MSG)
  1195. self.assertEqual(self.cliaddr, self.connaddr)
  1196. def _testStream(self):
  1197. self.cli.send(MSG)
  1198. self.cli.close()
  1199. def test_main():
  1200. tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
  1201. TestExceptions, BufferIOTest, BasicTCPTest2, BasicUDPTest, UDPTimeoutTest ]
  1202. tests.extend([
  1203. NonBlockingTCPTests,
  1204. FileObjectClassTestCase,
  1205. FileObjectInterruptedTestCase,
  1206. UnbufferedFileObjectClassTestCase,
  1207. LineBuffere

Large files files are truncated, but you can click here to view the full file