#!/bin/sh

dir=`dirname "$0"`

# change directory to $AUTOPKGTEST_TMP
cd "${AUTOPKGTEST_TMP}" || exit 1

cleanup() {
  ex=$?
  rm -f testvalgrind.bin mustfail.log
  exit "${ex}"
}
trap "cleanup" EXIT TERM INT

ulimit -s 32768

CC="cc -O2"
VALGRIND="env valgrind_multiplier=1 valgrind -q --max-stackframe=16777216 --error-exitcode=99"

${CC} -o testvalgrind.bin "${dir}/testvalgrind.c" -lmceliece || exit 2

# first test checks if valgrind detect timing leaks, valgrind must show tracebacks:"
#  mustfail_keypair ... Conditional jump or move depends on uninitialised value(s)"
#  mustfail_enc ....... Use of uninitialised value"
#  mustfail_dec ....... Use of uninitialised value"
${VALGRIND} ./testvalgrind.bin mustfail ref >mustfail.log 2>&1
RET=$?
if [ $RET -eq 99 ]; then
  echo "test if valgrind detects timing leaks ... OK"
  # uncomment to print valgrind traceback
  # cat mustfail.log
elif [ $RET -eq 0 ]; then
  echo "test if valgrind detects timing leaks ... FAILED, skipping tests" >&2
  exit 77
else
  echo "test if valgrind detects timing leaks ... FAILED, but with exit code not from valgrind, skipping tests" >&2
  cat mustfail.log >&2
  exit 77
fi

# main test
EX=0
for primitive in 6960119 6688128 8192128 460896 348864; do
  for variant in '' f; do
    for implname in vec avx; do
      ${VALGRIND} ./testvalgrind.bin "${primitive}${variant}" "${implname}"
      RET=$?
      if [ $RET -eq 0 ]; then
        echo "mceliece${primitive}${variant} ${implname} ... OK"
      elif [ $RET -eq 10 ]; then
        echo "mceliece${primitive}${variant} ${implname} ... NOT AVAILABLE (skipping)"
      else
        echo "mceliece${primitive}${variant} ${implname} ... FAILED" >&2
        EX=3
      fi
    done
  done
done

exit "${EX}"
