#!/bin/bash

set -e
WORKDIR=$(mktemp -d)
TESTDIR=$(realpath "$(dirname "$0")")
DKIMPY_MILTER=${DKIMPY_MILTER:-"$TESTDIR/dkimpy-milter"}
KEY_TYPES=(ed25519 rsa)

cd "$WORKDIR"

printf "Testing %s from directory %s\n" "$DKIMPY_MILTER" "$WORKDIR"

for keytype in "${KEY_TYPES[@]}"; do
    dknewkey --ktype "$keytype" "testkey.$keytype"
    if [ "$keytype" = ed25519 ]; then
        keyfile=KeyFileEd25519
        selector=SelectorEd25519
    elif [ "$keytype" = rsa ]; then
        keyfile=KeyFile
        selector=Selector
    fi
    if [ "$keytype" = ed25519 ]; then
        keytable=KeyTableEd25519
        selector=SelectorEd25519
    elif [ "$keytype" = rsa ]; then
        keytable=KeyTable
        selector=Selector
    fi
    cat > "$keytype.signing.conf" <<EOF
Domain example.net
$keyfile testkey.$keytype.key
$selector testkey
Socket unix:$keytype.signing.sock
PidFile $keytype.signing.pid
Mode s
UserID $(id --name --user):$(id --name --group)
EOF

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

    cat > "$keytype.table.conf" <<EOF
$keytable $WORKDIR/$keytype-table
Socket unix:$keytype.table.sock
PidFile $keytype.table.pid
Mode s
UserID $(id --name --user):$(id --name --group)
EOF

    cat >  "$keytype-table" <<EOF
example.org, testnokey, testkey.$keytype.key
example.net, testkey, testkey.$keytype.key
EOF
done

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

for keytype in "${KEY_TYPES[@]}"; do
    for func in signing verify table; do
        PYTHONPATH="$(dirname "$TESTDIR")" "$DKIMPY_MILTER" "$keytype.$func.conf" 2>"$keytype.$func.stderr" &
    done
done
trap cleanup EXIT

# ugly ugly (how are we supposed to know that the milters are all 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

rm -rf "$(dirname $TESTDIR)/dkimpy_milter/__pycache__"
