Files
llvm-project/lldb/test/API/terminal/TestPythonInterpreterEcho.py
Ebuka Ezike 43cb4631c1 [lldb] Fix typed commands not shown on the screen (#174216)
The cause is that in `python3.14`, `fcntl.ioctl` now throws a buffer
overflow error
when the buffer is too small or too large (see
https://github.com/python/cpython/pull/132919). This caused the Python
interpreter to fail terminal detection and not properly echo user
commands back to the screen.

Fix by dropping the custom terminal size check entirely and using the
built-in `sys.stdin.isatty()` instead.

Fixes #173302
2026-01-08 18:46:03 +00:00

63 lines
2.1 KiB
Python

"""
Test that typing python expression in the terminal is echoed back to stdout.
"""
from lldbsuite.test.decorators import skipIfAsan
from lldbsuite.test.lldbpexpect import PExpectTest
@skipIfAsan
class PythonInterpreterEchoTest(PExpectTest):
PYTHON_PROMPT = ">>> "
def verify_command_echo(
self, command: str, expected_output: str = "", is_regex: bool = False
):
assert self.child != None
child = self.child
self.assertIsNotNone(self.child, "expected a running lldb process.")
child.sendline(command)
# Build pattern list: match whichever comes first (output or prompt).
# This prevents waiting for a timeout if there's no match.
pattern = []
match_expected = expected_output and len(expected_output) > 0
if match_expected:
pattern.append(expected_output)
pattern.append(self.PYTHON_PROMPT)
expect_func = child.expect if is_regex else child.expect_exact
match_idx = expect_func(pattern)
if match_expected:
self.assertEqual(
match_idx, 0, "Expected output `{expected_output}` in stdout."
)
self.assertIsNotNone(self.child.before, "Expected output before prompt")
self.assertIsInstance(self.child.before, bytes)
echoed_text: str = self.child.before.decode("ascii").strip()
self.assertEqual(
command, echoed_text, f"Command '{command}' should be echoed to stdout."
)
if match_expected:
child.expect_exact(self.PYTHON_PROMPT)
def test_python_interpreter_echo(self):
"""Test that that the user typed commands is echoed to stdout"""
self.launch(use_colors=False, dimensions=(100, 100))
# Enter the python interpreter.
self.verify_command_echo(
"script --language python --", expected_output="Python.*\\.", is_regex=True
)
self.child_in_script_interpreter = True
self.verify_command_echo("val = 300")
self.verify_command_echo(
"print('result =', 300)", expected_output="result = 300"
)