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 1Source: xonsh/xonsh