PageRenderTime 48ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/lib-python/2.7/test/test_socket.py

https://bitbucket.org/dac_io/pypy
Python | 1618 lines | 1425 code | 96 blank | 97 comment | 65 complexity | f17e9f6e4ba4d4cea9f7d3ffad6e8296 MD5 | raw file

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

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

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