Files
clang-p2996/lldb/test/API/iohandler/sigint/TestIOHandlerPythonREPLSigint.py
Jason Molenda 6d6feaf7e3 [lldb][NFC] update API tests which skip/expect-fail arm
The architectures provided to skipIf / expectedFail are regular
expressions (v. _match_decorator_property() in decorators.py
so on Darwin systems "arm64" would match the skips for "arm" (32-bit
Linux).  Update these to "arm$" to prevent this, and also update
three tests (TestBuiltinFormats.py, TestCrossDSOTailCalls.py,
TestCrossObjectTailCalls.py) that were skipped for arm64 via this
behavior, and need to be skipped or they will fail.

This was moviated by the new TestDynamicValue.py test which has
an expected-fail for arm, but the test was passing on arm64 Darwin
resulting in failure for the CIs.
2025-05-27 18:41:16 -07:00

75 lines
2.7 KiB
Python

"""
Test sending SIGINT to the embedded Python REPL.
"""
import os
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test.lldbpexpect import PExpectTest
class TestCase(PExpectTest):
def start_python_repl(self):
"""Starts up the embedded Python REPL."""
self.launch()
# Start the embedded Python REPL via the 'script' command.
self.child.send("script -l python --\n")
# Wait for the Python REPL prompt.
self.child.expect(">>>")
# PExpect uses many timeouts internally and doesn't play well
# under ASAN on a loaded machine..
@skipIfAsan
@skipIfWindows
@skipIf(oslist=["linux"], archs=["arm$", "aarch64"])
def test_while_evaluating_code(self):
"""Tests SIGINT handling while Python code is being evaluated."""
self.start_python_repl()
# Start a long-running command that we try to abort with SIGINT.
# Note that we dont actually wait 10000s in this code as pexpect or
# lit will kill the test way before that.
self.child.send("import time; print('running' + 'now'); time.sleep(10000);\n")
# Make sure the command is actually being evaluated at the moment by
# looking at the string that the command is printing.
# Don't check for a needle that also occurs in the program itself to
# prevent that echoing will make this check pass unintentionally.
self.child.expect("runningnow")
# Send SIGINT to the LLDB process.
self.child.sendintr()
# This should get transformed to a KeyboardInterrupt which is the same
# behaviour as the standalone Python REPL. It should also interrupt
# the evaluation of our sleep statement.
self.child.expect("KeyboardInterrupt")
# Send EOF to quit the Python REPL.
self.child.sendeof()
self.quit()
# PExpect uses many timeouts internally and doesn't play well
# under ASAN on a loaded machine..
@skipIfAsan
# FIXME: On Linux the Python code that reads from stdin seems to block until
# it has finished reading a line before handling any queued signals.
@skipIf(hostoslist=["linux"])
@skipIfWindows
def test_while_waiting_on_input(self):
"""Tests SIGINT handling while the REPL is waiting on input from
stdin."""
self.start_python_repl()
# Send SIGINT to the LLDB process.
self.child.sendintr()
# This should get transformed to a KeyboardInterrupt which is the same
# behaviour as the standalone Python REPL.
self.child.expect("KeyboardInterrupt")
# Send EOF to quit the Python REPL.
self.child.sendeof()
self.quit()