diff options
author | Martin Panter <vadmium+py@gmail.com> | 2016-05-15 13:21:25 (GMT) |
---|---|---|
committer | Martin Panter <vadmium+py@gmail.com> | 2016-05-15 13:21:25 (GMT) |
commit | 2e1d8683c17f05cb1667e48f205856d8ad02a02a (patch) | |
tree | b49197bbfb57304327814f70d86d6651274697f3 /Lib/test/test_readline.py | |
parent | f47fc5553be1945d4d3ca1386c523fcf2ed28cef (diff) | |
download | cpython-2e1d8683c17f05cb1667e48f205856d8ad02a02a.zip cpython-2e1d8683c17f05cb1667e48f205856d8ad02a02a.tar.gz cpython-2e1d8683c17f05cb1667e48f205856d8ad02a02a.tar.bz2 |
Issue #26870: Avoid using kqueue() with pseudo-terminals
Also force terminate the child process in case it hangs for any reason.
Diffstat (limited to 'Lib/test/test_readline.py')
-rw-r--r-- | Lib/test/test_readline.py | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/Lib/test/test_readline.py b/Lib/test/test_readline.py index cfb4af1..f8e627a 100644 --- a/Lib/test/test_readline.py +++ b/Lib/test/test_readline.py @@ -9,7 +9,7 @@ import subprocess import sys import tempfile import unittest -from test.support import import_module, unlink, get_original_stdout +from test.support import import_module, unlink from test.support.script_helper import assert_python_ok # Skip tests if there is no readline module @@ -126,30 +126,30 @@ def run_pty(script, input=b"dummy input\r"): os.close(slave) with ExitStack() as cleanup: cleanup.enter_context(proc) + cleanup.callback(proc.terminate) cleanup.callback(os.close, master) - sel = cleanup.enter_context(selectors.DefaultSelector()) + # Avoid using DefaultSelector, because it may choose a kqueue() + # implementation, which does not work with pseudo-terminals on OS X + # < 10.9 (Issue 20365) and Open BSD (Issue 20667). + sel = getattr(selectors, "PollSelector", selectors.DefaultSelector)() + cleanup.enter_context(sel) sel.register(master, selectors.EVENT_READ | selectors.EVENT_WRITE) os.set_blocking(master, False) while True: - get_original_stdout().write(f"test_readline: select()\n") for [_, events] in sel.select(): if events & selectors.EVENT_READ: try: - get_original_stdout().write(f"test_readline: read()\n") chunk = os.read(master, 0x10000) except OSError as err: # Linux raises EIO when the slave is closed if err.errno != EIO: raise chunk = b"" - get_original_stdout().write(f"test_readline: read {chunk!r}\n") if not chunk: return output output.extend(chunk) if events & selectors.EVENT_WRITE: - get_original_stdout().write(f"test_readline: write()\n") input = input[os.write(master, input):] - get_original_stdout().write(f"test_readline: remaining input = {input!r}\n") if not input: sel.modify(master, selectors.EVENT_READ) |