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