diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/cases/lib-blacklist.bats | 6 | ||||
-rw-r--r-- | test/cases/lib-conf.bats | 4 | ||||
-rw-r--r-- | test/cases/lib-notifications.bats | 39 | ||||
-rw-r--r-- | test/cases/librechroot.bats | 94 | ||||
-rw-r--r-- | test/cases/libremakepkg.bats | 36 | ||||
-rw-r--r-- | test/cases/librerelease.bats | 230 | ||||
-rw-r--r-- | test/cases/librestage.bats | 19 | ||||
-rw-r--r-- | test/fixtures/lib-notifications/librerelease-complete-log.log | 6 | ||||
-rw-r--r-- | test/fixtures/lib-notifications/librerelease-debug-pkg.log | 3 | ||||
-rw-r--r-- | test/fixtures/lib-notifications/librerelease-multipkg-any.log | 10 | ||||
-rw-r--r-- | test/fixtures/lib-notifications/librerelease-multipkg-multirepo-any.log | 11 | ||||
-rw-r--r-- | test/fixtures/lib-notifications/librerelease-multipkg-multirepo-multiarch.log | 4 | ||||
-rw-r--r-- | test/fixtures/lib-notifications/librerelease-multirepo-multiarch.log | 4 | ||||
-rw-r--r-- | test/fixtures/librechroot/PKGBUILD-base-devel | 13 | ||||
-rw-r--r-- | test/lib/common.bash | 23 | ||||
-rwxr-xr-x | test/testenv | 26 |
16 files changed, 322 insertions, 206 deletions
diff --git a/test/cases/lib-blacklist.bats b/test/cases/lib-blacklist.bats index ba74d04..4dc30c9 100644 --- a/test/cases/lib-blacklist.bats +++ b/test/cases/lib-blacklist.bats @@ -94,17 +94,15 @@ load ../lib/common not empty $tmpdir/stderr } +# bats test_tags=network @test "libreblacklist downloads the blacklist as needed" { - require network || skip - libreblacklist cat >$tmpdir/stdout 2>$tmpdir/stderr not empty $tmpdir/stdout } +# bats test_tags=network @test "libreblacklist downloads the blacklist repeatedly" { - require network || skip - libreblacklist update libreblacklist update } diff --git a/test/cases/lib-conf.bats b/test/cases/lib-conf.bats index 0925640..6a8fee7 100644 --- a/test/cases/lib-conf.bats +++ b/test/cases/lib-conf.bats @@ -8,8 +8,8 @@ load ../lib/common [[ $PKGDEST == /pkgdest ]] } +# bats test_tags=sudo @test "lib/conf.sh figures out HOME when root" { - require sudo || skip # This one is tricky, because it does the job too well, it will find # the actual HOME, instead of the test environment HOME. Therefore, we # will just check that [[ $HOME != /root ]] @@ -19,8 +19,8 @@ load ../lib/common [[ $LIBREHOME != /root ]] } +# bats test_tags=sudo @test "lib/conf.sh nests LIBREUSER" { - require sudo || skip [[ $USER != root ]] cd "$tmpdir" echo '. $(librelib conf.sh); echo "$LIBREUSER"' > test.sh diff --git a/test/cases/lib-notifications.bats b/test/cases/lib-notifications.bats new file mode 100644 index 0000000..b45c3ff --- /dev/null +++ b/test/cases/lib-notifications.bats @@ -0,0 +1,39 @@ +readonly FIXURES_DIR=./fixtures//lib-notifications +readonly TEST_SCRIPT="source ../src/lib/notifications.sh ; release_notification tester < " + + +@test "lib/notifications.sh parses db-update log" { + run bash -c "${TEST_SCRIPT} $FIXURES_DIR/librerelease-complete-log.log" +# echo "librerelease-complete-log.log=${output}" >&3 + [[ "${output}" =~ "tester just published: (foo 1.2.3)->libre-testing/i686" ]] +} + +@test "lib/notifications.sh parses db-update log - debug-pkg" { + run bash -c "${TEST_SCRIPT} $FIXURES_DIR/librerelease-debug-pkg.log" +# echo "librerelease-debug-pkg.log=${output}" >&3 + [[ "${output}" =~ "tester just published: (foo 1.2.3)->libre/i686" ]] +} + +@test "lib/notifications.sh parses db-update log - multipkg-any" { + run bash -c "${TEST_SCRIPT} $FIXURES_DIR/librerelease-multipkg-any.log" +# echo "librerelease-multipkg-any.log=${output}" >&3 + [[ "${output}" =~ "tester just published: (gitget 20240221.1)->libre/armv7h (gitget 20240221.1)->libre/i686 (gitget 20240221.1)->libre/x86_64 (librelib 20240221.1)->libre/armv7h (librelib 20240221.1)->libre/i686 (librelib 20240221.1)->libre/x86_64 (libretools 20240221.1)->libre/armv7h (libretools 20240221.1)->libre/i686 (libretools 20240221.1)->libre/x86_64" ]] +} + +@test "lib/notifications.sh parses db-update log - multipkg-multirepo-any" { + run bash -c "${TEST_SCRIPT} $FIXURES_DIR/librerelease-multipkg-multirepo-any.log" +# echo "librerelease-multipkg-multirepo-any.log=${output}" >&3 + [[ "${output}" =~ "tester just published: (gitget 20240221.1)->libre-testing/i686 (gitget 20240221.1)->libre-testing/x86_64 (gitget 20240221.1)->libre/armv7h (librelib 20240221.1)->libre-testing/i686 (librelib 20240221.1)->libre-testing/x86_64 (librelib 20240221.1)->libre/armv7h (libretools 20240221.1)->libre-testing/i686 (libretools 20240221.1)->libre-testing/x86_64 (libretools 20240221.1)->libre/armv7h" ]] +} + +@test "lib/notifications.sh parses db-update log - multipkg-multirepo-multiarch" { + run bash -c "${TEST_SCRIPT} $FIXURES_DIR/librerelease-multipkg-multirepo-multiarch.log" +# echo "librerelease-multipkg-multirepo-multiarch.log=${output}" >&3 + [[ "${output}" =~ "tester just published: (bar 1.2.3)->libre/i686 (foo 1.2.3)->libre-testing/x86_64" ]] +} + +@test "lib/notifications.sh parses db-update log - multirepo-multiarch" { + run bash -c "${TEST_SCRIPT} $FIXURES_DIR/librerelease-multirepo-multiarch.log" +# echo "librerelease-multirepo-multiarch.log=${output}" >&3 + [[ "${output}" =~ "tester just published: (foo 1.2.3)->libre-testing/x86_64 (foo 1.2.3)->libre/i686" ]] +} diff --git a/test/cases/librechroot.bats b/test/cases/librechroot.bats index ca61e1e..665c48a 100644 --- a/test/cases/librechroot.bats +++ b/test/cases/librechroot.bats @@ -1,41 +1,39 @@ load ../lib/common +# bats test_tags=network,sudo @test "librechroot creates repo for new chroots" { - require network sudo || skip testsudo librechroot -l "$BATS_TEST_NAME" run test -r /repo/repo.db } +# bats test_tags=network,sudo @test "librechroot cleans the local repo correctly" { - require network sudo || skip testsudo librechroot -l "$BATS_TEST_NAME" make testsudo librechroot -l "$BATS_TEST_NAME" clean-repo testsudo librechroot -l "$BATS_TEST_NAME" run test -r /repo/repo.db # TODO: inspect /repo/* more } +# bats test_tags=network,sudo @test "librechroot respects exit status if out isnt a tty" { - require network sudo || skip set -o pipefail { testsudo librechroot -l "$BATS_TEST_NAME" run bash -c 'exit 3' | cat; } || status=$? [[ $status == 3 ]] } +# bats test_tags=network,sudo @test "librechroot creates ca certificates" { - require network sudo || skip testsudo librechroot -l "$BATS_TEST_NAME" run test -r /etc/ssl/certs/ca-certificates.crt } +# bats test_tags=network,sudo @test "librechroot disables networking when requested" { - require network sudo || skip - testsudo librechroot -l "$BATS_TEST_NAME" run curl https://repo.parabola.nu/ >/dev/null not testsudo librechroot -l "$BATS_TEST_NAME" -N run curl https://repo.parabola.nu/ >/dev/null } -@test "librechroot handles CHROOTEXTRAPKG correctly" { - require network sudo || skip - +# bats test_tags=network,sudo +@test "librechroot clean-pkgs obeys CHROOTEXTRAPKG" { not testsudo librechroot -l "$BATS_TEST_NAME" run lsof echo "CHROOTEXTRAPKG=(lsof)" >> "$XDG_CONFIG_HOME"/libretools/chroot.conf testsudo librechroot -l "$BATS_TEST_NAME" install-name lsof @@ -46,16 +44,64 @@ load ../lib/common not testsudo librechroot -l "$BATS_TEST_NAME" run lsof } -@test "librechroot obeys depends in PKGBUILD" { - require network sudo || skip +# bats test_tags=network,sudo +@test "librechroot clean-pkgs doesn't remove locally-updated parts of base-devel" { + local copydir="$chrootdir/default/$BATS_TEST_NAME" + + # Get info on the upstream package. + local oldpkgname=libre/pacman + testsudo librechroot -l "$BATS_TEST_NAME" run sh -c "pacman -Sp --print-format='%v %D' ${oldpkgname} >/info.txt" + local oldpkgver pkgdeps + read -r oldpkgver pkgdeps <"$copydir/info.txt" + read -r -a pkgdeps <<<"$pkgdeps" + + # Build our locally-updated version. + local newpkgname="repo/${oldpkgname##*/}" + local newpkgver="${oldpkgver}.1" + mkdir "$tmpdir/workdir/abs" + sed \ + -e "s/@PKGVER@/${newpkgver%%-*}/g" \ + -e "s/@PKGREL@/${newpkgver#*-}/g" \ + -e "s/@PKGDEPS@/${pkgdeps[*]@Q}/g" \ + <fixtures/librechroot/PKGBUILD-base-devel \ + >"$tmpdir/workdir/abs/PKGBUILD" + pushd "$tmpdir/workdir/abs" + testsudo libremakepkg -l "$BATS_TEST_NAME" + popd + testsudo librechroot -l "$BATS_TEST_NAME" run pacman -Sy + + # Verify that the package got added to [repo]... + echo "${newpkgname##*/} $newpkgver" >"$tmpdir/exp.txt" + testsudo librechroot -l "$BATS_TEST_NAME" run sh -c "pacman -Sp --print-format='%n %v' ${newpkgname} >/act.txt" + diff -u "$tmpdir/exp.txt" "$copydir/act.txt" + # ... but not installed. + echo "${oldpkgname##*/} $oldpkgver" >"$tmpdir/exp.txt" + testsudo librechroot -l "$BATS_TEST_NAME" run sh -c "pacman -Q ${oldpkgname##*/} >/act.txt" + diff -u "$tmpdir/exp.txt" "$copydir/act.txt" + + # Run the code-under-test. + testsudo librechroot -l "$BATS_TEST_NAME" clean-pkgs + + # Validate that clean-pkgs didn't change anything. + # + # In [repo]... + echo "${oldpkgname##*/} $oldpkgver" >"$tmpdir/exp.txt" + testsudo librechroot -l "$BATS_TEST_NAME" run sh -c "pacman -Q ${oldpkgname##*/} >/act.txt" + diff -u "$tmpdir/exp.txt" "$copydir/act.txt" + # ... but not installed. + echo "${newpkgname##*/} $newpkgver" >"$tmpdir/exp.txt" + testsudo librechroot -l "$BATS_TEST_NAME" run sh -c "pacman -Sp --print-format='%n %v' ${newpkgname} >/act.txt" + diff -u "$tmpdir/exp.txt" "$copydir/act.txt" +} +# bats test_tags=network,sudo +@test "librechroot clean-pkgs obeys PKGBUILD depends" { # NB: We chown `/startdir` because chcleanup runs `makepkg # --printsrcinfo > .SRCINFO` as the user that owns # `/startdir/PKGBUILD`, and `makepkg` doesn't like to be run # as root. Unfortunately, this test runs with a chroot that # doesn't have the `builduser` set up, and it'd be a pain to - # set it up. So choose an arbitrary user from - # `/usr/lib/sysusers.d/arch.conf`. + # set it up. local builduser_uid="${SUDO_UID:-$UID}" local builduser_gid="$(id -g "$builduser_uid")" testsudo librechroot -l "$BATS_TEST_NAME" run sh -c " @@ -78,9 +124,8 @@ load ../lib/common testsudo librechroot -l "$BATS_TEST_NAME" run lsof } -@test "librechroot can install libretools with chcleanup" { - require network sudo || skip - +# bats test_tags=network,sudo +@test "librechroot clean-pkgs can install libretools" { # NB: We chown `/startdir` because chcleanup runs `makepkg # --printsrcinfo > .SRCINFO` as the user that owns # `/startdir/PKGBUILD`, and `makepkg` doesn't like to be run @@ -124,9 +169,8 @@ load ../lib/common [[ "$(sed -n 2p $tmpdir/stderr)" =~ Usage:.* ]] } +# bats test_tags=network,sudo @test "librechroot obeys the n flag" { - require network sudo || skip - not test -f "$chrootdir/$BATS_TEST_NAME/$BATS_TEST_NAME/$BATS_TEST_NAME.stamp" testsudo librechroot -n "$BATS_TEST_NAME" -l "$BATS_TEST_NAME" run touch /"$BATS_TEST_NAME.stamp" @@ -135,8 +179,8 @@ load ../lib/common } # requires sudo so we know it's not failing because it needs root +# bats test_tags=sudo @test "librechroot fails for unknown commands" { - require sudo || skip testsudo librechroot phony >$tmpdir/stdout 2>$tmpdir/stderr || status=$? [[ $status != 0 ]] @@ -145,8 +189,8 @@ load ../lib/common } # requires sudo so we know it's not failing because it needs root +# bats test_tags=sudo @test "librechroot fails for unknown flags" { - require sudo || skip testsudo librechroot -q >$tmpdir/stdout 2>$tmpdir/stderr || status=$? [[ $status != 0 ]] @@ -154,8 +198,8 @@ load ../lib/common not empty $tmpdir/stderr } +# bats test_tags=sudo @test "librechroot fails when syncing a copy with itself" { - require sudo || skip testsudo timeout 5 librechroot -l root sync || status=$? case $status in 0|124|137) # success|timeout+TERM|timeout+KILL @@ -165,16 +209,17 @@ load ../lib/common esac } +# bats test_tags=network,sudo @test "librechroot deletes copies" { - require network sudo || skip testsudo librechroot -l "$BATS_TEST_NAME" make test -d "$chrootdir/default/$BATS_TEST_NAME" testsudo librechroot -l "$BATS_TEST_NAME" delete not test -e "$chrootdir/default/$BATS_TEST_NAME" } +# bats test_tags=network,sudo,btrfs @test "librechroot deletes subvolumes recursively" { - require network sudo btrfs || skip + [[ "$(stat -f -c %T "$chrootdir" 2>/dev/null || true)" == 'btrfs' ]] testsudo librechroot -l "$BATS_TEST_NAME" make testsudo librechroot -l "$BATS_TEST_NAME" install-name btrfs-progs test -d "$chrootdir/default/$BATS_TEST_NAME" @@ -185,9 +230,8 @@ load ../lib/common not test -e "$chrootdir/default/$BATS_TEST_NAME" } +# bats test_tags=network,sudo @test "librechroot cleans up TMPDIR" { - require network sudo || skip - local dir="$tmpdir/tmp" mkdir -- "$dir" diff --git a/test/cases/libremakepkg.bats b/test/cases/libremakepkg.bats index 34db6e3..985d6f6 100644 --- a/test/cases/libremakepkg.bats +++ b/test/cases/libremakepkg.bats @@ -20,8 +20,8 @@ teardown() { common_teardown } +# bats test_tags=network,sudo @test "libremakepkg builds a trivial package" { - require network sudo || skip cp fixtures/libremakepkg/PKGBUILD-hello "$tmpdir/PKGBUILD" cd "$tmpdir" @@ -30,8 +30,8 @@ teardown() { globfile libretools-hello-1.0-1-any.pkg.tar?(.!(sig|*.*)) } +# bats test_tags=network,sudo @test "libremakepkg disables networking during prepare" { - require network sudo || skip cp fixtures/libremakepkg/PKGBUILD-netprepare "$tmpdir/PKGBUILD" cd "$tmpdir" @@ -41,8 +41,8 @@ teardown() { globfile libretools-netprepare-1.0-1-any.pkg.tar?(.!(sig|*.*)) } +# bats test_tags=network,sudo @test "libremakepkg disables networking during build" { - require network sudo || skip cp fixtures/libremakepkg/PKGBUILD-netbuild "$tmpdir/PKGBUILD" cd "$tmpdir" @@ -52,8 +52,8 @@ teardown() { globfile libretools-netbuild-1.0-1-any.pkg.tar?(.!(sig|*.*)) } +# bats test_tags=network,sudo @test "libremakepkg disables networking during package" { - require network sudo || skip cp fixtures/libremakepkg/PKGBUILD-netpackage "$tmpdir/PKGBUILD" cd "$tmpdir" @@ -63,8 +63,8 @@ teardown() { globfile libretools-netpackage-1.0-1-any.pkg.tar?(.!(sig|*.*)) } +# bats test_tags=network,sudo @test "libremakepkg cleans the chroot before building" { - require network sudo || skip # 1. First, we build testpkg1 # 2. Then, we build testpkg2, which depends on testpkg1 # Therefore, testpkg1 will be installed after testpkg2 is built, we @@ -97,8 +97,8 @@ teardown() { not testsudo librechroot -l "$BATS_TEST_NAME" run libretools-testpkg1 'second time, fail' } +# bats test_tags=network,sudo @test "libremakepkg handles PKGDEST not existing" { - require network sudo || skip cp fixtures/libremakepkg/PKGBUILD-hello "$tmpdir/PKGBUILD" cd "$tmpdir" @@ -127,8 +127,8 @@ teardown() { not empty $tmpdir/stderr } +# bats test_tags=network,sudo @test "libremakepkg fails if a hook fails" { - require network sudo || skip cp fixtures/libremakepkg/PKGBUILD-hello "$tmpdir/PKGBUILD" cd "$tmpdir" @@ -142,8 +142,8 @@ teardown() { tail -n1 $tmpdir/stderr | grep -qF '==> ERROR: Failure(s) in check_pkgbuild: check_pkgbuild_nonfree' } +# bats test_tags=network,sudo @test "libremakepkg detects distcc files" { - require network sudo || skip cp fixtures/libremakepkg/PKGBUILD-hello "$tmpdir/PKGBUILD" cd "$tmpdir" @@ -164,9 +164,8 @@ teardown() { not globfile libretools-hello-1.0-1-any.pkg.tar?(.!(sig|*.*)) } +# bats test_tags=network,sudo @test "libremakepkg forwards distcc ports" { - require network sudo || skip - # The maximum AF_UNIX socket path is 108 bytes; so let's have # a chroot name that's guaranteed to be >110 characters, to # make sure we handle that. @@ -190,9 +189,8 @@ teardown() { globfile libretools-distcc-1.0-1-any.pkg.tar?(.!(sig|*.*)) } +# bats test_tags=network,sudo @test "libremakepkg doesnt symlink outputs" { - require network sudo || skip - sed -i /^unset/d "$XDG_CONFIG_HOME/pacman/makepkg.conf" cp fixtures/libremakepkg/PKGBUILD-hello "$tmpdir/PKGBUILD" @@ -206,9 +204,8 @@ teardown() { globfile "$tmpdir/workdir/srcpkgdest"/libretools-hello-1.0-1-any.src.tar?(.!(sig|*.*)) } +# bats test_tags=network,sudo @test "libremakepkg succeeds with good signatures" { - require network sudo || skip - cp fixtures/libremakepkg/PKGBUILD-signed "$tmpdir/PKGBUILD" cp fixtures/libremakepkg/hello.sh "$tmpdir/hello.sh" cd "$tmpdir" @@ -217,9 +214,8 @@ teardown() { testsudo libremakepkg -l "$BATS_TEST_NAME" } +# bats test_tags=network,sudo @test "libremakepkg fails with bad signatures" { - require network sudo || skip - cp fixtures/libremakepkg/PKGBUILD-signed "$tmpdir/PKGBUILD" cp fixtures/libremakepkg/hello.sh "$tmpdir/hello.sh" cd "$tmpdir" @@ -230,9 +226,8 @@ teardown() { not testsudo libremakepkg -l "$BATS_TEST_NAME" } +# bats test_tags=network,sudo @test "libremakepkg does not run pkgver" { - require network sudo || skip - cp fixtures/libremakepkg/PKGBUILD-pkgver "$tmpdir/PKGBUILD" pushd "$tmpdir" @@ -244,8 +239,8 @@ teardown() { diff -u fixtures/libremakepkg/PKGBUILD-pkgver "$tmpdir/PKGBUILD" } +# bats test_tags=network,sudo @test "libremakepkg has a flag to make startdir rw" { - require network sudo || skip cp fixtures/libremakepkg/PKGBUILD-rwstartdir "$tmpdir/PKGBUILD" cd "$tmpdir" @@ -255,9 +250,8 @@ teardown() { globfile libretools-rwstartdir-1.0-1-any.pkg.tar?(.!(sig|*.*)) } +# bats test_tags=network,sudo @test "libremakepkg can re-use source-packages" { - require network sudo || skip - cp fixtures/libremakepkg/PKGBUILD-hello "$tmpdir/PKGBUILD" cd "$tmpdir" diff --git a/test/cases/librerelease.bats b/test/cases/librerelease.bats index a984d73..e936ea8 100644 --- a/test/cases/librerelease.bats +++ b/test/cases/librerelease.bats @@ -1,5 +1,44 @@ load ../lib/common +## helpers ## + +# Stub server-side `db-update` for SSH localhost to run +StubDbupdate() +{ + cat <<-eot +#!/bin/bash +echo "==> Updating [fake-repo]" +{ + printf '%s\n' "\$DBSCRIPTS_CONFIG" + readlink -f -- "\$STAGING" + find "\$STAGING" -printf '%P\n' | LC_COLLATE=C sort +} > ${tmpdir@Q}/log.txt +eot +} + +# Stub server-side `pbot-say` for SSH localhost to run +StubPbotsay() +{ + cat <<-eot +#!/bin/bash +echo "\$*" >${tmpdir@Q}/pbot.txt +eot +} + +StageFiles() +{ + local staging_dir="$1" + + mkdir -p "$staging_dir"/repo1 "$staging_dir"/repo2/sub + touch "$staging_dir"/repo1/file1 \ + "$staging_dir"/repo1/file2 \ + "$staging_dir/repo2/file with spaces" \ + "$staging_dir"/repo2/sub/subfolder +} + + +## setup/teardown ## + setup() { common_setup @@ -30,7 +69,9 @@ setup() { # Configure libretools cat >> "$XDG_CONFIG_HOME/libretools/libretools.conf" <<-eot - REPODEST=ssh://${USER@Q}@127.0.0.1:${ssh_port@Q}/${tmpdir@Q}/srv-staging/ + TIER0_HOST=127.0.0.1 + TIER0_PORT=$ssh_port + TIER0_STAGING=${tmpdir@Q}/srv-staging/ DBSCRIPTS_CONFIG=/etc/dbscripts/config.local.phony HOOKPRERELEASE=: HOOKPOSTRELEASE=: @@ -43,24 +84,21 @@ teardown() { common_teardown } + +## tests ## + @test "librerelease displays usage text" { rm -rf "$XDG_CONFIG_HOME" - LC_ALL=C librerelease -h >"$tmpdir/stdout" 2>"$tmpdir/stderr" + LC_ALL=C librerelease -h > "$tmpdir/stdout" 2> "$tmpdir/stderr" [[ "$(sed 1q "$tmpdir/stdout")" =~ Usage:.* ]] empty "$tmpdir/stderr" } @test "librerelease lists all files" { - local workdir="$tmpdir/workdir" - mkdir -p "$workdir/staging/repo1" "$workdir/staging/repo2/sub" - touch \ - "$workdir/staging/repo1/file1" \ - "$workdir/staging/repo1/file2" \ - "$workdir/staging/repo2/file with spaces" \ - "$workdir/staging/repo2/sub/subfolder" + StageFiles "$tmpdir"/workdir/staging - LC_ALL=C librerelease -l &>"$tmpdir/list" || { status=$?; cat "$tmpdir/list"; return $status; } + LC_ALL=C librerelease -l &> "$tmpdir/list" || { status=$?; cat "$tmpdir/list"; return $status; } cat > "$tmpdir/list-correct" <<-eot -> repo1 @@ -71,58 +109,94 @@ teardown() { sub/subfolder eot - diff "$tmpdir/list-correct" "$tmpdir/list" + diff -u "$tmpdir/list-correct" "$tmpdir/list" } -@test "librerelease fails if gpgkey not set" { +@test "librerelease fails if GPGKEY not set" { unset GPGKEY - local workdir="$tmpdir/workdir" - mkdir -p "$workdir/staging/repo1" "$workdir/staging/repo2/sub" - touch \ - "$workdir/staging/repo1/file1" \ - "$workdir/staging/repo1/file2" \ - "$workdir/staging/repo2/file with spaces" \ - "$workdir/staging/repo2/sub/subfolder" + StageFiles "$tmpdir"/workdir/staging - LC_ALL=C librerelease -l >"$tmpdir/stdout" 2>"$tmpdir/stderr" || status=$? + LC_ALL=C librerelease -l > "$tmpdir/stdout" 2> "$tmpdir/stderr" || status=$? [[ $status != 0 ]] empty "$tmpdir/stdout" grep GPGKEY "$tmpdir/stderr" } +@test "librerelease fails if TIER0_HOST not set" { + unset TIER0_HOST + sed -i 's|TIER0_HOST=.*|TIER0_HOST=|' "$XDG_CONFIG_HOME/libretools/libretools.conf" + + StageFiles "$tmpdir"/workdir/staging + + LC_ALL=C librerelease -l > "$tmpdir"/stdout 2> "$tmpdir"/stderr || status=$? + + [[ $status != 0 ]] + grep "libretools.conf variables may have changed" "$tmpdir"/stdout + grep TIER0_HOST "$tmpdir"/stderr +} + @test "librerelease fails if DBSCRIPTS_CONFIG is not set" { cat >> "$XDG_CONFIG_HOME/libretools/libretools.conf" <<-eot DBSCRIPTS_CONFIG='' eot - local workdir="$tmpdir/workdir" - mkdir -p "$workdir/staging/repo1" "$workdir/staging/repo2/sub" - touch \ - "$workdir/staging/repo1/file1" \ - "$workdir/staging/repo1/file2" \ - "$workdir/staging/repo2/file with spaces" \ - "$workdir/staging/repo2/sub/subfolder" + StageFiles "$tmpdir"/workdir/staging - LC_ALL=C librerelease -l >"$tmpdir/stdout" 2>"$tmpdir/stderr" || status=$? + LC_ALL=C librerelease -l > "$tmpdir/stdout" 2> "$tmpdir/stderr" || status=$? [[ $status != 0 ]] - empty "$tmpdir/stdout" + grep "libretools.conf variables may have changed" "$tmpdir/stdout" grep DBSCRIPTS_CONFIG "$tmpdir/stderr" } -@test "librerelease runs" { - # Add a stub db-update so that when we ssh to localhost it has - # something to run. - install -Dm755 /dev/stdin "$tmpdir/bin/db-update" <<-eot - #!/bin/bash - { - printf '%s\n' "\$DBSCRIPTS_CONFIG" - readlink -f -- "\$STAGING" - find "\$STAGING" -printf '%P\n' | LC_COLLATE=C sort - } > ${tmpdir@Q}/log.txt - eot +@test "librerelease cleans local staging" { + local staging_dir="$tmpdir"/workdir/staging ; StageFiles "$staging_dir" ; + + cat > "$tmpdir"/expected-stdout <<-eot +removed 'repo1/file1' +removed 'repo1/file2' +removed 'repo2/file with spaces' +removed 'repo2/sub/subfolder' +eot + + LC_ALL=C librerelease -c > "$tmpdir"/stdout 2> "$tmpdir"/stderr || status=$? + + [[ $status == 0 ]] + grep "==> Removing files from local staging directory" "$tmpdir"/stderr + diff -u "$tmpdir"/expected-stdout "$tmpdir"/stdout + (( ! $(command ls -A1 "$staging_dir" | wc -l) )) +} + +@test "librerelease cleans remote staging" { + local staging_dir="$tmpdir"/srv-staging ; StageFiles "$staging_dir" ; + + cat > "$tmpdir"/expected-stdout <<-eot +removed '$staging_dir//repo1/file1' +removed '$staging_dir//repo1/file2' +removed directory '$staging_dir//repo1' +removed '$staging_dir//repo2/file with spaces' +removed '$staging_dir//repo2/sub/subfolder' +removed directory '$staging_dir//repo2/sub' +removed directory '$staging_dir//repo2' +eot + + LC_ALL=C librerelease -C > "$tmpdir"/stdout 2> "$tmpdir"/stderr || status=$? + + [[ $status == 0 ]] + grep "==> Removing files from remote staging directory" "$tmpdir"/stderr + # `rm -rfv` order depends on the underlying filesystem and so + # we need to sort this for it to be reproducible. + LC_ALL=C sort <"$tmpdir"/expected-stdout >"$tmpdir"/expected-stdout.sorted + LC_ALL=C sort <"$tmpdir"/stdout >"$tmpdir"/stdout.sorted + diff -u "$tmpdir"/expected-stdout.sorted "$tmpdir"/stdout.sorted + (( ! $(command ls -A1 "$staging_dir" | wc -l) )) +} + +@test "librerelease publishes packages successfully" { + # Add server-side stub + install -Dm755 /dev/stdin "$tmpdir/bin/db-update" < <(StubDbupdate) # writes log.txt PATH=$tmpdir/bin:$PATH # Log which directories the hooks are run in. @@ -131,14 +205,7 @@ teardown() { HOOKPOSTRELEASE='pwd > ${tmpdir@Q}/postrelease.txt' eot - # Make some files to stage - local workdir="$tmpdir/workdir" - mkdir -p "$workdir/staging/repo1" "$workdir/staging/repo2/sub" - touch \ - "$workdir/staging/repo1/file1" \ - "$workdir/staging/repo1/file2" \ - "$workdir/staging/repo2/file with spaces" \ - "$workdir/staging/repo2/sub/subfolder" + StageFiles "$tmpdir"/workdir/staging # Run librerelease @@ -167,60 +234,27 @@ teardown() { } @test "librerelease notifies pbot" { - # Add a stub db-update pbot-say so that when we ssh to localhost it has - # something to run. - install -Dm755 /dev/stdin "$tmpdir/bin/db-update" <<-eot - #!/bin/bash - { - printf '%s\n' "\$DBSCRIPTS_CONFIG" - readlink -f -- "\$STAGING" - find "\$STAGING" -printf '%P\n' | LC_COLLATE=C sort - } > ${tmpdir@Q}/log.txt - eot - install -Dm755 /dev/stdin "$tmpdir/bin/pbot-say" <<-eot - #!/bin/bash - echo "\$*" >${tmpdir@Q}/pbot.txt - eot + # Add server-side stubs + install -Dm755 /dev/stdin "$tmpdir"/bin/db-update < <(StubDbupdate) # writes log.txt + install -Dm755 /dev/stdin "$tmpdir"/bin/pbot-say < <(StubPbotsay ) # writes pbot.txt PATH=$tmpdir/bin:$PATH - # Log which directories the hooks are run in. - cat >> "$XDG_CONFIG_HOME/libretools/libretools.conf" <<-eot - HOOKPRERELEASE='pwd > ${tmpdir@Q}/prerelease.txt' - HOOKPOSTRELEASE='pwd > ${tmpdir@Q}/postrelease.txt' - eot + StageFiles "$tmpdir"/workdir/staging - # Make some files to stage - local workdir="$tmpdir/workdir" - mkdir -p "$workdir/staging/repo1" "$workdir/staging/repo2/sub" - touch \ - "$workdir/staging/repo1/file1" \ - "$workdir/staging/repo1/file2" \ - "$workdir/staging/repo2/file with spaces" \ - "$workdir/staging/repo2/sub/subfolder" + LC_ALL=C librerelease 2> "$tmpdir"/stderr - # Run - librerelease + grep -E " -> Notifying pbot:" "$tmpdir"/stderr + #grep " $USER just published:" "$tmpdir"/pbot.txt + grep "$USER just published:" "$tmpdir"/pbot.txt +} - # Make sure everything went OK - pwd > "$tmpdir/pwd.txt" - cat > "$tmpdir/log-correct.txt" <<-eot - /etc/dbscripts/config.local.phony - $(readlink -f -- "$tmpdir/srv-staging") +@test "librerelease logs-in as TIER0_LOGIN" { + PATH=$tmpdir/bin:$PATH - repo1 - repo1/file1 - repo1/file1.sig - repo1/file2 - repo1/file2.sig - repo2 - repo2/file with spaces - repo2/file with spaces.sig - repo2/sub - repo2/sub/subfolder - repo2/sub/subfolder.sig - eot - diff -u "$tmpdir/log-correct.txt" "$tmpdir/log.txt" - diff -u "$tmpdir/pwd.txt" "$tmpdir/prerelease.txt" - diff -u "$tmpdir/pwd.txt" "$tmpdir/postrelease.txt" - grep 'just published' "$tmpdir/pbot.txt" + echo "TIER0_LOGIN=tier0-user" >> "$XDG_CONFIG_HOME"/libretools/libretools.conf + LC_ALL=C librerelease -C > "$tmpdir"/stdout 2> "$tmpdir"/stderr || status=$? + + [[ $status != 0 ]] + empty "$tmpdir"/stdout + grep "tier0-user@127.0.0.1: Permission denied" "$tmpdir"/stderr } diff --git a/test/cases/librestage.bats b/test/cases/librestage.bats index 4551d1e..000ea3e 100644 --- a/test/cases/librestage.bats +++ b/test/cases/librestage.bats @@ -26,27 +26,22 @@ shopt -s extglob not empty "$tmpdir/stderr" } +# bats test_tags=network,sudo @test "librestage guesses the repo" { - nochroot=false; require network sudo || nochroot=true mkdir -p -- "$tmpdir/reponame/libretools-hello" cp fixtures/librestage/PKGBUILD-hello "$tmpdir/reponame/libretools-hello/PKGBUILD" cd "$tmpdir/reponame/libretools-hello" - if $nochroot; then - makepkg - else - testsudo libremakepkg -l "$BATS_TEST_NAME" - fi + testsudo libremakepkg -l "$BATS_TEST_NAME" librestage find "$tmpdir" -not -type d -exec ls -ld -- {} + globfile $tmpdir/workdir/staging/reponame/libretools-hello-1.0-1-any.pkg.tar?(.!(sig|*.*)) - $nochroot || globfile $tmpdir/workdir/staging/sources/parabola/libretools-hello-1.0-1-any.src.tar?(.!(sig|*.*)) + globfile $tmpdir/workdir/staging/sources/parabola/libretools-hello-1.0-1-any.src.tar?(.!(sig|*.*)) } +# bats test_tags=network,sudo @test "librestage stages packages without PKGDEST" { - nochroot=false; require network sudo || nochroot=true - cat >> "$XDG_CONFIG_HOME/pacman/makepkg.conf" <<-eot PKGDEST='' SRCPKGDEST='' @@ -55,14 +50,10 @@ shopt -s extglob cp fixtures/librestage/PKGBUILD-hello "$tmpdir/PKGBUILD" cd "$tmpdir" - if $nochroot; then - makepkg - else testsudo libremakepkg -l "$BATS_TEST_NAME" - fi librestage repo1 find "$tmpdir" -not -type d -exec ls -ld -- {} + globfile $tmpdir/workdir/staging/repo1/libretools-hello-1.0-1-any.pkg.tar?(.!(sig|*.*)) - $nochroot || globfile $tmpdir/workdir/staging/sources/parabola/libretools-hello-1.0-1-any.src.tar?(.!(sig|*.*)) + globfile $tmpdir/workdir/staging/sources/parabola/libretools-hello-1.0-1-any.src.tar?(.!(sig|*.*)) } diff --git a/test/fixtures/lib-notifications/librerelease-complete-log.log b/test/fixtures/lib-notifications/librerelease-complete-log.log new file mode 100644 index 0000000..ec4c8d8 --- /dev/null +++ b/test/fixtures/lib-notifications/librerelease-complete-log.log @@ -0,0 +1,6 @@ +copied 'sources/parabola/foo-1.2.3-4-i686.src.tar.gz' -> '/srv/repo/main/sources/parabola/foo-1.2.3-4-i686.src.tar.gz' +removed 'sources/parabola/foo-1.2.3-4-i686.src.tar.gz' +copied 'sources/parabola/foo-1.2.3-4-i686.src.tar.gz.sig' -> '/srv/repo/main/sources/parabola/foo-1.2.3-4-i686.src.tar.gz.sig' +removed 'sources/parabola/foo-1.2.3-4-i686.src.tar.gz.sig' +==> Updating [libre-testing]... + -> foo-1.2.3-4-i686.pkg.tar.zst (i686) diff --git a/test/fixtures/lib-notifications/librerelease-debug-pkg.log b/test/fixtures/lib-notifications/librerelease-debug-pkg.log new file mode 100644 index 0000000..ac90d2f --- /dev/null +++ b/test/fixtures/lib-notifications/librerelease-debug-pkg.log @@ -0,0 +1,3 @@ +==> Updating [libre]... + -> foo-1.2.3-4-i686.pkg.tar.zst (i686) + -> foo-debug-1.2.3-4-i686.pkg.tar.zst (i686) diff --git a/test/fixtures/lib-notifications/librerelease-multipkg-any.log b/test/fixtures/lib-notifications/librerelease-multipkg-any.log new file mode 100644 index 0000000..4ccf129 --- /dev/null +++ b/test/fixtures/lib-notifications/librerelease-multipkg-any.log @@ -0,0 +1,10 @@ +==> Updating [libre]... + -> gitget-20240221.1-3-any.pkg.tar.zst (x86_64) + -> librelib-20240221.1-3-any.pkg.tar.zst (x86_64) + -> libretools-20240221.1-3-any.pkg.tar.zst (x86_64) + -> gitget-20240221.1-3-any.pkg.tar.zst (i686) + -> librelib-20240221.1-3-any.pkg.tar.zst (i686) + -> libretools-20240221.1-3-any.pkg.tar.zst (i686) + -> gitget-20240221.1-3-any.pkg.tar.zst (armv7h) + -> librelib-20240221.1-3-any.pkg.tar.zst (armv7h) + -> libretools-20240221.1-3-any.pkg.tar.zst (armv7h) diff --git a/test/fixtures/lib-notifications/librerelease-multipkg-multirepo-any.log b/test/fixtures/lib-notifications/librerelease-multipkg-multirepo-any.log new file mode 100644 index 0000000..35a76ad --- /dev/null +++ b/test/fixtures/lib-notifications/librerelease-multipkg-multirepo-any.log @@ -0,0 +1,11 @@ +==> Updating [libre-testing]... + -> gitget-20240221.1-3-any.pkg.tar.zst (x86_64) + -> librelib-20240221.1-3-any.pkg.tar.zst (x86_64) + -> libretools-20240221.1-3-any.pkg.tar.zst (x86_64) + -> gitget-20240221.1-3-any.pkg.tar.zst (i686) + -> librelib-20240221.1-3-any.pkg.tar.zst (i686) + -> libretools-20240221.1-3-any.pkg.tar.zst (i686) +==> Updating [libre]... + -> gitget-20240221.1-3-any.pkg.tar.zst (armv7h) + -> librelib-20240221.1-3-any.pkg.tar.zst (armv7h) + -> libretools-20240221.1-3-any.pkg.tar.zst (armv7h) diff --git a/test/fixtures/lib-notifications/librerelease-multipkg-multirepo-multiarch.log b/test/fixtures/lib-notifications/librerelease-multipkg-multirepo-multiarch.log new file mode 100644 index 0000000..7dade39 --- /dev/null +++ b/test/fixtures/lib-notifications/librerelease-multipkg-multirepo-multiarch.log @@ -0,0 +1,4 @@ +==> Updating [libre-testing]... + -> foo-1.2.3-4-x86_64.pkg.tar.zst (x86_64) +==> Updating [libre]... + -> bar-1.2.3-4-i686.pkg.tar.zst (i686) diff --git a/test/fixtures/lib-notifications/librerelease-multirepo-multiarch.log b/test/fixtures/lib-notifications/librerelease-multirepo-multiarch.log new file mode 100644 index 0000000..17810e4 --- /dev/null +++ b/test/fixtures/lib-notifications/librerelease-multirepo-multiarch.log @@ -0,0 +1,4 @@ +==> Updating [libre-testing]... + -> foo-1.2.3-4-x86_64.pkg.tar.zst (x86_64) +==> Updating [libre]... + -> foo-1.2.3-4-i686.pkg.tar.zst (i686) diff --git a/test/fixtures/librechroot/PKGBUILD-base-devel b/test/fixtures/librechroot/PKGBUILD-base-devel new file mode 100644 index 0000000..ae3b035 --- /dev/null +++ b/test/fixtures/librechroot/PKGBUILD-base-devel @@ -0,0 +1,13 @@ +pkgname=pacman +license=('GPL') +pkgdesc="A library-based package manager with dependency support" +url="https://www.archlinux.org/pacman/" +arch=('x86_64') + +pkgver=@PKGVER@ +pkgrel=@PKGREL@ +depends=(@PKGDEPS@) + +prepare() { :; } +build() { :; } +package() { :; } diff --git a/test/lib/common.bash b/test/lib/common.bash index 90b6f04..db6b33e 100644 --- a/test/lib/common.bash +++ b/test/lib/common.bash @@ -66,7 +66,7 @@ common_setup() { common_teardown() { gpg-connect-agent KILLAGENT /bye || true if [[ -n ${tmpdir:-} ]]; then - if [[ -f "$tmpdir/.used-sudo" ]]; then + if libremessages in_array 'sudo' "${BATS_TEST_TAGS[@]}"; then sudo rm -rf -- "$tmpdir" else rm -rf -- "$tmpdir" @@ -100,27 +100,6 @@ teardown() { # Utility functions for use in test definitions ###################### -require() ( - set +x - local missing=() - if libremessages in_array "network" "$@" && ! [[ $NETWORK ]]; then - missing+=('networking') - fi - if libremessages in_array "sudo" "$@" && ! [[ $SUDO ]]; then - missing+=('sudo') - fi - if libremessages in_array "btrfs" "$@" && ! [[ "$(stat -f -c %T "$chrootdir" 2>/dev/null || true)" == 'btrfs' ]]; then - missing+=('btrfs') - fi - if (( ${#missing[@]} )); then - return 1 - fi - if libremessages in_array "sudo" "$@"; then - touch "$tmpdir/.used-sudo" - fi - return 0 -) - empty() { diff -u /dev/null "$1" } diff --git a/test/testenv b/test/testenv index 09fd328..eb34dda 100755 --- a/test/testenv +++ b/test/testenv @@ -2,21 +2,6 @@ { set -e - # Parse the arguments - NETWORK=true - SUDO=true - while [[ $# -gt 0 ]]; do - case "$1" in - --no-network) shift; unset NETWORK;; - --network) shift; NETWORK=true;; - --no-sudo) shift; unset SUDO;; - --sudo) shift; SUDO=true;; - --) shift; break;; - *) break;; - esac - done - export NETWORK SUDO - if [[ $# == 0 ]]; then echo 'You need to run testenv with arguments!' >&2 exit 1 @@ -27,7 +12,7 @@ cleanup() { set +e # coordinate this with ./lib/common.bash - if [[ $SUDO ]] && [[ -d "$TMPDIR/chroots" ]]; then + if [[ -f "$TMPDIR/.used-sudo" ]] && [[ -d "$TMPDIR/chroots" ]]; then if [[ "$(stat -f -c %T "$TMPDIR/chroots")" == btrfs ]]; then sudo find "$TMPDIR/chroots" -depth -inum 256 -exec \ btrfs subvolume delete {} \; &>/dev/null @@ -61,8 +46,9 @@ "${_librelib_conf_sh_sysconfdir}/makepkg.d/librefetch.conf" # Hack to respect our variables in sudo - install -Dm755 /dev/stdin "$destdir/usr/bin/testsudo" <<-'eot' + install -Dm755 /dev/stdin "$destdir/usr/bin/testsudo" <<-eot #!/bin/bash + touch ${TMPDIR@Q}/.used-sudo vars=( TMPDIR GNUPGHOME XDG_CACHE_HOME XDG_CONFIG_HOME @@ -70,10 +56,10 @@ GPGKEY ) env=() - for var in "${vars[@]}"; do - env+=("$var=${!var}") + for var in "\${vars[@]}"; do + env+=("\$var=\${!var}") done - sudo "${env[@]}" "$@" + sudo "\${env[@]}" "\$@" eot # Hack to work around GnuPG being stupid with locating gpg-agent's socket install -Dm755 /dev/stdin "$destdir/usr/bin/gpg" <<-'eot' |