aboutsummaryrefslogtreecommitdiffstats
path: root/tests/run
diff options
context:
space:
mode:
authorGuilhem Moulin <guilhem@fripost.org>2019-11-09 03:13:45 +0100
committerGuilhem Moulin <guilhem@fripost.org>2019-11-13 06:23:56 +0100
commit67440844c422ee30b31df9a46a7f99ac0e833add (patch)
tree989381e5b94d5939dafdd1e99c7db2ada95355ec /tests/run
parentb9da6cc7ecf71026d1023dc3354b820c7518426e (diff)
Refactor and improve test suite.
Diffstat (limited to 'tests/run')
-rwxr-xr-xtests/run173
1 files changed, 113 insertions, 60 deletions
diff --git a/tests/run b/tests/run
index ee11757..cb52518 100755
--- a/tests/run
+++ b/tests/run
@@ -22,27 +22,27 @@ set -ue
PATH=/usr/bin:/bin
export PATH
-if [ $# -ne 1 ]; then
- printf "Usage: %s TESTNAME\\n" "$0" >&2
+if [ $# -eq 0 ] || [ $# -gt 2 ]; then
+ printf "Usage: %s TESTFILE [TESTNAME]\\n" "$0" >&2
exit 1
fi
-TEST="${1%/}"
-TEST="${TEST##*/}"
-NAME="${TEST#[0-9]*-}"
-TESTDIR="$(dirname -- "$0")/$TEST"
+TESTDIR="$(dirname -- "$0")/$1"
+TESTNAME="${2-$1}"
if [ ! -d "$TESTDIR" ]; then
printf "ERROR: Not a directory: %s\\n" "$TESTDIR" >&2
exit 1
fi
-ROOTDIR="$(mktemp --tmpdir="${TMPDIR:-/dev/shm}" --directory "$NAME.XXXXXXXXXX")"
+ROOTDIR="$(mktemp --tmpdir="${TMPDIR:-/dev/shm}" --directory "$1.XXXXXXXXXX")"
trap 'rm -rf -- "$ROOTDIR"' EXIT INT TERM
-STDOUT="$ROOTDIR/stdout"
-STDERR="$ROOTDIR/stderr"
+_STDOUT="$ROOTDIR/stdout"
+_STDERR="$ROOTDIR/stderr"
TMPDIR="$ROOTDIR/tmp"
+STDERR="$(mktemp --tmpdir="$ROOTDIR" "stderr.XXXXXXXXXX")"
mkdir -- "$TMPDIR" "$ROOTDIR/home"
+declare -a REMOTES=()
# Set environment for the given user
environ_set() {
@@ -60,24 +60,35 @@ environ_set() {
# Prepare the test harness
prepare() {
declare -a ENVIRON=()
- local src cfg target u home
+ local src cfg target u home n capability
+ if [ -f "$TESTDIR/remotes" ]; then
+ for cfg in $(seq 1 "$(< "$TESTDIR/remotes")"); do
+ REMOTES+=( "remote$cfg" )
+ done
+ else
+ REMOTES+=( "remote" )
+ fi
# copy dovecot config
- for src in "$TESTDIR/local.conf" "$TESTDIR"/remote*.conf; do
- [ -r "$src" ] || continue
- u="${src#"$TESTDIR/"}"
- u="${u%.conf}"
- home="$ROOTDIR/home/$u"
+ for u in "local" "${REMOTES[@]}"; do
+ home="$ROOTDIR/$u/home"
export "HOME_$u"="$home"
- mkdir -pm0755 -- "$home/.local/bin"
mkdir -pm0700 -- "$home/.config/dovecot"
cat >"$home/.config/dovecot/config" <<-EOF
- log_path = /dev/null
- mail_home = $ROOTDIR/home/%u
+ log_path = $HOME_local/mail.log
+ mail_home = $home
+ mail_location = dbox:~/inbox:LAYOUT=index
mailbox_list_index = yes
ssl = no
+ namespace inbox {
+ inbox = yes
+ }
EOF
- cat >>"$home/.config/dovecot/config" <"$src"
+ if [ -f "$TESTDIR/$u.conf" ]; then
+ cat >>"$home/.config/dovecot/config" <"$TESTDIR/$u.conf"
+ fi
+
environ_set "$u"
+ mkdir -pm0755 -- "$home/.local/bin"
cat >"$home/.local/bin/doveadm" <<-EOF
#!/bin/sh
exec env -i ${ENVIRON[@]@Q} \\
@@ -89,36 +100,62 @@ prepare() {
# copy interimap config
mkdir -pm0700 -- "$HOME_local/.local/share/interimap"
mkdir -pm0700 -- "$HOME_local/.config/interimap"
- for cfg in "$TESTDIR"/remote*.conf; do
- cfg="${cfg#"$TESTDIR/remote"}"
- cfg="${cfg%.conf}"
- u="remote$cfg"
+ for u in "${REMOTES[@]}"; do
+ n="${u#remote}"
eval home="\$HOME_$u"
- if [ -f "$TESTDIR/interimap.conf" ]; then
- cat <"$TESTDIR/interimap.conf" >>"$HOME_local/.config/interimap/config$cfg"
- fi
- cat >>"$HOME_local/.config/interimap/config$cfg" <<-EOF
+
+ cat >>"$HOME_local/.config/interimap/config$n" <<-EOF
database = $u.db
-
+ #logfile = $HOME_local/interimap$n.log
+ EOF
+ if [ -f "$TESTDIR/interimap$n.conf" ]; then
+ cat <"$TESTDIR/interimap$n.conf" >>"$HOME_local/.config/interimap/config$n"
+ fi
+
+ cat >>"$HOME_local/.config/interimap/config$n" <<-EOF
+
[local]
type = tunnel
command = exec ${HOME_local@Q}/.local/bin/doveadm exec imap
null-stderr = NO
+ EOF
+ if [ -f "$TESTDIR/interimap$n.local" ]; then
+ cat <"$TESTDIR/interimap$n.local" >>"$HOME_local/.config/interimap/config$n"
+ fi
+
+ # `doveadm exec imap` ignores 'imap_capability' from doveconf/config
+ capability="$(doveconf -c "$home/.config/dovecot/config" -h imap_capability)"
+ cat >>"$HOME_local/.config/interimap/config$n" <<-EOF
[remote]
type = tunnel
- command = exec ${home@Q}/.local/bin/doveadm exec imap
+ command = exec ${home@Q}/.local/bin/doveadm exec imap ${capability:+-oimap_capability=${capability@Q}}
null-stderr = NO
EOF
+ if [ -f "$TESTDIR/interimap$n.remote" ]; then
+ cat <"$TESTDIR/interimap$n.remote" >>"$HOME_local/.config/interimap/config$n"
+ fi
done
}
prepare
# Wrappers for interimap(1) and doveadm(1)
interimap() {
- declare -a ENVIRON=()
+ declare -a ENVIRON=() r=0
environ_set "local"
- env -i "${ENVIRON[@]}" perl -I./lib -T ./interimap "$@"
+ env -i "${ENVIRON[@]}" perl -I./lib -T ./interimap "$@" 2>"$STDERR" || r=$?
+ cat "$STDERR" >&2
+ return $r
+}
+interimap_init() {
+ local u="${1-remote}"
+ local db="$XDG_DATA_HOME/interimap/$u.db"
+ local cfg="config${u#remote}"
+
+ test \! -e "$db" || error "Database already exists" 1
+ interimap --config "$cfg" || error "Couldn't initialize interimap" 1
+ test -f "$db" || error "Database is still missing" 1
+ grep -Fx "Creating new schema in database file $db" <"$STDERR" || error "DB wasn't created" 1
}
doveadm() {
if [ $# -le 2 ] || [ "$1" != "-u" ]; then
@@ -167,9 +204,7 @@ dump_test_result() {
local above="<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
local src u home
declare -a ENVIRON=()
- for src in "$TESTDIR/local.conf" "$TESTDIR"/remote*.conf; do
- u="${src#"$TESTDIR/"}"
- u="${u%.conf}"
+ for u in "local" "${REMOTES[@]}"; do
environ_set "$u"
eval home="\$HOME_$u"
printf "%s dovecot configuration:\\n%s\\n" "$u" "$below"
@@ -177,16 +212,18 @@ dump_test_result() {
printf "%s\\n\\n" "$above"
done
- printf "(local) interimap configuration:\\n%s\\n" "$below"
- cat <"$HOME_local/.config/interimap/config"
- printf "%s\\n\\n" "$above"
+ for u in "${REMOTES[@]}"; do
+ printf "interimap configuration (local <-> $u):\\n%s\\n" "$below"
+ cat <"$HOME_local/.config/interimap/config${u#remote}"
+ printf "%s\\n\\n" "$above"
+ done
- printf "standard output was:\\n%s\\n" "$below"
- cat <"$STDOUT"
+ printf "standard output:\\n%s\\n" "$below"
+ cat <"$_STDOUT"
printf "%s\\n\\n" "$above"
- printf "standard error was:\\n%s\\n" "$below"
- cat <"$STDERR"
+ printf "standard error:\\n%s\\n" "$below"
+ cat <"$_STDERR"
printf "%s\\n\\n" "$above"
}
@@ -225,7 +262,7 @@ check_mailbox_status2() {
WHERE mailbox = $blob
EOF
)
- check_mailbox_status_values "local" "$lmailbox" $lUIDVALIDITY $lUIDNEXT $lHIGHESTMODSEQ $MESSAGES
+ check_mailbox_status_values "local" "$lmailbox" $lUIDVALIDITY $lUIDNEXT $lHIGHESTMODSEQ $MESSAGES
check_mailbox_status_values "$u" "$rmailbox" $rUIDVALIDITY $rUIDNEXT $rHIGHESTMODSEQ $MESSAGES
local a b
@@ -304,38 +341,54 @@ check_mailbox_list() {
<( printf "%s" "${lmailboxes[*]}" | sort ) <( printf "%s" "${rmailboxes[*]}" | sort )
}
-# Wrappers for grep(1) and `grep -C`
-xgrep() {
- if ! grep -q "$@"; then
- printf "\`grep %s\` failed on line %d\\n" "${*@Q}" ${BASH_LINENO[0]} >&2
- exit 1
- fi
-}
+# Wrapper for `grep -c`
xcgrep() {
local m="$1" n
shift
if ! n="$(grep -c "$@")" || [ $m -ne $n ]; then
- printf "\`grep -c %s\` failed on line %d: %d != %d\\n" "${*@Q}" ${BASH_LINENO[0]} "$m" "$n" >&2
- exit 1
+ error "\`grep -c ${*@Q}\` failed ($m != $n)" 1
fi
}
+error() {
+ local err="${1+": $1"}" i=${2-0}
+ printf "ERROR$err on file %s line %d\\n" "${BASH_SOURCE[i+1]}" ${BASH_LINENO[i]} >&2
+ exit 1
+}
+ptree_abort() {
+ local pid
+ for pid in "$@"; do
+ # kill a process and its children
+ pkill -TERM -P "$pid" || printf "pkill(1) exited with status %d\\n" "$?" >&2
+ kill -TERM "$pid" || printf "kill(1) exited with status %d\\n" "$?" >&2
+ done
+ wait
+}
+step_start() { printf "%s%s..." "${INDENT-}" "$1" >&3; }
+step_done() { passed >&3; }
+failed() {
+ [ -t 1 ] && printf " \\x1B[1;31mFAILED\\x1B[0m\\n" || echo " FAILED"
+}
+passed() {
+ [ -t 1 ] && printf " \\x1B[1;32mPASSED\\x1B[0m\\n" || echo " PASSED"
+}
# Run test in a sub-shell
declare -a ENVIRON=()
environ_set "local"
-export TMPDIR TESTDIR STDOUT STDERR "${ENVIRON[@]}"
+export TMPDIR TESTDIR STDERR "${ENVIRON[@]}"
export -f environ_set doveadm interimap sqlite3 sample_message deliver
+export -f interimap_init ptree_abort step_start step_done passed
export -f check_mailbox_status check_mailbox_status_values check_mailbox_status2
-export -f check_mailboxes_status check_mailbox_list xgrep xcgrep
-printf "%s..." "$TEST"
-if ! bash -ue "$TESTDIR/run" >"$STDOUT" 2>"$STDERR"; then
- echo " FAILED"
- dump_test_result
+export -f check_mailboxes_status check_mailbox_list xcgrep error
+[ "$TESTNAME" = "..." ] || printf "%s%s..." "${INDENT-}" "$TESTNAME"
+if ! bash -ue "$TESTDIR/t" 3>&1 >"$_STDOUT" 2>"$_STDERR"; then
+ failed
+ [ "${QUIET-n}" = "y" ] || dump_test_result
exit 1
else
- echo " OK"
- if grep -Paq "\\x00" -- "$STDOUT" "$STDERR"; then
- printf "\\tWarn: binary output (outstanding \\0)!\\n"
+ [ "$TESTNAME" = "..." ] || passed
+ if grep -Paq "\\x00" -- "$_STDOUT" "$_STDERR"; then
+ printf "\\tWARN: binary output (outstanding \\0)!\\n"
fi
exit 0
fi