61 lines
3.7 KiB
Bash
Executable File
61 lines
3.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Row 305 gate (sage-3374): wording, both suites whole, mutants a/b/c with exact-name cleanup.
|
|
set -uo pipefail
|
|
WT=/mnt/storage/scratch/gizmo-305
|
|
OUT=/mnt/storage/scratch/gizmo-305-out/gate
|
|
mkdir -p "$OUT"
|
|
cd "$WT" || exit 9
|
|
[ "$(git rev-parse HEAD)" = 8ddba89b7442f09fc71cf24d7f250e40a7f60fdf ] || { echo "HEAD drift"; exit 9; }
|
|
[ -z "$(git status --porcelain)" ] || { echo "dirty tree"; exit 9; }
|
|
[ -L node_modules ] || ln -s /mnt/storage/src/mosaic-stack/node_modules node_modules
|
|
[ -L node_modules ] || { echo "no node_modules link"; exit 8; }
|
|
DIRNET=gizmo-305_default
|
|
nets() { echo " nets[$1]: $(docker network ls --format '{{.Name}}' | grep -E '^(mosaic-test-|gizmo-305_)' | tr '\n' ' ')"; }
|
|
newtmp() { export TMPDIR="$(mktemp -d /mnt/storage/scratch/tmp/gXXX)"; echo " TMPDIR $TMPDIR"; }
|
|
run() { # name script
|
|
local name=$1 s=$2; newtmp; nets "before $name"
|
|
local t0=$SECONDS
|
|
timeout -k 10 900 "$s" > "$OUT/$name.log" 2>&1; local rc=$?
|
|
echo "$name rc=$rc wall $((SECONDS-t0)) s :: $(grep -E '^selftest:' "$OUT/$name.log")"
|
|
[ $rc -eq 124 ] || [ $rc -eq 137 ] && echo "SHELL-PHASE TIMEOUT (mos-1275): to Mos unplaced"
|
|
grep -E 'compose network' "$OUT/$name.log" | sed 's/^/ /'
|
|
grep -E '^FAIL|could not remove' "$OUT/$name.log" | sed 's/^/ red: /'
|
|
grep -E '^skip' "$OUT/$name.log" | sed 's/^/ skip: /'
|
|
nets "after $name"
|
|
LASTRC=$rc
|
|
}
|
|
echo "start $(date -u +%FT%TZ) HEAD $(git rev-parse --short HEAD) refactor $(git rev-parse --short origin/refactor) docker $(docker version --format '{{.Server.Version}}')"
|
|
echo "== wording"
|
|
ABS="mosaic-test-absent-$RANDOM$RANDOM"_default
|
|
docker network rm "$ABS" >/dev/null 2>"$OUT/absent.txt"; echo " rc=$? stderr: $(cat "$OUT/absent.txt")"
|
|
grep -qE 'not found|No such network' "$OUT/absent.txt" || { echo "STOP: wording matches neither pattern"; exit 3; }
|
|
echo "== green"
|
|
for s in task release; do run "test-$s" "scripts/test-$s.sh"; [ $LASTRC -eq 0 ] || { echo "STOP: red on green run"; exit 4; }; done
|
|
nets "after green" | grep -qE 'mosaic-test-|gizmo-305_' && { echo "STOP: network left after green"; exit 5; }
|
|
echo "== mutants"
|
|
mut() { # tag python-edit expected(red|green)
|
|
local tag=$1 edit=$2 want=$3
|
|
for s in task release; do
|
|
local f="scripts/test-$s.sh" sum; sum=$(sha256sum "$f" | cut -d' ' -f1)
|
|
cp -p "$f" "$OUT/$s.orig"
|
|
python3 -B -c "$edit" "$f" || { echo "mutant $tag edit failed"; exit 6; }
|
|
git diff --stat -- "$f" | head -1 | sed "s/^/ M$tag /"
|
|
run "M$tag-$s" "$f"
|
|
cp -p "$OUT/$s.orig" "$f"
|
|
[ "$(sha256sum "$f" | cut -d' ' -f1)" = "$sum" ] && echo " restore ok $f" || { echo "RESTORE MISMATCH $f"; exit 7; }
|
|
if [ "$want" = red ]; then grep -q '^FAIL.*compose network' "$OUT/M$tag-$s.log" && echo " M$tag-$s KILLED" || echo " M$tag-$s SURVIVED (unexpected)"
|
|
else grep -q '^OK.*compose network' "$OUT/M$tag-$s.log" && echo " M$tag-$s survived (known)" || echo " M$tag-$s unexpected red"; fi
|
|
# exact-name cleanup (mos-1438)
|
|
for n in $(docker network ls --format '{{.Name}}' | grep -E '^(mosaic-test-(task|release)-[a-z0-9]+_default|gizmo-305_default)$'); do
|
|
docker network rm "$n" >/dev/null && echo " cleaned $n"
|
|
done
|
|
nets "after cleanup M$tag-$s"
|
|
done
|
|
}
|
|
E='import sys;p=sys.argv[1];s=open(p).read();o=%s;n=%s;assert s.count(o)==1;open(p,"w").write(s.replace(o,n))'
|
|
mut a "$(printf "$E" "'export COMPOSE_PROJECT_NAME='" "'COMPOSE_PROJECT_NAME='")" red
|
|
mut b "$(printf "$E" "'err=\"\$(docker network rm \"\$net\" 2>&1 >/dev/null)\" && return 0'" "'err=\"\" && return 0'")" red
|
|
mut c "$(printf "$E" "'; remove_compose_network'\"'\"' EXIT'" "''\"'\"' EXIT'")" green
|
|
[ -z "$(git status --porcelain | grep -v '^?? node_modules$')" ] && echo "tree clean after mutants" || { echo "TREE DIRTY"; git status --porcelain; }
|
|
echo "end $(date -u +%FT%TZ)"
|