mirror of
https://github.com/python/cpython.git
synced 2026-06-27 19:36:07 +00:00
[3.15] gh-150966: Fix live profiling error tests (GH-151020) (#151604)
gh-150966: Fix live profiling error tests (GH-151020)
(cherry picked from commit 6b142ab9a0)
Co-authored-by: Pablo Galindo Salgado <Pablogsal@gmail.com>
This commit is contained in:
parent
821e5d79fa
commit
1e7fb93df7
2 changed files with 24 additions and 5 deletions
|
|
@ -825,17 +825,34 @@ def test_get_all_lines_full_display(self):
|
|||
class TestLiveModeErrors(unittest.TestCase):
|
||||
"""Tests running error commands in the live mode fails gracefully."""
|
||||
|
||||
class QuitWhenFinishedDisplay(MockDisplay):
|
||||
def __init__(self, collector):
|
||||
super().__init__()
|
||||
self.collector = collector
|
||||
|
||||
def get_input(self):
|
||||
ch = super().get_input()
|
||||
if ch != -1:
|
||||
return ch
|
||||
# Sampling only stops once the target process has exited, at
|
||||
# which point the collector is marked finished. Quit then so the
|
||||
# run can surface the target's stderr. We must not rely on the
|
||||
# target's pid still being signalable: once it exits it lingers
|
||||
# as a zombie (it is reaped after sample_live returns), so a
|
||||
# liveness check would never observe it gone and would hang.
|
||||
if self.collector.finished:
|
||||
return ord('q')
|
||||
return -1
|
||||
|
||||
def mock_curses_wrapper(self, func):
|
||||
func(mock.MagicMock())
|
||||
|
||||
def mock_init_curses_side_effect(self, n_times, mock_self, stdscr):
|
||||
mock_self.display = MockDisplay()
|
||||
# Allow the loop to run for a bit (approx 0.5s) before quitting
|
||||
# This ensures we don't exit too early while the subprocess is
|
||||
# still failing
|
||||
mock_self.display = self.QuitWhenFinishedDisplay(mock_self)
|
||||
# Feed non-input events so live mode keeps polling while the target
|
||||
# process is still running; once it exits the display quits on its own.
|
||||
for _ in range(n_times):
|
||||
mock_self.display.simulate_input(-1)
|
||||
mock_self.display.simulate_input(ord('q'))
|
||||
|
||||
def test_run_failed_module_live(self):
|
||||
"""Test that running a existing module that fails exits with clean error."""
|
||||
|
|
|
|||
|
|
@ -0,0 +1,2 @@
|
|||
Avoid prematurely terminating failing live sampling profiler test targets,
|
||||
which made stderr assertions flaky on ASAN buildbots.
|
||||
Loading…
Add table
Add a link
Reference in a new issue