| #!/usr/bin/env bash |
| set -euo pipefail |
|
|
| SUFFIX="${RANDOM}${RANDOM}" |
| CONTAINER="matchday-memory-concurrency-$SUFFIX" |
| DB_TEST_VALUE="local-memory-test-$SUFFIX" |
| VENV_DIR="$(mktemp -d "${TMPDIR:-/tmp}/matchday-memory-test.XXXXXX")" |
| PORT="$(python3 -c 'import socket; sock = socket.socket(); sock.bind(("127.0.0.1", 0)); print(sock.getsockname()[1]); sock.close()')" |
|
|
| cleanup() { |
| docker rm -f "$CONTAINER" >/dev/null 2>&1 || true |
| rm -rf "$VENV_DIR" |
| } |
| trap cleanup EXIT INT TERM |
|
|
| docker run -d --name "$CONTAINER" \ |
| -p "127.0.0.1:${PORT}:5432" \ |
| -e "POSTGRES_PASSWORD=$DB_TEST_VALUE" \ |
| -e POSTGRES_USER=matchday \ |
| -e POSTGRES_DB=matchday_test \ |
| postgres:16-alpine >/dev/null |
|
|
| for _ in $(seq 1 60); do |
| ready_markers="$(docker logs "$CONTAINER" 2>&1 | grep -c 'database system is ready to accept connections' || true)" |
| if [[ "$ready_markers" -ge 2 ]] && \ |
| docker exec "$CONTAINER" pg_isready -U matchday -d matchday_test >/dev/null 2>&1; then |
| break |
| fi |
| sleep 0.25 |
| done |
| docker exec "$CONTAINER" pg_isready -U matchday -d matchday_test >/dev/null |
|
|
| python3 -m venv "$VENV_DIR/venv" |
| "$VENV_DIR/venv/bin/pip" install --quiet -e '.[postgres,dev]' |
| MATCHDAY_TEST_POSTGRES_URL="postgresql+psycopg://matchday:${DB_TEST_VALUE}@127.0.0.1:${PORT}/matchday_test" \ |
| PYTHONPATH=backend \ |
| "$VENV_DIR/venv/bin/python" -m pytest \ |
| backend/tests/test_hardening_regressions.py::test_concurrent_postgres_writes_leave_exactly_one_active_memory \ |
| backend/tests/test_hardening_regressions.py::test_concurrent_postgres_share_requests_reuse_one_artifact \ |
| backend/tests/test_hardening_regressions.py::test_concurrent_postgres_share_upgrade_creates_one_v2_artifact \ |
| backend/tests/test_hardening_regressions.py::test_postgres_run_heartbeat_does_not_deadlock_agent_checkpoint \ |
| backend/tests/test_hardening_regressions.py::test_postgres_safe_reads_do_not_write_nonces_and_mutation_replay_is_atomic \ |
| backend/tests/test_hardening_regressions.py::test_concurrent_postgres_run_budget_reservations_enforce_both_limits \ |
| backend/tests/test_hardening_regressions.py::test_concurrent_postgres_resume_claim_has_exactly_one_winner \ |
| backend/tests/test_hardening_regressions.py::test_postgres_tool_charge_survives_outer_transaction_rollback \ |
| -q |
|
|