blob: ec350cd4953a6b1907e982891b983996f3bc6726 [file] [log] [blame]
Jesus Cead8b9ae62011-11-14 19:07:41 +01001# Test case for the select.devpoll() function
2
3# Initial tests are copied as is from "test_poll.py"
4
5import os, select, random, unittest, sys
6from test.support import TESTFN, run_unittest
7
8try:
9 select.devpoll
10except AttributeError:
Brett Cannoncd8efa32012-11-14 15:16:53 -050011 raise unittest.SkipTest("select.devpoll not defined")
Jesus Cead8b9ae62011-11-14 19:07:41 +010012
13
14def find_ready_matching(ready, flag):
15 match = []
16 for fd, mode in ready:
17 if mode & flag:
18 match.append(fd)
19 return match
20
21class DevPollTests(unittest.TestCase):
22
23 def test_devpoll1(self):
24 # Basic functional test of poll object
25 # Create a bunch of pipe and test that poll works with them.
26
27 p = select.devpoll()
28
29 NUM_PIPES = 12
30 MSG = b" This is a test."
31 MSG_LEN = len(MSG)
32 readers = []
33 writers = []
34 r2w = {}
35 w2r = {}
36
37 for i in range(NUM_PIPES):
38 rd, wr = os.pipe()
39 p.register(rd)
40 p.modify(rd, select.POLLIN)
41 p.register(wr, select.POLLOUT)
42 readers.append(rd)
43 writers.append(wr)
44 r2w[rd] = wr
45 w2r[wr] = rd
46
47 bufs = []
48
49 while writers:
50 ready = p.poll()
51 ready_writers = find_ready_matching(ready, select.POLLOUT)
52 if not ready_writers:
53 self.fail("no pipes ready for writing")
54 wr = random.choice(ready_writers)
55 os.write(wr, MSG)
56
57 ready = p.poll()
58 ready_readers = find_ready_matching(ready, select.POLLIN)
59 if not ready_readers:
60 self.fail("no pipes ready for reading")
61 self.assertEqual([w2r[wr]], ready_readers)
62 rd = ready_readers[0]
63 buf = os.read(rd, MSG_LEN)
64 self.assertEqual(len(buf), MSG_LEN)
65 bufs.append(buf)
66 os.close(r2w[rd]) ; os.close(rd)
67 p.unregister(r2w[rd])
68 p.unregister(rd)
69 writers.remove(r2w[rd])
70
71 self.assertEqual(bufs, [MSG] * NUM_PIPES)
72
73 def test_timeout_overflow(self):
74 pollster = select.devpoll()
75 w, r = os.pipe()
76 pollster.register(w)
77
78 pollster.poll(-1)
79 self.assertRaises(OverflowError, pollster.poll, -2)
80 self.assertRaises(OverflowError, pollster.poll, -1 << 31)
81 self.assertRaises(OverflowError, pollster.poll, -1 << 64)
82
83 pollster.poll(0)
84 pollster.poll(1)
85 pollster.poll(1 << 30)
86 self.assertRaises(OverflowError, pollster.poll, 1 << 31)
87 self.assertRaises(OverflowError, pollster.poll, 1 << 63)
88 self.assertRaises(OverflowError, pollster.poll, 1 << 64)
89
90def test_main():
91 run_unittest(DevPollTests)
92
93if __name__ == '__main__':
94 test_main()