Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 4b4b9fb

Browse filesBrowse files
gh-83994, gh-132843: Fix and improve test_ioctl (GH-132848)
* Skip test_ioctl_tcflush if termios.TCFLSH is not available. * Do not skip ALL ioctl() tests when /dev/tty is not available.
1 parent e2c69d3 commit 4b4b9fb
Copy full SHA for 4b4b9fb

File tree

Expand file treeCollapse file tree

1 file changed

+38
-31
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+38
-31
lines changed

‎Lib/test/test_ioctl.py

Copy file name to clipboardExpand all lines: Lib/test/test_ioctl.py
+38-31Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,35 @@
11
import array
2+
import os
3+
import struct
4+
import threading
25
import unittest
36
from test.support import get_attribute
7+
from test.support import threading_helper
48
from test.support.import_helper import import_module
5-
import os, struct
69
fcntl = import_module('fcntl')
710
termios = import_module('termios')
8-
get_attribute(termios, 'TIOCGPGRP') #Can't run tests without this feature
9-
10-
try:
11-
tty = open("/dev/tty", "rb")
12-
except OSError:
13-
raise unittest.SkipTest("Unable to open /dev/tty")
14-
else:
15-
with tty:
16-
# Skip if another process is in foreground
17-
r = fcntl.ioctl(tty, termios.TIOCGPGRP, struct.pack("i", 0))
18-
rpgrp = struct.unpack("i", r)[0]
19-
if rpgrp not in (os.getpgrp(), os.getsid(0)):
20-
raise unittest.SkipTest("Neither the process group nor the session "
21-
"are attached to /dev/tty")
22-
del tty, r, rpgrp
2311

2412
try:
2513
import pty
2614
except ImportError:
2715
pty = None
2816

29-
class IoctlTests(unittest.TestCase):
17+
class IoctlTestsTty(unittest.TestCase):
18+
@classmethod
19+
def setUpClass(cls):
20+
TIOCGPGRP = get_attribute(termios, 'TIOCGPGRP')
21+
try:
22+
tty = open("/dev/tty", "rb")
23+
except OSError:
24+
raise unittest.SkipTest("Unable to open /dev/tty")
25+
with tty:
26+
# Skip if another process is in foreground
27+
r = fcntl.ioctl(tty, TIOCGPGRP, struct.pack("i", 0))
28+
rpgrp = struct.unpack("i", r)[0]
29+
if rpgrp not in (os.getpgrp(), os.getsid(0)):
30+
raise unittest.SkipTest("Neither the process group nor the session "
31+
"are attached to /dev/tty")
32+
3033
def test_ioctl_immutable_buf(self):
3134
# If this process has been put into the background, TIOCGPGRP returns
3235
# the session ID instead of the process group id.
@@ -132,23 +135,27 @@ def test_ioctl_mutate_2048(self):
132135
self._check_ioctl_mutate_len(2048)
133136
self.assertRaises(ValueError, self._check_ioctl_not_mutate_len, 2048)
134137

138+
139+
@unittest.skipIf(pty is None, 'pty module required')
140+
class IoctlTestsPty(unittest.TestCase):
141+
def setUp(self):
142+
self.master_fd, self.slave_fd = pty.openpty()
143+
self.addCleanup(os.close, self.slave_fd)
144+
self.addCleanup(os.close, self.master_fd)
145+
146+
@unittest.skipUnless(hasattr(termios, 'TCFLSH'), 'requires termios.TCFLSH')
135147
def test_ioctl_tcflush(self):
136-
with open("/dev/tty", "rb") as tty:
137-
r = fcntl.ioctl(tty, termios.TCFLSH, termios.TCIFLUSH)
138-
self.assertEqual(r, 0)
148+
r = fcntl.ioctl(self.slave_fd, termios.TCFLSH, termios.TCIFLUSH)
149+
self.assertEqual(r, 0)
150+
r = fcntl.ioctl(self.slave_fd, termios.TCFLSH, termios.TCOFLUSH)
151+
self.assertEqual(r, 0)
139152

140-
@unittest.skipIf(pty is None, 'pty module required')
141153
def test_ioctl_set_window_size(self):
142-
mfd, sfd = pty.openpty()
143-
try:
144-
# (rows, columns, xpixel, ypixel)
145-
our_winsz = struct.pack("HHHH", 20, 40, 0, 0)
146-
result = fcntl.ioctl(mfd, termios.TIOCSWINSZ, our_winsz)
147-
new_winsz = struct.unpack("HHHH", result)
148-
self.assertEqual(new_winsz[:2], (20, 40))
149-
finally:
150-
os.close(mfd)
151-
os.close(sfd)
154+
# (rows, columns, xpixel, ypixel)
155+
our_winsz = struct.pack("HHHH", 20, 40, 0, 0)
156+
result = fcntl.ioctl(self.master_fd, termios.TIOCSWINSZ, our_winsz)
157+
new_winsz = struct.unpack("HHHH", result)
158+
self.assertEqual(new_winsz[:2], (20, 40))
152159

153160

154161
if __name__ == "__main__":

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.