blob: f63564e6b0ee6dc180829c4c2658b85db98dca37 [file] [log] [blame]
Victor Stinner21d29c32011-10-12 21:01:46 +02001import errno
Barry Warsaw792c94a1996-12-11 23:58:46 +00002import os
Victor Stinner21d29c32011-10-12 21:01:46 +02003import select
Victor Stinner7f14a372020-12-15 18:06:36 +01004import subprocess
Christian Heimesdd15f6c2008-03-16 00:07:10 +00005import sys
Victor Stinner7f14a372020-12-15 18:06:36 +01006import textwrap
Victor Stinner21d29c32011-10-12 21:01:46 +02007import unittest
8from test import support
Barry Warsaw792c94a1996-12-11 23:58:46 +00009
Christian Heimesde0b9622012-11-19 00:59:39 +010010@unittest.skipIf((sys.platform[:3]=='win'),
Benjamin Petersond856ab62010-04-06 21:55:16 +000011 "can't easily test on this system")
Christian Heimesdd15f6c2008-03-16 00:07:10 +000012class SelectTestCase(unittest.TestCase):
Barry Warsaw792c94a1996-12-11 23:58:46 +000013
Christian Heimesdd15f6c2008-03-16 00:07:10 +000014 class Nope:
15 pass
Barry Warsaw792c94a1996-12-11 23:58:46 +000016
Christian Heimesdd15f6c2008-03-16 00:07:10 +000017 class Almost:
18 def fileno(self):
19 return 'fileno'
Fred Drake004d5e62000-10-23 17:22:08 +000020
Christian Heimesdd15f6c2008-03-16 00:07:10 +000021 def test_error_conditions(self):
22 self.assertRaises(TypeError, select.select, 1, 2, 3)
23 self.assertRaises(TypeError, select.select, [self.Nope()], [], [])
24 self.assertRaises(TypeError, select.select, [self.Almost()], [], [])
25 self.assertRaises(TypeError, select.select, [], [], [], "not a number")
Antoine Pitrou131a6412011-04-09 23:49:58 +020026 self.assertRaises(ValueError, select.select, [], [], [], -1)
Barry Warsaw792c94a1996-12-11 23:58:46 +000027
Victor Stinnerecd02072011-10-17 19:55:31 +020028 # Issue #12367: http://www.freebsd.org/cgi/query-pr.cgi?pr=kern/155606
29 @unittest.skipIf(sys.platform.startswith('freebsd'),
30 'skip because of a FreeBSD bug: kern/155606')
Victor Stinner21d29c32011-10-12 21:01:46 +020031 def test_errno(self):
32 with open(__file__, 'rb') as fp:
33 fd = fp.fileno()
34 fp.close()
35 try:
Victor Stinner386c2d82011-10-16 20:48:52 +020036 select.select([fd], [], [], 0)
Andrew Svetlov6d8a1222012-12-17 22:23:46 +020037 except OSError as err:
Victor Stinner21d29c32011-10-12 21:01:46 +020038 self.assertEqual(err.errno, errno.EBADF)
39 else:
40 self.fail("exception not raised")
41
Benjamin Petersond856ab62010-04-06 21:55:16 +000042 def test_returned_list_identity(self):
43 # See issue #8329
44 r, w, x = select.select([], [], [], 1)
45 self.assertIsNot(r, w)
46 self.assertIsNot(r, x)
47 self.assertIsNot(w, x)
48
pxinwre1e3c2d2020-12-16 05:20:07 +080049 @unittest.skipUnless(hasattr(os, 'popen'), "need os.popen()")
Christian Heimesdd15f6c2008-03-16 00:07:10 +000050 def test_select(self):
Victor Stinner7f14a372020-12-15 18:06:36 +010051 code = textwrap.dedent('''
52 import time
53 for i in range(10):
54 print("testing...", flush=True)
55 time.sleep(0.050)
56 ''')
57 cmd = [sys.executable, '-I', '-c', code]
58 with subprocess.Popen(cmd, stdout=subprocess.PIPE) as proc:
59 pipe = proc.stdout
60 for timeout in (0, 1, 2, 4, 8, 16) + (None,)*10:
Benjamin Petersonee8712c2008-05-20 21:35:26 +000061 if support.verbose:
Victor Stinner7f14a372020-12-15 18:06:36 +010062 print(f'timeout = {timeout}')
63 rfd, wfd, xfd = select.select([pipe], [], [], timeout)
64 self.assertEqual(wfd, [])
65 self.assertEqual(xfd, [])
66 if not rfd:
Serhiy Storchaka5b10b982019-03-05 10:06:26 +020067 continue
Victor Stinner7f14a372020-12-15 18:06:36 +010068 if rfd == [pipe]:
69 line = pipe.readline()
Benjamin Petersonee8712c2008-05-20 21:35:26 +000070 if support.verbose:
Serhiy Storchaka5b10b982019-03-05 10:06:26 +020071 print(repr(line))
72 if not line:
73 if support.verbose:
74 print('EOF')
75 break
76 continue
Victor Stinner7f14a372020-12-15 18:06:36 +010077 self.fail('Unexpected return values from select():',
78 rfd, wfd, xfd)
Barry Warsaw792c94a1996-12-11 23:58:46 +000079
Antoine Pitroue4ad37e2012-11-01 20:13:54 +010080 # Issue 16230: Crash on select resized list
81 def test_select_mutated(self):
82 a = []
83 class F:
84 def fileno(self):
85 del a[-1]
86 return sys.__stdout__.fileno()
87 a[:] = [F()] * 10
88 self.assertEqual(select.select([], a, []), ([], a[:5], []))
89
Zachary Ware38c707e2015-04-13 15:00:43 -050090def tearDownModule():
Benjamin Petersonee8712c2008-05-20 21:35:26 +000091 support.reap_children()
Neal Norwitz1b738e92002-06-13 22:23:47 +000092
Christian Heimesdd15f6c2008-03-16 00:07:10 +000093if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -050094 unittest.main()