Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug]: test_other_signal_before_sigint fails with Qt on macOS CI #27984

Open
QuLogic opened this issue Mar 28, 2024 · 0 comments
Open

[Bug]: test_other_signal_before_sigint fails with Qt on macOS CI #27984

QuLogic opened this issue Mar 28, 2024 · 0 comments

Comments

@QuLogic
Copy link
Member

QuLogic commented Mar 28, 2024

Bug summary

We've previously not been installing Qt wrappers such as PyQt6 or PySide. #27723 adds those back, but we have discovered that test_other_signal_before_sigint fails on CI. The subprocess appears to segfault somewhere in the Qt event loop.

I had tried to debug it with c1afbac, but then it stopped failing. Reverting that change then failed again, though one time it passed. So this seems to be fairly flaky.

I went through all CI runs, and found that this is not particularly limited to any parametrization:

      4 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtcairo-QT_API=PyQt6-BACKEND_DEPS=PyQt6,cairocffi] _
      3 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtcairo-QT_API=PySide6-BACKEND_DEPS=PySide6,cairocffi] _
      3 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtcairo-QT_API=PyQt5-BACKEND_DEPS=PyQt5,cairocffi] _
      3 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtagg-QT_API=PyQt6-BACKEND_DEPS=PyQt6] _
      2 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtcairo-QT_API=PySide2-BACKEND_DEPS=PySide2,cairocffi] _
      2 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtagg-QT_API=PySide6-BACKEND_DEPS=PySide6] _
      1 _ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtagg-QT_API=PySide2-BACKEND_DEPS=PySide2] _

Unfortunately, I don't think @tacaswell was able to reproduce the crash, and @ksunden was only able to reproduce once, but only as part of a full test suite, and never again later in a smaller run.

So as part of #27723, I've marked these as xfail, but if we can figure out a way to reproduce, we should be able to fix this.

Code for reproduction

pytest -k test_other_signal_before_sigint lib/matplotlib/tests/test_backends_interactive.py

Actual outcome

_ test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtagg-QT_API=PySide6-BACKEND_DEPS=PySide6] _
[gw1] darwin -- Python 3.12.2 /Library/Frameworks/Python.framework/Versions/3.12/bin/python

env = {'BACKEND_DEPS': 'PySide6', 'MPLBACKEND': 'qtagg', 'QT_API': 'PySide6'}
target = 'show', kwargs = {'block': True}
request = <FixtureRequest for <Function test_other_signal_before_sigint[show-kwargs0-MPLBACKEND=qtagg-QT_API=PySide6-BACKEND_DEPS=PySide6]>>

    @pytest.mark.skipif(sys.platform == 'win32',
                        reason='No other signal available to send on Windows')
    @pytest.mark.parametrize("env", _get_testable_interactive_backends())
    @pytest.mark.parametrize("target, kwargs", [
        ('show', {'block': True}),
        ('pause', {'interval': 10})
    ])
    def test_other_signal_before_sigint(env, target, kwargs, request):
        backend = env.get("MPLBACKEND")
        if not backend.startswith(("qt", "macosx")):
            pytest.skip("SIGINT currently only tested on qt and macosx")
        if backend == "macosx":
            request.node.add_marker(pytest.mark.xfail(reason="macosx backend is buggy"))
        proc = _WaitForStringPopen(
            [sys.executable, "-c",
             inspect.getsource(_test_other_signal_before_sigint_impl) +
             "\n_test_other_signal_before_sigint_impl("
                f"{backend!r}, {target!r}, {kwargs!r})"])
        try:
            proc.wait_for('DRAW')
            os.kill(proc.pid, signal.SIGUSR1)
            proc.wait_for('SIGUSR1')
            os.kill(proc.pid, signal.SIGINT)
            stdout, _ = proc.communicate(timeout=_test_timeout)
        except Exception:
            proc.kill()
            stdout, _ = proc.communicate()
            raise
        print(stdout)
>       assert 'SUCCESS' in stdout
E       AssertionError

/Users/runner/work/matplotlib/matplotlib/lib/matplotlib/tests/test_backends_interactive.py:790: AssertionError
----------------------------- Captured stdout call -----------------------------

----------------------------- Captured stderr call -----------------------------
Fatal Python error: Segmentation fault

Current thread 0x00000001d88a9c40 (most recent call first):
  File "/Users/runner/work/matplotlib/matplotlib/lib/matplotlib/backends/qt_compat.py", line 159 in _exec
  File "/Users/runner/work/matplotlib/matplotlib/lib/matplotlib/backends/backend_qt.py", line 633 in start_main_loop
  File "/Users/runner/work/matplotlib/matplotlib/lib/matplotlib/backend_bases.py", line 3536 in show
  File "/Users/runner/work/matplotlib/matplotlib/lib/matplotlib/pyplot.py", line 590 in show
  File "<string>", line 21 in _test_other_signal_before_sigint_impl
  File "<string>", line 25 in <module>

Extension modules: numpy.core._multiarray_umath, numpy.core._multiarray_tests, numpy.linalg._umath_linalg, numpy.fft._pocketfft_internal, numpy.random._common, numpy.random.bit_generator, numpy.random._bounded_integers, numpy.random._mt19937, numpy.random.mtrand, numpy.random._philox, numpy.random._pcg64, numpy.random._sfc64, numpy.random._generator, PIL._imaging, kiwisolver._cext, PyQt6.QtCore, PyQt6.QtGui, PyQt6.QtWidgets (total: 18)

Expected outcome

Tests pass

Additional information

No response

Operating system

macOS

Matplotlib Version

main

Matplotlib Backend

QtAgg

Python version

3.10 or 3.12

Jupyter version

No response

Installation

git checkout

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant