From 9239571be193834d20f0d30614b166da539c25c8 Mon Sep 17 00:00:00 2001 From: amanthanvi Date: Sun, 28 Dec 2025 11:18:12 -0500 Subject: [PATCH] Tighten macOS update check and add empty-output test --- lib/check/all.sh | 4 +-- tests/system_maintenance.bats | 52 +++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/lib/check/all.sh b/lib/check/all.sh index ac05e27..5062db6 100644 --- a/lib/check/all.sh +++ b/lib/check/all.sh @@ -246,7 +246,7 @@ check_macos_update() { fi if sw_output=$(run_with_timeout 10 softwareupdate -l --no-scan 2> /dev/null); then - sw_status=0 + : else sw_status=$? fi @@ -257,7 +257,7 @@ check_macos_update() { # Prefer avoiding false negatives: if the system indicates updates are pending, # only clear the flag when softwareupdate explicitly reports no updates. - if [[ $sw_status -eq 0 && -n "$sw_output" ]] && echo "$sw_output" | grep -q "No new software available"; then + if [[ $sw_status -eq 0 && -n "$sw_output" ]] && echo "$sw_output" | grep -qE '^[[:space:]]*No new software available'; then updates_available="false" fi fi diff --git a/tests/system_maintenance.bats b/tests/system_maintenance.bats index dc93696..4d19b03 100644 --- a/tests/system_maintenance.bats +++ b/tests/system_maintenance.bats @@ -195,7 +195,12 @@ source "$PROJECT_ROOT/lib/check/all.sh" defaults() { echo "1"; } run_with_timeout() { + local timeout="${1:-}" shift + if [[ "$timeout" != "10" ]]; then + echo "BAD_TIMEOUT:$timeout" + return 124 + fi if [[ "${1:-}" == "softwareupdate" && "${2:-}" == "-l" && "${3:-}" == "--no-scan" ]]; then cat <<'OUT' Software Update Tool @@ -218,6 +223,7 @@ EOF [ "$status" -eq 0 ] [[ "$output" == *"Update available"* ]] [[ "$output" == *"MACOS_UPDATE_AVAILABLE=true"* ]] + [[ "$output" != *"BAD_TIMEOUT:"* ]] } @test "check_macos_update clears update flag when softwareupdate reports no updates" { @@ -229,7 +235,12 @@ source "$PROJECT_ROOT/lib/check/all.sh" defaults() { echo "1"; } run_with_timeout() { + local timeout="${1:-}" shift + if [[ "$timeout" != "10" ]]; then + echo "BAD_TIMEOUT:$timeout" + return 124 + fi if [[ "${1:-}" == "softwareupdate" && "${2:-}" == "-l" && "${3:-}" == "--no-scan" ]]; then cat <<'OUT' Software Update Tool @@ -252,6 +263,7 @@ EOF [ "$status" -eq 0 ] [[ "$output" == *"System up to date"* ]] [[ "$output" == *"MACOS_UPDATE_AVAILABLE=false"* ]] + [[ "$output" != *"BAD_TIMEOUT:"* ]] } @test "check_macos_update keeps update flag when softwareupdate times out" { @@ -263,7 +275,12 @@ source "$PROJECT_ROOT/lib/check/all.sh" defaults() { echo "1"; } run_with_timeout() { + local timeout="${1:-}" shift + if [[ "$timeout" != "10" ]]; then + echo "BAD_TIMEOUT:$timeout" + return 124 + fi if [[ "${1:-}" == "softwareupdate" && "${2:-}" == "-l" && "${3:-}" == "--no-scan" ]]; then return 124 fi @@ -280,6 +297,41 @@ EOF [ "$status" -eq 0 ] [[ "$output" == *"Update available"* ]] [[ "$output" == *"MACOS_UPDATE_AVAILABLE=true"* ]] + [[ "$output" != *"BAD_TIMEOUT:"* ]] +} + +@test "check_macos_update keeps update flag when softwareupdate returns empty output" { + run bash --noprofile --norc <<'EOF' +set -euo pipefail +source "$PROJECT_ROOT/lib/core/common.sh" +source "$PROJECT_ROOT/lib/check/all.sh" + +defaults() { echo "1"; } + +run_with_timeout() { + local timeout="${1:-}" + shift + if [[ "$timeout" != "10" ]]; then + echo "BAD_TIMEOUT:$timeout" + return 124 + fi + if [[ "${1:-}" == "softwareupdate" && "${2:-}" == "-l" && "${3:-}" == "--no-scan" ]]; then + return 0 + fi + return 124 +} + +start_inline_spinner(){ :; } +stop_inline_spinner(){ :; } + +check_macos_update +echo "MACOS_UPDATE_AVAILABLE=$MACOS_UPDATE_AVAILABLE" +EOF + + [ "$status" -eq 0 ] + [[ "$output" == *"Update available"* ]] + [[ "$output" == *"MACOS_UPDATE_AVAILABLE=true"* ]] + [[ "$output" != *"BAD_TIMEOUT:"* ]] } @test "check_macos_update skips softwareupdate when defaults shows no updates" {