@@ -1451,3 +1451,181 @@ display_is_cpu_renderer() {
14511451
14521452 return 1
14531453}
1454+
1455+ # ##############################################################################
1456+ # Wayland protocol validation (client-side)
1457+ # ##############################################################################
1458+ # Validate that the client actually created a surface and committed buffers.
1459+ # Expects WAYLAND_DEBUG output in the provided logfile.
1460+ #
1461+ # Usage:
1462+ # display_wayland_proto_validate "/path/to/run.log"
1463+ # Returns:
1464+ # 0 = looks good (surface + commit seen)
1465+ # 1 = missing required evidence
1466+ display_wayland_proto_validate () {
1467+ logf=" ${1:- } "
1468+ [ -n " $logf " ] && [ -f " $logf " ] || return 1
1469+
1470+ # Accept both wl_compositor@X and wl_compositor#X formats
1471+ # Accept commit() with or without parentheses in logs
1472+ if grep -Eq ' wl_compositor[@#][0-9]+\.create_surface' " $logf " &&
1473+ grep -Eq ' wl_surface[@#][0-9]+\.commit' " $logf " ; then
1474+ return 0
1475+ fi
1476+
1477+ return 1
1478+ }
1479+
1480+ # ##############################################################################
1481+ # Screenshot capture + delta validation
1482+ # ##############################################################################
1483+ # Uses weston-screenshooter when available.
1484+ # If the compositor rejects capture (unauthorized / protocol failure),
1485+ # treat it as "not available" so tests do not FAIL due to policy.
1486+ #
1487+ # Returns convention:
1488+ # 0 = success
1489+ # 1 = tool exists but capture failed
1490+ # 2 = tool not available or not permitted (unauthorized / protocol failure)
1491+
1492+ display_screenshot_tool () {
1493+ if command -v weston-screenshooter > /dev/null 2>&1 ; then
1494+ echo " weston-screenshooter"
1495+ return 0
1496+ fi
1497+ return 1
1498+ }
1499+
1500+ display_take_screenshot () {
1501+ out=" ${1:- } "
1502+ [ -n " $out " ] || return 1
1503+
1504+ tool=" $( display_screenshot_tool 2> /dev/null || true) "
1505+ [ -n " $tool " ] || return 2
1506+
1507+ tmp_log=" $( mktemp /tmp/weston_shot_XXXXXX.log 2> /dev/null || true) "
1508+ [ -n " $tmp_log " ] || tmp_log=" /tmp/weston_shot.log"
1509+
1510+ rc=0
1511+ case " $tool " in
1512+ weston-screenshooter)
1513+ # capture stdout+stderr to inspect authorization failures
1514+ weston-screenshooter " $out " > " $tmp_log " 2>&1 || rc=$?
1515+ ;;
1516+ * )
1517+ rm -f " $tmp_log " 2> /dev/null || true
1518+ return 2
1519+ ;;
1520+ esac
1521+
1522+ # If compositor rejects capture, treat as "not permitted" (skip)
1523+ if grep -qiE ' unauthorized|protocol failure' " $tmp_log " 2> /dev/null; then
1524+ rm -f " $tmp_log " 2> /dev/null || true
1525+ rm -f " $out " 2> /dev/null || true
1526+ return 2
1527+ fi
1528+
1529+ rm -f " $tmp_log " 2> /dev/null || true
1530+
1531+ [ " $rc " -eq 0 ] || return 1
1532+ [ -s " $out " ] || return 1
1533+ return 0
1534+ }
1535+
1536+ display_hash_file () {
1537+ f=" ${1:- } "
1538+ [ -n " $f " ] && [ -f " $f " ] || return 1
1539+
1540+ if command -v sha256sum > /dev/null 2>&1 ; then
1541+ sha256sum " $f " | awk ' {print $1}'
1542+ return 0
1543+ fi
1544+ if command -v md5sum > /dev/null 2>&1 ; then
1545+ md5sum " $f " | awk ' {print $1}'
1546+ return 0
1547+ fi
1548+ return 1
1549+ }
1550+
1551+ # Begin screenshot-delta session (captures "before" shot).
1552+ # Usage:
1553+ # display_screenshot_delta_begin "testname" "/path/to/outdir"
1554+ # Side effects:
1555+ # sets DISPLAY_SHOT_BEFORE and DISPLAY_SHOT_DIR
1556+ # Returns:
1557+ # 0 ok
1558+ # 2 tool missing or not permitted
1559+ # 1 capture failed
1560+ display_screenshot_delta_begin () {
1561+ tn=" ${1:- weston-test} "
1562+ od=" ${2:- .} "
1563+
1564+ ts=" $( date +%Y%m%d_%H%M%S 2> /dev/null || date +%s) "
1565+ DISPLAY_SHOT_DIR=" $od "
1566+ DISPLAY_SHOT_BEFORE=" ${od} /${tn} _before_${ts} .png"
1567+
1568+ rc=0
1569+ display_take_screenshot " $DISPLAY_SHOT_BEFORE " || rc=$?
1570+
1571+ if [ " $rc " -eq 0 ]; then
1572+ log_info " Screenshot before captured: $DISPLAY_SHOT_BEFORE "
1573+ return 0
1574+ fi
1575+
1576+ if [ " $rc " -eq 2 ]; then
1577+ log_warn " Screenshot tool not available or not permitted skipping screenshot delta validation"
1578+ DISPLAY_SHOT_BEFORE=" "
1579+ return 2
1580+ fi
1581+
1582+ log_warn " Failed to capture screenshot before skipping screenshot delta validation"
1583+ DISPLAY_SHOT_BEFORE=" "
1584+ return 1
1585+ }
1586+
1587+ # End screenshot-delta session (captures "after" and compares hash).
1588+ # Usage:
1589+ # display_screenshot_delta_end "testname"
1590+ # Returns:
1591+ # 0 changed (PASS)
1592+ # 1 identical (FAIL)
1593+ # 2 not available or skipped
1594+ display_screenshot_delta_end () {
1595+ tn=" ${1:- weston-test} "
1596+ [ -n " ${DISPLAY_SHOT_BEFORE:- } " ] || return 2
1597+
1598+ od=" ${DISPLAY_SHOT_DIR:- .} "
1599+ ts=" $( date +%Y%m%d_%H%M%S 2> /dev/null || date +%s) "
1600+ after=" ${od} /${tn} _after_${ts} .png"
1601+
1602+ rc=0
1603+ display_take_screenshot " $after " || rc=$?
1604+
1605+ if [ " $rc " -eq 2 ]; then
1606+ log_warn " Screenshot tool not available or not permitted skipping screenshot delta validation"
1607+ return 2
1608+ fi
1609+ if [ " $rc " -ne 0 ]; then
1610+ log_warn " Failed to capture screenshot after skipping screenshot delta validation"
1611+ return 2
1612+ fi
1613+
1614+ log_info " Screenshot after captured: $after "
1615+
1616+ h1=" $( display_hash_file " $DISPLAY_SHOT_BEFORE " 2> /dev/null || true) "
1617+ h2=" $( display_hash_file " $after " 2> /dev/null || true) "
1618+
1619+ if [ -z " $h1 " ] || [ -z " $h2 " ]; then
1620+ log_warn " Could not hash screenshots skipping screenshot delta validation"
1621+ return 2
1622+ fi
1623+
1624+ if [ " $h1 " = " $h2 " ]; then
1625+ log_warn " Screenshot delta check identical no visible change detected"
1626+ return 1
1627+ fi
1628+
1629+ log_info " Screenshot delta check changed visual validation OK"
1630+ return 0
1631+ }
0 commit comments