blob: 110c006862737bdc657df40a95aa54f8d7c4ef44 [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
Victor Stinnerdaf45552013-08-28 00:53:59 +02008import unittest
Serhiy Storchakae437a102016-04-24 21:41:02 +03009from test.support import run_unittest, cpython_only
Jesus Cead8b9ae62011-11-14 19:07:41 +010010
Jesus Ceada251092014-04-29 18:18:37 +020011if not hasattr(select, 'devpoll') :
12 raise unittest.SkipTest('test works only on Solaris OS family')
Jesus Cead8b9ae62011-11-14 19:07:41 +010013
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
Victor Stinner13423c32013-08-22 00:19:50 +020091 def test_close(self):
92 open_file = open(__file__, "rb")
93 self.addCleanup(open_file.close)
94 fd = open_file.fileno()
95 devpoll = select.devpoll()
96
97 # test fileno() method and closed attribute
98 self.assertIsInstance(devpoll.fileno(), int)
99 self.assertFalse(devpoll.closed)
100
101 # test close()
102 devpoll.close()
103 self.assertTrue(devpoll.closed)
104 self.assertRaises(ValueError, devpoll.fileno)
105
106 # close() can be called more than once
107 devpoll.close()
108
109 # operations must fail with ValueError("I/O operation on closed ...")
110 self.assertRaises(ValueError, devpoll.modify, fd, select.POLLIN)
111 self.assertRaises(ValueError, devpoll.poll)
Miss Islington (bot)b4808c12019-09-11 07:37:38 -0700112 self.assertRaises(ValueError, devpoll.register, fd, select.POLLIN)
Victor Stinner13423c32013-08-22 00:19:50 +0200113 self.assertRaises(ValueError, devpoll.unregister, fd)
114
Victor Stinnerdaf45552013-08-28 00:53:59 +0200115 def test_fd_non_inheritable(self):
116 devpoll = select.devpoll()
117 self.addCleanup(devpoll.close)
118 self.assertEqual(os.get_inheritable(devpoll.fileno()), False)
119
Serhiy Storchaka5da107a2013-12-14 19:12:02 +0200120 def test_events_mask_overflow(self):
121 pollster = select.devpoll()
122 w, r = os.pipe()
123 pollster.register(w)
124 # Issue #17919
Miss Islington (bot)b4808c12019-09-11 07:37:38 -0700125 self.assertRaises(ValueError, pollster.register, 0, -1)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200126 self.assertRaises(OverflowError, pollster.register, 0, 1 << 64)
Miss Islington (bot)b4808c12019-09-11 07:37:38 -0700127 self.assertRaises(ValueError, pollster.modify, 1, -1)
Serhiy Storchaka5cfc79d2014-02-07 10:06:39 +0200128 self.assertRaises(OverflowError, pollster.modify, 1, 1 << 64)
129
130 @cpython_only
131 def test_events_mask_overflow_c_limits(self):
132 from _testcapi import USHRT_MAX
133 pollster = select.devpoll()
134 w, r = os.pipe()
135 pollster.register(w)
136 # Issue #17919
137 self.assertRaises(OverflowError, pollster.register, 0, USHRT_MAX + 1)
Serhiy Storchaka5da107a2013-12-14 19:12:02 +0200138 self.assertRaises(OverflowError, pollster.modify, 1, USHRT_MAX + 1)
139
140
Jesus Cead8b9ae62011-11-14 19:07:41 +0100141def test_main():
142 run_unittest(DevPollTests)
143
144if __name__ == '__main__':
145 test_main()