AtlatestRepositorysigil-wm

sigil-wm / tree / scriptstest-activation

1#!/usr/bin/env bash
2set -euo pipefail
3cd "$(dirname "$0")/.."
4make -j2 all build/protocol-client
5mkdir -p build/receipts
6runtime_dir=$(mktemp -d /tmp/sigil-wm-activation.XXXXXX)
7export XDG_RUNTIME_DIR="$runtime_dir" SIGIL_WM_REPL="$runtime_dir/repl"
8export WLR_BACKENDS=headless WLR_RENDERER=pixman WLR_HEADLESS_OUTPUTS=1
9unset WAYLAND_DISPLAY DISPLAY
10server_pid= first_pid= second_pid=
11cleanup() {
12 for child in "$second_pid" "$first_pid" "$server_pid"; do
13 [[ -z $child ]] || kill "$child" 2>/dev/null || true
14 [[ -z $child ]] || wait "$child" 2>/dev/null || true
15 done
16 rm -rf "$runtime_dir"
18trap cleanup EXIT
19value() { bash scripts/msg "$SIGIL_WM_REPL" "$1"; }
20wait_value() {
21 for ((attempt=0; attempt<100; attempt++)); do
22 if value "$1" | grep -q '(value #t)'; then return; fi
23 sleep 0.05
24 done
25 cat build/receipts/activation.log >&2
26 printf 'WAIT_FAILED=%s\n' "$1" >&2
27 return 1
29wait_count() {
30 local count
31 for ((attempt=0; attempt<200; attempt++)); do
32 count=$(grep -c "$2" "$1" 2>/dev/null || true)
33 if (( ${count:-0} >= $3 )); then return; fi
34 sleep 0.05
35 done
36 tail -20 "$1" >&2
37 tail -15 build/receipts/activation.log >&2
38 return 1
40timeout 150 bash scripts/run-sigil -L src eval -f test/activation.sgl > build/receipts/activation.log 2>&1 &
41server_pid=$!
42wait_count build/receipts/activation.log '^WAYLAND_SOCKET=' 1
43export WAYLAND_DISPLAY=activation-probe
44[[ -S $XDG_RUNTIME_DIR/activation-probe ]]
45timeout 30 bash scripts/run-sigil -L src eval -f test/socket-collision.sgl > build/receipts/socket-collision.log 2>&1
46grep -q '^SOCKET_COLLISION=PASS' build/receipts/socket-collision.log
47mkfifo "$runtime_dir/first-control" "$runtime_dir/second-control"
48exec {first_control}<> "$runtime_dir/first-control"
49exec {second_control}<> "$runtime_dir/second-control"
50SIGIL_WM_CLIENT_ACTIVATION=1 timeout 130 build/protocol-client green 36000 < "$runtime_dir/first-control" > build/receipts/activation-first.log 2>&1 &
51first_pid=$!
52wait_value '(= (length windows) 1)'
53SIGIL_WM_CLIENT_CONTROL=1 timeout 130 build/protocol-client red 36000 < "$runtime_dir/second-control" > build/receipts/activation-second.log 2>&1 &
54second_pid=$!
55wait_value '(and (= (length windows) 2) (= (dict-ref (host-snapshot host) focus:) (cadr windows)))'
56wait_value '(>= configurations 3)'
57printf 'a\n' >&"$first_control"
58wait_value '(and (= (length activations) 1) (= (event-ref (car activations) id:) (car windows)) (not (event-ref (car activations) seat?:)) (= (event-ref (car activations) source:) 0) (= (dict-ref (host-snapshot host) focus:) (cadr windows)))'
59value '(define untrusted-copy (car activations))'
60value '(focus-window! host (car windows))'
61wait_value '(= (dict-ref (host-snapshot host) focus:) (car windows))'
62value '(begin (emulate-key! host 1 38 #t) (emulate-key! host 1 38 #f))'
63wait_count build/receipts/activation-first.log '^CLIENT_KEY=38,1' 1
64printf 'v\n' >&"$first_control"
65wait_value '(and (= (length activations) 2) (event-ref (cadr activations) seat?:) (= (event-ref (cadr activations) source:) (car windows)) (> (event-ref (cadr activations) serial:) 0))'
66printf 'i\ns\n' >&"$first_control"
67wait_count build/receipts/activation-first.log '^CLIENT_ACTIVATION_DONE' 3
68wait_count build/receipts/activation-first.log '^CLIENT_SYNC=s' 1
69wait_value '(and (= (length activations) 2) (not (event-ref untrusted-copy seat?:)) (= (event-ref untrusted-copy source:) 0) (= (event-ref untrusted-copy serial:) 0))'
70serials=$(grep -c '^CLIENT_CONFIGURE_SERIAL=' build/receipts/activation-first.log)
71printf 'm\n' >&"$first_control"
72wait_value '(= maximizes 1)'
73wait_count build/receipts/activation-first.log '^CLIENT_CONFIGURE_SERIAL=' "$((serials+1))"
74wait_value '(let ((record (find (lambda (record) (= (dict-ref record id:) (car windows))) (dict-ref (host-snapshot host) windows:)))) (and (= (rect-width (dict-ref record committed:)) 300) (= (rect-height (dict-ref record committed:)) 300)))'
75printf 'q\n' >&"$first_control"
76wait "$first_pid"
77first_pid=
78wait_value '(= (length windows) 1)'
79sleep 0.2
80printf 'q\n' >&"$second_control"
81wait "$second_pid"
82second_pid=
83wait_value '(and (null? windows) (= (host-statistic host 1) 0))'
84value '(stop-host! host)'
85wait "$server_pid"
86server_pid=
87grep -q '^ACTIVATION_HOST=PASS' build/receipts/activation.log
88[[ ! -S $XDG_RUNTIME_DIR/activation-probe ]]
89echo 'ACTIVATION=PASS real trusted untrusted invalid serial inert focus immutable facts explicit maximize socket validation collision ownership'