https://github.com/python/cpython/commit/c0c65141b37029bfb364094a6dfb4c75ebf8359e
commit: c0c65141b37029bfb364094a6dfb4c75ebf8359e
branch: main
author: Sam Gross <[email protected]>
committer: colesbury <[email protected]>
date: 2025-12-03T15:48:44-05:00
summary:
gh-140482: Avoid changing terminal settings in test_pty (gh-142202)
The previous test_spawn_doesnt_hang test had a few problems:
* It would cause ENV CHANGED failures if other tests were running
concurrently due to stty changes
* Typing while the test was running could cause it to fail
files:
M Lib/test/test_pty.py
diff --git a/Lib/test/test_pty.py b/Lib/test/test_pty.py
index a2018e864445e1..7e4f4828ce0f8d 100644
--- a/Lib/test/test_pty.py
+++ b/Lib/test/test_pty.py
@@ -3,7 +3,6 @@
is_android, is_apple_mobile, is_wasm32, reap_children, verbose,
warnings_helper
)
from test.support.import_helper import import_module
-from test.support.os_helper import TESTFN, unlink
# Skip these tests if termios is not available
import_module('termios')
@@ -299,26 +298,27 @@ def test_master_read(self):
@warnings_helper.ignore_fork_in_thread_deprecation_warnings()
def test_spawn_doesnt_hang(self):
- self.addCleanup(unlink, TESTFN)
- with open(TESTFN, 'wb') as f:
- STDOUT_FILENO = 1
- dup_stdout = os.dup(STDOUT_FILENO)
- os.dup2(f.fileno(), STDOUT_FILENO)
- buf = b''
- def master_read(fd):
- nonlocal buf
- data = os.read(fd, 1024)
- buf += data
- return data
+ # gh-140482: Do the test in a pty.fork() child to avoid messing
+ # with the interactive test runner's terminal settings.
+ pid, fd = pty.fork()
+ if pid == pty.CHILD:
+ pty.spawn([sys.executable, '-c', 'print("hi there")'])
+ os._exit(0)
+
+ try:
+ buf = bytearray()
try:
- pty.spawn([sys.executable, '-c', 'print("hi there")'],
- master_read)
- finally:
- os.dup2(dup_stdout, STDOUT_FILENO)
- os.close(dup_stdout)
- self.assertEqual(buf, b'hi there\r\n')
- with open(TESTFN, 'rb') as f:
- self.assertEqual(f.read(), b'hi there\r\n')
+ while (data := os.read(fd, 1024)) != b'':
+ buf.extend(data)
+ except OSError as e:
+ if e.errno != errno.EIO:
+ raise
+
+ (pid, status) = os.waitpid(pid, 0)
+ self.assertEqual(status, 0)
+ self.assertEqual(buf.take_bytes(), b"hi there\r\n")
+ finally:
+ os.close(fd)
class SmallPtyTests(unittest.TestCase):
"""These tests don't spawn children or hang."""
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]