blob: e634d3a3733b5c521a3411426a83dbe4b77c09c1 [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
Victor Stinnerdaf45552013-08-28 00:53:59 +02005import os
6import random
7import select
8import sys
9import unittest
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +020010from test.support import TESTFN, run_unittest, cpython_only
Jesus Cead8b9ae62011-11-14 19:07:41 +010011
12try:
13 select.devpoll
14except AttributeError:
Brett Cannoncd8efa32012-11-14 15:16:53 -050015 raise unittest.SkipTest("select.devpoll not defined")
Jesus Cead8b9ae62011-11-14 19:07:41 +010016
17
18def find_ready_matching(ready, flag):
19 match = []
20 for fd, mode in ready:
21 if mode & flag:
22 match.append(fd)
23 return match
24
25class DevPollTests(unittest.TestCase):
26
27 def test_devpoll1(self):
28 # Basic functional test of poll object
29 # Create a bunch of pipe and test that poll works with them.
30
31 p = select.devpoll()
32
33 NUM_PIPES = 12
34 MSG = b" This is a test."
35 MSG_LEN = len(MSG)
36 readers = []
37 writers = []
38 r2w = {}
39 w2r = {}
40
41 for i in range(NUM_PIPES):
42 rd, wr = os.pipe()
43 p.register(rd)
44 p.modify(rd, select.POLLIN)
45 p.register(wr, select.POLLOUT)
46 readers.append(rd)
47 writers.append(wr)
48 r2w[rd] = wr
49 w2r[wr] = rd
50
51 bufs = []
52
53 while writers:
54 ready = p.poll()
55 ready_writers = find_ready_matching(ready, select.POLLOUT)
56 if not ready_writers:
57 self.fail("no pipes ready for writing")
58 wr = random.choice(ready_writers)
59 os.write(wr, MSG)
60
61 ready = p.poll()
62 ready_readers = find_ready_matching(ready, select.POLLIN)
63 if not ready_readers:
64 self.fail("no pipes ready for reading")
65 self.assertEqual([w2r[wr]], ready_readers)
66 rd = ready_readers[0]
67 buf = os.read(rd, MSG_LEN)
68 self.assertEqual(len(buf), MSG_LEN)
69 bufs.append(buf)
70 os.close(r2w[rd]) ; os.close(rd)
71 p.unregister(r2w[rd])
72 p.unregister(rd)
73 writers.remove(r2w[rd])
74
75 self.assertEqual(bufs, [MSG] * NUM_PIPES)
76
77 def test_timeout_overflow(self):
78 pollster = select.devpoll()
79 w, r = os.pipe()
80 pollster.register(w)
81
82 pollster.poll(-1)
83 self.assertRaises(OverflowError, pollster.poll, -2)
84 self.assertRaises(OverflowError, pollster.poll, -1 << 31)
85 self.assertRaises(OverflowError, pollster.poll, -1 << 64)
86
87 pollster.poll(0)
88 pollster.poll(1)
89 pollster.poll(1 << 30)
90 self.assertRaises(OverflowError, pollster.poll, 1 << 31)
91 self.assertRaises(OverflowError, pollster.poll, 1 << 63)
92 self.assertRaises(OverflowError, pollster.poll, 1 << 64)
93
Victor Stinner13423c32013-08-22 00:19:50 +020094 def test_close(self):
95 open_file = open(__file__, "rb")
96 self.addCleanup(open_file.close)
97 fd = open_file.fileno()
98 devpoll = select.devpoll()
99
100 # test fileno() method and closed attribute
101 self.assertIsInstance(devpoll.fileno(), int)
102 self.assertFalse(devpoll.closed)
103
104 # test close()
105 devpoll.close()
106 self.assertTrue(devpoll.closed)
107 self.assertRaises(ValueError, devpoll.fileno)
108
109 # close() can be called more than once
110 devpoll.close()
111
112 # operations must fail with ValueError("I/O operation on closed ...")
113 self.assertRaises(ValueError, devpoll.modify, fd, select.POLLIN)
114 self.assertRaises(ValueError, devpoll.poll)
115 self.assertRaises(ValueError, devpoll.register, fd, fd, select.POLLIN)
116 self.assertRaises(ValueError, devpoll.unregister, fd)
117
Victor Stinnerdaf45552013-08-28 00:53:59 +0200118 def test_fd_non_inheritable(self):
119 devpoll = select.devpoll()
120 self.addCleanup(devpoll.close)
121 self.assertEqual(os.get_inheritable(devpoll.fileno()), False)
122
Serhiy Storchaka5da107a2013-12-14 19:12:02 +0200123 def test_events_mask_overflow(self):
124 pollster = select.devpoll()
125 w, r = os.pipe()
126 pollster.register(w)
127 # Issue #17919
128 self.assertRaises(OverflowError, pollster.register, 0, -1)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200129 self.assertRaises(OverflowError, pollster.register, 0, 1 << 64)
Serhiy Storchaka5da107a2013-12-14 19:12:02 +0200130 self.assertRaises(OverflowError, pollster.modify, 1, -1)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200131 self.assertRaises(OverflowError, pollster.modify, 1, 1 << 64)
132
133 @cpython_only
134 def test_events_mask_overflow_c_limits(self):
135 from _testcapi import USHRT_MAX
136 pollster = select.devpoll()
137 w, r = os.pipe()
138 pollster.register(w)
139 # Issue #17919
140 self.assertRaises(OverflowError, pollster.register, 0, USHRT_MAX + 1)
Serhiy Storchaka5da107a2013-12-14 19:12:02 +0200141 self.assertRaises(OverflowError, pollster.modify, 1, USHRT_MAX + 1)
142
143
Jesus Cead8b9ae62011-11-14 19:07:41 +0100144def test_main():
145 run_unittest(DevPollTests)
146
147if __name__ == '__main__':
148 test_main()