35 lines
1.2 KiB
Bash
35 lines
1.2 KiB
Bash
#!/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
|