blob: 819d9dc8832bcd1191845528b7ce18644ec465ad [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
Christian Heimese9b034b2013-12-16 13:27:16 +01007from _testcapi import USHRT_MAX
Jesus Cead8b9ae62011-11-14 19:07:41 +01008
9try:
10 select.devpoll
11except AttributeError:
12 raise unittest.SkipTest("select.devpoll not defined -- skipping test_devpoll")
13
14
15def find_ready_matching(ready, flag):
16 match = []
17 for fd, mode in ready:
18 if mode & flag:
19 match.append(fd)
20 return match
21
22class DevPollTests(unittest.TestCase):
23
24 def test_devpoll1(self):
25 # Basic functional test of poll object
26 # Create a bunch of pipe and test that poll works with them.
27
28 p = select.devpoll()
29
30 NUM_PIPES = 12
31 MSG = b" This is a test."
32 MSG_LEN = len(MSG)
33 readers = []
34 writers = []
35 r2w = {}
36 w2r = {}
37
38 for i in range(NUM_PIPES):
39 rd, wr = os.pipe()
40 p.register(rd)
41 p.modify(rd, select.POLLIN)
42 p.register(wr, select.POLLOUT)
43 readers.append(rd)
44 writers.append(wr)
45 r2w[rd] = wr
46 w2r[wr] = rd
47
48 bufs = []
49
50 while writers:
51 ready = p.poll()
52 ready_writers = find_ready_matching(ready, select.POLLOUT)
53 if not ready_writers:
54 self.fail("no pipes ready for writing")
55 wr = random.choice(ready_writers)
56 os.write(wr, MSG)
57
58 ready = p.poll()
59 ready_readers = find_ready_matching(ready, select.POLLIN)
60 if not ready_readers:
61 self.fail("no pipes ready for reading")
62 self.assertEqual([w2r[wr]], ready_readers)
63 rd = ready_readers[0]
64 buf = os.read(rd, MSG_LEN)
65 self.assertEqual(len(buf), MSG_LEN)
66 bufs.append(buf)
67 os.close(r2w[rd]) ; os.close(rd)
68 p.unregister(r2w[rd])
69 p.unregister(rd)
70 writers.remove(r2w[rd])
71
72 self.assertEqual(bufs, [MSG] * NUM_PIPES)
73
74 def test_timeout_overflow(self):
75 pollster = select.devpoll()
76 w, r = os.pipe()
77 pollster.register(w)
78
79 pollster.poll(-1)
80 self.assertRaises(OverflowError, pollster.poll, -2)
81 self.assertRaises(OverflowError, pollster.poll, -1 << 31)
82 self.assertRaises(OverflowError, pollster.poll, -1 << 64)
83
84 pollster.poll(0)
85 pollster.poll(1)
86 pollster.poll(1 << 30)
87 self.assertRaises(OverflowError, pollster.poll, 1 << 31)
88 self.assertRaises(OverflowError, pollster.poll, 1 << 63)
89 self.assertRaises(OverflowError, pollster.poll, 1 << 64)
90
Serhiy Storchaka5da107a2013-12-14 19:12:02 +020091 def test_events_mask_overflow(self):
92 pollster = select.devpoll()
93 w, r = os.pipe()
94 pollster.register(w)
95 # Issue #17919
96 self.assertRaises(OverflowError, pollster.register, 0, -1)
97 self.assertRaises(OverflowError, pollster.register, 0, USHRT_MAX + 1)
98 self.assertRaises(OverflowError, pollster.modify, 1, -1)
99 self.assertRaises(OverflowError, pollster.modify, 1, USHRT_MAX + 1)
100
101
Jesus Cead8b9ae62011-11-14 19:07:41 +0100102def test_main():
103 run_unittest(DevPollTests)
104
105if __name__ == '__main__':
106 test_main()