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.
75 lines
2.7 KiB
Python
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()
|