* test: scaffold pytest suite with mise, uv and Task
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* ci: run the pytest suite via mise and task
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix: make test cleanup survive repeated SIGINT
A group Ctrl-C reaches pytest a second time via task and uv while the
session fixture tears down, aborting the volume cleanup. Ignore SIGINT
and SIGTERM during cleanup, remove volumes in finally, and tolerate
already-removed objects.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix: pin Python 3.13 for uv without mise
Add .python-version (read by mise and uv) and cap requires-python at
<3.14 so bare uv uses 3.13 or fails instead of picking 3.14.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix: clean up test containers on SIGTERM
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* test: port compat tests to pytest
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* test: assert the success message first in the corruption test
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* test: assert the empty-tag snapshot carries no tags
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* test: remove anonymous volumes with short-lived test containers
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* test: port feature-gated tests to pytest
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* test: port sabotage self-test to task test:sabotage
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix: create parent directories in put_file
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* test: move structure.yml to tests and remove cst volume leak
container-structure-test left one anonymous volume per test container.
tests/structure.py runs it with --save and removes the new containers
with their volumes afterwards.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* test: remove the Bash suite
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* ci: run only the Python suite in the test job
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* docs: describe the Python test suite
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* test: isolate scenario steps, share helpers, use restore_latest, HEAD dir probe
Scenario fixtures record each step; a failing step fails only the tests
that assert on it. running() and raise_interrupt() live in helpers.py.
put_file probes parent directories with a HEAD request instead of a
get_archive stream. stream_run uses restore_latest and asserts its result.
Docstrings no longer refer to the removed Bash suite.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* test: sabotage check rejects errors and malformed reports
Only <failure> of the expected tests counts as red; errors in them and a
malformed JUnit report exit 2 (invalid) instead of passing or exiting 1.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* test: structure wrapper removes only its own containers
Restrict cleanup to containers of the image under test without the
rbd-test-run label and ignore NotFound.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* build: run all test suites and aggregate the exit code
task test no longer stops at the first failing suite.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix: sabotage check treats failed scenario steps as INVALID
StepFailed is no AssertionError any more; sabotage.py counts a JUnit failure
named StepFailed as error, so an expected-red test only counts when its own
assertion fails.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix: hard timeout for container-structure-test
CST_TIMEOUT (default 300 s) kills a hanging run; existing cleanup removes the
containers; exit code 124 with a clear message.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix: shorten sabotage message for lint
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix: handle JUnit failures without message in sabotage check
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>