mirror of
https://github.com/python/cpython.git
synced 2025-11-27 13:45:25 +00:00
Backport robustness fix for test_builtin
This commit is contained in:
parent
0d776b1ce8
commit
413d497247
1 changed files with 31 additions and 21 deletions
|
|
@ -11,12 +11,13 @@ import ast
|
||||||
import types
|
import types
|
||||||
import builtins
|
import builtins
|
||||||
import random
|
import random
|
||||||
|
import traceback
|
||||||
from test.support import fcmp, TESTFN, unlink, run_unittest, check_warnings
|
from test.support import fcmp, TESTFN, unlink, run_unittest, check_warnings
|
||||||
from operator import neg
|
from operator import neg
|
||||||
try:
|
try:
|
||||||
import pty
|
import pty, signal
|
||||||
except ImportError:
|
except ImportError:
|
||||||
pty = None
|
pty = signal = None
|
||||||
|
|
||||||
|
|
||||||
class Squares:
|
class Squares:
|
||||||
|
|
@ -993,7 +994,7 @@ class BuiltinTest(unittest.TestCase):
|
||||||
fp.close()
|
fp.close()
|
||||||
unlink(TESTFN)
|
unlink(TESTFN)
|
||||||
|
|
||||||
@unittest.skipUnless(pty, "the pty module isn't available")
|
@unittest.skipUnless(pty, "the pty and signal modules must be available")
|
||||||
def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
|
def check_input_tty(self, prompt, terminal_input, stdio_encoding=None):
|
||||||
r, w = os.pipe()
|
r, w = os.pipe()
|
||||||
try:
|
try:
|
||||||
|
|
@ -1004,6 +1005,9 @@ class BuiltinTest(unittest.TestCase):
|
||||||
self.skipTest("pty.fork() raised {}".format(e))
|
self.skipTest("pty.fork() raised {}".format(e))
|
||||||
if pid == 0:
|
if pid == 0:
|
||||||
# Child
|
# Child
|
||||||
|
try:
|
||||||
|
# Make sure we don't get stuck if there's a problem
|
||||||
|
signal.alarm(2)
|
||||||
os.close(r)
|
os.close(r)
|
||||||
# Check the error handlers are accounted for
|
# Check the error handlers are accounted for
|
||||||
if stdio_encoding:
|
if stdio_encoding:
|
||||||
|
|
@ -1014,11 +1018,11 @@ class BuiltinTest(unittest.TestCase):
|
||||||
encoding=stdio_encoding,
|
encoding=stdio_encoding,
|
||||||
errors='replace')
|
errors='replace')
|
||||||
with open(w, "w") as wpipe:
|
with open(w, "w") as wpipe:
|
||||||
try:
|
|
||||||
print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
|
print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
|
||||||
print(ascii(input(prompt)), file=wpipe)
|
print(ascii(input(prompt)), file=wpipe)
|
||||||
|
except:
|
||||||
|
traceback.print_exc()
|
||||||
finally:
|
finally:
|
||||||
print(";EOF", file=wpipe)
|
|
||||||
# We don't want to return to unittest...
|
# We don't want to return to unittest...
|
||||||
os._exit(0)
|
os._exit(0)
|
||||||
# Parent
|
# Parent
|
||||||
|
|
@ -1029,15 +1033,21 @@ class BuiltinTest(unittest.TestCase):
|
||||||
lines = []
|
lines = []
|
||||||
while True:
|
while True:
|
||||||
line = rpipe.readline().strip()
|
line = rpipe.readline().strip()
|
||||||
if line == ";EOF":
|
if line == "":
|
||||||
|
# The other end was closed => the child exited
|
||||||
break
|
break
|
||||||
lines.append(line)
|
lines.append(line)
|
||||||
|
# Check the result was got and corresponds to the user's terminal input
|
||||||
|
if len(lines) != 2:
|
||||||
|
# Something went wrong, try to get at stderr
|
||||||
|
with open(fd, "r", encoding="ascii", errors="ignore") as child_output:
|
||||||
|
self.fail("got %d lines in pipe but expected 2, child output was:\n%s"
|
||||||
|
% (len(lines), child_output.read()))
|
||||||
|
os.close(fd)
|
||||||
# Check we did exercise the GNU readline path
|
# Check we did exercise the GNU readline path
|
||||||
self.assertIn(lines[0], {'tty = True', 'tty = False'})
|
self.assertIn(lines[0], {'tty = True', 'tty = False'})
|
||||||
if lines[0] != 'tty = True':
|
if lines[0] != 'tty = True':
|
||||||
self.skipTest("standard IO in should have been a tty")
|
self.skipTest("standard IO in should have been a tty")
|
||||||
# Check the result was got and corresponds to the user's terminal input
|
|
||||||
self.assertEqual(len(lines), 2)
|
|
||||||
input_result = eval(lines[1]) # ascii() -> eval() roundtrip
|
input_result = eval(lines[1]) # ascii() -> eval() roundtrip
|
||||||
if stdio_encoding:
|
if stdio_encoding:
|
||||||
expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
|
expected = terminal_input.decode(stdio_encoding, 'surrogateescape')
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue