test: one command for every recovery property the room depends on
Run against the lab as the package built it, not a session edited by hand. The panel came back from eight SIGKILLs a second apart in about 2.2s each time, the compositor in 0.1s, the audio policy from three, and neither Parent Call nor the browser dying disturbed the panel. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5
parent
d2d30d6b0c
commit
e8078e37c1
Executable
+81
@@ -0,0 +1,81 @@
|
||||
#!/bin/bash
|
||||
# Every recovery property the classroom depends on, measured against the
|
||||
# lab as the package built it. Run after tools/lab/from-package.
|
||||
set -uo pipefail
|
||||
|
||||
NAME="${LAB_NAME:-classroom-v2-lab}"
|
||||
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
||||
|
||||
inlab() { docker exec "$NAME" "$@"; }
|
||||
insession() {
|
||||
docker exec -u classroom -e XDG_RUNTIME_DIR=/run/user/1000 \
|
||||
-e DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \
|
||||
-e HOME=/home/classroom "$NAME" "$@"
|
||||
}
|
||||
|
||||
kill_and_wait() {
|
||||
local proc="$1" rounds="${2:-1}" gap="${3:-1}"
|
||||
for round in $(seq 1 "$rounds"); do
|
||||
local old new started
|
||||
old=$(inlab pgrep -x "$proc" | head -1)
|
||||
[ -n "$old" ] || { echo " $proc was not running"; return 1; }
|
||||
started=$(date +%s%N)
|
||||
inlab kill -9 "$old" 2>/dev/null
|
||||
new=""
|
||||
while [ $(( ($(date +%s%N) - started) / 1000000000 )) -lt 60 ]; do
|
||||
new=$(inlab pgrep -x "$proc" | head -1)
|
||||
[ -n "$new" ] && [ "$new" != "$old" ] && break
|
||||
sleep 0.25
|
||||
done
|
||||
if [ -n "$new" ] && [ "$new" != "$old" ]; then
|
||||
printf " %-16s round %s: back in %ss\n" "$proc" "$round" \
|
||||
"$(awk "BEGIN{printf \"%.1f\", ($(date +%s%N)-$started)/1000000000}")"
|
||||
else
|
||||
printf " %-16s round %s: DID NOT COME BACK\n" "$proc" "$round"
|
||||
return 1
|
||||
fi
|
||||
sleep "$gap"
|
||||
done
|
||||
}
|
||||
|
||||
echo "the panel, killed eight times a second apart"
|
||||
kill_and_wait plasmashell 8 1
|
||||
|
||||
echo
|
||||
echo "the compositor, killed twice"
|
||||
kill_and_wait kwin_wayland 2 4
|
||||
|
||||
echo
|
||||
echo "the audio policy, killed three times"
|
||||
for round in 1 2 3; do
|
||||
inlab pkill -9 -f "bin/classroom-audio" 2>/dev/null
|
||||
sleep 6
|
||||
printf " audio round %s: %s\n" "$round" \
|
||||
"$(insession systemctl --user is-active ekklesia-classroom-audio.service)"
|
||||
done
|
||||
|
||||
echo
|
||||
echo "Parent Call, killed while the panel is watched"
|
||||
insession sh -c 'setsid /usr/local/bin/classroom-parent-call >/dev/null 2>&1 &'
|
||||
sleep 5
|
||||
before=$(inlab pgrep -c -x plasmashell)
|
||||
inlab pkill -9 -f "bin/classroom-parent-call" 2>/dev/null
|
||||
sleep 3
|
||||
printf " panel before %s, after %s\n" "$before" "$(inlab pgrep -c -x plasmashell)"
|
||||
|
||||
echo
|
||||
echo "the browser, killed while the panel is watched"
|
||||
insession sh -c 'setsid /usr/local/bin/classroom-browser >/dev/null 2>&1 &'
|
||||
sleep 18
|
||||
before=$(inlab pgrep -c -x plasmashell)
|
||||
inlab pkill -9 chrome 2>/dev/null
|
||||
sleep 4
|
||||
printf " panel before %s, after %s\n" "$before" "$(inlab pgrep -c -x plasmashell)"
|
||||
|
||||
echo
|
||||
echo "what is still standing"
|
||||
printf " plasmashell=%s kwin=%s applets=%s audio=%s\n" \
|
||||
"$(inlab pgrep -c -x plasmashell)" \
|
||||
"$(inlab pgrep -c -x kwin_wayland)" \
|
||||
"$(inlab sh -c 'grep -c "^plugin=" /home/classroom/.config/plasma-org.kde.plasma.desktop-appletsrc')" \
|
||||
"$(insession systemctl --user is-active ekklesia-classroom-audio.service)"
|
||||
Reference in New Issue
Block a user