#!/bin/bash

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

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

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

# Cf. Net_SMTP-*/tests/config.php.dist
cat >"$TESTDIR/config.php" <<-EOF
	<?php
	define('TEST_HOSTNAME',     'localhost');
	define('TEST_PORT',         $port);
	define('TEST_LOCALHOST',    'localhost.localdomain');
	define('TEST_AUTH_USER',    '$username');
	define('TEST_AUTH_PASS',    '$password');
	define('TEST_FROM',         'from@example.net');
	define('TEST_TO',           'to@example.net');
	define('TEST_SUBJECT',      'Test Subject');
	define('TEST_BODY',         'Test Body');
EOF


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

relay_host="127.0.0.1"
relay_port=10025

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 submission
	service submission-login {
	    chroot =
	    inet_listener submission {
	        port = $port
	    }
	}
	submission_relay_host = $relay_host
	submission_relay_port = $relay_port
EOF

RELAY_PID=""
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"
    if [ -n "${RELAY_PID+x}" ]; then
        kill -TERM "$RELAY_PID" || printf "kill(1) exited with status %d\\n" "$?" >&2
    fi
}

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

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

# throw away all incoming messages
/usr/sbin/smtp-sink -h smtp-sink.example.net "inet:$relay_host:$relay_port" 8 & RELAY_PID="$!"

sleep 1
pear run-tests "$TESTDIR"
