PageRenderTime 40ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/Lib/test/test_kqueue.py

https://gitlab.com/unofficial-mirrors/cpython
Python | 239 lines | 194 code | 33 blank | 12 comment | 12 complexity | 8105d0a9bc590968286a9b68a11a274b MD5 | raw file
  1. """
  2. Tests for kqueue wrapper.
  3. """
  4. import errno
  5. import os
  6. import select
  7. import socket
  8. import time
  9. import unittest
  10. if not hasattr(select, "kqueue"):
  11. raise unittest.SkipTest("test works only on BSD")
  12. class TestKQueue(unittest.TestCase):
  13. def test_create_queue(self):
  14. kq = select.kqueue()
  15. self.assertTrue(kq.fileno() > 0, kq.fileno())
  16. self.assertTrue(not kq.closed)
  17. kq.close()
  18. self.assertTrue(kq.closed)
  19. self.assertRaises(ValueError, kq.fileno)
  20. def test_create_event(self):
  21. from operator import lt, le, gt, ge
  22. fd = os.open(os.devnull, os.O_WRONLY)
  23. self.addCleanup(os.close, fd)
  24. ev = select.kevent(fd)
  25. other = select.kevent(1000)
  26. self.assertEqual(ev.ident, fd)
  27. self.assertEqual(ev.filter, select.KQ_FILTER_READ)
  28. self.assertEqual(ev.flags, select.KQ_EV_ADD)
  29. self.assertEqual(ev.fflags, 0)
  30. self.assertEqual(ev.data, 0)
  31. self.assertEqual(ev.udata, 0)
  32. self.assertEqual(ev, ev)
  33. self.assertNotEqual(ev, other)
  34. self.assertTrue(ev < other)
  35. self.assertTrue(other >= ev)
  36. for op in lt, le, gt, ge:
  37. self.assertRaises(TypeError, op, ev, None)
  38. self.assertRaises(TypeError, op, ev, 1)
  39. self.assertRaises(TypeError, op, ev, "ev")
  40. ev = select.kevent(fd, select.KQ_FILTER_WRITE)
  41. self.assertEqual(ev.ident, fd)
  42. self.assertEqual(ev.filter, select.KQ_FILTER_WRITE)
  43. self.assertEqual(ev.flags, select.KQ_EV_ADD)
  44. self.assertEqual(ev.fflags, 0)
  45. self.assertEqual(ev.data, 0)
  46. self.assertEqual(ev.udata, 0)
  47. self.assertEqual(ev, ev)
  48. self.assertNotEqual(ev, other)
  49. ev = select.kevent(fd, select.KQ_FILTER_WRITE, select.KQ_EV_ONESHOT)
  50. self.assertEqual(ev.ident, fd)
  51. self.assertEqual(ev.filter, select.KQ_FILTER_WRITE)
  52. self.assertEqual(ev.flags, select.KQ_EV_ONESHOT)
  53. self.assertEqual(ev.fflags, 0)
  54. self.assertEqual(ev.data, 0)
  55. self.assertEqual(ev.udata, 0)
  56. self.assertEqual(ev, ev)
  57. self.assertNotEqual(ev, other)
  58. ev = select.kevent(1, 2, 3, 4, 5, 6)
  59. self.assertEqual(ev.ident, 1)
  60. self.assertEqual(ev.filter, 2)
  61. self.assertEqual(ev.flags, 3)
  62. self.assertEqual(ev.fflags, 4)
  63. self.assertEqual(ev.data, 5)
  64. self.assertEqual(ev.udata, 6)
  65. self.assertEqual(ev, ev)
  66. self.assertNotEqual(ev, other)
  67. bignum = 0x7fff
  68. ev = select.kevent(bignum, 1, 2, 3, bignum - 1, bignum)
  69. self.assertEqual(ev.ident, bignum)
  70. self.assertEqual(ev.filter, 1)
  71. self.assertEqual(ev.flags, 2)
  72. self.assertEqual(ev.fflags, 3)
  73. self.assertEqual(ev.data, bignum - 1)
  74. self.assertEqual(ev.udata, bignum)
  75. self.assertEqual(ev, ev)
  76. self.assertNotEqual(ev, other)
  77. # Issue 11973
  78. bignum = 0xffff
  79. ev = select.kevent(0, 1, bignum)
  80. self.assertEqual(ev.ident, 0)
  81. self.assertEqual(ev.filter, 1)
  82. self.assertEqual(ev.flags, bignum)
  83. self.assertEqual(ev.fflags, 0)
  84. self.assertEqual(ev.data, 0)
  85. self.assertEqual(ev.udata, 0)
  86. self.assertEqual(ev, ev)
  87. self.assertNotEqual(ev, other)
  88. # Issue 11973
  89. bignum = 0xffffffff
  90. ev = select.kevent(0, 1, 2, bignum)
  91. self.assertEqual(ev.ident, 0)
  92. self.assertEqual(ev.filter, 1)
  93. self.assertEqual(ev.flags, 2)
  94. self.assertEqual(ev.fflags, bignum)
  95. self.assertEqual(ev.data, 0)
  96. self.assertEqual(ev.udata, 0)
  97. self.assertEqual(ev, ev)
  98. self.assertNotEqual(ev, other)
  99. def test_queue_event(self):
  100. serverSocket = socket.socket()
  101. serverSocket.bind(('127.0.0.1', 0))
  102. serverSocket.listen()
  103. client = socket.socket()
  104. client.setblocking(False)
  105. try:
  106. client.connect(('127.0.0.1', serverSocket.getsockname()[1]))
  107. except OSError as e:
  108. self.assertEqual(e.args[0], errno.EINPROGRESS)
  109. else:
  110. #raise AssertionError("Connect should have raised EINPROGRESS")
  111. pass # FreeBSD doesn't raise an exception here
  112. server, addr = serverSocket.accept()
  113. kq = select.kqueue()
  114. kq2 = select.kqueue.fromfd(kq.fileno())
  115. ev = select.kevent(server.fileno(),
  116. select.KQ_FILTER_WRITE,
  117. select.KQ_EV_ADD | select.KQ_EV_ENABLE)
  118. kq.control([ev], 0)
  119. ev = select.kevent(server.fileno(),
  120. select.KQ_FILTER_READ,
  121. select.KQ_EV_ADD | select.KQ_EV_ENABLE)
  122. kq.control([ev], 0)
  123. ev = select.kevent(client.fileno(),
  124. select.KQ_FILTER_WRITE,
  125. select.KQ_EV_ADD | select.KQ_EV_ENABLE)
  126. kq2.control([ev], 0)
  127. ev = select.kevent(client.fileno(),
  128. select.KQ_FILTER_READ,
  129. select.KQ_EV_ADD | select.KQ_EV_ENABLE)
  130. kq2.control([ev], 0)
  131. events = kq.control(None, 4, 1)
  132. events = set((e.ident, e.filter) for e in events)
  133. self.assertEqual(events, set([
  134. (client.fileno(), select.KQ_FILTER_WRITE),
  135. (server.fileno(), select.KQ_FILTER_WRITE)]))
  136. client.send(b"Hello!")
  137. server.send(b"world!!!")
  138. # We may need to call it several times
  139. for i in range(10):
  140. events = kq.control(None, 4, 1)
  141. if len(events) == 4:
  142. break
  143. time.sleep(1.0)
  144. else:
  145. self.fail('timeout waiting for event notifications')
  146. events = set((e.ident, e.filter) for e in events)
  147. self.assertEqual(events, set([
  148. (client.fileno(), select.KQ_FILTER_WRITE),
  149. (client.fileno(), select.KQ_FILTER_READ),
  150. (server.fileno(), select.KQ_FILTER_WRITE),
  151. (server.fileno(), select.KQ_FILTER_READ)]))
  152. # Remove completely client, and server read part
  153. ev = select.kevent(client.fileno(),
  154. select.KQ_FILTER_WRITE,
  155. select.KQ_EV_DELETE)
  156. kq.control([ev], 0)
  157. ev = select.kevent(client.fileno(),
  158. select.KQ_FILTER_READ,
  159. select.KQ_EV_DELETE)
  160. kq.control([ev], 0)
  161. ev = select.kevent(server.fileno(),
  162. select.KQ_FILTER_READ,
  163. select.KQ_EV_DELETE)
  164. kq.control([ev], 0, 0)
  165. events = kq.control([], 4, 0.99)
  166. events = set((e.ident, e.filter) for e in events)
  167. self.assertEqual(events, set([
  168. (server.fileno(), select.KQ_FILTER_WRITE)]))
  169. client.close()
  170. server.close()
  171. serverSocket.close()
  172. def testPair(self):
  173. kq = select.kqueue()
  174. a, b = socket.socketpair()
  175. a.send(b'foo')
  176. event1 = select.kevent(a, select.KQ_FILTER_READ, select.KQ_EV_ADD | select.KQ_EV_ENABLE)
  177. event2 = select.kevent(b, select.KQ_FILTER_READ, select.KQ_EV_ADD | select.KQ_EV_ENABLE)
  178. r = kq.control([event1, event2], 1, 1)
  179. self.assertTrue(r)
  180. self.assertFalse(r[0].flags & select.KQ_EV_ERROR)
  181. self.assertEqual(b.recv(r[0].data), b'foo')
  182. a.close()
  183. b.close()
  184. kq.close()
  185. def test_close(self):
  186. open_file = open(__file__, "rb")
  187. self.addCleanup(open_file.close)
  188. fd = open_file.fileno()
  189. kqueue = select.kqueue()
  190. # test fileno() method and closed attribute
  191. self.assertIsInstance(kqueue.fileno(), int)
  192. self.assertFalse(kqueue.closed)
  193. # test close()
  194. kqueue.close()
  195. self.assertTrue(kqueue.closed)
  196. self.assertRaises(ValueError, kqueue.fileno)
  197. # close() can be called more than once
  198. kqueue.close()
  199. # operations must fail with ValueError("I/O operation on closed ...")
  200. self.assertRaises(ValueError, kqueue.control, None, 4)
  201. def test_fd_non_inheritable(self):
  202. kqueue = select.kqueue()
  203. self.addCleanup(kqueue.close)
  204. self.assertEqual(os.get_inheritable(kqueue.fileno()), False)
  205. if __name__ == "__main__":
  206. unittest.main()