123 lines
4.8 KiB
Bash
123 lines
4.8 KiB
Bash
#!/usr/bin/env bats
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
# Copyright (C) 2026 Bryan Joshua Pedini
|
|
|
|
# --dry-run: mutating commands (upgrade, purge, hold/unhold, lock files, statefile writes)
|
|
# are printed as "+ <cmd>" instead of executed; read-only queries and (as root) the
|
|
# metadata refresh still run.
|
|
|
|
load test_helper
|
|
|
|
setup() { common_setup; }
|
|
|
|
APT_UPGRADE='apt-get -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold -o DPkg::Lock::Timeout=60 --with-new-pkgs upgrade'
|
|
|
|
@test "apt: refresh runs, hold/upgrade/unhold are printed, nothing mutating is executed" {
|
|
run skup --dry-run <<<$'2-\n'
|
|
assert_success
|
|
assert_line 'Refreshing package lists... done.'
|
|
log_has 'apt-get update -qq -o APT::Update::Error-Mode=any'
|
|
assert_line '+ apt-mark hold su-dummy-b'
|
|
assert_line "+ $APT_UPGRADE"
|
|
assert_line '+ apt-mark unhold su-dummy-b'
|
|
assert_line 'Dry run: nothing was changed.'
|
|
log_lacks '^apt-get -y'
|
|
log_lacks '^apt-mark (un)?hold'
|
|
run cat "$FAKE_DIR/holds"
|
|
assert_output ''
|
|
[[ ! -e $STATE ]]
|
|
}
|
|
|
|
@test "apt: a package the admin already held is not printed as held" {
|
|
echo su-dummy-c >"$FAKE_DIR/holds"
|
|
FAKE_APT_SIM=held run skup --dry-run --no-refresh <<<$'3-\n'
|
|
assert_success
|
|
refute_line --partial 'apt-mark hold'
|
|
refute_line --partial 'apt-mark unhold'
|
|
assert_line "+ $APT_UPGRADE"
|
|
}
|
|
|
|
@test "N+ prints the statefile changes and writes nothing; the rows still leave the list" {
|
|
run skup --dry-run --no-refresh <<<$'1+\nl\nq'
|
|
assert_success
|
|
assert_line "+ mkdir -p -m 0755 $STATE"
|
|
assert_line "+ $STATE_FILE add: apt su-dummy-a user"
|
|
assert_line "+ $STATE_FILE add: apt su-dummy-b dep:su-dummy-a"
|
|
assert_line '3 upgradable, 2 trusted (hidden, use --all to show), 1 to review:'
|
|
[[ ! -e $STATE ]]
|
|
}
|
|
|
|
@test "Nx prints the purge commands and drops the row" {
|
|
run skup --dry-run --no-refresh <<<$'3x\ny\nl\nq'
|
|
assert_success
|
|
assert_line '+ apt-get -y purge su-dummy-c'
|
|
refute_output --partial 'autoremove'
|
|
assert_line '2 upgradable, 0 trusted (hidden, use --all to show), 2 to review:'
|
|
log_lacks '^apt-get -y'
|
|
}
|
|
|
|
@test "trust, untrust and refresh print their statefile changes and write nothing" {
|
|
write_state "$HEADER" "apt${T}su-dummy-c${T}user${T}2026-01-01T00:00:00Z"
|
|
before=$(cat "$STATE_FILE")
|
|
run skup --dry-run trust su-dummy-a
|
|
assert_success
|
|
assert_line 'trusted su-dummy-a (+1 dependency: su-dummy-b)'
|
|
assert_line "+ $STATE_FILE add: apt su-dummy-a user"
|
|
assert_line "+ $STATE_FILE add: apt su-dummy-b dep:su-dummy-a"
|
|
run skup --dry-run untrust su-dummy-c
|
|
assert_success
|
|
assert_line "+ $STATE_FILE remove: apt su-dummy-c user"
|
|
write_state "$HEADER" "apt${T}su-dummy-w${T}user${T}2026-01-01T00:00:00Z"
|
|
before=$(cat "$STATE_FILE")
|
|
run skup --dry-run refresh
|
|
assert_success
|
|
assert_line "+ $STATE_FILE add: apt su-dummy-v dep:su-dummy-w"
|
|
[[ $(cat "$STATE_FILE") == "$before" ]]
|
|
}
|
|
|
|
@test "pacman: -Su --ignore and -Rns are printed" {
|
|
use_fakes pacman
|
|
run skup --dry-run --no-refresh <<<$'3x\ny\n2-\n'
|
|
assert_success
|
|
assert_line '+ pacman -Rns --noconfirm -- su-dummy-c'
|
|
assert_line '+ pacman -Su --noconfirm --ignore su-dummy-b'
|
|
log_lacks '^pacman -(Su|Syu|Rns) '
|
|
}
|
|
|
|
@test "dnf: upgrade --exclude and remove are printed" {
|
|
use_fakes dnf rpm
|
|
export FAKE_RPM_NO_D=1
|
|
run skup --dry-run --no-refresh <<<$'5x\ny\n4-\n'
|
|
assert_success
|
|
assert_line '+ dnf -y remove su-dummy-c'
|
|
assert_line '+ dnf -y --setopt=skip_if_unavailable=0 --setopt=\*.metadata_expire=-1 upgrade --exclude=su-dummy-b'
|
|
log_lacks '^dnf -y'
|
|
}
|
|
|
|
@test "zypper: the private-lock commands are printed, no lock file is written" {
|
|
use_fakes zypper rpm
|
|
export SKEPTICAL_UPDATER_OS_RELEASE=$FAKE_DATA/os-release-leap
|
|
mkdir -p "$BATS_TEST_TMPDIR/etc"
|
|
printf '[main]\nlocksfile.path = %s\n' "$BATS_TEST_TMPDIR/etc/locks" >"$BATS_TEST_TMPDIR/etc/zypp.conf"
|
|
export ZYPP_CONF=$BATS_TEST_TMPDIR/etc/zypp.conf
|
|
run skup --dry-run --no-refresh <<<$'2-\n'
|
|
assert_success
|
|
assert_line "+ # private $BATS_TEST_TMPDIR/skeptical-updater.XXXXXX/zypp.conf: $BATS_TEST_TMPDIR/etc/zypp.conf with locksfile.path = $BATS_TEST_TMPDIR/skeptical-updater.XXXXXX/locks (a copy of $BATS_TEST_TMPDIR/etc/locks)"
|
|
assert_line "+ env ZYPP_CONF=$BATS_TEST_TMPDIR/skeptical-updater.XXXXXX/zypp.conf zypper --non-interactive --quiet addlock su-dummy-b"
|
|
assert_line "+ env ZYPP_CONF=$BATS_TEST_TMPDIR/skeptical-updater.XXXXXX/zypp.conf zypper --non-interactive --no-refresh update"
|
|
log_lacks 'addlock| update$'
|
|
[[ ! -e $BATS_TEST_TMPDIR/etc/locks ]]
|
|
run ls "$BATS_TEST_TMPDIR"
|
|
refute_output --partial 'skeptical-updater.'
|
|
}
|
|
|
|
@test "as root the refresh really runs; as non-root it is printed" {
|
|
run skup --dry-run list
|
|
log_has 'apt-get update -qq -o APT::Update::Error-Mode=any'
|
|
: >"$FAKE_LOG"
|
|
SKEPTICAL_UPDATER_EUID=1000 run skup --dry-run list
|
|
assert_success
|
|
assert_line '+ apt-get update -qq -o APT::Update::Error-Mode=any'
|
|
log_lacks '^apt-get update'
|
|
}
|