#!/usr/bin/env bats setup() { APP_ROOT="$(cd "$BATS_TEST_DIRNAME/.." && pwd)" } @test "player unit exists" { [ -f "$APP_ROOT/systemd/flowercore-signage-player-pi.service" ] } @test "player unit uses simple chromium service with restart backoff" { unit="$(cat "$APP_ROOT/systemd/flowercore-signage-player-pi.service")" [[ "$unit" == *"Type=simple"* ]] [[ "$unit" == *"Restart=always"* ]] [[ "$unit" == *"RestartSec=10s"* ]] [[ "$unit" == *"StartLimitBurst=5"* ]] [[ "$unit" == *"StartLimitIntervalSec=300s"* ]] } @test "player unit caps chromium memory at two gigabytes" { grep -q '^MemoryMax=2G$' "$APP_ROOT/systemd/flowercore-signage-player-pi.service" grep -q '^MemoryHigh=1500M$' "$APP_ROOT/systemd/flowercore-signage-player-pi.service" } @test "player unit condition-gates startup on identity and p12 certificate" { grep -q '^ConditionPathExists=/etc/flowercore/signage-node.json$' "$APP_ROOT/systemd/flowercore-signage-player-pi.service" grep -q '^ConditionPathExists=/etc/fc-signage-player/client.p12$' "$APP_ROOT/systemd/flowercore-signage-player-pi.service" } @test "player unit runs prelaunch checks before chromium" { grep -q '^ExecStartPre=/usr/local/bin/flowercore-signage-prelaunch.sh$' "$APP_ROOT/systemd/flowercore-signage-player-pi.service" grep -q '^ExecStart=/usr/local/bin/flowercore-signage-launch.sh$' "$APP_ROOT/systemd/flowercore-signage-player-pi.service" } @test "hdmi udev rule routes through the two-second settle service" { rule="$(cat "$APP_ROOT/systemd/99-flowercore-signage-hdmi.rules")" [[ "$rule" == *'KERNEL=="card?-HDMI-A-?"'* ]] [[ "$rule" == *"systemctl start flowercore-signage-player-pi-hdmi.service"* ]] [[ "$rule" != *"systemctl restart flowercore-signage-player-pi.service"* ]] } @test "hdmi responder settles, declares display, then restarts chromium" { responder="$(cat "$APP_ROOT/scripts/flowercore-signage-hdmi-respond.sh")" [[ "$responder" == *"sleep 2"* ]] [[ "$responder" == *"systemctl start flowercore-signage-detect-display.service"* ]] [[ "$responder" == *"systemctl restart flowercore-signage-player-pi.service"* ]] } @test "chromium policy json is valid and disables credential prompts" { command -v jq >/dev/null || skip "jq not installed" jq -e '.AutofillAddressEnabled == false and .AutofillCreditCardEnabled == false and .PasswordManagerEnabled == false' \ "$APP_ROOT/chromium-policies/flowercore-signage.json" >/dev/null } @test "launch script tries embed URL and logs bare-player fallback" { launch="$(cat "$APP_ROOT/scripts/flowercore-signage-launch.sh")" [[ "$launch" == *'/player/${NODE_ID}/embed?token=${CERT_THUMB}'* ]] [[ "$launch" == *"url-divergence.log"* ]] [[ "$launch" == *'/player/${NODE_ID}?token=${CERT_THUMB}'* ]] } @test "prelaunch script validates required node and cert files" { prelaunch="$(cat "$APP_ROOT/scripts/flowercore-signage-prelaunch.sh")" [[ "$prelaunch" == *"/etc/flowercore/signage-node.json"* ]] [[ "$prelaunch" == *"/etc/fc-signage-player/client.p12"* ]] [[ "$prelaunch" == *"/etc/fc-signage-player/client.p12.pass"* ]] [[ "$prelaunch" == *"exit 1"* ]] }