AtlatestRepositorysigil-wm
1
#!/usr/bin/env bash2
set -euo pipefail3
cd "$(dirname "$0")/.."4
make -j2 all build/output-present-fault.so build/lock-client build/readback5
out=$PWD/build/receipts/lock-presentation6
mkdir -p "$out"7
runtime_dir=$(mktemp -d /tmp/sigil-wm-lock-presentation.XXXXXX)8
server_pid= lock_pid=9
cleanup() {10
for child in "$lock_pid" "$server_pid"; do11
[[ -z $child ]] || kill "$child" 2>/dev/null || true12
[[ -z $child ]] || wait "$child" 2>/dev/null || true13
done14
exec 3>&- || true15
rm -rf -- "$runtime_dir"16
}17
trap cleanup EXIT18
export XDG_RUNTIME_DIR=$runtime_dir SIGIL_WM_REPL=$runtime_dir/repl SIGIL_WM_PRESENT_BARRIER=$runtime_dir/withhold19
export WLR_BACKENDS=headless WLR_RENDERER=pixman WLR_HEADLESS_OUTPUTS=120
unset WAYLAND_DISPLAY DISPLAY21
bash scripts/run-sigil --version22
runtime=$PWD/build/runtime/sigil-linux-amd64.runnable23
export LD_LIBRARY_PATH="$GUIX_ENVIRONMENT/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"24
value() {25
SIGIL_WM_EXPRESSION="$1" "$runtime" -L src eval '(import (sigil wm repl) (sigil process)) (display (repl-request (getenv "SIGIL_WM_REPL") (getenv "SIGIL_WM_EXPRESSION"))) (newline)'26
}27
wait_value() {28
for ((attempt=0; attempt<200; attempt++)); do29
value "$1" | grep -q '(value #t)' && return30
kill -0 "$server_pid"31
sleep 0.0232
done33
cat "$out/server.log"34
return 135
}36
LD_PRELOAD="$PWD/build/output-present-fault.so" timeout 120 "$runtime" -L src eval -f test/lock-presentation.sgl > "$out/server.log" 2>&1 &37
server_pid=$!38
for ((attempt=0; attempt<1000; attempt++)); do39
grep -q '^WAYLAND_SOCKET=' "$out/server.log" && break40
kill -0 "$server_pid"41
sleep 0.0242
done43
export WAYLAND_DISPLAY44
WAYLAND_DISPLAY=$(sed -n 's/^WAYLAND_SOCKET=//p' "$out/server.log")45
[[ -n $WAYLAND_DISPLAY ]]46
capture() {47
rm -f "$out/$1.ppm"48
value "(capture-output! host output \"$out/$1.ppm\")" > /dev/null49
for ((attempt=0; attempt<400; attempt++)); do50
[[ ! -s $out/$1.ppm ]] || break51
sleep 0.0252
done53
build/readback "$out/$1.ppm" "$out/$1.png" samples "320,240:$2" "30,30:$2"54
}55
capture before 00cc4456
touch "$SIGIL_WM_PRESENT_BARRIER"57
mkfifo "$runtime_dir/lock-control"58
exec 3<> "$runtime_dir/lock-control"59
timeout 100 build/lock-client blank 3>&- < "$runtime_dir/lock-control" > "$out/client.log" 2>&1 &60
lock_pid=$!61
wait_value '(= state 1)'62
capture withheld 00000063
sleep 1.364
value '(and (= state 1) (> (withheld) 0))' | grep -q '(value #t)'65
! grep -q '^LOCKED ' "$out/client.log"66
rm "$SIGIL_WM_PRESENT_BARRIER"67
capture presented 00000068
wait_value '(= state 2)'69
for ((attempt=0; attempt<200; attempt++)); do70
grep -q '^LOCKED elapsed-ms=' "$out/client.log" && break71
sleep 0.0272
done73
elapsed=$(sed -n 's/^LOCKED elapsed-ms=//p' "$out/client.log")74
[[ $elapsed =~ ^[0-9]+$ ]]75
(( elapsed >= 1300 && elapsed < 10000 ))76
printf 'u\n' >&377
wait "$lock_pid"78
lock_pid=79
grep -q '^LOCK_UNLOCK_CONFIRMED$' "$out/client.log"80
wait_value '(= state 0)'81
capture restored 00cc4482
value '(stop-host! host)' > /dev/null83
wait "$server_pid"84
server_pid=85
cat "$out/client.log" "$out/server.log"86
grep -q '^LOCK_PRESENTATION=PASS ' "$out/server.log"87
echo 'LOCK_PRESENTATION_GATE=PASS actual presentation barrier blank owner opaque pixels authenticated unlock'