PageRenderTime 36ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/Lib/test/test_devpoll.py

https://gitlab.com/unofficial-mirrors/cpython
Python | 145 lines | 107 code | 28 blank | 10 comment | 9 complexity | 16e244511b935c8c5471c3482f7a73ed MD5 | raw file
  1. # Test case for the select.devpoll() function
  2. # Initial tests are copied as is from "test_poll.py"
  3. import os
  4. import random
  5. import select
  6. import unittest
  7. from test.support import run_unittest, cpython_only
  8. if not hasattr(select, 'devpoll') :
  9. raise unittest.SkipTest('test works only on Solaris OS family')
  10. def find_ready_matching(ready, flag):
  11. match = []
  12. for fd, mode in ready:
  13. if mode & flag:
  14. match.append(fd)
  15. return match
  16. class DevPollTests(unittest.TestCase):
  17. def test_devpoll1(self):
  18. # Basic functional test of poll object
  19. # Create a bunch of pipe and test that poll works with them.
  20. p = select.devpoll()
  21. NUM_PIPES = 12
  22. MSG = b" This is a test."
  23. MSG_LEN = len(MSG)
  24. readers = []
  25. writers = []
  26. r2w = {}
  27. w2r = {}
  28. for i in range(NUM_PIPES):
  29. rd, wr = os.pipe()
  30. p.register(rd)
  31. p.modify(rd, select.POLLIN)
  32. p.register(wr, select.POLLOUT)
  33. readers.append(rd)
  34. writers.append(wr)
  35. r2w[rd] = wr
  36. w2r[wr] = rd
  37. bufs = []
  38. while writers:
  39. ready = p.poll()
  40. ready_writers = find_ready_matching(ready, select.POLLOUT)
  41. if not ready_writers:
  42. self.fail("no pipes ready for writing")
  43. wr = random.choice(ready_writers)
  44. os.write(wr, MSG)
  45. ready = p.poll()
  46. ready_readers = find_ready_matching(ready, select.POLLIN)
  47. if not ready_readers:
  48. self.fail("no pipes ready for reading")
  49. self.assertEqual([w2r[wr]], ready_readers)
  50. rd = ready_readers[0]
  51. buf = os.read(rd, MSG_LEN)
  52. self.assertEqual(len(buf), MSG_LEN)
  53. bufs.append(buf)
  54. os.close(r2w[rd]) ; os.close(rd)
  55. p.unregister(r2w[rd])
  56. p.unregister(rd)
  57. writers.remove(r2w[rd])
  58. self.assertEqual(bufs, [MSG] * NUM_PIPES)
  59. def test_timeout_overflow(self):
  60. pollster = select.devpoll()
  61. w, r = os.pipe()
  62. pollster.register(w)
  63. pollster.poll(-1)
  64. self.assertRaises(OverflowError, pollster.poll, -2)
  65. self.assertRaises(OverflowError, pollster.poll, -1 << 31)
  66. self.assertRaises(OverflowError, pollster.poll, -1 << 64)
  67. pollster.poll(0)
  68. pollster.poll(1)
  69. pollster.poll(1 << 30)
  70. self.assertRaises(OverflowError, pollster.poll, 1 << 31)
  71. self.assertRaises(OverflowError, pollster.poll, 1 << 63)
  72. self.assertRaises(OverflowError, pollster.poll, 1 << 64)
  73. def test_close(self):
  74. open_file = open(__file__, "rb")
  75. self.addCleanup(open_file.close)
  76. fd = open_file.fileno()
  77. devpoll = select.devpoll()
  78. # test fileno() method and closed attribute
  79. self.assertIsInstance(devpoll.fileno(), int)
  80. self.assertFalse(devpoll.closed)
  81. # test close()
  82. devpoll.close()
  83. self.assertTrue(devpoll.closed)
  84. self.assertRaises(ValueError, devpoll.fileno)
  85. # close() can be called more than once
  86. devpoll.close()
  87. # operations must fail with ValueError("I/O operation on closed ...")
  88. self.assertRaises(ValueError, devpoll.modify, fd, select.POLLIN)
  89. self.assertRaises(ValueError, devpoll.poll)
  90. self.assertRaises(ValueError, devpoll.register, fd, fd, select.POLLIN)
  91. self.assertRaises(ValueError, devpoll.unregister, fd)
  92. def test_fd_non_inheritable(self):
  93. devpoll = select.devpoll()
  94. self.addCleanup(devpoll.close)
  95. self.assertEqual(os.get_inheritable(devpoll.fileno()), False)
  96. def test_events_mask_overflow(self):
  97. pollster = select.devpoll()
  98. w, r = os.pipe()
  99. pollster.register(w)
  100. # Issue #17919
  101. self.assertRaises(OverflowError, pollster.register, 0, -1)
  102. self.assertRaises(OverflowError, pollster.register, 0, 1 << 64)
  103. self.assertRaises(OverflowError, pollster.modify, 1, -1)
  104. self.assertRaises(OverflowError, pollster.modify, 1, 1 << 64)
  105. @cpython_only
  106. def test_events_mask_overflow_c_limits(self):
  107. from _testcapi import USHRT_MAX
  108. pollster = select.devpoll()
  109. w, r = os.pipe()
  110. pollster.register(w)
  111. # Issue #17919
  112. self.assertRaises(OverflowError, pollster.register, 0, USHRT_MAX + 1)
  113. self.assertRaises(OverflowError, pollster.modify, 1, USHRT_MAX + 1)
  114. def test_main():
  115. run_unittest(DevPollTests)
  116. if __name__ == '__main__':
  117. test_main()