[3.14] gh-140482: Preserve and restore stty echo as a test environment (GH-140519) (#140562)

gh-140482: Preserve and restore `stty echo` as a test environment (GH-140519)
(cherry picked from commit b3c713a0af)


gh-140482: Restore `stty echo` as a test environment

Co-authored-by: Barry Warsaw <barry@python.org>
This commit is contained in:
Miss Islington (bot) 2025-10-24 21:24:17 +02:00 committed by GitHub
parent 11b5e0b9c2
commit 7545ea6b3a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 27 additions and 0 deletions

View file

@ -9,6 +9,13 @@ from test.support import os_helper
from .utils import print_warning
# Import termios to save and restore terminal echo. This is only available on
# Unix, and it's fine if the module can't be found.
try:
import termios # noqa: F401
except ModuleNotFoundError:
pass
class SkipTestEnvironment(Exception):
pass
@ -65,6 +72,7 @@ class saved_test_environment:
'shutil_archive_formats', 'shutil_unpack_formats',
'asyncio.events._event_loop_policy',
'urllib.requests._url_tempfiles', 'urllib.requests._opener',
'stty_echo',
)
def get_module(self, name):
@ -292,6 +300,24 @@ class saved_test_environment:
warnings = self.get_module('warnings')
warnings.showwarning = fxn
def get_stty_echo(self):
termios = self.try_get_module('termios')
if not os.isatty(fd := sys.__stdin__.fileno()):
return None
attrs = termios.tcgetattr(fd)
lflags = attrs[3]
return bool(lflags & termios.ECHO)
def restore_stty_echo(self, echo):
termios = self.get_module('termios')
attrs = termios.tcgetattr(fd := sys.__stdin__.fileno())
if echo:
# Turn echo on.
attrs[3] |= termios.ECHO
else:
# Turn echo off.
attrs[3] &= ~termios.ECHO
termios.tcsetattr(fd, termios.TCSADRAIN, attrs)
def resource_info(self):
for name in self.resources:
method_suffix = name.replace('.', '_')

View file

@ -0,0 +1 @@
Preserve and restore the state of ``stty echo`` as part of the test environment.