3.7 KiB
3.7 KiB
Raw output — gh #474 start_or_cancel() test suite
Generated test code
git diff main..wkt/start_or_cancel_tests_474 -- tests/trionics/test_taskc.py
Prose summary of the generated module (tests/trionics/test_taskc.py):
- module docstring framing the
trio.Nursery.start()startup-cancellation wart, the wrapper’s repair, and the intent thatuse_start_or_cancel=Falseparams double as upstream-trio wart-documentation (break on a trio upgrade → upstream may have shipped porcelain, re-audit the wrapper); cites gh #474 / PR #464 andmodden’sprogman.open_wks()as the source use case. - shared children:
absorbs_cancel_pre_started()(the graceful-teardown cancel-absorber which triggers the lossy RTE path) +raise_val_err()(fast-erroring sibling). test_sibling_err_not_masked_by_startup_rte(parametrizeduse_start_or_cancel): asserts eg contains exactly oneValueErrorand, wrapper-case, NO residual RTE (eg.split(ValueError)remainder isNone); bare-case, the residual RTE carries trio’s exact “child exited without calling” wording.test_pure_oob_cancel_not_morphed_to_rte(parametrized): wrapper-case runs clean and assertscs.cancelled_caught; bare-case asserts the eg-wrapped RTE.test_genuine_startup_rte_still_raised(parametrized): no-cancel protocol bug → RTE with trio’s wording from both call forms.test_childs_own_rte_never_demoted_to_cancel(parametrizedrte_argin'never got started!',1234): child cancels the ambient scope then raises its own RTE synchronously (no checkpoint between → deterministically under-cancellation at catch time); asserts the RTE survives withargs[0]intact.test_started_value_and_args_passthru:.started()value, positional args and thename=kwarg (viatrio.lowlevel.current_task().name) all forward.
Non-code output (verbatim highlights)
Behaviour probe (trio 0.29, scratchpad scripts) — the decision basis for the test shapes:
== B-sibling-err use_soc=False
start raised: RuntimeError('child exited without
calling task_status.started()')
top-level: ExceptionGroup([ValueError('sibling blew
up!'), RuntimeError('child exited without calling
task_status.started()')])
== B-cs-cancel use_soc=False
top-level: ExceptionGroup([RuntimeError('child
exited without calling task_status.started()')])
== B-sibling-err use_soc=True
start raised: Cancelled()
top-level: ExceptionGroup([ValueError('sibling blew
up!')])
== B-cs-cancel use_soc=True
start raised: Cancelled()
top-level: clean return
== own-rte-under-cancel (both) -> RTE('never got
started!') propagates unchanged
Key finding: with a WELL-BEHAVED (non-absorbing) child an OOB ancestor cancel surfaces Cancelled directly from .start() on trio 0.29 — the lossy RTE requires the child to absorb its cancel pre-.started(), which is what modden’s open_from_wks teardown did. Trio’s nursery-exit wait defers cancel delivery to children, so all tested shapes are deterministic (0 flakes / 50 runs).
Mutation verification:
mutation 1 (checkpoint_if_cancelled removed):
FAILED test_sibling_err_not_masked_by_startup_rte[True]
FAILED test_pure_oob_cancel_not_morphed_to_rte[True]
mutation 2 (guard relaxed to 'started' substring,
isinstance dropped):
FAILED test_childs_own_rte_never_demoted_to_cancel[never got started!]
FAILED test_childs_own_rte_never_demoted_to_cancel[1234]
Final runs:
tests/trionics/test_taskc.py: 9 passed in 0.03s
hammer: 0/50 runs failed
tests/trionics/ + tests/test_trioisms.py:
23 passed, 5 xfailed in 3.02s