#!/usr/bin/env bash # tests/run-rust: Run Rust test suite via cargo nextest (D-030) # Exit: 0 = all pass, non-zero = failure # Stdout: {"suite":"rust","total":N,"passed":N,"failed":N,"duration_ms":N} set -euo pipefail FILTER="" while [[ $# -gt 0 ]]; do case "$1" in --filter) FILTER="${2:-}"; shift 2 ;; --filter=*) FILTER="${1#--filter=}"; shift ;; *) echo "Unknown argument: $1" >&2; exit 2 ;; esac done REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$REPO_ROOT/server" START_MS=$(date +%s%3N) TMPOUT=$(mktemp) NEXTEST_ARGS=(nextest run --color never) if [[ -n "$FILTER" ]]; then NEXTEST_ARGS+=(-E "test(~${FILTER})") fi set +e cargo "${NEXTEST_ARGS[@]}" 2>&1 | tee "$TMPOUT" >&2 EXIT_CODE=${PIPESTATUS[0]} set -e END_MS=$(date +%s%3N) DURATION_MS=$((END_MS - START_MS)) # Parse nextest summary: " Summary [ 0.123s] N tests run: X passed[, Y failed], Z skipped" # (older nextest uses "Finished", newer uses "Summary" — match both) SUMMARY=$(grep -E "^\s*(Summary|Finished)" "$TMPOUT" | tail -1 || true) _extract_num() { local haystack="$1" pattern="$2" echo "$haystack" | grep -oE "[0-9]+ $pattern" | grep -oE '^[0-9]+' || echo 0 } TOTAL=0; PASSED=0; FAILED=0 if [[ -n "$SUMMARY" ]]; then TOTAL=$(_extract_num "$SUMMARY" "tests? run") PASSED=$(_extract_num "$SUMMARY" "passed") FAILED=$(_extract_num "$SUMMARY" "failed") fi rm -f "$TMPOUT" printf '{"suite":"rust","total":%d,"passed":%d,"failed":%d,"duration_ms":%d}\n' \ "${TOTAL:-0}" "${PASSED:-0}" "${FAILED:-0}" "$DURATION_MS" exit $EXIT_CODE