#!/bin/bash

set -ue
PATH="/usr/bin:/bin"
export PATH

TESTDIR=( Net_Sieve-*/tests )
if [ ! -d "$TESTDIR" ]; then
    echo "Missing test directory" >&2
    exit 1
fi

username="user"
password="$(xxd -l16 -p </dev/urandom)"
port=14190

# Cf. Net_Sieve-*/tests/config.php.dist
cat >"$TESTDIR/config.php" <<-EOF
	<?php
	define('HOST', 'localhost');
	define('PORT', $port);
	define('USERNAME', '$username');
	define('PASSWORD', '$password');
EOF


home="$AUTOPKGTEST_TMP/home"
dovecot_dir="$AUTOPKGTEST_TMP/dovecot"
run_dir="$dovecot_dir/run"
mkdir -m0700 -- "$home" "$dovecot_dir"

cat >"$dovecot_dir/config" <<-EOF
	log_path = $dovecot_dir/dovecot.log
	mail_location = maildir:~/mail
	ssl = no
	listen = 127.0.0.1, 127.0.1.1, ::1
	namespace inbox {
	    inbox = yes
	}

	# https://wiki.dovecot.org/HowTo/Rootless
	base_dir = $run_dir
	default_internal_user  = $(id -un)
	default_internal_group = $(id -gn)
	default_login_user     = $(id -un)

	service anvil {
	    chroot =
	}
	service stats {
	    chroot =
	}

	passdb {
	    args = scheme=PLAIN username_format=%u $dovecot_dir/users
	    driver = passwd-file
	}
	userdb {
	    args = username_format=%u $dovecot_dir/users
	    driver = passwd-file
	}

	protocols = \$protocols sieve
	service managesieve-login {
	    chroot =
	    inet_listener sieve {
	        port = $port
	    }
	}
EOF

cleanup() {
    local pid
    if ! doveadm -c "$dovecot_dir/config" stop; then
        pid="$(< "$run_dir/master.pid")"
        kill -TERM "$pid" || printf "kill(1) exited with status %d\\n" "$?" >&2
    fi
    rm -rf -- "$dovecot_dir" "$home"
}

/usr/sbin/dovecot -c "$dovecot_dir/config"
trap cleanup EXIT INT TERM

printf "%s:%s::::%s:\\n" "$username" "$password" "$home" >"$dovecot_dir/users"

sleep 1
phpunit "$TESTDIR"
