Running all tests
Run every test suite in the workspace, picking the fastest compiled device backend for the host.
Step 1: detect the device
Run this once at the start and echo the chosen device:
if [[ "$OSTYPE" == "darwin"* ]]; then
DEVICE=metal
elif command -v nvidia-smi >/dev/null 2>&1 && nvidia-smi >/dev/null 2>&1; then
DEVICE=cuda
else
DEVICE=cpu
fi
echo "Device: $DEVICE"
$DEVICE selects the Rust integration suite variant in Step 2. The other four suites don't take a device feature.
Step 2: run the suites
Copy this checklist and tick each item as the suite completes:
- [ ] JS client
- [ ] Python client
- [ ] Rust unit
- [ ] Rust integration
| # | Suite | Inner command | Working dir |
|---|---|---|---|
| 1 | JS client | make test.client.js |
repo root |
| 2 | Python client | NixOS: poetry run pytest, ruff, poetry run mypy". Every other OS: poetry run pytest, poetry run ruff, poetry run mypy |
paddler_client_python/ |
| 3 | Rust unit | TEST_DEVICE=$DEVICE make test.unit |
repo root |
| 4 | Rust integration | TEST_DEVICE=$DEVICE make test.integration |
repo root |
Run them in this order. Cheap suites (1, 3, 4) surface bugs quickly; the heavy GPU-bound suites (2, 5) come last.
Step 3: rules during the run
- Serialize GPU suites. When
$DEVICEiscudaormetal, run test suites sequentially to avoid device contention. - Per-test 30 s budget. Flag any individual test that exceeds 30 s wall-clock. That is a real bug — production or test — not flakiness.
Step 4: report
After all suites finish, sum up the results in an actionable report.