#!/usr/bin/env bash # Concurrency regression test for the Phew checker. # # The bug this guards against: the checker reaped chall.py processes it did not # own, so two overlapping checks killed each other's session and the victim # reported "Process ended while waiting for '> '" on a healthy service. Firing # several checks at once is the only way to reproduce it — sequential runs pass # even with the bug present. set -uo pipefail BASE=/opt/gemastik18-final TEAM=${1:-1} N=${2:-5} case "$TEAM" in 1) PORT=31080;; 2) PORT=32080;; 3) PORT=33080;; 4) PORT=34080;; esac U=$(grep -oP '^ADMIN_USERNAME=\K.*' "$BASE/teams/team$TEAM/receiver/.env") P=$(grep -oP '^ADMIN_PASSWORD=\K.*' "$BASE/teams/team$TEAM/receiver/.env") count() { docker exec "phew_container_team$TEAM" sh -c 'ps ax | grep -c "[c]hall.py"'; } echo "before: $(count) chall.py (1 = socat service only)" pids=() for i in $(seq 1 "$N"); do ( out=$(timeout 300 curl -sS -u "$U:$P" "http://127.0.0.1:$PORT/check/phew") echo " req$i: $out" ) & pids+=($!) done for p in "${pids[@]}"; do wait "$p"; done sleep 5 after=$(count) echo "after: $after chall.py" if [ "$after" -le 1 ]; then echo "RESULT: PASS (no leak)" else echo "RESULT: FAIL (leaked $((after - 1)))" fi