blob: 40ebeee5975b65d1856bc572f1e671bb510251c9 [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
11
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
Victor Stinner13423c32013-08-22 00:19:50 +0200123
Jesus Cead8b9ae62011-11-14 19:07:41 +0100124def test_main():
125 run_unittest(DevPollTests)
126
127if __name__ == '__main__':
128 test_main()