PageRenderTime 53ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/lib-python/modified-2.5.2/test/test_socket.py

https://bitbucket.org/probreasoning/pypy
Python | 1012 lines | 860 code | 77 blank | 75 comment | 38 complexity | c6a5792138e299d95c2665d21606b460 MD5 | raw file
  1. #!/usr/bin/env python
  2. import unittest
  3. from test import test_support
  4. import socket
  5. import select
  6. import time
  7. import thread, threading
  8. import Queue
  9. import sys, gc
  10. import array
  11. from weakref import proxy
  12. import signal
  13. PORT = 50007
  14. HOST = 'localhost'
  15. MSG = 'Michael Gilfix was here\n'
  16. class SocketTCPTest(unittest.TestCase):
  17. def setUp(self):
  18. self.serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  19. self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  20. global PORT
  21. PORT = test_support.bind_port(self.serv, HOST, PORT)
  22. self.serv.listen(1)
  23. def tearDown(self):
  24. self.serv.close()
  25. self.serv = None
  26. class SocketUDPTest(unittest.TestCase):
  27. def setUp(self):
  28. self.serv = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  29. self.serv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  30. global PORT
  31. PORT = test_support.bind_port(self.serv, HOST, PORT)
  32. def tearDown(self):
  33. self.serv.close()
  34. self.serv = None
  35. class ThreadableTest:
  36. """Threadable Test class
  37. The ThreadableTest class makes it easy to create a threaded
  38. client/server pair from an existing unit test. To create a
  39. new threaded class from an existing unit test, use multiple
  40. inheritance:
  41. class NewClass (OldClass, ThreadableTest):
  42. pass
  43. This class defines two new fixture functions with obvious
  44. purposes for overriding:
  45. clientSetUp ()
  46. clientTearDown ()
  47. Any new test functions within the class must then define
  48. tests in pairs, where the test name is preceeded with a
  49. '_' to indicate the client portion of the test. Ex:
  50. def testFoo(self):
  51. # Server portion
  52. def _testFoo(self):
  53. # Client portion
  54. Any exceptions raised by the clients during their tests
  55. are caught and transferred to the main thread to alert
  56. the testing framework.
  57. Note, the server setup function cannot call any blocking
  58. functions that rely on the client thread during setup,
  59. unless serverExplicityReady() is called just before
  60. the blocking call (such as in setting up a client/server
  61. connection and performing the accept() in setUp().
  62. """
  63. def __init__(self):
  64. # Swap the true setup function
  65. self.__setUp = self.setUp
  66. self.__tearDown = self.tearDown
  67. self.setUp = self._setUp
  68. self.tearDown = self._tearDown
  69. def serverExplicitReady(self):
  70. """This method allows the server to explicitly indicate that
  71. it wants the client thread to proceed. This is useful if the
  72. server is about to execute a blocking routine that is
  73. dependent upon the client thread during its setup routine."""
  74. self.server_ready.set()
  75. def _setUp(self):
  76. self.server_ready = threading.Event()
  77. self.client_ready = threading.Event()
  78. self.done = threading.Event()
  79. self.queue = Queue.Queue(1)
  80. # Do some munging to start the client test.
  81. methodname = self.id()
  82. i = methodname.rfind('.')
  83. methodname = methodname[i+1:]
  84. test_method = getattr(self, '_' + methodname)
  85. self.client_thread = thread.start_new_thread(
  86. self.clientRun, (test_method,))
  87. self.__setUp()
  88. if not self.server_ready.isSet():
  89. self.server_ready.set()
  90. self.client_ready.wait()
  91. def _tearDown(self):
  92. self.__tearDown()
  93. self.done.wait()
  94. if not self.queue.empty():
  95. msg = self.queue.get()
  96. self.fail(msg)
  97. def clientRun(self, test_func):
  98. self.server_ready.wait()
  99. self.client_ready.set()
  100. self.clientSetUp()
  101. if not callable(test_func):
  102. raise TypeError, "test_func must be a callable function"
  103. try:
  104. test_func()
  105. except Exception, strerror:
  106. self.queue.put(strerror)
  107. self.clientTearDown()
  108. def clientSetUp(self):
  109. raise NotImplementedError, "clientSetUp must be implemented."
  110. def clientTearDown(self):
  111. self.done.set()
  112. thread.exit()
  113. class ThreadedTCPSocketTest(SocketTCPTest, ThreadableTest):
  114. def __init__(self, methodName='runTest'):
  115. SocketTCPTest.__init__(self, methodName=methodName)
  116. ThreadableTest.__init__(self)
  117. def clientSetUp(self):
  118. self.cli = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  119. def clientTearDown(self):
  120. self.cli.close()
  121. self.cli = None
  122. ThreadableTest.clientTearDown(self)
  123. class ThreadedUDPSocketTest(SocketUDPTest, ThreadableTest):
  124. def __init__(self, methodName='runTest'):
  125. SocketUDPTest.__init__(self, methodName=methodName)
  126. ThreadableTest.__init__(self)
  127. def clientSetUp(self):
  128. self.cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  129. class SocketConnectedTest(ThreadedTCPSocketTest):
  130. def __init__(self, methodName='runTest'):
  131. ThreadedTCPSocketTest.__init__(self, methodName=methodName)
  132. def setUp(self):
  133. ThreadedTCPSocketTest.setUp(self)
  134. # Indicate explicitly we're ready for the client thread to
  135. # proceed and then perform the blocking call to accept
  136. self.serverExplicitReady()
  137. conn, addr = self.serv.accept()
  138. self.cli_conn = conn
  139. def tearDown(self):
  140. self.cli_conn.close()
  141. self.cli_conn = None
  142. ThreadedTCPSocketTest.tearDown(self)
  143. def clientSetUp(self):
  144. ThreadedTCPSocketTest.clientSetUp(self)
  145. self.cli.connect((HOST, PORT))
  146. self.serv_conn = self.cli
  147. def clientTearDown(self):
  148. self.serv_conn.close()
  149. self.serv_conn = None
  150. ThreadedTCPSocketTest.clientTearDown(self)
  151. class SocketPairTest(unittest.TestCase, ThreadableTest):
  152. def __init__(self, methodName='runTest'):
  153. unittest.TestCase.__init__(self, methodName=methodName)
  154. ThreadableTest.__init__(self)
  155. def setUp(self):
  156. self.serv, self.cli = socket.socketpair()
  157. def tearDown(self):
  158. self.serv.close()
  159. self.serv = None
  160. def clientSetUp(self):
  161. pass
  162. def clientTearDown(self):
  163. self.cli.close()
  164. self.cli = None
  165. ThreadableTest.clientTearDown(self)
  166. #######################################################################
  167. ## Begin Tests
  168. class GeneralModuleTests(unittest.TestCase):
  169. def test_weakref(self):
  170. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  171. p = proxy(s)
  172. self.assertEqual(p.fileno(), s.fileno())
  173. s.close()
  174. s = None
  175. gc.collect()
  176. gc.collect()
  177. try:
  178. p.fileno()
  179. except ReferenceError:
  180. pass
  181. else:
  182. self.fail('Socket proxy still exists')
  183. def testSocketError(self):
  184. # Testing socket module exceptions
  185. def raise_error(*args, **kwargs):
  186. raise socket.error
  187. def raise_herror(*args, **kwargs):
  188. raise socket.herror
  189. def raise_gaierror(*args, **kwargs):
  190. raise socket.gaierror
  191. self.failUnlessRaises(socket.error, raise_error,
  192. "Error raising socket exception.")
  193. self.failUnlessRaises(socket.error, raise_herror,
  194. "Error raising socket exception.")
  195. self.failUnlessRaises(socket.error, raise_gaierror,
  196. "Error raising socket exception.")
  197. def testCrucialConstants(self):
  198. # Testing for mission critical constants
  199. socket.AF_INET
  200. socket.SOCK_STREAM
  201. socket.SOCK_DGRAM
  202. socket.SOCK_RAW
  203. socket.SOCK_RDM
  204. socket.SOCK_SEQPACKET
  205. socket.SOL_SOCKET
  206. socket.SO_REUSEADDR
  207. def testHostnameRes(self):
  208. # Testing hostname resolution mechanisms
  209. hostname = socket.gethostname()
  210. try:
  211. ip = socket.gethostbyname(hostname)
  212. except socket.error:
  213. # Probably name lookup wasn't set up right; skip this test
  214. return
  215. self.assert_(ip.find('.') >= 0, "Error resolving host to ip.")
  216. try:
  217. hname, aliases, ipaddrs = socket.gethostbyaddr(ip)
  218. except socket.error:
  219. # Probably a similar problem as above; skip this test
  220. return
  221. all_host_names = [hostname, hname] + aliases
  222. fqhn = socket.getfqdn(ip)
  223. if not fqhn in all_host_names:
  224. self.fail("Error testing host resolution mechanisms. (fqdn: %s, all: %s)" % (fqhn, repr(all_host_names)))
  225. def testRefCountGetNameInfo(self):
  226. # Testing reference count for getnameinfo
  227. import sys
  228. if hasattr(sys, "getrefcount"):
  229. try:
  230. # On some versions, this loses a reference
  231. orig = sys.getrefcount(__name__)
  232. socket.getnameinfo(__name__,0)
  233. except SystemError:
  234. if sys.getrefcount(__name__) <> orig:
  235. self.fail("socket.getnameinfo loses a reference")
  236. def testInterpreterCrash(self):
  237. # Making sure getnameinfo doesn't crash the interpreter
  238. try:
  239. # On some versions, this crashes the interpreter.
  240. socket.getnameinfo(('x', 0, 0, 0), 0)
  241. except socket.error:
  242. pass
  243. def testNtoH(self):
  244. # This just checks that htons etc. are their own inverse,
  245. # when looking at the lower 16 or 32 bits.
  246. sizes = {socket.htonl: 32, socket.ntohl: 32,
  247. socket.htons: 16, socket.ntohs: 16}
  248. for func, size in sizes.items():
  249. mask = (1L<<size) - 1
  250. for i in (0, 1, 0xffff, ~0xffff, 2, 0x01234567, 0x76543210):
  251. self.assertEqual(i & mask, func(func(i&mask)) & mask)
  252. # should also accept ints, not only longs:
  253. self.assertEqual(i & mask, func(func(int(i&mask))) & mask)
  254. swapped = func(mask)
  255. self.assertEqual(swapped & mask, mask)
  256. self.assertRaises(OverflowError, func, 1L<<34)
  257. if test_support.check_impl_detail(cpython=False):
  258. # XXX on 64-bit machines, it should also raise if it's an
  259. # out-of-bound int, not just an out-of-bound long, but
  260. # CPython 2.5/2.6 does not do it:
  261. self.assertRaises(OverflowError, func, 1<<34)
  262. # XXX the following check seems reasonable enough, but
  263. # it does not work on CPython either; disabled for now:
  264. # self.assertRaises(OverflowError, func, 1<<size)
  265. # self.assertRaises(OverflowError, func, 1L<<size)
  266. # the following was fixed on CPython >= 2.6:
  267. self.assertRaises((OverflowError, ValueError), func, -1)
  268. def testGetServBy(self):
  269. eq = self.assertEqual
  270. # Find one service that exists, then check all the related interfaces.
  271. # I've ordered this by protocols that have both a tcp and udp
  272. # protocol, at least for modern Linuxes.
  273. if sys.platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
  274. 'freebsd7', 'darwin'):
  275. # avoid the 'echo' service on this platform, as there is an
  276. # assumption breaking non-standard port/protocol entry
  277. services = ('daytime', 'qotd', 'domain')
  278. else:
  279. services = ('echo', 'daytime', 'domain')
  280. for service in services:
  281. try:
  282. port = socket.getservbyname(service, 'tcp')
  283. break
  284. except socket.error:
  285. pass
  286. else:
  287. raise socket.error
  288. # Try same call with optional protocol omitted
  289. port2 = socket.getservbyname(service)
  290. eq(port, port2)
  291. # Try udp, but don't barf it it doesn't exist
  292. try:
  293. udpport = socket.getservbyname(service, 'udp')
  294. except socket.error:
  295. udpport = None
  296. else:
  297. eq(udpport, port)
  298. # Now make sure the lookup by port returns the same service name
  299. eq(socket.getservbyport(port2), service)
  300. eq(socket.getservbyport(port, 'tcp'), service)
  301. if udpport is not None:
  302. eq(socket.getservbyport(udpport, 'udp'), service)
  303. def testDefaultTimeout(self):
  304. # Testing default timeout
  305. # The default timeout should initially be None
  306. self.assertEqual(socket.getdefaulttimeout(), None)
  307. s = socket.socket()
  308. self.assertEqual(s.gettimeout(), None)
  309. s.close()
  310. # Set the default timeout to 10, and see if it propagates
  311. socket.setdefaulttimeout(10)
  312. self.assertEqual(socket.getdefaulttimeout(), 10)
  313. s = socket.socket()
  314. self.assertEqual(s.gettimeout(), 10)
  315. s.close()
  316. # Reset the default timeout to None, and see if it propagates
  317. socket.setdefaulttimeout(None)
  318. self.assertEqual(socket.getdefaulttimeout(), None)
  319. s = socket.socket()
  320. self.assertEqual(s.gettimeout(), None)
  321. s.close()
  322. # Check that setting it to an invalid value raises ValueError
  323. self.assertRaises(ValueError, socket.setdefaulttimeout, -1)
  324. # Check that setting it to an invalid type raises TypeError
  325. self.assertRaises(TypeError, socket.setdefaulttimeout, "spam")
  326. def testIPv4toString(self):
  327. if not hasattr(socket, 'inet_pton'):
  328. return # No inet_pton() on this platform
  329. from socket import inet_aton as f, inet_pton, AF_INET
  330. g = lambda a: inet_pton(AF_INET, a)
  331. self.assertEquals('\x00\x00\x00\x00', f('0.0.0.0'))
  332. self.assertEquals('\xff\x00\xff\x00', f('255.0.255.0'))
  333. self.assertEquals('\xaa\xaa\xaa\xaa', f('170.170.170.170'))
  334. self.assertEquals('\x01\x02\x03\x04', f('1.2.3.4'))
  335. self.assertEquals('\xff\xff\xff\xff', f('255.255.255.255'))
  336. self.assertEquals('\x00\x00\x00\x00', g('0.0.0.0'))
  337. self.assertEquals('\xff\x00\xff\x00', g('255.0.255.0'))
  338. self.assertEquals('\xaa\xaa\xaa\xaa', g('170.170.170.170'))
  339. self.assertEquals('\xff\xff\xff\xff', g('255.255.255.255'))
  340. def testIPv6toString(self):
  341. if not hasattr(socket, 'inet_pton'):
  342. return # No inet_pton() on this platform
  343. try:
  344. from socket import inet_pton, AF_INET6, has_ipv6
  345. if not has_ipv6:
  346. return
  347. except ImportError:
  348. return
  349. f = lambda a: inet_pton(AF_INET6, a)
  350. self.assertEquals('\x00' * 16, f('::'))
  351. self.assertEquals('\x00' * 16, f('0::0'))
  352. self.assertEquals('\x00\x01' + '\x00' * 14, f('1::'))
  353. self.assertEquals(
  354. '\x45\xef\x76\xcb\x00\x1a\x56\xef\xaf\xeb\x0b\xac\x19\x24\xae\xae',
  355. f('45ef:76cb:1a:56ef:afeb:bac:1924:aeae')
  356. )
  357. def testStringToIPv4(self):
  358. if not hasattr(socket, 'inet_ntop'):
  359. return # No inet_ntop() on this platform
  360. from socket import inet_ntoa as f, inet_ntop, AF_INET
  361. g = lambda a: inet_ntop(AF_INET, a)
  362. self.assertEquals('1.0.1.0', f('\x01\x00\x01\x00'))
  363. self.assertEquals('170.85.170.85', f('\xaa\x55\xaa\x55'))
  364. self.assertEquals('255.255.255.255', f('\xff\xff\xff\xff'))
  365. self.assertEquals('1.2.3.4', f('\x01\x02\x03\x04'))
  366. self.assertEquals('1.0.1.0', g('\x01\x00\x01\x00'))
  367. self.assertEquals('170.85.170.85', g('\xaa\x55\xaa\x55'))
  368. self.assertEquals('255.255.255.255', g('\xff\xff\xff\xff'))
  369. def testStringToIPv6(self):
  370. if not hasattr(socket, 'inet_ntop'):
  371. return # No inet_ntop() on this platform
  372. try:
  373. from socket import inet_ntop, AF_INET6, has_ipv6
  374. if not has_ipv6:
  375. return
  376. except ImportError:
  377. return
  378. f = lambda a: inet_ntop(AF_INET6, a)
  379. self.assertEquals('::', f('\x00' * 16))
  380. self.assertEquals('::1', f('\x00' * 15 + '\x01'))
  381. self.assertEquals(
  382. 'aef:b01:506:1001:ffff:9997:55:170',
  383. f('\x0a\xef\x0b\x01\x05\x06\x10\x01\xff\xff\x99\x97\x00\x55\x01\x70')
  384. )
  385. # XXX The following don't test module-level functionality...
  386. def testSockName(self):
  387. # Testing getsockname()
  388. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  389. sock.bind(("0.0.0.0", PORT+1))
  390. name = sock.getsockname()
  391. # XXX(nnorwitz): http://tinyurl.com/os5jz seems to indicate
  392. # it reasonable to get the host's addr in addition to 0.0.0.0.
  393. # At least for eCos. This is required for the S/390 to pass.
  394. my_ip_addr = socket.gethostbyname(socket.gethostname())
  395. self.assert_(name[0] in ("0.0.0.0", my_ip_addr), '%s invalid' % name[0])
  396. self.assertEqual(name[1], PORT+1)
  397. def testGetSockOpt(self):
  398. # Testing getsockopt()
  399. # We know a socket should start without reuse==0
  400. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  401. reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
  402. self.failIf(reuse != 0, "initial mode is reuse")
  403. def testSetSockOpt(self):
  404. # Testing setsockopt()
  405. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  406. sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  407. reuse = sock.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR)
  408. self.failIf(reuse == 0, "failed to set reuse mode")
  409. def testSendAfterClose(self):
  410. # testing send() after close() with timeout
  411. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  412. sock.settimeout(1)
  413. sock.close()
  414. self.assertRaises(socket.error, sock.send, "spam")
  415. def testNewAttributes(self):
  416. # testing .family, .type and .protocol
  417. sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  418. self.assertEqual(sock.family, socket.AF_INET)
  419. self.assertEqual(sock.type, socket.SOCK_STREAM)
  420. self.assertEqual(sock.proto, 0)
  421. sock.close()
  422. class BasicTCPTest(SocketConnectedTest):
  423. def __init__(self, methodName='runTest'):
  424. SocketConnectedTest.__init__(self, methodName=methodName)
  425. def testRecv(self):
  426. # Testing large receive over TCP
  427. msg = self.cli_conn.recv(1024)
  428. self.assertEqual(msg, MSG)
  429. def _testRecv(self):
  430. self.serv_conn.send(MSG)
  431. def testOverFlowRecv(self):
  432. # Testing receive in chunks over TCP
  433. seg1 = self.cli_conn.recv(len(MSG) - 3)
  434. seg2 = self.cli_conn.recv(1024)
  435. msg = seg1 + seg2
  436. self.assertEqual(msg, MSG)
  437. def _testOverFlowRecv(self):
  438. self.serv_conn.send(MSG)
  439. def testRecvFrom(self):
  440. # Testing large recvfrom() over TCP
  441. msg, addr = self.cli_conn.recvfrom(1024)
  442. self.assertEqual(msg, MSG)
  443. def _testRecvFrom(self):
  444. self.serv_conn.send(MSG)
  445. def testOverFlowRecvFrom(self):
  446. # Testing recvfrom() in chunks over TCP
  447. seg1, addr = self.cli_conn.recvfrom(len(MSG)-3)
  448. seg2, addr = self.cli_conn.recvfrom(1024)
  449. msg = seg1 + seg2
  450. self.assertEqual(msg, MSG)
  451. def _testOverFlowRecvFrom(self):
  452. self.serv_conn.send(MSG)
  453. def testSendAll(self):
  454. # Testing sendall() with a 2048 byte string over TCP
  455. msg = ''
  456. while 1:
  457. read = self.cli_conn.recv(1024)
  458. if not read:
  459. break
  460. msg += read
  461. self.assertEqual(msg, 'f' * 2048)
  462. def _testSendAll(self):
  463. big_chunk = 'f' * 2048
  464. self.serv_conn.sendall(big_chunk)
  465. def testFromFd(self):
  466. # Testing fromfd()
  467. if not hasattr(socket, "fromfd"):
  468. return # On Windows, this doesn't exist
  469. fd = self.cli_conn.fileno()
  470. sock = socket.fromfd(fd, socket.AF_INET, socket.SOCK_STREAM)
  471. msg = sock.recv(1024)
  472. self.assertEqual(msg, MSG)
  473. def _testFromFd(self):
  474. self.serv_conn.send(MSG)
  475. def testShutdown(self):
  476. # Testing shutdown()
  477. msg = self.cli_conn.recv(1024)
  478. self.assertEqual(msg, MSG)
  479. def _testShutdown(self):
  480. self.serv_conn.send(MSG)
  481. self.serv_conn.shutdown(2)
  482. class BasicUDPTest(ThreadedUDPSocketTest):
  483. def __init__(self, methodName='runTest'):
  484. ThreadedUDPSocketTest.__init__(self, methodName=methodName)
  485. def testSendtoAndRecv(self):
  486. # Testing sendto() and Recv() over UDP
  487. msg = self.serv.recv(len(MSG))
  488. self.assertEqual(msg, MSG)
  489. def _testSendtoAndRecv(self):
  490. self.cli.sendto(MSG, 0, (HOST, PORT))
  491. def testRecvFrom(self):
  492. # Testing recvfrom() over UDP
  493. msg, addr = self.serv.recvfrom(len(MSG))
  494. self.assertEqual(msg, MSG)
  495. def _testRecvFrom(self):
  496. self.cli.sendto(MSG, 0, (HOST, PORT))
  497. def testRecvFromNegative(self):
  498. # Negative lengths passed to recvfrom should give ValueError.
  499. self.assertRaises(ValueError, self.serv.recvfrom, -1)
  500. def _testRecvFromNegative(self):
  501. self.cli.sendto(MSG, 0, (HOST, PORT))
  502. class TCPCloserTest(ThreadedTCPSocketTest):
  503. def testClose(self):
  504. conn, addr = self.serv.accept()
  505. conn.close()
  506. sd = self.cli
  507. read, write, err = select.select([sd], [], [], 1.0)
  508. self.assertEqual(read, [sd])
  509. self.assertEqual(sd.recv(1), '')
  510. def _testClose(self):
  511. self.cli.connect((HOST, PORT))
  512. time.sleep(1.0)
  513. class BasicSocketPairTest(SocketPairTest):
  514. def __init__(self, methodName='runTest'):
  515. SocketPairTest.__init__(self, methodName=methodName)
  516. def testRecv(self):
  517. msg = self.serv.recv(1024)
  518. self.assertEqual(msg, MSG)
  519. def _testRecv(self):
  520. self.cli.send(MSG)
  521. def testSend(self):
  522. self.serv.send(MSG)
  523. def _testSend(self):
  524. msg = self.cli.recv(1024)
  525. self.assertEqual(msg, MSG)
  526. class NonBlockingTCPTests(ThreadedTCPSocketTest):
  527. def __init__(self, methodName='runTest'):
  528. ThreadedTCPSocketTest.__init__(self, methodName=methodName)
  529. def testSetBlocking(self):
  530. # Testing whether set blocking works
  531. self.serv.setblocking(0)
  532. start = time.time()
  533. try:
  534. self.serv.accept()
  535. except socket.error:
  536. pass
  537. end = time.time()
  538. self.assert_((end - start) < 1.0, "Error setting non-blocking mode.")
  539. def _testSetBlocking(self):
  540. pass
  541. def testAccept(self):
  542. # Testing non-blocking accept
  543. self.serv.setblocking(0)
  544. try:
  545. conn, addr = self.serv.accept()
  546. except socket.error:
  547. pass
  548. else:
  549. self.fail("Error trying to do non-blocking accept.")
  550. read, write, err = select.select([self.serv], [], [])
  551. if self.serv in read:
  552. conn, addr = self.serv.accept()
  553. else:
  554. self.fail("Error trying to do accept after select.")
  555. def _testAccept(self):
  556. time.sleep(0.1)
  557. self.cli.connect((HOST, PORT))
  558. def testConnect(self):
  559. # Testing non-blocking connect
  560. conn, addr = self.serv.accept()
  561. def _testConnect(self):
  562. self.cli.settimeout(10)
  563. self.cli.connect((HOST, PORT))
  564. def testRecv(self):
  565. # Testing non-blocking recv
  566. conn, addr = self.serv.accept()
  567. conn.setblocking(0)
  568. try:
  569. msg = conn.recv(len(MSG))
  570. except socket.error:
  571. pass
  572. else:
  573. self.fail("Error trying to do non-blocking recv.")
  574. read, write, err = select.select([conn], [], [])
  575. if conn in read:
  576. msg = conn.recv(len(MSG))
  577. self.assertEqual(msg, MSG)
  578. else:
  579. self.fail("Error during select call to non-blocking socket.")
  580. def _testRecv(self):
  581. self.cli.connect((HOST, PORT))
  582. time.sleep(0.1)
  583. self.cli.send(MSG)
  584. class FileObjectClassTestCase(SocketConnectedTest):
  585. bufsize = -1 # Use default buffer size
  586. def __init__(self, methodName='runTest'):
  587. SocketConnectedTest.__init__(self, methodName=methodName)
  588. def setUp(self):
  589. SocketConnectedTest.setUp(self)
  590. self.serv_file = self.cli_conn.makefile('rb', self.bufsize)
  591. def tearDown(self):
  592. self.serv_file.close()
  593. self.assert_(self.serv_file.closed)
  594. self.serv_file = None
  595. SocketConnectedTest.tearDown(self)
  596. def clientSetUp(self):
  597. SocketConnectedTest.clientSetUp(self)
  598. self.cli_file = self.serv_conn.makefile('wb')
  599. def clientTearDown(self):
  600. self.cli_file.close()
  601. self.assert_(self.cli_file.closed)
  602. self.cli_file = None
  603. SocketConnectedTest.clientTearDown(self)
  604. def testSmallRead(self):
  605. # Performing small file read test
  606. first_seg = self.serv_file.read(len(MSG)-3)
  607. second_seg = self.serv_file.read(3)
  608. msg = first_seg + second_seg
  609. self.assertEqual(msg, MSG)
  610. def _testSmallRead(self):
  611. self.cli_file.write(MSG)
  612. self.cli_file.flush()
  613. def testFullRead(self):
  614. # read until EOF
  615. msg = self.serv_file.read()
  616. self.assertEqual(msg, MSG)
  617. def _testFullRead(self):
  618. self.cli_file.write(MSG)
  619. self.cli_file.close()
  620. def testUnbufferedRead(self):
  621. # Performing unbuffered file read test
  622. buf = ''
  623. while 1:
  624. char = self.serv_file.read(1)
  625. if not char:
  626. break
  627. buf += char
  628. self.assertEqual(buf, MSG)
  629. def _testUnbufferedRead(self):
  630. self.cli_file.write(MSG)
  631. self.cli_file.flush()
  632. def testReadline(self):
  633. # Performing file readline test
  634. line = self.serv_file.readline()
  635. self.assertEqual(line, MSG)
  636. def _testReadline(self):
  637. self.cli_file.write(MSG)
  638. self.cli_file.flush()
  639. def testClosedAttr(self):
  640. self.assert_(not self.serv_file.closed)
  641. def _testClosedAttr(self):
  642. self.assert_(not self.cli_file.closed)
  643. class UnbufferedFileObjectClassTestCase(FileObjectClassTestCase):
  644. """Repeat the tests from FileObjectClassTestCase with bufsize==0.
  645. In this case (and in this case only), it should be possible to
  646. create a file object, read a line from it, create another file
  647. object, read another line from it, without loss of data in the
  648. first file object's buffer. Note that httplib relies on this
  649. when reading multiple requests from the same socket."""
  650. bufsize = 0 # Use unbuffered mode
  651. def testUnbufferedReadline(self):
  652. # Read a line, create a new file object, read another line with it
  653. line = self.serv_file.readline() # first line
  654. self.assertEqual(line, "A. " + MSG) # first line
  655. self.serv_file = self.cli_conn.makefile('rb', 0)
  656. line = self.serv_file.readline() # second line
  657. self.assertEqual(line, "B. " + MSG) # second line
  658. def _testUnbufferedReadline(self):
  659. self.cli_file.write("A. " + MSG)
  660. self.cli_file.write("B. " + MSG)
  661. self.cli_file.flush()
  662. class LineBufferedFileObjectClassTestCase(FileObjectClassTestCase):
  663. bufsize = 1 # Default-buffered for reading; line-buffered for writing
  664. class SmallBufferedFileObjectClassTestCase(FileObjectClassTestCase):
  665. bufsize = 2 # Exercise the buffering code
  666. class Urllib2FileobjectTest(unittest.TestCase):
  667. # urllib2.HTTPHandler has "borrowed" socket._fileobject, and requires that
  668. # it close the socket if the close c'tor argument is true
  669. def testClose(self):
  670. class MockSocket:
  671. closed = False
  672. def flush(self): pass
  673. def close(self): self.closed = True
  674. def _drop(self): pass
  675. def _reuse(self): pass
  676. # must not close unless we request it: the original use of _fileobject
  677. # by module socket requires that the underlying socket not be closed until
  678. # the _socketobject that created the _fileobject is closed
  679. s = MockSocket()
  680. f = socket._fileobject(s)
  681. f.close()
  682. self.assert_(not s.closed)
  683. s = MockSocket()
  684. f = socket._fileobject(s, close=True)
  685. f.close()
  686. self.assert_(s.closed)
  687. class TCPTimeoutTest(SocketTCPTest):
  688. def testTCPTimeout(self):
  689. def raise_timeout(*args, **kwargs):
  690. self.serv.settimeout(1.0)
  691. self.serv.accept()
  692. self.failUnlessRaises(socket.timeout, raise_timeout,
  693. "Error generating a timeout exception (TCP)")
  694. def testTimeoutZero(self):
  695. ok = False
  696. try:
  697. self.serv.settimeout(0.0)
  698. foo = self.serv.accept()
  699. except socket.timeout:
  700. self.fail("caught timeout instead of error (TCP)")
  701. except socket.error:
  702. ok = True
  703. except:
  704. self.fail("caught unexpected exception (TCP)")
  705. if not ok:
  706. self.fail("accept() returned success when we did not expect it")
  707. def testInterruptedTimeout(self):
  708. # XXX I don't know how to do this test on MSWindows or any other
  709. # plaform that doesn't support signal.alarm() or os.kill(), though
  710. # the bug should have existed on all platforms.
  711. if not hasattr(signal, "alarm"):
  712. return # can only test on *nix
  713. self.serv.settimeout(5.0) # must be longer than alarm
  714. class Alarm(Exception):
  715. pass
  716. def alarm_handler(signal, frame):
  717. raise Alarm
  718. old_alarm = signal.signal(signal.SIGALRM, alarm_handler)
  719. try:
  720. signal.alarm(2) # POSIX allows alarm to be up to 1 second early
  721. try:
  722. foo = self.serv.accept()
  723. except socket.timeout:
  724. self.fail("caught timeout instead of Alarm")
  725. except Alarm:
  726. pass
  727. except:
  728. self.fail("caught other exception instead of Alarm")
  729. else:
  730. self.fail("nothing caught")
  731. signal.alarm(0) # shut off alarm
  732. except Alarm:
  733. self.fail("got Alarm in wrong place")
  734. finally:
  735. # no alarm can be pending. Safe to restore old handler.
  736. signal.signal(signal.SIGALRM, old_alarm)
  737. class UDPTimeoutTest(SocketTCPTest):
  738. def testUDPTimeout(self):
  739. def raise_timeout(*args, **kwargs):
  740. self.serv.settimeout(1.0)
  741. self.serv.recv(1024)
  742. self.failUnlessRaises(socket.timeout, raise_timeout,
  743. "Error generating a timeout exception (UDP)")
  744. def testTimeoutZero(self):
  745. ok = False
  746. try:
  747. self.serv.settimeout(0.0)
  748. foo = self.serv.recv(1024)
  749. except socket.timeout:
  750. self.fail("caught timeout instead of error (UDP)")
  751. except socket.error:
  752. ok = True
  753. except:
  754. self.fail("caught unexpected exception (UDP)")
  755. if not ok:
  756. self.fail("recv() returned success when we did not expect it")
  757. class TestExceptions(unittest.TestCase):
  758. def testExceptionTree(self):
  759. self.assert_(issubclass(socket.error, Exception))
  760. self.assert_(issubclass(socket.herror, socket.error))
  761. self.assert_(issubclass(socket.gaierror, socket.error))
  762. self.assert_(issubclass(socket.timeout, socket.error))
  763. class TestLinuxAbstractNamespace(unittest.TestCase):
  764. UNIX_PATH_MAX = 108
  765. def testLinuxAbstractNamespace(self):
  766. address = "\x00python-test-hello\x00\xff"
  767. s1 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  768. s1.bind(address)
  769. s1.listen(1)
  770. s2 = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  771. s2.connect(s1.getsockname())
  772. s1.accept()
  773. self.assertEqual(s1.getsockname(), address)
  774. self.assertEqual(s2.getpeername(), address)
  775. def testMaxName(self):
  776. address = "\x00" + "h" * (self.UNIX_PATH_MAX - 1)
  777. s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  778. s.bind(address)
  779. self.assertEqual(s.getsockname(), address)
  780. def testNameOverflow(self):
  781. address = "\x00" + "h" * self.UNIX_PATH_MAX
  782. s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
  783. self.assertRaises(socket.error, s.bind, address)
  784. class BufferIOTest(SocketConnectedTest):
  785. """
  786. Test the buffer versions of socket.recv() and socket.send().
  787. """
  788. def __init__(self, methodName='runTest'):
  789. SocketConnectedTest.__init__(self, methodName=methodName)
  790. def testRecvInto(self):
  791. buf = array.array('c', ' '*1024)
  792. nbytes = self.cli_conn.recv_into(buf)
  793. self.assertEqual(nbytes, len(MSG))
  794. msg = buf.tostring()[:len(MSG)]
  795. self.assertEqual(msg, MSG)
  796. def _testRecvInto(self):
  797. buf = buffer(MSG)
  798. self.serv_conn.send(buf)
  799. def testRecvFromInto(self):
  800. buf = array.array('c', ' '*1024)
  801. nbytes, addr = self.cli_conn.recvfrom_into(buf)
  802. self.assertEqual(nbytes, len(MSG))
  803. msg = buf.tostring()[:len(MSG)]
  804. self.assertEqual(msg, MSG)
  805. def _testRecvFromInto(self):
  806. buf = buffer(MSG)
  807. self.serv_conn.send(buf)
  808. def test_main():
  809. tests = [GeneralModuleTests, BasicTCPTest, TCPCloserTest, TCPTimeoutTest,
  810. TestExceptions, BufferIOTest]
  811. if sys.platform != 'mac':
  812. tests.extend([ BasicUDPTest, UDPTimeoutTest ])
  813. tests.extend([
  814. NonBlockingTCPTests,
  815. FileObjectClassTestCase,
  816. UnbufferedFileObjectClassTestCase,
  817. LineBufferedFileObjectClassTestCase,
  818. SmallBufferedFileObjectClassTestCase,
  819. Urllib2FileobjectTest,
  820. ])
  821. if hasattr(socket, "socketpair"):
  822. tests.append(BasicSocketPairTest)
  823. if sys.platform == 'linux2':
  824. tests.append(TestLinuxAbstractNamespace)
  825. thread_info = test_support.threading_setup()
  826. test_support.run_unittest(*tests)
  827. test_support.threading_cleanup(*thread_info)
  828. if __name__ == "__main__":
  829. test_main()