#6582·xonsh

0.24.2 testsuite fails

Author: nunotexbsdCreated Aug 23, 2026Updated Aug 25, 2026
Labelstestsparser

Hello,

Tests fails at my end, any clues?

FreeBSD 16

EDIT: Must be something on my end as I did tested previous 0.24.1 0.24.0 and those fail too with same error. I remember that tests were OK when I pushed updates.

EDIT2: I think I spoted a race. 2 tries, 2 results:

Testing with: python3.12 -m pytest tests/xintegration/test_stress.py -k test_callable_alias_fd_leaking

1st try:

 execx echo stderr" o>e')\n\n    echo 3 && echo 4\n\nfor i in range(111):\n    $(a | b)\n\n\n# Empirically, in case of a leak, the output\n# drops out at ~600-1000 function calls.\nfor i in range(10):\n    for j
in range(69):\n        $(a | b)\n\n] _

test_code = "\n$XONSH_SHOW_TRACEBACK = True\nimport sys\n\[email protected]\ndef _a(args, stdin, stdout, stderr):\n    name = 'a'...e output\n# drops out at ~600-1000 function calls.\nfor i in range(10):\n    for j in range(69):\n        $(a | b)\n\n"

    @pytest.mark.parametrize("test_code", test_code_fd_leaking)
    @pytest.mark.timeout(600)
    def test_callable_alias_fd_leaking(test_code):
        """Testing callable alias on leaks and errors in pipe.
        1. No fd leaking: no output interrupting during 1000+ pipe calls.
        2. No I/O errors or "Bad file descriptor" errors.
        3. No stdout leaking from alias `a`.
        See also #6159.
        """

        out, err, ret = run_xonsh(
            test_code, interactive=False, single_command=True, timeout=600
        )
        assert ret == 0
>       assert "Error" not in out  # No I/O errors or "Bad file descriptor" errors.
        ^^^^^^^^^^^^^^^^^^^^^^^^^
E       assert 'Error' not in "a: print er...n3\\n4\\n'\n"
E
E         'Error' is contained here:
E
E           AttributeError: 'CtxAwareTransformer' object has no attribute 'lines'
E         ?          +++++
E           b: execx echo stderr
E           'b: print out alias.stdout\nb: print out sys.stdout\nb: echo stdout\nb: ![] echo stdout\nb: execx echo stdout\n3\n4\n'...
E
E         ...Full output truncated (467 lines hidden), use '-vv' to show

tests/xintegration/test_stress.py:194: AssertionError
============================================================================================= short test summary info ==============================================================================================
FAILED tests/xintegration/test_stress.py::test_callable_alias_fd_leaking[\n$XONSH_SHOW_TRACEBACK = True\nimport sys\n\[email protected]\ndef _a(args, stdin, stdout, stderr):\n    name = 'a'\n\n    print(f"{name}: print out alias.stdout", file=stdout)\n    print(f"{name}: print err alias.stderr", file=stderr)\n\n    print(f"{name}: print out sys.stdout", file=sys.stdout)\n    print(f"{name}: print err sys.stderr", file=sys.stderr)\n\n    echo @(f"{name}: echo stdout")\n    echo @(f"{name}: echo stderr") o>e\n\n    ![echo @(f"{name}: ![] echo stdout")]\n    $[echo @(f"{name}: $[] echo stdout")]\n\n    $(echo @(f"{name}: $() echo
stdout LEAKING TEST"))\n    $(echo @(f"{name}: $() echo stderr") o>e)\n\n    !(echo @(f"{name}: !() echo stdout LEAKING TEST"))\n    !(echo @(f"{name}: !() echo stderr LEAKING TEST") o>e)\n\n    execx(f'echo "{name}: execx echo stdout"')\n    execx(f'echo "{name}: execx echo stderr" o>e')\n\n    echo 1 && echo 2\n\n\[email protected]\ndef _b(args, stdin, stdout, stderr):\n    name = 'b'\n\n    print(f"{name}: print out
alias.stdout", file=stdout)\n    print(f"{name}: print err alias.stderr", file=stderr)\n\n    print(f"{name}: print out sys.stdout", file=sys.stdout)\n    print(f"{name}: print err sys.stderr", file=sys.stderr)\n\n    echo @(f"{name}: echo stdout")\n    echo @(f"{name}: echo stderr") o>e\n\n    ![echo @(f"{name}: ![] echo stdout")]\n    $[echo @(f"{name}: $[] echo stdout")]\n\n    $(echo @(f"{name}: $() echo stdout LEAKING TEST"))\n    $(echo @(f"{name}: $() echo stderr") o>e)\n\n    !(echo @(f"{name}: !() echo stdout LEAKING TEST"))\n    !(echo @(f"{name}: !() echo stderr LEAKING TEST") o>e)\n\n    execx(f'echo "{name}: execx echo stdout"')\n    execx(f'echo "{name}: execx echo stderr" o>e')\n\n    echo 3 && echo 4\n\nfor i in range(111):\n    $(a | b)\n\n\n# Empirically, in case of a leak, the output\n# drops out at ~600-1000 function calls.\nfor i in range(10):\n    for j in range(69):\n        $(a | b)\n\n] - assert 'Error' not in "a: print er...n3\\n4\\n'\n"
=================================================================================== 1 failed, 4 deselected in 174.61s (0:02:54) ====================================================================================

2nd try:

=============================================================================================== test session starts ================================================================================================
platform freebsd16 -- Python 3.12.14, pytest-9.1.1, pluggy-1.6.0
cachedir: .cache/pytest
rootdir: /wrkdirs/usr/ports/shells/xonsh/work-py312/xonsh-0.24.1
configfile: setup.cfg
plugins: xonsh-0.24.1, subprocess-1.5.4, mock-3.15.1, cov-6.3.0, rerunfailures-16.0.1, timeout-2.4.0
collected 5 items / 4 deselected / 1 selected

tests/xintegration/test_stress.py .                                                                                                                                                                          [100%]

=================================================================================== 1 passed, 4 deselected in 155.86s (0:02:35) ====================================================================================

Coul we leave this PR open while I investigate?

(...)
tests/xintegration/test_stress.py:194: AssertionError
================================================================================================= warnings summary =================================================================================================
../../../../../../../usr/local/lib/python3.12/site-packages/_pytest/python.py:124
  /usr/local/lib/python3.12/site-packages/_pytest/python.py:124: PytestRemovedIn10Warning: Passing a non-Collection iterable to parametrize is deprecated.
  Test: tests/parsers/test_parser.py::test_string_literal_concat, argvalues type: product
  Please convert to a list or tuple.
  See https://docs.pytest.org/en/stable/deprecations.html#parametrize-iterators
    metafunc.parametrize(*marker.args, **marker.kwargs, _param_mark=marker)

../../../../../../../usr/local/lib/python3.12/site-packages/_pytest/python.py:124
  /usr/local/lib/python3.12/site-packages/_pytest/python.py:124: PytestRemovedIn10Warning: Passing a non-Collection iterable to parametrize is deprecated.
  Test: tests/parsers/test_parser.py::test_path_literal_concat, argvalues type: product
  Please convert to a list or tuple.
  See https://docs.pytest.org/en/stable/deprecations.html#parametrize-iterators
    metafunc.parametrize(*marker.args, **marker.kwargs, _param_mark=marker)

../../../../../../../usr/local/lib/python3.12/site-packages/_pytest/python.py:124
  /usr/local/lib/python3.12/site-packages/_pytest/python.py:124: PytestRemovedIn10Warning: Passing a non-Collection iterable to parametrize is deprecated.
  Test: tests/parsers/test_parser.py::test_macro_call_two_args, argvalues type: product
  Please convert to a list or tuple.
  See https://docs.pytest.org/en/stable/deprecations.html#parametrize-iterators
    metafunc.parametrize(*marker.args, **marker.kwargs, _param_mark=marker)

../../../../../../../usr/local/lib/python3.12/site-packages/_pytest/python.py:124
  /usr/local/lib/python3.12/site-packages/_pytest/python.py:124: PytestRemovedIn10Warning: Passing a non-Collection iterable to parametrize is deprecated.
  Test: tests/parsers/test_parser.py::test_macro_call_three_args, argvalues type: product
  Please convert to a list or tuple.
  See https://docs.pytest.org/en/stable/deprecations.html#parametrize-iterators
    metafunc.parametrize(*marker.args, **marker.kwargs, _param_mark=marker)

../../../../../../../usr/local/lib/python3.12/site-packages/_pytest/python.py:124
  /usr/local/lib/python3.12/site-packages/_pytest/python.py:124: PytestRemovedIn10Warning: Passing a non-Collection iterable to parametrize is deprecated.
  Test: tests/parsers/test_parser.py::test_syntax_error_literal_concat_different, argvalues type: permutations
  Please convert to a list or tuple.
  See https://docs.pytest.org/en/stable/deprecations.html#parametrize-iterators
    metafunc.parametrize(*marker.args, **marker.kwargs, _param_mark=marker)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
============================================================================================= short test summary info ==============================================================================================
FAILED tests/xintegration/test_stress.py::test_callable_alias_fd_leaking[\n$XONSH_SHOW_TRACEBACK = True\nimport sys\n\[email protected]\ndef _a(args, stdin, stdout, stderr):\n    name = 'a'\n\n    print(f"{name}: print out alias.stdout", file=stdout)\n    print(f"{name}: print err alias.stderr", file=stderr)\n\n    print(f"{name}: print out sys.stdout", file=sys.stdout)\n    print(f"{name}: print err sys.stderr", file=sys.stderr)\n\n    echo @(f"{name}: echo stdout")\n    echo @(f"{name}: echo stderr") o>e\n\n    ![echo @(f"{name}: ![] echo stdout")]\n    $[echo @(f"{name}: $[] echo stdout")]\n\n    $(echo @(f"{name}: $() echo
stdout LEAKING TEST"))\n    $(echo @(f"{name}: $() echo stderr") o>e)\n\n    !(echo @(f"{name}: !() echo stdout LEAKING TEST"))\n    !(echo @(f"{name}: !() echo stderr LEAKING TEST") o>e)\n\n    execx(f'echo "{name}: execx echo stdout"')\n    execx(f'echo "{name}: execx echo stderr" o>e')\n\n    echo 1 && echo 2\n\n\[email protected]\ndef _b(args, stdin, stdout, stderr):\n    name = 'b'\n\n    print(f"{name}: print out
alias.stdout", file=stdout)\n    print(f"{name}: print err alias.stderr", file=stderr)\n\n    print(f"{name}: print out sys.stdout", file=sys.stdout)\n    print(f"{name}: print err sys.stderr", file=sys.stderr)\n\n    echo @(f"{name}: echo stdout")\n    echo @(f"{name}: echo stderr") o>e\n\n    ![echo @(f"{name}: ![] echo stdout")]\n    $[echo @(f"{name}: $[] echo stdout")]\n\n    $(echo @(f"{name}: $() echo stdout LEAKING TEST"))\n    $(echo @(f"{name}: $() echo stderr") o>e)\n\n    !(echo @(f"{name}: !() echo stdout LEAKING TEST"))\n    !(echo @(f"{name}: !() echo stderr LEAKING TEST") o>e)\n\n    execx(f'echo "{name}: execx echo stdout"')\n    execx(f'echo "{name}: execx echo stderr" o>e')\n\n    echo 3 && echo 4\n\nfor i in range(111):\n    $(a | b)\n\n\n# Empirically, in case of a leak, the output\n# drops out at ~600-1000 function calls.\nfor i in range(10):\n    for j in range(69):\n        $(a | b)\n\n] - assert 'Error' not in "a: print er...n3\\n4\\n'\n"
============================================================ 1 failed, 7515 passed, 257 skipped, 3 xfailed, 1 xpassed, 5 warnings in 471.51s (0:07:51) =============================================================
*** Error code 1