/Lib/test/test_poll.py

http://unladen-swallow.googlecode.com/ · Python · 157 lines · 119 code · 28 blank · 10 comment · 20 complexity · cd0e9bf3b7dde42cc0062cd23002ce23 MD5 · raw file

  1. # Test case for the os.poll() function
  2. import os, select, random, unittest
  3. from test.test_support import TestSkipped, TESTFN, run_unittest
  4. try:
  5. select.poll
  6. except AttributeError:
  7. raise TestSkipped, "select.poll not defined -- skipping test_poll"
  8. def find_ready_matching(ready, flag):
  9. match = []
  10. for fd, mode in ready:
  11. if mode & flag:
  12. match.append(fd)
  13. return match
  14. class PollTests(unittest.TestCase):
  15. def test_poll1(self):
  16. # Basic functional test of poll object
  17. # Create a bunch of pipe and test that poll works with them.
  18. p = select.poll()
  19. NUM_PIPES = 12
  20. MSG = " This is a test."
  21. MSG_LEN = len(MSG)
  22. readers = []
  23. writers = []
  24. r2w = {}
  25. w2r = {}
  26. for i in range(NUM_PIPES):
  27. rd, wr = os.pipe()
  28. p.register(rd)
  29. p.modify(rd, select.POLLIN)
  30. p.register(wr, select.POLLOUT)
  31. readers.append(rd)
  32. writers.append(wr)
  33. r2w[rd] = wr
  34. w2r[wr] = rd
  35. bufs = []
  36. while writers:
  37. ready = p.poll()
  38. ready_writers = find_ready_matching(ready, select.POLLOUT)
  39. if not ready_writers:
  40. raise RuntimeError, "no pipes ready for writing"
  41. wr = random.choice(ready_writers)
  42. os.write(wr, MSG)
  43. ready = p.poll()
  44. ready_readers = find_ready_matching(ready, select.POLLIN)
  45. if not ready_readers:
  46. raise RuntimeError, "no pipes ready for reading"
  47. rd = random.choice(ready_readers)
  48. buf = os.read(rd, MSG_LEN)
  49. self.assertEqual(len(buf), MSG_LEN)
  50. bufs.append(buf)
  51. os.close(r2w[rd]) ; os.close( rd )
  52. p.unregister( r2w[rd] )
  53. p.unregister( rd )
  54. writers.remove(r2w[rd])
  55. self.assertEqual(bufs, [MSG] * NUM_PIPES)
  56. def poll_unit_tests(self):
  57. # returns NVAL for invalid file descriptor
  58. FD = 42
  59. try:
  60. os.close(FD)
  61. except OSError:
  62. pass
  63. p = select.poll()
  64. p.register(FD)
  65. r = p.poll()
  66. self.assertEqual(r[0], (FD, select.POLLNVAL))
  67. f = open(TESTFN, 'w')
  68. fd = f.fileno()
  69. p = select.poll()
  70. p.register(f)
  71. r = p.poll()
  72. self.assertEqual(r[0][0], fd)
  73. f.close()
  74. r = p.poll()
  75. self.assertEqual(r[0], (fd, select.POLLNVAL))
  76. os.unlink(TESTFN)
  77. # type error for invalid arguments
  78. p = select.poll()
  79. self.assertRaises(TypeError, p.register, p)
  80. self.assertRaises(TypeError, p.unregister, p)
  81. # can't unregister non-existent object
  82. p = select.poll()
  83. self.assertRaises(KeyError, p.unregister, 3)
  84. # Test error cases
  85. pollster = select.poll()
  86. class Nope:
  87. pass
  88. class Almost:
  89. def fileno(self):
  90. return 'fileno'
  91. self.assertRaises(TypeError, pollster.register, Nope(), 0)
  92. self.assertRaises(TypeError, pollster.register, Almost(), 0)
  93. # Another test case for poll(). This is copied from the test case for
  94. # select(), modified to use poll() instead.
  95. def test_poll2(self):
  96. cmd = 'for i in 0 1 2 3 4 5 6 7 8 9; do echo testing...; sleep 1; done'
  97. p = os.popen(cmd, 'r')
  98. pollster = select.poll()
  99. pollster.register( p, select.POLLIN )
  100. for tout in (0, 1000, 2000, 4000, 8000, 16000) + (-1,)*10:
  101. fdlist = pollster.poll(tout)
  102. if (fdlist == []):
  103. continue
  104. fd, flags = fdlist[0]
  105. if flags & select.POLLHUP:
  106. line = p.readline()
  107. if line != "":
  108. self.fail('error: pipe seems to be closed, but still returns data')
  109. continue
  110. elif flags & select.POLLIN:
  111. line = p.readline()
  112. if not line:
  113. break
  114. continue
  115. else:
  116. self.fail('Unexpected return value from select.poll: %s' % fdlist)
  117. p.close()
  118. def test_poll3(self):
  119. # test int overflow
  120. pollster = select.poll()
  121. pollster.register(1)
  122. self.assertRaises(OverflowError, pollster.poll, 1L << 64)
  123. x = 2 + 3
  124. if x != 5:
  125. self.fail('Overflow must have occurred')
  126. def test_main():
  127. run_unittest(PollTests)
  128. if __name__ == '__main__':
  129. test_main()