summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2011-11-06 01:51:25 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2011-11-06 01:51:25 (GMT)
commit413d4972477b816ea6b400f18ec9fe1c9360fe69 (patch)
tree77cff4768303d3ef75ccd5f7f4081096a4863981
parent0d776b1ce849ff0646738b6361ef940ab6f8b9cb (diff)
downloadcpython-413d4972477b816ea6b400f18ec9fe1c9360fe69.zip
cpython-413d4972477b816ea6b400f18ec9fe1c9360fe69.tar.gz
cpython-413d4972477b816ea6b400f18ec9fe1c9360fe69.tar.bz2
Backport robustness fix for test_builtin
-rw-r--r--Lib/test/test_builtin.py52
1 files changed, 31 insertions, 21 deletions
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index 40c1ab4..244e55f 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -11,12 +11,13 @@ import ast
import types
import builtins
import random
+import traceback
from test.support import fcmp, TESTFN, unlink, run_unittest, check_warnings
from operator import neg
try:
- import pty
+ import pty, signal
except ImportError:
- pty = None
+ pty = signal = None
class Squares:
@@ -993,7 +994,7 @@ class BuiltinTest(unittest.TestCase):
fp.close()
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):
r, w = os.pipe()
try:
@@ -1004,23 +1005,26 @@ class BuiltinTest(unittest.TestCase):
self.skipTest("pty.fork() raised {}".format(e))
if pid == 0:
# Child
- os.close(r)
- # Check the error handlers are accounted for
- if stdio_encoding:
- sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
- encoding=stdio_encoding,
- errors='surrogateescape')
- sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
- encoding=stdio_encoding,
- errors='replace')
- with open(w, "w") as wpipe:
- try:
+ try:
+ # Make sure we don't get stuck if there's a problem
+ signal.alarm(2)
+ os.close(r)
+ # Check the error handlers are accounted for
+ if stdio_encoding:
+ sys.stdin = io.TextIOWrapper(sys.stdin.detach(),
+ encoding=stdio_encoding,
+ errors='surrogateescape')
+ sys.stdout = io.TextIOWrapper(sys.stdout.detach(),
+ encoding=stdio_encoding,
+ errors='replace')
+ with open(w, "w") as wpipe:
print("tty =", sys.stdin.isatty() and sys.stdout.isatty(), file=wpipe)
print(ascii(input(prompt)), file=wpipe)
- finally:
- print(";EOF", file=wpipe)
- # We don't want to return to unittest...
- os._exit(0)
+ except:
+ traceback.print_exc()
+ finally:
+ # We don't want to return to unittest...
+ os._exit(0)
# Parent
os.close(w)
os.write(fd, terminal_input + b"\r\n")
@@ -1029,15 +1033,21 @@ class BuiltinTest(unittest.TestCase):
lines = []
while True:
line = rpipe.readline().strip()
- if line == ";EOF":
+ if line == "":
+ # The other end was closed => the child exited
break
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
self.assertIn(lines[0], {'tty = True', 'tty = False'})
if lines[0] != 'tty = True':
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
if stdio_encoding:
expected = terminal_input.decode(stdio_encoding, 'surrogateescape')