cat / goq
clone

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

fix/hero-release-note
goq / scripts / tests / bazzite-inventory-cold-boot.sh
bazzite-inventory-cold-boot.sh 6.6K executable
1#!/usr/bin/env bash2# The fixture overrides commands that are reached indirectly through sourced3# inventory functions. ShellCheck reports that pattern as SC2317 before 0.104# and SC2329 in newer releases.5# shellcheck disable=SC2317,SC232967set -euo pipefail89script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"10export SIGIL_INVENTORY_SOURCE_ONLY=111# shellcheck source=../bazzite-inventory.sh12# shellcheck disable=SC109113source "$script_dir/../bazzite-inventory.sh"1415fail() {16 printf 'FAIL: %s\n' "$1" >&217 exit 118}1920assert_contains() {21 local output="$1"22 local expected="$2"23 grep -qxF "$expected" <<<"$output" || \24 fail "expected output line: $expected"25}2627assert_not_contains() {28 local output="$1"29 local unexpected="$2"30 if grep -qF "$unexpected" <<<"$output"; then31 fail "unexpected output text: $unexpected"32 fi33}3435session_user_id="$(id -u)"36session_fixture_user="$session_user_id"37session_fixture_remote=no38session_fixture_state=active39session_fixture_services='Service=sddm-autologin'40loginctl() {41 if [[ "$1" == list-sessions ]]; then42 printf '2 %s test seat0 tty1\n' "$session_user_id"43 else44 printf '%s\n' \45 'Id=2' \46 "User=$session_fixture_user" \47 "Remote=$session_fixture_remote"48 [[ -z "$session_fixture_services" ]] || \49 printf '%s\n' "$session_fixture_services"50 printf '%s\n' \51 'Type=wayland' \52 'Class=user' \53 "State=$session_fixture_state"54 fi55}5657assert_session_fixture() {58 local label="$1"59 local expected="$2"60 local output6162 output="$(cold_boot_session_evidence)"63 if [[ "$expected" == pass ]]; then64 assert_contains "$output" 'gaming_autologin_session=ok'65 assert_not_contains "$output" 'cold_boot_failure='66 else67 assert_contains "$output" \68 'cold_boot_failure=no_active_local_gaming_autologin_session'69 assert_not_contains "$output" 'gaming_autologin_session=ok'70 fi71 printf 'session_fixture=%s result=%s\n' "$label" "$expected"72}7374assert_session_fixture sddm pass75session_fixture_services='Service=gdm-autologin'76assert_session_fixture gdm pass77session_fixture_user=6553478assert_session_fixture wrong-user fail79session_fixture_user="$session_user_id"80session_fixture_remote=yes81assert_session_fixture remote fail82session_fixture_remote=no83session_fixture_state=closing84assert_session_fixture inactive fail85session_fixture_state=active86session_fixture_services='Service=gdm-password'87assert_session_fixture manual-gdm fail88session_fixture_services=''89assert_session_fixture missing-service fail90session_fixture_services='Service='91assert_session_fixture empty-service fail92session_fixture_services='Service=sddm-autologin-extra'93assert_session_fixture near-miss-service fail94session_fixture_services='Service=-autologin'95assert_session_fixture empty-service-prefix fail96session_fixture_services=$'Service=sddm-autologin\nService=gdm-autologin'97assert_session_fixture duplicate-service fail98session_fixture_services='Service=sddm-autologin'99session_fixture_user=$'65534\nUser='"$session_user_id"100assert_session_fixture duplicate-user fail101session_fixture_user="$session_user_id"102session_fixture_remote=$'yes\nRemote=no'103assert_session_fixture duplicate-remote fail104session_fixture_remote=no105session_fixture_state=$'closing\nState=active'106assert_session_fixture duplicate-state fail107session_fixture_state=active108109loginctl() {110 if [[ "$1" == list-sessions ]]; then111 printf '%s\n' \112 "2 $session_user_id test - pts/0" \113 "3 $session_user_id test - -" \114 "4 $session_user_id test seat0 tty1"115 return116 fi117118 case "$2" in119 2)120 printf '%s\n' \121 'Id=2' "User=$session_user_id" 'Remote=yes' 'Service=sshd' \122 'Type=tty' 'Class=user' 'State=active'123 ;;124 3)125 printf '%s\n' \126 'Id=3' "User=$session_user_id" 'Remote=no' 'Service=systemd-user' \127 'Type=unspecified' 'Class=manager' 'State=active'128 ;;129 4)130 printf '%s\n' \131 'Id=4' "User=$session_user_id" 'Remote=no' 'Service=gdm-autologin' \132 'Type=wayland' 'Class=user' 'State=active'133 ;;134 *)135 return 1136 ;;137 esac138}139multiple_session_output="$(cold_boot_session_evidence)"140assert_contains "$multiple_session_output" 'gaming_autologin_session=ok'141assert_not_contains "$multiple_session_output" 'cold_boot_failure='142143pass_journal='[0.500000] host systemd[1]: Reached target Basic System144[1.000000] host gamescope-session-plus[100]: starting Gamescope145[2.000000] host systemd[1000]: Started sigil-host.service - Sigil streaming host146[3.000000] host sigil[200]: INFO sigil host ready147[4.000000] host sshd-session[300]: Accepted publickey for tank'148journalctl() {149 printf '%s\n' "$pass_journal"150}151pass_output="$(cold_boot_journal_evidence)"152assert_contains "$pass_output" 'gamescope_before_first_ssh=ok'153assert_contains "$pass_output" 'sigil_unit_before_first_ssh=ok'154assert_contains "$pass_output" 'sigil_ready_before_first_ssh=ok'155assert_not_contains "$pass_output" 'cold_boot_failure='156assert_not_contains "$pass_output" 'cold_boot_evidence_insufficient='157158late_journal='[301.000000] host gamescope-session-plus[100]: starting Gamescope159[302.000000] host systemd[1000]: Started sigil-host.service - Sigil streaming host160[303.000000] host sigil[200]: INFO sigil host ready161[304.000000] host sshd-session[300]: Accepted publickey for tank'162journalctl() {163 printf '%s\n' "$late_journal"164}165late_output="$(cold_boot_journal_evidence)"166assert_contains "$late_output" \167 'cold_boot_evidence_insufficient=boot_journal_does_not_reach_startup'168169bad_order_journal='[0.500000] host systemd[1]: Reached target Basic System170[1.000000] host sshd-session[300]: Accepted publickey for tank171[2.000000] host gamescope-session-plus[100]: starting Gamescope172[3.000000] host systemd[1000]: Started sigil-host.service - Sigil streaming host173[4.000000] host sigil[200]: INFO sigil host ready'174journalctl() {175 printf '%s\n' "$bad_order_journal"176}177bad_order_output="$(cold_boot_journal_evidence)"178assert_contains "$bad_order_output" \179 'cold_boot_failure=gamescope_did_not_start_before_first_ssh'180assert_contains "$bad_order_output" \181 'cold_boot_failure=sigil_unit_did_not_start_before_first_ssh'182assert_contains "$bad_order_output" \183 'cold_boot_failure=sigil_was_not_ready_before_first_ssh'184185missing_ssh_journal='[0.500000] host systemd[1]: Reached target Basic System186[1.000000] host gamescope-session-plus[100]: starting Gamescope187[2.000000] host systemd[1000]: Started sigil-host.service - Sigil streaming host188[3.000000] host sigil[200]: INFO sigil host ready'189journalctl() {190 printf '%s\n' "$missing_ssh_journal"191}192missing_ssh_output="$(cold_boot_journal_evidence)"193assert_contains "$missing_ssh_output" \194 'cold_boot_evidence_insufficient=first_ssh_acceptance_not_observable'195196echo 'bazzite_inventory_cold_boot_tests=ok'