#!/bin/bash

# Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net>

set -e

tests="${1##t-}"

BADVARS=0
for v in TEST_HOST TEST_IP TEST_PORT TEST_QUERY_DELAY TEST_GAP MSVA_PORT; do
    if [ ! -v "$v" ]; then
        printf "You need to set the %s environment variable\n" "$v" >&2
        BADVARS=1
    fi
done

if [ 0 != "$BADVARS" ]; then
    exit 1
fi

if [ . != "$(dirname "$0")" ]; then
    printf "You should only run this mod-gnutls test suite from the t/ directory of the mod_gnutls source.\n" >&2
    exit 1
fi

function stop_msva() {
    kill %1
}

function apache_down_err() {
    printf "FAILURE: %s\n" "$TEST_NAME"
    /usr/sbin/apache2 -f "$(pwd)/apache.conf" -k stop || true
    if [ -e output ]; then
        printf "\ngnutls-cli outputs:\n"
        diff -u output <( tail -n "$(wc -l < output)" "$output" ) || true
    fi
    printf "\nApache error logs:\n"
    tail "../../logs/${TEST_NAME}.error.log"
    stop_msva
}

if [ -z "$tests" ] ; then
    tests=./tests/*
else
    tests=./tests/"$(printf "%02d" "$tests")"_*
fi

GNUPGHOME=$(pwd)/msva.gnupghome MSVA_KEYSERVER_POLICY=never monkeysphere-validation-agent &

trap stop_msva EXIT

sleep "$TEST_GAP"

printf "TESTING: initial MSVA verification\n"
MONKEYSPHERE_VALIDATION_AGENT_SOCKET="http://127.0.0.1:$MSVA_PORT" msva-query-agent https "$(cat client.uid)" x509pem client < client/x509.pem  
printf "\nSUCCESS: initial MSVA verification\n"

for t in $tests; do 
    sleep "$TEST_GAP"
    export TEST_NAME="$(basename "$t")"
    output="../../outputs/${TEST_NAME}.output"
    rm -f "$output"
    cd "$t"
    if [ -e fail.* ]; then
        EXPECTED_FAILURE="$(printf " (expected: %s)" fail.*)"
    else
        unset EXPECTED_FAILURE
    fi
    printf "TESTING: %s%s\n" "$TEST_NAME" "$EXPECTED_FAILURE"
    trap apache_down_err EXIT
    MONKEYSPHERE_VALIDATION_AGENT_SOCKET="http://127.0.0.1:$MSVA_PORT" /usr/sbin/apache2 -f "$(pwd)/apache.conf" -k start || [ -e fail.server ]

    if (sed "s/__HOSTNAME__/${TEST_HOST}/" < ./input && sleep "$TEST_QUERY_DELAY") | \
        gnutls-cli -p "${TEST_PORT}" $(cat ./gnutls-cli.args) "${TEST_HOST}" > \
        "$output" ; then
        if [ -e fail* ]; then
            printf "%s should have failed but succeeded\n" "$(basename "$t")" >&2
            exit 1
        fi
    else
        if [ ! -e fail* ]; then
            printf "%s should have succeeded but failed\n" "$(basename "$t")" >&2
            exit 1
        fi
    fi
    if [ -e output ] ; then
        diff -q -u output <( tail -n "$(wc -l < output)" "$output" )
    fi
    /usr/sbin/apache2 -f "$(pwd)/apache.conf" -k stop || [ -e fail.server ]
    trap stop_msva EXIT
    printf "SUCCESS: %s\n" "$TEST_NAME"
    cd ../..
done

stop_msva
