cat / goq
clone

turns a linux box into a private steam streaming appliance: plug in, tap your key, play from another computer

fix/release-build-and-order
goq / scripts / tests / bazzite-hardware-uat-selection.sh
bazzite-hardware-uat-selection.sh 9.1K executable
1#!/usr/bin/env bash23set -euo pipefail45script_dir="$(CDPATH='' cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)"6runner="$script_dir/../run-bazzite-hardware-uat.sh"7temp_parent="${TMPDIR:-/tmp}"8temp_parent="${temp_parent%/}"9temp_root="$(mktemp -d "$temp_parent/sigil-hardware-selection.XXXXXX")"1011cleanup() {12 local status=$?13 trap - EXIT INT TERM HUP14 case "$temp_root" in15 "$temp_parent"/sigil-hardware-selection.??????) rm -rf -- "$temp_root" ;;16 esac17 exit "$status"18}19trap cleanup EXIT INT TERM HUP2021export SIGIL_HARDWARE_UAT_SOURCE_ONLY=122# shellcheck source=../run-bazzite-hardware-uat.sh23# shellcheck disable=SC109124source "$runner"25render_node=''26va_encoder=''27va_candidates=''2829fail() {30 printf 'FAIL: %s\n' "$1" >&231 exit 132}3334fixture="$temp_root/fixture"35sysfs_root="$fixture/sys/class/drm"36device_root="$fixture/dev/dri"37drivers="$fixture/drivers"38bin="$fixture/bin"39factory_fixture="$fixture/factories.tsv"40install -d -m 0700 \41 "$sysfs_root" "$device_root" "$drivers/amdgpu" "$drivers/i915" "$bin"4243add_render_node() {44 local name="$1"45 local driver="$2"4647 install -d -m 0700 "$sysfs_root/$name/device"48 ln -s "$drivers/$driver" "$sysfs_root/$name/device/driver"49 install -m 0600 /dev/null "$device_root/$name"50}5152reset_render_nodes() {53 rm -rf -- "$sysfs_root"54 rm -rf -- "$device_root"55 install -d -m 0700 "$sysfs_root" "$device_root"56}5758cat >"$bin/gst-inspect-1.0" <<'EOF'59#!/usr/bin/env bash60set -euo pipefail6162fixture="${SIGIL_TEST_FACTORY_FIXTURE:?}"63if [[ $# -eq 0 ]]; then64 awk -F '\t' '{ printf "va: %s: fixture encoder\n", $1 }' "$fixture"65 exit 066fi67exit 168EOF69chmod 0755 "$bin/gst-inspect-1.0"70cat >"$bin/sigil" <<'EOF'71#!/usr/bin/env bash72set -euo pipefail7374fixture="${SIGIL_TEST_FACTORY_FIXTURE:?}"75[[ "$1" == capture && "$2" == encoder-preflight ]]76shift 277factory=''78device=''79required_modes=''80while [[ $# -gt 0 ]]; do81 case "$1" in82 --vaapi-encoder) factory="$2"; shift 2 ;;83 --vaapi-render-node) device="$2"; shift 2 ;;84 --rate-control) required_modes="${required_modes:+$required_modes,}$2"; shift 2 ;;85 *) exit 64 ;;86 esac87done88if [[ "${SIGIL_TEST_GST_MODE:-}" == oversize-factory ]]; then89 awk 'BEGIN { for (i = 0; i < 1048578; i++) printf "x" }'90 exit 091fi92[[ "$required_modes" == cbr,cqp ]]93awk -F '\t' -v factory="$factory" -v device="$device" '94 $1 == factory && $2 == device && $4 == "complete" \95 && ("," $3 ",") ~ /,cbr,/ && ("," $3 ",") ~ /,cqp,/ { found = 1 }96 END { exit !found }97' "$fixture"98printf '%s\n' encoder_preflight=ok99EOF100chmod 0755 "$bin/sigil"101cat >"$bin/timeout" <<'EOF'102#!/usr/bin/env bash103set -euo pipefail104105[[ "${SIGIL_TEST_TIMEOUT:-}" != true ]] || exit 124106[[ "${1:-}" == --signal=TERM ]]107shift108[[ "${1:-}" == --kill-after=2s ]]109shift110[[ "${1:-}" == 5s ]]111shift112exec "$@"113EOF114chmod 0755 "$bin/timeout"115export SIGIL_TEST_FACTORY_FIXTURE="$factory_fixture"116117select_fixture() {118 select_gstva_h264_encoder \119 "$bin/sigil" "$bin/gst-inspect-1.0" "$device_root" false \120 "${1:-}" "${2:-}" "$bin/timeout" "$fixture"121}122123reset_render_nodes124add_render_node renderD128 i915125printf '%s\t%s\t%s\t%s\n' \126 vah264enc "$device_root/renderD128" cqp,cbr complete \127 >"$factory_fixture"128select_fixture || fail 'an Intel GstVA H.264 encoder was rejected by driver name'129[[ "$render_node" == "$device_root/renderD128" ]] || \130 fail 'the capability-backed Intel render node was not selected'131[[ "$va_encoder" == vah264enc ]] || \132 fail 'the factory bound to the Intel render node was not selected'133134reset_render_nodes135add_render_node renderD130 amdgpu136printf '%s\t%s\t%s\t%s\n' \137 vah264enc "$device_root/renderD130" cqp,cbr complete \138 >"$factory_fixture"139select_fixture || fail 'a generic factory backed by renderD130 was not selected'140[[ "$render_node" == "$device_root/renderD130" && "$va_encoder" == vah264enc ]] || \141 fail 'selection retained a renderD128 or per-device factory assumption'142143reset_render_nodes144add_render_node renderD128 i915145add_render_node renderD129 amdgpu146printf '%s\t%s\t%s\t%s\n' \147 vah264enc "$device_root/renderD128" cqp,cbr complete \148 varenderD129h264enc "$device_root/renderD129" cqp,cbr complete \149 >"$factory_fixture"150selection_status=0151select_fixture || selection_status=$?152[[ "$selection_status" -eq 2 ]] || \153 fail 'two viable cross-driver pairs were not ambiguous'154[[ -z "$render_node" && -z "$va_encoder" ]] || \155 fail 'ambiguous discovery retained a silent first selection'156grep -Fxq "$device_root/renderD128 vah264enc" <<<"$va_candidates" || \157 fail 'the first ambiguous pair was not reported'158grep -Fxq "$device_root/renderD129 varenderD129h264enc" <<<"$va_candidates" || \159 fail 'the second ambiguous pair was not reported'160161select_fixture "$device_root/renderD129" varenderD129h264enc || \162 fail 'a valid explicit pair was rejected'163[[ "$render_node" == "$device_root/renderD129" \164 && "$va_encoder" == varenderD129h264enc ]] || \165 fail 'the explicit pair did not win ambiguous discovery'166if select_fixture "$device_root/renderD129" vah264enc; then167 fail 'a mismatched explicit node/factory pair was accepted'168fi169170reset_render_nodes171add_render_node renderD130 amdgpu172printf '%s\t%s\t%s\t%s\n' \173 vah264enc "$device_root/renderD129" cqp,cbr complete \174 >"$factory_fixture"175if select_fixture; then176 fail 'a factory whose device-path mismatched the render node was accepted'177fi178179for modes in cqp cbr; do180 printf '%s\t%s\t%s\t%s\n' \181 vah264enc "$device_root/renderD130" "$modes" complete \182 >"$factory_fixture"183 if select_fixture; then184 fail "a factory advertising only $modes was accepted"185 fi186done187printf '%s\t%s\t%s\t%s\n' \188 vah264enc "$device_root/renderD130" cqp,cbr missing-bitrate \189 >"$factory_fixture"190if select_fixture; then191 fail 'a factory missing a required writable property was accepted'192fi193194SIGIL_TEST_GST_MODE=oversize-factory195export SIGIL_TEST_GST_MODE196if select_fixture; then197 fail 'oversized factory inspection output was accepted'198fi199unset SIGIL_TEST_GST_MODE200201SIGIL_TEST_TIMEOUT=true202export SIGIL_TEST_TIMEOUT203if select_fixture; then204 fail 'a timed-out GStreamer registry inspection was accepted'205fi206unset SIGIL_TEST_TIMEOUT207208printf '%s\t%s\t%s\t%s\n' \209 x264enc "$device_root/renderD130" cqp,cbr complete \210 vah264enc-malformed "$device_root/renderD130" cqp,cbr complete \211 >"$factory_fixture"212if select_fixture; then213 fail 'malformed or software factory names were accepted'214fi215216printf '%s\t%s\t%s\t%s\n' \217 vah264enc "$device_root/renderD130" cqp,cbr complete \218 vah264enc "$device_root/renderD130" cqp,cbr complete \219 >"$factory_fixture"220select_fixture || fail 'duplicate listing of one factory became ambiguous'221[[ "$va_encoder" == vah264enc ]] || fail 'duplicate factory selection was unstable'222223rm -f -- "$device_root/renderD130"224ln -s "$temp_root/missing-render-node" "$device_root/renderD130"225if select_fixture; then226 fail 'a symlink render node was accepted'227fi228rm -f -- "$device_root/renderD130"229install -m 0600 /dev/null "$device_root/renderD130"230if select_gstva_h264_encoder \231 "$bin/sigil" "$bin/gst-inspect-1.0" "$device_root" true '' '' \232 "$bin/timeout" "$fixture"233then234 fail 'a regular file was accepted as a production DRM character device'235fi236[[ -z "$render_node" && -z "$va_encoder" ]] || \237 fail 'failed discovery retained stale selection state'238239encoder_config_line="vaapi_encoder = \"\$va_encoder\""240render_node_config_line="vaapi_render_node = \"\$render_node\""241[[ "$(grep -Fc "$encoder_config_line" "$runner")" -eq 3 ]] || \242 fail 'not every generated UAT config uses the selected factory'243[[ "$(grep -Fc "$render_node_config_line" "$runner")" -eq 3 ]] || \244 fail 'not every generated UAT config uses the selected render node'245if grep -Eq 'render_node=/dev/dri/renderD128|va_encoder=vah264enc' "$runner"; then246 fail 'the hardware runner still pins the original render node or factory'247fi248249fake_commit=0123456789abcdef0123456789abcdef01234567250parser_error="$temp_root/parser.error"251parser_status=0252SIGIL_HARDWARE_UAT_SOURCE_ONLY=0 bash "$runner" /invalid "$fake_commit" 1 \253 --render-node /dev/dri/renderD129 > /dev/null 2>"$parser_error" \254 || parser_status=$?255[[ "$parser_status" -eq 64 ]] || fail 'a partial override did not fail as usage error'256grep -Fxq -- '--render-node and --va-encoder must be provided together' \257 "$parser_error" || fail 'a partial override did not explain the paired requirement'258259parser_status=0260SIGIL_HARDWARE_UAT_SOURCE_ONLY=0 bash "$runner" /invalid "$fake_commit" 1 \261 --unknown value > /dev/null 2>"$parser_error" || parser_status=$?262[[ "$parser_status" -eq 64 ]] || fail 'an unknown override did not fail as usage error'263grep -Fq 'usage:' "$parser_error" || fail 'an unknown override did not print usage'264265parser_status=0266SIGIL_HARDWARE_UAT_SOURCE_ONLY=0 bash "$runner" /invalid "$fake_commit" 1 \267 --render-node /dev/dri/renderD128 --render-node /dev/dri/renderD129 \268 --va-encoder vah264enc > /dev/null 2>"$parser_error" || parser_status=$?269[[ "$parser_status" -eq 64 ]] || fail 'a duplicate override was accepted'270271parser_status=0272SIGIL_HARDWARE_UAT_SOURCE_ONLY=0 bash "$runner" /invalid "$fake_commit" 1 \273 --render-node '' --va-encoder vah264enc \274 > /dev/null 2>"$parser_error" || parser_status=$?275[[ "$parser_status" -eq 64 ]] || fail 'an empty override value was accepted'276277printf 'bazzite_hardware_uat_selection_tests=ok\n'