summaryrefslogtreecommitdiff
path: root/test/cases/librerelease.bats
diff options
context:
space:
mode:
Diffstat (limited to 'test/cases/librerelease.bats')
-rw-r--r--test/cases/librerelease.bats191
1 files changed, 142 insertions, 49 deletions
diff --git a/test/cases/librerelease.bats b/test/cases/librerelease.bats
index 93a04e3..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
@@ -12,7 +51,7 @@ setup() {
PasswordAuthentication no
AcceptEnv TMPDIR
AcceptEnv _HOME GNUPGHOME XDG_CACHE_HOME XDG_CONFIG_HOME
- AcceptEnv _PATH LIBRETOOLS_LIBDIR _librelib_conf_sh_sysconfdir _librelib_conf_sh_pkgconfdir
+ AcceptEnv _PATH LIBRETOOLS_LIBRARY_PATH _librelib_conf_sh_sysconfdir _librelib_conf_sh_pkgconfdir
AcceptEnv GPGKEY
ForceCommand HOME=\$_HOME; PATH=\$_PATH; eval "\$SSH_ORIGINAL_COMMAND"
eot
@@ -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
@@ -165,3 +232,29 @@ teardown() {
diff -u "$tmpdir/pwd.txt" "$tmpdir/prerelease.txt"
diff -u "$tmpdir/pwd.txt" "$tmpdir/postrelease.txt"
}
+
+@test "librerelease notifies pbot" {
+ # 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
+
+ StageFiles "$tmpdir"/workdir/staging
+
+ LC_ALL=C librerelease 2> "$tmpdir"/stderr
+
+ grep -E " -> Notifying pbot:" "$tmpdir"/stderr
+ #grep " $USER just published:" "$tmpdir"/pbot.txt
+ grep "$USER just published:" "$tmpdir"/pbot.txt
+}
+
+@test "librerelease logs-in as TIER0_LOGIN" {
+ PATH=$tmpdir/bin:$PATH
+
+ 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
+}