AtlatestRepositorysigil-wm

sigil-wm / tree / scriptstest-lock-presentation

1#!/usr/bin/env bash
2set -euo pipefail
3cd "$(dirname "$0")/.."
4make -j2 all build/output-present-fault.so build/lock-client build/readback
5out=$PWD/build/receipts/lock-presentation
6mkdir -p "$out"
7runtime_dir=$(mktemp -d /tmp/sigil-wm-lock-presentation.XXXXXX)
8server_pid= lock_pid=
9cleanup() {
10 for child in "$lock_pid" "$server_pid"; do
11 [[ -z $child ]] || kill "$child" 2>/dev/null || true
12 [[ -z $child ]] || wait "$child" 2>/dev/null || true
13 done
14 exec 3>&- || true
15 rm -rf -- "$runtime_dir"
17trap cleanup EXIT
18export XDG_RUNTIME_DIR=$runtime_dir SIGIL_WM_REPL=$runtime_dir/repl SIGIL_WM_PRESENT_BARRIER=$runtime_dir/withhold
19export WLR_BACKENDS=headless WLR_RENDERER=pixman WLR_HEADLESS_OUTPUTS=1
20unset WAYLAND_DISPLAY DISPLAY
21bash scripts/run-sigil --version
22runtime=$PWD/build/runtime/sigil-linux-amd64.runnable
23export LD_LIBRARY_PATH="$GUIX_ENVIRONMENT/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
24value() {
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)'
27wait_value() {
28 for ((attempt=0; attempt<200; attempt++)); do
29 value "$1" | grep -q '(value #t)' && return
30 kill -0 "$server_pid"
31 sleep 0.02
32 done
33 cat "$out/server.log"
34 return 1
36LD_PRELOAD="$PWD/build/output-present-fault.so" timeout 120 "$runtime" -L src eval -f test/lock-presentation.sgl > "$out/server.log" 2>&1 &
37server_pid=$!
38for ((attempt=0; attempt<1000; attempt++)); do
39 grep -q '^WAYLAND_SOCKET=' "$out/server.log" && break
40 kill -0 "$server_pid"
41 sleep 0.02
42 done
43export WAYLAND_DISPLAY
44WAYLAND_DISPLAY=$(sed -n 's/^WAYLAND_SOCKET=//p' "$out/server.log")
45[[ -n $WAYLAND_DISPLAY ]]
46capture() {
47 rm -f "$out/$1.ppm"
48 value "(capture-output! host output \"$out/$1.ppm\")" > /dev/null
49 for ((attempt=0; attempt<400; attempt++)); do
50 [[ ! -s $out/$1.ppm ]] || break
51 sleep 0.02
52 done
53 build/readback "$out/$1.ppm" "$out/$1.png" samples "320,240:$2" "30,30:$2"
55capture before 00cc44
56touch "$SIGIL_WM_PRESENT_BARRIER"
57mkfifo "$runtime_dir/lock-control"
58exec 3<> "$runtime_dir/lock-control"
59timeout 100 build/lock-client blank 3>&- < "$runtime_dir/lock-control" > "$out/client.log" 2>&1 &
60lock_pid=$!
61wait_value '(= state 1)'
62capture withheld 000000
63sleep 1.3
64value '(and (= state 1) (> (withheld) 0))' | grep -q '(value #t)'
65! grep -q '^LOCKED ' "$out/client.log"
66rm "$SIGIL_WM_PRESENT_BARRIER"
67capture presented 000000
68wait_value '(= state 2)'
69for ((attempt=0; attempt<200; attempt++)); do
70 grep -q '^LOCKED elapsed-ms=' "$out/client.log" && break
71 sleep 0.02
72 done
73elapsed=$(sed -n 's/^LOCKED elapsed-ms=//p' "$out/client.log")
74[[ $elapsed =~ ^[0-9]+$ ]]
75(( elapsed >= 1300 && elapsed < 10000 ))
76printf 'u\n' >&3
77wait "$lock_pid"
78lock_pid=
79grep -q '^LOCK_UNLOCK_CONFIRMED$' "$out/client.log"
80wait_value '(= state 0)'
81capture restored 00cc44
82value '(stop-host! host)' > /dev/null
83wait "$server_pid"
84server_pid=
85cat "$out/client.log" "$out/server.log"
86grep -q '^LOCK_PRESENTATION=PASS ' "$out/server.log"
87echo 'LOCK_PRESENTATION_GATE=PASS actual presentation barrier blank owner opaque pixels authenticated unlock'