aboutsummaryrefslogtreecommitdiffstats
path: root/tests/run
diff options
context:
space:
mode:
Diffstat (limited to 'tests/run')
-rwxr-xr-xtests/run109
1 files changed, 83 insertions, 26 deletions
diff --git a/tests/run b/tests/run
index cb52518..bff9c18 100755
--- a/tests/run
+++ b/tests/run
@@ -27,7 +27,8 @@ if [ $# -eq 0 ] || [ $# -gt 2 ]; then
exit 1
fi
-TESTDIR="$(dirname -- "$0")/$1"
+BASEDIR="$(dirname -- "$0")"
+TESTDIR="$BASEDIR/$1"
TESTNAME="${2-$1}"
if [ ! -d "$TESTDIR" ]; then
printf "ERROR: Not a directory: %s\\n" "$TESTDIR" >&2
@@ -35,7 +36,18 @@ if [ ! -d "$TESTDIR" ]; then
fi
ROOTDIR="$(mktemp --tmpdir="${TMPDIR:-/dev/shm}" --directory "$1.XXXXXXXXXX")"
-trap 'rm -rf -- "$ROOTDIR"' EXIT INT TERM
+declare -a DOVECOT_SERVER=()
+trap cleanup EXIT INT TERM
+cleanup() {
+ local pid c
+ for c in "${DOVECOT_SERVER[@]}"; do
+ if [ ! -f "$c" ] || ! env -i PATH="/usr/bin:/bin" doveadm -c "$c" stop; then
+ pid="$(< "${c%/*}/run/master.pid")"
+ kill -TERM "$pid" || printf "kill(1) exited with status %d\\n" "$?" >&2
+ fi
+ done
+ rm -rf -- "$ROOTDIR"
+}
_STDOUT="$ROOTDIR/stdout"
_STDERR="$ROOTDIR/stderr"
@@ -60,7 +72,7 @@ environ_set() {
# Prepare the test harness
prepare() {
declare -a ENVIRON=()
- local src cfg target u home n capability
+ local src cfg target u home n proto
if [ -f "$TESTDIR/remotes" ]; then
for cfg in $(seq 1 "$(< "$TESTDIR/remotes")"); do
REMOTES+=( "remote$cfg" )
@@ -72,27 +84,64 @@ prepare() {
for u in "local" "${REMOTES[@]}"; do
home="$ROOTDIR/$u/home"
export "HOME_$u"="$home"
- mkdir -pm0700 -- "$home/.config/dovecot"
- cat >"$home/.config/dovecot/config" <<-EOF
+ environ_set "$u"
+
+ mkdir -pm0700 -- "$home/.dovecot"
+ cat >"$home/.dovecot/config" <<-EOF
log_path = $HOME_local/mail.log
mail_home = $home
mail_location = dbox:~/inbox:LAYOUT=index
mailbox_list_index = yes
ssl = no
+ listen = 127.0.0.1, ::1
namespace inbox {
inbox = yes
}
EOF
if [ -f "$TESTDIR/$u.conf" ]; then
- cat >>"$home/.config/dovecot/config" <"$TESTDIR/$u.conf"
+ cat >>"$home/.dovecot/config" <"$TESTDIR/$u.conf"
+ fi
+ cp -aT -- "$BASEDIR/snippets/dovecot" "$home/.dovecot/conf.d"
+
+ proto="$(env -i "${ENVIRON[@]}" doveconf -c "$home/.dovecot/config" -h protocols)"
+ if [ -n "$proto" ]; then
+ cat >>"$home/.dovecot/config" <<-EOF
+ # https://wiki.dovecot.org/HowTo/Rootless
+ base_dir = $home/.dovecot/run
+ default_internal_user = $(id -un)
+ default_internal_group = $(id -gn)
+ default_login_user = $(id -un)
+
+ service anvil {
+ chroot =
+ }
+ service imap-login {
+ chroot =
+ }
+ service stats {
+ chroot =
+ }
+
+ passdb {
+ args = scheme=PLAIN username_format=%u $home/.dovecot/users
+ driver = passwd-file
+ }
+ userdb {
+ args = username_format=%u $home/.dovecot/users
+ driver = passwd-file
+ }
+ EOF
+
+ env -i PATH="/usr/bin:/bin" /usr/sbin/dovecot -c "$home/.dovecot/config"
+ DOVECOT_SERVER+=( "$home/.dovecot/config" )
+ printf "%s:%s:::::\\n" "$u" "$(xxd -l16 -p </dev/urandom)" >"$home/.dovecot/users"
fi
- environ_set "$u"
mkdir -pm0755 -- "$home/.local/bin"
cat >"$home/.local/bin/doveadm" <<-EOF
#!/bin/sh
exec env -i ${ENVIRON[@]@Q} \\
- doveadm -c ${home@Q}/.config/dovecot/config "\$@"
+ doveadm -c ${home@Q}/.dovecot/config "\$@"
EOF
chmod +x -- "$home/.local/bin/doveadm"
done
@@ -123,15 +172,19 @@ prepare() {
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 ${capability:+-oimap_capability=${capability@Q}}
- null-stderr = NO
- EOF
+ printf "\\n[remote]\\n" >>"$HOME_local/.config/interimap/config$n"
+ if [ -s "$home/.dovecot/users" ]; then
+ cat <<-EOF
+ username = $u
+ password = $(awk -F: -vu="$u" '$1 == u {print $2}' <"$home/.dovecot/users")
+ EOF
+ else
+ cat <<-EOF
+ type = tunnel
+ command = exec ${home@Q}/.local/bin/doveadm exec imap
+ null-stderr = NO
+ EOF
+ fi >>"$HOME_local/.config/interimap/config$n"
if [ -f "$TESTDIR/interimap$n.remote" ]; then
cat <"$TESTDIR/interimap$n.remote" >>"$HOME_local/.config/interimap/config$n"
fi
@@ -208,7 +261,7 @@ dump_test_result() {
environ_set "$u"
eval home="\$HOME_$u"
printf "%s dovecot configuration:\\n%s\\n" "$u" "$below"
- env -i "${ENVIRON[@]}" doveconf -c "$home/.config/dovecot/config" -n
+ env -i "${ENVIRON[@]}" doveconf -c "$home/.dovecot/config" -n
printf "%s\\n\\n" "$above"
done
@@ -218,6 +271,10 @@ dump_test_result() {
printf "%s\\n\\n" "$above"
done
+ printf "mail.log:\\n%s\\n" "$below"
+ cat -- "$HOME_local/mail.log" 2>/dev/null || true
+ printf "%s\\n\\n" "$above"
+
printf "standard output:\\n%s\\n" "$below"
cat <"$_STDOUT"
printf "%s\\n\\n" "$above"
@@ -230,10 +287,10 @@ dump_test_result() {
# Check mailbox consistency between the local/remote server and interimap's database
check_mailbox_status() {
local mailbox="$1" lns="inbox" lsep lprefix rns="inbox" rsep rprefix
- lsep="$(doveconf -c "$HOME_local/.config/dovecot/config" -h "namespace/$lns/separator")"
- lprefix="$(doveconf -c "$HOME_local/.config/dovecot/config" -h "namespace/$lns/prefix")"
- rsep="$(doveconf -c "$HOME_remote/.config/dovecot/config" -h "namespace/$lns/separator")"
- rprefix="$(doveconf -c "$HOME_remote/.config/dovecot/config" -h "namespace/$lns/prefix")"
+ lsep="$(doveconf -c "$HOME_local/.dovecot/config" -h "namespace/$lns/separator")"
+ lprefix="$(doveconf -c "$HOME_local/.dovecot/config" -h "namespace/$lns/prefix")"
+ rsep="$(doveconf -c "$HOME_remote/.dovecot/config" -h "namespace/$lns/separator")"
+ rprefix="$(doveconf -c "$HOME_remote/.dovecot/config" -h "namespace/$lns/prefix")"
local blob="x'$(printf "%s" "$mailbox" | tr "$lsep" "\\0" | xxd -c256 -ps)'"
local rmailbox="$(printf "%s" "$mailbox" | tr "$lsep" "$rsep")"
@@ -305,10 +362,10 @@ check_mailboxes_status() {
# Check mailbox list constency between the local and remote servers
check_mailbox_list() {
local m i lns="inbox" lsep lprefix rns="inbox" rsep rprefix sub=
- lsep="$(doveconf -c "$HOME_local/.config/dovecot/config" -h "namespace/$lns/separator")"
- lprefix="$(doveconf -c "$HOME_local/.config/dovecot/config" -h "namespace/$lns/prefix")"
- rsep="$(doveconf -c "$HOME_remote/.config/dovecot/config" -h "namespace/$lns/separator")"
- rprefix="$(doveconf -c "$HOME_remote/.config/dovecot/config" -h "namespace/$lns/prefix")"
+ lsep="$(doveconf -c "$HOME_local/.dovecot/config" -h "namespace/$lns/separator")"
+ lprefix="$(doveconf -c "$HOME_local/.dovecot/config" -h "namespace/$lns/prefix")"
+ rsep="$(doveconf -c "$HOME_remote/.dovecot/config" -h "namespace/$lns/separator")"
+ rprefix="$(doveconf -c "$HOME_remote/.dovecot/config" -h "namespace/$lns/prefix")"
if [ $# -gt 0 ] && [ "$1" = "-s" ]; then
sub="-s"
shift