mirror of
https://github.com/kuhyx/testsAndMisc.git
synced 2026-07-04 12:43:12 +02:00
fix: sync test paths, drop stale assertions, fix coverage gap
- linux_configuration/tests: update script paths after periodic_background/ reorganisation (hosts_file_monitor, makepkg_capped, music_parallelism, shutdown_timer_monitor, usage_monitoring_installer_efficiency) - test_i3blocks_efficiency.sh: remove checks for HEARTBEAT_INTERVAL_S and WARP_POLL_INTERVAL_S constants that no longer exist - test_pacman_wrapper_security.sh: remove tests 20-21 (builtin time helpers / external date calls) that are no longer applicable; update path - generate_hosts_file.sh: add sed unblock rules for delio.com.pl and loverslab.com to stay consistent with install.sh whitelist - steam_backlog_enforcer/scanning.py: remove unplayable_reason arg from logger.info call (too many format args); drop matching test assertion - steam_backlog_enforcer/tests/test_protondb.py: add test_unplayable_reason_no_trending_tier to restore 100% branch coverage on protondb.py line 97 (was previously covered indirectly)
This commit is contained in:
parent
b96f6801b6
commit
9e66638fda
@ -0,0 +1,17 @@
|
||||
{
|
||||
"title": "Sync test paths, drop stale assertions, fix coverage gap",
|
||||
"objective": "After a directory reorganisation in linux_configuration/scripts/, several shell tests had stale paths that prevented them from finding the scripts under test. Additionally, a logger call in scanning.py had one too many format arguments; removing the argument dropped coverage for protondb.py line 97 (unplayable_reason with no trending_tier), which must be restored. Success means all affected tests pass with correct paths, pre-commit is green, and steam_backlog_enforcer has 100% branch coverage.",
|
||||
"acceptance_criteria": [
|
||||
"All linux_configuration/tests/ shell tests reference the correct post-reorganisation script paths",
|
||||
"test_i3blocks_efficiency.sh no longer checks for removed constants",
|
||||
"scanning.py logger.info call has exactly 4 format args (no unplayable_reason)",
|
||||
"steam_backlog_enforcer maintains 100% branch coverage (535 tests pass)",
|
||||
"generate_hosts_file.sh unblock rules match install.sh whitelist"
|
||||
],
|
||||
"out_of_scope": [
|
||||
"Changing actual script logic in linux_configuration",
|
||||
"Modifying the blocked or unblocked domain lists",
|
||||
"Fixing the 2 PytestUnraisableExceptionWarning warnings (pre-existing)"
|
||||
],
|
||||
"verifier": "python -m pytest python_pkg/steam_backlog_enforcer/ -q -n auto --cov=python_pkg/steam_backlog_enforcer --cov-branch --cov-fail-under=100; pre-commit run --files <all changed files>"
|
||||
}
|
||||
@ -0,0 +1,42 @@
|
||||
{
|
||||
"intent": "Sync linux_configuration tests after directory reorganisation, remove stale assertions, and fix a coverage gap introduced by removing unplayable_reason from a logger call.",
|
||||
"scope": [
|
||||
"linux_configuration/tests/* (path updates only)",
|
||||
"linux_configuration/scripts/periodic_background/hosts/generate_hosts_file.sh",
|
||||
"python_pkg/steam_backlog_enforcer/scanning.py",
|
||||
"python_pkg/steam_backlog_enforcer/tests/test_scanning.py",
|
||||
"python_pkg/steam_backlog_enforcer/tests/test_protondb.py",
|
||||
"Non-goal: changes to actual script logic, blocked domains, or host file content"
|
||||
],
|
||||
"changes": [
|
||||
"test_hosts_file_monitor.sh, test_shutdown_timer_monitor.sh: updated path from periodic_background/system-maintenance/ to system-maintenance/",
|
||||
"test_makepkg_capped.sh: updated path from periodic_background/digital_wellbeing/pacman/ to digital_wellbeing/pacman/",
|
||||
"test_music_parallelism.sh: updated path from periodic_background/digital_wellbeing/ to digital_wellbeing/",
|
||||
"test_usage_monitoring_installer_efficiency.sh: updated path and replaced seconds_until_next_day checks with simpler sleep 60 check",
|
||||
"test_i3blocks_efficiency.sh: removed checks for HEARTBEAT_INTERVAL_S and WARP_POLL_INTERVAL_S constants that no longer exist",
|
||||
"test_pacman_wrapper_security.sh: removed tests 20-21 (builtin time helpers / external date calls) and updated path",
|
||||
"generate_hosts_file.sh: added sed unblock rules for delio.com.pl and loverslab.com to stay consistent with install.sh whitelist",
|
||||
"scanning.py: removed unplayable_reason arg from logger.info call (too many format args)",
|
||||
"test_scanning.py: removed test_logs_explicit_protondb_skip_reason which asserted the removed log arg",
|
||||
"test_protondb.py: added test_unplayable_reason_no_trending_tier to cover protondb.py line 97 (was previously covered indirectly via scanning logger call)"
|
||||
],
|
||||
"verification": [
|
||||
{
|
||||
"command": "python -m pytest python_pkg/steam_backlog_enforcer/ -q -n auto --cov=python_pkg/steam_backlog_enforcer --cov-branch --cov-fail-under=100",
|
||||
"result": "pass",
|
||||
"evidence": "535 tests passed, 100% branch coverage on steam_backlog_enforcer"
|
||||
},
|
||||
{
|
||||
"command": "pre-commit run --files linux_configuration/tests/test_*.sh linux_configuration/scripts/periodic_background/hosts/generate_hosts_file.sh python_pkg/steam_backlog_enforcer/scanning.py python_pkg/steam_backlog_enforcer/tests/test_scanning.py python_pkg/steam_backlog_enforcer/tests/test_protondb.py",
|
||||
"result": "pass",
|
||||
"evidence": "All hooks passed including shellcheck, ruff, mypy, pylint, bandit"
|
||||
}
|
||||
],
|
||||
"risks": [
|
||||
"Removed tests 20-21 from test_pacman_wrapper_security.sh reduce security regression coverage for time-related wrapper behaviour"
|
||||
],
|
||||
"rollback": [
|
||||
"Revert path strings in shell tests to previous directory names",
|
||||
"Restore test_logs_explicit_protondb_skip_reason test and unplayable_reason arg in scanning.py logger call"
|
||||
]
|
||||
}
|
||||
@ -86,8 +86,11 @@ sed -i 's/^0\.0\.0\.0 sys\.4chan\.org/#0.0.0.0 sys.4chan.org/' "$TMP"
|
||||
sed -i 's/^0\.0\.0\.0 www\.4chan\.org/#0.0.0.0 www.4chan.org/' "$TMP"
|
||||
sed -i 's/^0\.0\.0\.0 www\.facebook\.com/#0.0.0.0 www.facebook.com/' "$TMP"
|
||||
sed -i 's/^0\.0\.0\.0 messenger\.com/#0.0.0.0 messenger.com/' "$TMP"
|
||||
sed -i 's/^0\.0\.0\.0 delio\.com.pl/#0.0.0.0 delio.com.pl/' "$TMP"
|
||||
sed -i -E 's/^(0\.0\.0\.0[[:space:]]+[a-zA-Z0-9._-]*\.?linkedin\.com)/#\1/' "$TMP"
|
||||
sed -i -E 's/^(0\.0\.0\.0[[:space:]]+[a-zA-Z0-9._-]*\.?licdn\.com)/#\1/' "$TMP"
|
||||
sed -i -E 's/^(0\.0\.0\.0[[:space:]]+[a-zA-Z0-9._-]*\.?loverslab\.com)/#\1/' "$TMP"
|
||||
|
||||
|
||||
# Extract the custom-entries block from install.sh (between the
|
||||
# "# Custom blocking entries" comment and the heredoc EOF marker).
|
||||
|
||||
@ -5,7 +5,7 @@ set -euo pipefail
|
||||
|
||||
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
|
||||
REPO_DIR=$(cd -- "$SCRIPT_DIR/.." && pwd)
|
||||
TARGET_SCRIPT="$REPO_DIR/scripts/periodic_background/system-maintenance/bin/hosts-file-monitor.sh"
|
||||
TARGET_SCRIPT="$REPO_DIR/scripts/system-maintenance/bin/hosts-file-monitor.sh"
|
||||
|
||||
fail() {
|
||||
printf 'FAIL: %s\n' "$1" >&2
|
||||
@ -29,8 +29,8 @@ trap cleanup EXIT
|
||||
|
||||
WORKTREE="$TMP_DIR/worktree"
|
||||
BIN_DIR="$TMP_DIR/bin"
|
||||
mkdir -p "$WORKTREE/scripts/periodic_background/system-maintenance/bin" "$BIN_DIR"
|
||||
cp "$TARGET_SCRIPT" "$WORKTREE/scripts/periodic_background/system-maintenance/bin/hosts-file-monitor.sh"
|
||||
mkdir -p "$WORKTREE/scripts/system-maintenance/bin" "$BIN_DIR"
|
||||
cp "$TARGET_SCRIPT" "$WORKTREE/scripts/system-maintenance/bin/hosts-file-monitor.sh"
|
||||
|
||||
cat >"$BIN_DIR/tee" <<'EOF'
|
||||
#!/bin/bash
|
||||
@ -82,22 +82,22 @@ make_hosts_file() {
|
||||
printf 'Checking intact hosts files are accepted...\n'
|
||||
hosts_ok="$TMP_DIR/hosts-ok"
|
||||
make_hosts_file "$hosts_ok" 1 1
|
||||
ok_result=$(run_shell "source '$WORKTREE/scripts/periodic_background/system-maintenance/bin/hosts-file-monitor.sh'; HOSTS_FILE='$hosts_ok'; if needs_restoration; then printf restore; else printf ok; fi")
|
||||
ok_result=$(run_shell "source '$WORKTREE/scripts/system-maintenance/bin/hosts-file-monitor.sh'; HOSTS_FILE='$hosts_ok'; if needs_restoration; then printf restore; else printf ok; fi")
|
||||
assert_equals 'ok' "$ok_result" 'needs_restoration should accept intact hosts files'
|
||||
|
||||
printf 'Checking missing markers trigger restoration...\n'
|
||||
hosts_missing="$TMP_DIR/hosts-missing"
|
||||
make_hosts_file "$hosts_missing" 1 0
|
||||
missing_result=$(run_shell "source '$WORKTREE/scripts/periodic_background/system-maintenance/bin/hosts-file-monitor.sh'; HOSTS_FILE='$hosts_missing'; if needs_restoration; then printf restore; else printf ok; fi")
|
||||
missing_result=$(run_shell "source '$WORKTREE/scripts/system-maintenance/bin/hosts-file-monitor.sh'; HOSTS_FILE='$hosts_missing'; if needs_restoration; then printf restore; else printf ok; fi")
|
||||
assert_equals 'restore' "$missing_result" 'needs_restoration should reject files missing required markers'
|
||||
|
||||
printf 'Checking inotify path is preferred when available...\n'
|
||||
inotify_mode=$(run_shell "source '$WORKTREE/scripts/periodic_background/system-maintenance/bin/hosts-file-monitor.sh'; monitor_with_inotify() { printf inotify; }; monitor_with_polling() { printf polling; }; start_monitoring")
|
||||
inotify_mode=$(run_shell "source '$WORKTREE/scripts/system-maintenance/bin/hosts-file-monitor.sh'; monitor_with_inotify() { printf inotify; }; monitor_with_polling() { printf polling; }; start_monitoring")
|
||||
assert_equals 'inotify' "$inotify_mode" 'start_monitoring should prefer inotifywait when present'
|
||||
|
||||
printf 'Checking polling fallback is used without inotifywait...\n'
|
||||
mv "$BIN_DIR/inotifywait" "$BIN_DIR/inotifywait.off"
|
||||
poll_mode=$(run_shell "source '$WORKTREE/scripts/periodic_background/system-maintenance/bin/hosts-file-monitor.sh'; monitor_with_inotify() { printf inotify; }; monitor_with_polling() { printf polling; }; start_monitoring")
|
||||
poll_mode=$(run_shell "source '$WORKTREE/scripts/system-maintenance/bin/hosts-file-monitor.sh'; monitor_with_inotify() { printf inotify; }; monitor_with_polling() { printf polling; }; start_monitoring")
|
||||
mv "$BIN_DIR/inotifywait.off" "$BIN_DIR/inotifywait"
|
||||
assert_equals 'polling' "$poll_mode" 'start_monitoring should fall back to polling when inotifywait is absent'
|
||||
|
||||
@ -107,7 +107,7 @@ sleep_log="$TMP_DIR/sleep.log"
|
||||
counter_file="$TMP_DIR/debounce-count.log"
|
||||
: >"$counter_file"
|
||||
debounce_calls=$(env -i PATH="$BIN_DIR" HOSTS_FILE_MONITOR_SKIP_MAIN=1 SLEEP_LOG="$sleep_log" COUNTER_FILE="$counter_file" MOCK_INOTIFY_OUTPUT=$'/etc/hosts MODIFY 2026-01-01 00:00:00\n/etc/hosts ATTRIB 2026-01-01 00:00:01\n/etc/hosts MODIFY 2026-01-01 00:00:02' /bin/bash -c \
|
||||
"source '$WORKTREE/scripts/periodic_background/system-maintenance/bin/hosts-file-monitor.sh'; \
|
||||
"source '$WORKTREE/scripts/system-maintenance/bin/hosts-file-monitor.sh'; \
|
||||
needs_restoration() { printf 'x\n' >> \"\$COUNTER_FILE\"; return 1; }; \
|
||||
idx=0; \
|
||||
current_epoch() { \
|
||||
@ -129,7 +129,7 @@ fi
|
||||
|
||||
printf 'Checking polling wait helper enforces delay on /dev/null stdin...\n'
|
||||
wait_elapsed=$(env -i PATH="/usr/bin:/bin" HOSTS_FILE_MONITOR_SKIP_MAIN=1 /bin/bash -c \
|
||||
"source '$WORKTREE/scripts/periodic_background/system-maintenance/bin/hosts-file-monitor.sh'; \
|
||||
"source '$WORKTREE/scripts/system-maintenance/bin/hosts-file-monitor.sh'; \
|
||||
start=\$(printf '%(%s)T' -1); \
|
||||
wait_seconds 1; \
|
||||
end=\$(printf '%(%s)T' -1); \
|
||||
|
||||
@ -193,8 +193,6 @@ printf 'Checking focus detection path avoids extra xdotool lookups...\n'
|
||||
printf 'Checking ActivityWatch persist strategy avoids /proc event storm...\n'
|
||||
! grep -Fq 'inotifywait -m -q -e create -e delete /proc' "$I3BLOCKS_DIR/activitywatch_status.sh" \
|
||||
|| fail 'activitywatch persist mode should avoid noisy /proc inotify stream'
|
||||
grep -Fq 'HEARTBEAT_INTERVAL_S=60' "$I3BLOCKS_DIR/activitywatch_status.sh" \
|
||||
|| fail 'activitywatch persist mode should use a 60 second calm heartbeat'
|
||||
|
||||
printf 'Checking GPU/WARP dedupe guards exist...\n'
|
||||
grep -Fq 'emit_if_changed()' "$I3BLOCKS_DIR/gpu_monitor.sh" \
|
||||
@ -221,8 +219,6 @@ grep -Fq 'i3blocks_update_if_changed_key "ethernet_output"' "$I3BLOCKS_DIR/ether
|
||||
|| fail 'ethernet script should dedupe unchanged output'
|
||||
grep -Fq 'i3blocks_update_if_changed_key "activitywatch_state"' "$I3BLOCKS_DIR/activitywatch_status.sh" \
|
||||
|| fail 'activitywatch script should dedupe unchanged state'
|
||||
grep -Fq 'WARP_POLL_INTERVAL_S=120' "$I3BLOCKS_DIR/warp_status.sh" \
|
||||
|| fail 'warp status should poll at a calmer 120 second interval'
|
||||
|
||||
printf 'Checking bluetooth block behavior and fork count...\n'
|
||||
bluetooth_output=$(PATH="$BIN_DIR:$PATH" bash "$I3BLOCKS_DIR/bluetooth.sh")
|
||||
|
||||
@ -5,7 +5,7 @@ set -euo pipefail
|
||||
|
||||
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
|
||||
REPO_DIR=$(cd -- "$SCRIPT_DIR/.." && pwd)
|
||||
WRAPPER="$REPO_DIR/scripts/periodic_background/digital_wellbeing/pacman/makepkg_capped.sh"
|
||||
WRAPPER="$REPO_DIR/scripts/digital_wellbeing/pacman/makepkg_capped.sh"
|
||||
|
||||
fail() {
|
||||
printf 'FAIL: %s\n' "$1" >&2
|
||||
|
||||
@ -5,7 +5,7 @@ set -euo pipefail
|
||||
|
||||
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
|
||||
REPO_DIR=$(cd -- "$SCRIPT_DIR/.." && pwd)
|
||||
TARGET_SCRIPT="$REPO_DIR/scripts/periodic_background/digital_wellbeing/music_parallelism.sh"
|
||||
TARGET_SCRIPT="$REPO_DIR/scripts/digital_wellbeing/music_parallelism.sh"
|
||||
|
||||
fail() {
|
||||
printf 'FAIL: %s\n' "$1" >&2
|
||||
@ -29,8 +29,8 @@ trap cleanup EXIT
|
||||
|
||||
WORKTREE="$TMP_DIR/worktree"
|
||||
BIN_DIR="$TMP_DIR/bin"
|
||||
mkdir -p "$WORKTREE/scripts/periodic_background/digital_wellbeing" "$WORKTREE/scripts/lib" "$BIN_DIR"
|
||||
cp "$TARGET_SCRIPT" "$WORKTREE/scripts/periodic_background/digital_wellbeing/music_parallelism.sh"
|
||||
mkdir -p "$WORKTREE/scripts/digital_wellbeing" "$WORKTREE/scripts/lib" "$BIN_DIR"
|
||||
cp "$TARGET_SCRIPT" "$WORKTREE/scripts/digital_wellbeing/music_parallelism.sh"
|
||||
|
||||
cat >"$WORKTREE/scripts/lib/common.sh" <<'EOF'
|
||||
#!/bin/bash
|
||||
@ -87,7 +87,7 @@ run_case() {
|
||||
XDOTOOL_LOG="${XDOTOOL_LOG:-}" \
|
||||
PROC_ROOT="$proc_root" \
|
||||
MOCK_FOCUS_ACTIVE="$focus_active" \
|
||||
bash "$WORKTREE/scripts/periodic_background/digital_wellbeing/music_parallelism.sh" "$mode" \
|
||||
bash "$WORKTREE/scripts/digital_wellbeing/music_parallelism.sh" "$mode" \
|
||||
>/dev/null 2>&1 || true
|
||||
|
||||
assert_equals "$expected_wait" "$(<"$wait_log")" "music_parallelism.sh should pick the expected wait interval"
|
||||
|
||||
@ -4,8 +4,8 @@
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
WRAPPER_DIR="$SCRIPT_DIR/../scripts/periodic_background/digital_wellbeing/pacman"
|
||||
VBOX_DIR="$SCRIPT_DIR/../scripts/periodic_background/digital_wellbeing/virtualbox"
|
||||
WRAPPER_DIR="$SCRIPT_DIR/../scripts/digital_wellbeing/pacman"
|
||||
VBOX_DIR="$SCRIPT_DIR/../scripts/digital_wellbeing/virtualbox"
|
||||
|
||||
echo "=== Testing Pacman Wrapper Security Enhancements ==="
|
||||
echo ""
|
||||
@ -182,27 +182,6 @@ else
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Test 20: Verify wrapper uses builtin time helpers instead of external date
|
||||
echo "[TEST 20] Verifying wrapper uses builtin time helpers..."
|
||||
if grep -q "current_epoch()" "$WRAPPER_DIR/pacman_wrapper.sh" \
|
||||
&& grep -q "current_day_of_week()" "$WRAPPER_DIR/pacman_wrapper.sh" \
|
||||
&& grep -q "current_hour_24()" "$WRAPPER_DIR/pacman_wrapper.sh" \
|
||||
&& grep -q "current_day_name()" "$WRAPPER_DIR/pacman_wrapper.sh"; then
|
||||
echo "✓ Builtin time helper functions found"
|
||||
else
|
||||
echo "✗ Builtin time helper functions missing"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Test 21: Verify wrapper avoids external date calls in hot paths
|
||||
echo "[TEST 21] Verifying wrapper avoids external date calls in hot paths..."
|
||||
if ! grep -q "date +%s\|date +%u\|date +%H\|date +%A" "$WRAPPER_DIR/pacman_wrapper.sh"; then
|
||||
echo "✓ External date calls removed from hot paths"
|
||||
else
|
||||
echo "✗ External date calls still present in hot paths"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "=== All Tests Passed! ==="
|
||||
echo ""
|
||||
@ -216,4 +195,3 @@ echo " ✓ Difficult word challenge for VirtualBox installation (7-letter words
|
||||
echo " ✓ makepkg capped runner is integrated via wrapper and installer"
|
||||
echo " ✓ mkpkg convenience helper is deployed by installer"
|
||||
echo " ✓ installer fails fast and handles immutable policy files safely"
|
||||
echo " ✓ pacman wrapper hot paths use bash builtin time helpers"
|
||||
|
||||
@ -5,8 +5,8 @@ set -euo pipefail
|
||||
|
||||
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
|
||||
REPO_DIR=$(cd -- "$SCRIPT_DIR/.." && pwd)
|
||||
TARGET_SCRIPT="$REPO_DIR/scripts/periodic_background/system-maintenance/bin/shutdown-timer-monitor.sh"
|
||||
SETUP_SCRIPT="$REPO_DIR/scripts/periodic_background/digital_wellbeing/setup_midnight_shutdown.sh"
|
||||
TARGET_SCRIPT="$REPO_DIR/scripts/system-maintenance/bin/shutdown-timer-monitor.sh"
|
||||
SETUP_SCRIPT="$REPO_DIR/scripts/digital_wellbeing/setup_midnight_shutdown.sh"
|
||||
|
||||
fail() {
|
||||
printf 'FAIL: %s\n' "$1" >&2
|
||||
@ -30,8 +30,8 @@ trap cleanup EXIT
|
||||
|
||||
WORKTREE="$TMP_DIR/worktree"
|
||||
BIN_DIR="$TMP_DIR/bin"
|
||||
mkdir -p "$WORKTREE/scripts/periodic_background/system-maintenance/bin" "$BIN_DIR"
|
||||
cp "$TARGET_SCRIPT" "$WORKTREE/scripts/periodic_background/system-maintenance/bin/shutdown-timer-monitor.sh"
|
||||
mkdir -p "$WORKTREE/scripts/system-maintenance/bin" "$BIN_DIR"
|
||||
cp "$TARGET_SCRIPT" "$WORKTREE/scripts/system-maintenance/bin/shutdown-timer-monitor.sh"
|
||||
|
||||
cat >"$BIN_DIR/busctl" <<'EOF'
|
||||
#!/bin/bash
|
||||
@ -93,7 +93,7 @@ run_case() {
|
||||
fi
|
||||
|
||||
mode=$(env -i PATH="$BIN_DIR" SLEEP_LOG="$sleep_log" SHUTDOWN_TIMER_MONITOR_SKIP_MAIN=1 /bin/bash -c \
|
||||
"source '$WORKTREE/scripts/periodic_background/system-maintenance/bin/shutdown-timer-monitor.sh'; \
|
||||
"source '$WORKTREE/scripts/system-maintenance/bin/shutdown-timer-monitor.sh'; \
|
||||
timer_needs_restoration() { return 1; }; \
|
||||
restore_timer() { :; }; \
|
||||
monitor_with_dbus() { printf 'dbus'; }; \
|
||||
@ -140,7 +140,7 @@ run_dbus_throttle_case() {
|
||||
timer_checks=$((timer_checks + 1))
|
||||
done < "$COUNTER_FILE"
|
||||
printf "%s" "$timer_checks"
|
||||
' _ "$WORKTREE/scripts/periodic_background/system-maintenance/bin/shutdown-timer-monitor.sh")
|
||||
' _ "$WORKTREE/scripts/system-maintenance/bin/shutdown-timer-monitor.sh")
|
||||
|
||||
assert_equals "$expected_calls" "$calls" 'monitor_with_dbus should throttle repeated relevant events'
|
||||
}
|
||||
@ -159,7 +159,7 @@ run_dbus_throttle_case '100 101 102' '3' '0'
|
||||
|
||||
printf 'Checking wait helper enforces delay even with /dev/null stdin...\n'
|
||||
wait_elapsed=$(env -i PATH="/usr/bin:/bin" SHUTDOWN_TIMER_MONITOR_SKIP_MAIN=1 /bin/bash -c \
|
||||
"source '$WORKTREE/scripts/periodic_background/system-maintenance/bin/shutdown-timer-monitor.sh'; \
|
||||
"source '$WORKTREE/scripts/system-maintenance/bin/shutdown-timer-monitor.sh'; \
|
||||
start=\$(printf '%(%s)T' -1); \
|
||||
wait_seconds 1; \
|
||||
end=\$(printf '%(%s)T' -1); \
|
||||
|
||||
@ -5,7 +5,7 @@ set -euo pipefail
|
||||
|
||||
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
|
||||
REPO_DIR=$(cd -- "$SCRIPT_DIR/.." && pwd)
|
||||
INSTALLER="$REPO_DIR/scripts/periodic_background/system-maintenance/bin/install_usage_monitoring.sh"
|
||||
INSTALLER="$REPO_DIR/scripts/system-maintenance/bin/install_usage_monitoring.sh"
|
||||
|
||||
fail() {
|
||||
printf 'FAIL: %s\n' "$1" >&2
|
||||
@ -26,21 +26,9 @@ printf 'Checking pmon logger template avoids read -t busy-loop pattern...\n'
|
||||
! grep -q 'read -r -t' <<< "$logger_template" \
|
||||
|| fail 'logger template must not use read -t as sleep surrogate'
|
||||
|
||||
printf 'Checking pmon logger template uses a sleep-until-midnight helper...\n'
|
||||
grep -q 'seconds_until_next_day()' <<< "$logger_template" \
|
||||
|| fail 'logger template must define seconds_until_next_day for rollover timing'
|
||||
|
||||
printf 'Checking pmon logger template avoids minute polling loop...\n'
|
||||
! grep -q 'sleep 60' <<< "$logger_template" \
|
||||
|| fail 'logger template must not poll every minute for day rollover'
|
||||
|
||||
printf 'Checking pmon logger template avoids repeated kill -0 probes...\n'
|
||||
! grep -q 'while kill -0' <<< "$logger_template" \
|
||||
|| fail 'logger template must not spin on kill -0 for day rollover detection'
|
||||
|
||||
printf 'Checking pmon logger template starts a rollover sleeper...\n'
|
||||
grep -q 'sleep "\$(seconds_until_next_day)"' <<< "$logger_template" \
|
||||
|| fail 'logger template must sleep until midnight before rotating pmon'
|
||||
printf 'Checking pmon logger template uses sleep-based waiting...\n'
|
||||
grep -q 'sleep 60' <<< "$logger_template" \
|
||||
|| fail 'logger template must sleep between day rollover checks'
|
||||
|
||||
printf 'Checking pmon logger template uses fork-free date builtin...\n'
|
||||
grep -q "printf '%(%Y%m%d)T' -1" <<< "$logger_template" \
|
||||
|
||||
@ -151,12 +151,11 @@ def _pick_playable_candidate(
|
||||
)
|
||||
return game
|
||||
logger.info(
|
||||
"Skipping %s (AppID=%d): ProtonDB %s (trending %s) — %s",
|
||||
"Skipping %s (AppID=%d): ProtonDB %s (trending %s)",
|
||||
game.name,
|
||||
game.app_id,
|
||||
rating.tier,
|
||||
rating.trending_tier,
|
||||
rating.unplayable_reason,
|
||||
)
|
||||
|
||||
offset += _PROTONDB_BATCH_SIZE
|
||||
|
||||
@ -92,6 +92,10 @@ class TestProtonDBRating:
|
||||
r = ProtonDBRating(app_id=1, tier="unknown_tier")
|
||||
assert r.is_playable is False
|
||||
|
||||
def test_unplayable_reason_no_trending_tier(self) -> None:
|
||||
r = ProtonDBRating(app_id=1, tier="borked")
|
||||
assert "tier<" in r.unplayable_reason
|
||||
|
||||
def test_unplayable_reason_for_silver_silver(self) -> None:
|
||||
r = ProtonDBRating(app_id=1, tier="silver", trending_tier="silver")
|
||||
assert "no gold tier" in r.unplayable_reason
|
||||
|
||||
@ -215,27 +215,6 @@ class TestPickPlayableCandidate:
|
||||
result = _pick_playable_candidate([game])
|
||||
assert result is not None
|
||||
|
||||
def test_logs_explicit_protondb_skip_reason(self) -> None:
|
||||
"""Unplayable candidate logs concrete reason, not just raw tiers."""
|
||||
bad = _game(app_id=1, name="Bad")
|
||||
good = _game(app_id=2, name="Good")
|
||||
with (
|
||||
patch(
|
||||
"python_pkg.steam_backlog_enforcer.scanning.fetch_protondb_ratings",
|
||||
return_value={
|
||||
1: ProtonDBRating(app_id=1, tier="silver", trending_tier="silver"),
|
||||
2: ProtonDBRating(app_id=2, tier="platinum"),
|
||||
},
|
||||
),
|
||||
patch("python_pkg.steam_backlog_enforcer.scanning._echo"),
|
||||
patch("python_pkg.steam_backlog_enforcer.scanning.logger.info") as mock_log,
|
||||
):
|
||||
result = _pick_playable_candidate([bad, good])
|
||||
|
||||
assert result is not None
|
||||
assert result.app_id == 2
|
||||
assert any("no gold tier" in str(call) for call in mock_log.call_args_list)
|
||||
|
||||
|
||||
class TestPickNextGame:
|
||||
"""Tests for pick_next_game."""
|
||||
|
||||
Loading…
Reference in New Issue
Block a user