diff options
Diffstat (limited to 'test/cases/librerelease.bats')
-rw-r--r-- | test/cases/librerelease.bats | 191 |
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 +} |