Skip to content
Prev Previous commit
Next Next commit
Add tests for input
  • Loading branch information
sergey-miryanov committed Feb 21, 2025
commit f13cdbb453d7ab7e5dd091a71fcf527c69ddcfc3
87 changes: 87 additions & 0 deletions Lib/test/test_sys_getattr.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,63 @@ def main():
exit(0)
''')

common_input_code = textwrap.dedent('''
import sys

class FakeIO:
def write(self, str):
pass
def flush(self):
pass
def fileno(self):
return 0

class CrashStdin:
def __init__(self):
self.stdin = sys.stdin
setattr(sys, "stdin", FakeIO())

def __repr__(self):
stdin = sys.stdin
setattr(sys, "stdin", self.stdin)
del stdin
return "CrashStdin"

class CrashStdout:
def __init__(self):
self.stdout = sys.stdout
setattr(sys, "stdout", FakeIO())

def __repr__(self):
stdout = sys.stdout
setattr(sys, "stdout", self.stdout)
del stdout
return "CrashStdout"

class CrashStderr:
def __init__(self):
self.stderr = sys.stderr
setattr(sys, "stderr", FakeIO())

def __repr__(self):
stderr = sys.stderr
setattr(sys, "stderr", self.stderr)
del stderr
return "CrashStderr"

def audit(event, args):
if event == 'builtins.input':
repr(args)

def main():
{0}
input({1})

if __name__ == "__main__":
main()

''')


def test_print_deleted_stdout(self):
# print should use strong reference to the stdout.
Expand Down Expand Up @@ -157,5 +214,35 @@ def test_warnings_warn_explicit(self):
self.assertNotIn(b"Segmentation fault", err)
self.assertNotIn(b"access violation", err)

def test_input_stdin(self):
test_code = self.common_input_code.format(
"",
"CrashStdin()"
)
rc, _, err = assert_python_ok('-c', test_code)
self.assertEqual(rc, 0)
self.assertNotIn(b"Segmentation fault", err)
self.assertNotIn(b"access violation", err)

def test_input_stdout(self):
test_code = self.common_input_code.format(
"",
"CrashStdout()"
)
rc, _, err = assert_python_ok('-c', test_code)
self.assertEqual(rc, 0)
self.assertNotIn(b"Segmentation fault", err)
self.assertNotIn(b"access violation", err)

def test_input_stderr(self):
test_code = self.common_input_code.format(
"sys.addaudithook(audit)",
"CrashStderr()"
)
rc, _, err = assert_python_ok('-c', test_code)
self.assertEqual(rc, 0)
self.assertNotIn(b"Segmentation fault", err)
self.assertNotIn(b"access violation", err)

if __name__ == "__main__":
unittest.main()