#!/bin/bash

set -e
WORKDIR=$(mktemp -d)
TESTDIR=$(realpath "$(dirname "$0")")

cd "$WORKDIR"

dknewkey --ktype ed25519 testkey
cat > signing.conf <<EOF
Domain example.net
KeyFileEd25519 testkey.key
SelectorEd25519 testkey
Socket unix:signing.sock
PidFile signing.pid
Mode s
UserID $(id --name --user):$(id --name --group)
EOF

cat > verify.conf <<EOF
Socket unix:verify.sock
PidFile verify.pid
Mode v
DNSOverride $(cat testkey.dns)
UserID $(id --name --user):$(id --name --group)
EOF

cleanup() {
    echo cleaning up jobs:
    jobs
    if [ -s signing.pid ] && kill -0 "$(cat signing.pid)"; then
        kill "$(cat signing.pid)"
    fi
    if [ -s verify.pid ] && kill -0 "$(cat verify.pid)"; then
        kill "$(cat verify.pid)"
    fi
    wait
    for errdata in signing.stderr verify.stderr; do
        if [ -s "$errdata" ]; then
            printf -- "-> %s:\n" "$errdata"
            cat "$errdata"
            printf -- "-> end %s\n" "$errdata"
        fi
    done
    rm -rf "$WORKDIR"
}

PYTHONPATH="$(dirname "$TESTDIR")" dkimpy-milter signing.conf 2>signing.stderr &
PYTHONPATH="$(dirname "$TESTDIR")" dkimpy-milter verify.conf 2>verify.stderr &
trap cleanup EXIT

# ugly ugly (how are we supposed to know that the filter is ready?):
sleep 2

# uses miltertest from opendkim:
for x in ${TESTS:-"$TESTDIR"/*.miltertest}; do
    if ! [ -e "$x" ]; then
        if [ -e "$TESTDIR/$x" ]; then
            x="$TESTDIR/$x"
        fi
    fi
    printf -- "-> running %s...\n" "$x"
    miltertest -s "$x"
done
