summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/cases/lib-blacklist.bats6
-rw-r--r--test/cases/lib-conf.bats4
-rw-r--r--test/cases/lib-notifications.bats39
-rw-r--r--test/cases/librechroot.bats94
-rw-r--r--test/cases/libremakepkg.bats36
-rw-r--r--test/cases/librerelease.bats230
-rw-r--r--test/cases/librestage.bats19
-rw-r--r--test/fixtures/lib-notifications/librerelease-complete-log.log6
-rw-r--r--test/fixtures/lib-notifications/librerelease-debug-pkg.log3
-rw-r--r--test/fixtures/lib-notifications/librerelease-multipkg-any.log10
-rw-r--r--test/fixtures/lib-notifications/librerelease-multipkg-multirepo-any.log11
-rw-r--r--test/fixtures/lib-notifications/librerelease-multipkg-multirepo-multiarch.log4
-rw-r--r--test/fixtures/lib-notifications/librerelease-multirepo-multiarch.log4
-rw-r--r--test/fixtures/librechroot/PKGBUILD-base-devel13
-rw-r--r--test/lib/common.bash23
-rwxr-xr-xtest/testenv26
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'