Re-add labwc stress harness scripts

nested-labwc.sh runs a command inside a nested labwc (wlroots-family host)
so the clipboard bridge exercises the data-control backend; stress-clipboard.sh
loops the clipboard smoke tests, snapshotting logs into /tmp/stress-fail/ on
any failure.  Recovered verbatim after the history rewrite dropped scripts/.

Usage:
  scripts/nested-labwc.sh scripts/stress-clipboard.sh [iterations]
This commit is contained in:
Andrew Hamilton 2026-08-14 08:12:05 +10:00
parent c2fdb7b6e1
commit 2cdd7a3cbf
2 changed files with 111 additions and 0 deletions

72
scripts/nested-labwc.sh Executable file
View file

@ -0,0 +1,72 @@
#!/bin/sh
# Throwaway dev wrapper: run a command inside a nested labwc (wlroots-family
# host) so the clipboard bridge uses the wlr-data-control backend.
# Usage: nested-labwc.sh [--x11] <command...>
# Default command: tabbed-wlroots with two wltest tabs.
set -e
REPO="${TABBED_REPO:-/home/ahamilton/code/tabbed-wayland}"
RUNTIME="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"
export WAYLAND_DISPLAY="${WAYLAND_DISPLAY:-wayland-0}"
export WLR_WL_OUTPUTS="${WLR_WL_OUTPUTS:-1}"
MODE=wayland
if [ "$1" = "--x11" ]; then
MODE=x11
shift
fi
if [ "$MODE" = x11 ]; then
export WLR_BACKENDS=x11
export DISPLAY="${DISPLAY:-:0}"
echo "[nested-labwc] x11 backend on $DISPLAY"
else
export WLR_BACKENDS=wayland
echo "[nested-labwc] wayland backend under $WAYLAND_DISPLAY"
fi
before="$(ls "$RUNTIME"/wayland-* 2>/dev/null || true)"
labwc -t "labwc-dev" >/tmp/labwc.log 2>&1 &
LABWC_PID=$!
trap 'kill "$LABWC_PID" 2>/dev/null || true' EXIT INT TERM
# Discover labwc's socket: the wayland-N that wasn't there before. Only match
# plain wayland-<n> sockets (labwc's name); portal/other compositors create
# wayland-proxy-* sockets at arbitrary times and must be ignored.
SOCK=""
for i in $(seq 1 150); do
for s in "$RUNTIME"/wayland-*; do
[ -e "$s" ] || continue
b="${s##*/}"
case "$b" in *.lock|*proxy*) continue ;;
wayland-[0-9]*) case "$before" in *"$s"*) ;; *) SOCK="$b"; break 2 ;; esac ;;
esac
done
if ! kill -0 "$LABWC_PID" 2>/dev/null; then
echo "[nested-labwc] labwc exited early; tail:" >&2
tail -20 /tmp/labwc.log >&2
exit 1
fi
sleep 0.1
done
if [ -z "$SOCK" ]; then
echo "[nested-labwc] no new wayland socket appeared" >&2
tail -20 /tmp/labwc.log >&2
exit 1
fi
echo "[nested-labwc] nested labwc socket: $SOCK"
export WAYLAND_DISPLAY="$SOCK"
if [ "$#" -eq 0 ]; then
set -- "$REPO/build/tabbed-wlroots" \
"$REPO/build/wltest '#ff0000'" \
"$REPO/build/wltest '#0000ff'"
fi
"$@"
rc=$?
kill "$LABWC_PID" 2>/dev/null || true
exit "$rc"

39
scripts/stress-clipboard.sh Executable file
View file

@ -0,0 +1,39 @@
#!/usr/bin/env bash
# Stress-run the clipboard smoke tests against a wlroots-family host.
# Meant to be run inside scripts/nested-labwc.sh so the data-control
# backend is exercised:
# scripts/nested-labwc.sh scripts/stress-clipboard.sh [iterations] [pytest-args...]
# Prints PASS/FAIL per iteration and snapshots logs on any failure into
# /tmp/stress-fail/iter-<n>/ for diagnosis (the Pi's intermittent labwc
# clipboard failures are the motivation).
set -u
REPO="${TABBED_REPO:-$(cd "$(dirname "$0")/.." && pwd)}"
ITER="${1:-30}"
shift 2>/dev/null || shift
FAIL_DIR=/tmp/stress-fail
rm -rf "$FAIL_DIR"
mkdir -p "$FAIL_DIR"
pass=0
fail=0
for i in $(seq 1 "$ITER"); do
out=$(cd "$REPO" && python3 -m pytest tests/test_smoke.py -k clipboard -q "$@" 2>&1)
rc=$?
if [ "$rc" -eq 0 ]; then
pass=$((pass + 1))
echo "[$(date +%H:%M:%S)] iter $i/$ITER PASS"
else
fail=$((fail + 1))
d="$FAIL_DIR/iter-$i"
mkdir -p "$d"
printf '%s\n' "$out" >"$d/pytest.txt"
cp /tmp/tabtest.log "$d/tabtest.log" 2>/dev/null || true
cp /tmp/labwc.log "$d/labwc.log" 2>/dev/null || true
echo "[$(date +%H:%M:%S)] iter $i/$ITER FAIL (snapshot in $d)"
fi
done
echo "=== $pass passed, $fail failed (of $ITER) ==="
[ "$fail" -eq 0 ]