#!/bin/bash

#openssl.test

# need a unique port since may run the same time as testsuite
openssl_port=11114
no_pid=-1
server_pid=$no_pid
wolf_suites_tested=0
wolf_suites_total=0
counter=0

do_cleanup() {
    echo "in cleanup"

    if  [ $server_pid != $no_pid ]
    then
        echo "killing server"
        kill -9 $server_pid
    fi
}

do_trap() {
    echo "got trap"
    do_cleanup
    exit -1
}

trap do_trap INT TERM

if test -n "$WOLFSSL_OPENSSL_TEST"; then
    echo "WOLFSSL_OPENSSL_TEST set, running test..."
else
    echo "WOLFSSL_OPENSSL_TEST NOT set, won't run"
    exit 0
fi

echo -e "\nTesting existence of openssl command...\n"
command -v openssl >/dev/null 2>&1 || { echo >&2 "Requires openssl command, but it's not installed.  Ending."; exit 0; }


echo -e "\nTesting for _build directory as part of distcheck, different paths"
currentDir=`pwd`
if [[ $currentDir == *"_build" ]]
then
    echo -e "_build directory detected, moving a directory back"
    cd ..
fi

echo -e "\nStarting openssl server...\n"

openssl s_server -accept $openssl_port -cert ./certs/server-cert.pem -key ./certs/server-key.pem  -quiet -www  -dhparam ./certs/dh2048.pem -dcert ./certs/server-ecc.pem -dkey ./certs/ecc-key.pem &
server_pid=$!


# get openssl ciphers
open_ciphers=`openssl ciphers`
IFS=':'  read -ra opensslArray <<< "$open_ciphers"

# get wolfssl ciphers
wolf_ciphers=`./examples/client/client -e`
IFS=':'  read -ra wolfsslArray <<< "$wolf_ciphers"

# server should be ready, let's make sure
server_ready=0
while [ "$counter" -lt 20 ]; do
    echo -e "waiting for openssl s_server ready..."
    nc -z localhost $openssl_port
    nc_result=$?
    if [ $nc_result == 0 ]
    then
        echo -e "openssl s_server ready!"
        server_ready=1
        break
    fi
    sleep 0.1
    counter=$((counter+ 1))
done


if [ $server_ready == 0 ]
then
    echo -e "Couldn't verify openssl server is running, timeout error"
    do_cleanup
    exit -1
fi

for wolfSuite in "${wolfsslArray[@]}"; do

    echo -e "trying wolfSSL cipher suite $wolfSuite"
    matchSuite=0
    wolf_suites_total=$((wolf_suites_total + 1))

    for openSuite in "${opensslArray[@]}"; do
        if [ $openSuite == $wolfSuite ]
        then
            echo -e "Matched to OpenSSL suite support"
            matchSuite=1
        fi
    done

    if [ $matchSuite == 0 ]
    then
        echo -e "Couldn't match suite, continuing..."
        continue
    fi

    ./examples/client/client -p $openssl_port -g -l $wolfSuite
    client_result=$?

    if [ $client_result != 0 ]
    then
        echo -e "client failed!"
        do_cleanup
        exit 1
    fi
    wolf_suites_tested=$((wolf_suites_tested+1))

done

kill -9 $server_pid

echo -e "wolfSSL total suites   $wolf_suites_total"
echo -e "wolfSSL suites tested  $wolf_suites_tested"
echo -e "\nSuccess!\n"

exit 0
