diff libtommath/testme.sh @ 1692:1051e4eea25a

Update LibTomMath to 1.2.0 (#84) * update C files * update other files * update headers * update makefiles * remove mp_set/get_double() * use ltm 1.2.0 API * update ltm_desc * use bundled tommath if system-tommath is too old * XMALLOC etc. were changed to MP_MALLOC etc.
author Steffen Jaeckel <s@jaeckel.eu>
date Tue, 26 May 2020 17:36:47 +0200
parents f52919ffd3b1
children
line wrap: on
line diff
--- a/libtommath/testme.sh	Tue May 26 23:27:26 2020 +0800
+++ b/libtommath/testme.sh	Tue May 26 17:36:47 2020 +0200
@@ -4,6 +4,7 @@
 #   0  success
 # 128  a test failed
 #  >0  the number of timed-out tests
+# 255  parsing of parameters failed
 
 set -e
 
@@ -21,40 +22,69 @@
 {
   echo "Usage options for $(basename $0) [--with-cc=arg [other options]]"
   echo
-  echo "Executing this script without any parameter will only run the default configuration"
-  echo "that has automatically been determined for the architecture you're running."
+  echo "Executing this script without any parameter will only run the default"
+  echo "configuration that has automatically been determined for the"
+  echo "architecture you're running."
   echo
   echo "    --with-cc=*             The compiler(s) to use for the tests"
-  echo "        This is an option that will be iterated."
+  echo "                            This is an option that will be iterated."
   echo
   echo "    --test-vs-mtest=*       Run test vs. mtest for '*' operations."
-  echo "        Only the first of each options will be taken into account."
+  echo "                            Only the first of each options will be"
+  echo "                            taken into account."
   echo
-  echo "To be able to specify options a compiler has to be given."
-  echo "All options will be tested with all MP_xBIT configurations."
+  echo "To be able to specify options a compiler has to be given with"
+  echo "the option --with-cc=compilername"
+  echo "All other options will be tested with all MP_xBIT configurations."
   echo
-  echo "    --with-{m64,m32,mx32}   The architecture(s) to build and test for,"
-  echo "                            e.g. --with-mx32."
-  echo "        This is an option that will be iterated, multiple selections are possible."
-  echo "        The mx32 architecture is not supported by clang and will not be executed."
+  echo "    --with-{m64,m32,mx32}   The architecture(s) to build and test"
+  echo "                            for, e.g. --with-mx32."
+  echo "                            This is an option that will be iterated,"
+  echo "                            multiple selections are possible."
+  echo "                            The mx32 architecture is not supported"
+  echo "                            by clang and will not be executed."
   echo
   echo "    --cflags=*              Give an option to the compiler,"
   echo "                            e.g. --cflags=-g"
-  echo "        This is an option that will always be passed as parameter to CC."
+  echo "                            This is an option that will always be"
+  echo "                            passed as parameter to CC."
   echo
   echo "    --make-option=*         Give an option to make,"
   echo "                            e.g. --make-option=\"-f makefile.shared\""
-  echo "        This is an option that will always be passed as parameter to make."
+  echo "                            This is an option that will always be"
+  echo "                            passed as parameter to make."
   echo
   echo "    --with-low-mp           Also build&run tests with -DMP_{8,16,32}BIT."
   echo
   echo "    --mtest-real-rand       Use real random data when running mtest."
   echo
+  echo "    --with-valgrind"
+  echo "    --with-valgrind=*       Run in valgrind (slow!)."
+  echo
+  echo "    --with-travis-valgrind  Run with valgrind on Travis on specific branches."
+  echo
+  echo "    --valgrind-options      Additional Valgrind options"
+  echo "                            Some of the options like e.g.:"
+  echo "                            --track-origins=yes add a lot of extra"
+  echo "                            runtime and may trigger the 30 minutes"
+  echo "                            timeout."
+  echo
   echo "Godmode:"
   echo
-  echo "    --all                   Choose all architectures and gcc and clang as compilers"
+  echo "    --all                   Choose all architectures and gcc and clang"
+  echo "                            as compilers but does not run valgrind."
+  echo
+  echo "    --format                Runs the various source-code formatters"
+  echo "                            and generators and checks if the sources"
+  echo "                            are clean."
   echo
+  echo "    -h"
   echo "    --help                  This message"
+  echo
+  echo "    -v"
+  echo "    --version               Prints the version. It is just the number"
+  echo "                            of git commits to this file, no deeper"
+  echo "                            meaning attached"
   exit 0
 }
 
@@ -90,13 +120,49 @@
 _runtest()
 {
   make clean > /dev/null
-  _make "$1" "$2" "test_standalone"
   local _timeout=""
   which timeout >/dev/null && _timeout="timeout --foreground 90"
-  echo -e "\rRun test $1 $2"
-  $_timeout ./test > test_${suffix}.log || _die "running tests" $?
+  if [[ "$MAKE_OPTIONS" =~ "tune" ]]
+  then
+    # "make tune" will run "tune_it.sh" automatically, hence "autotune", but it cannot
+    # get switched off without some effort, so we just let it run twice for testing purposes
+    echo -e "\rRun autotune $1 $2"
+    _make "$1" "$2" ""
+    $_timeout $TUNE_CMD > test_${suffix}.log || _die "running autotune" $?
+  else
+    _make "$1" "$2" "test"
+    echo -e "\rRun test $1 $2"
+    $_timeout ./test > test_${suffix}.log || _die "running tests" $?
+  fi
 }
 
+# This is not much more of a C&P of _runtest with a different timeout
+# and the additional valgrind call.
+# TODO: merge
+_runvalgrind()
+{
+  make clean > /dev/null
+  local _timeout=""
+  # 30 minutes? Yes. Had it at 20 minutes and the Valgrind run needed over 25 minutes.
+  # A bit too close for comfort.
+  which timeout >/dev/null && _timeout="timeout --foreground 1800"
+echo "MAKE_OPTIONS = \"$MAKE_OPTIONS\""
+  if [[ "$MAKE_OPTIONS" =~ "tune"  ]]
+  then
+echo "autotune branch"
+    _make "$1" "$2" ""
+    # The shell used for /bin/sh is DASH 0.5.7-4ubuntu1 on the author's machine which fails valgrind, so
+    # we just run on instance of etc/tune with the same options as in etc/tune_it.sh
+    echo -e "\rRun etc/tune $1 $2 once inside valgrind"
+    $_timeout $VALGRIND_BIN $VALGRIND_OPTS $TUNE_CMD > test_${suffix}.log || _die "running etc/tune" $?
+  else
+    _make "$1" "$2" "test"
+    echo -e "\rRun test $1 $2 inside valgrind"
+    $_timeout $VALGRIND_BIN $VALGRIND_OPTS ./test > test_${suffix}.log || _die "running tests" $?
+  fi
+}
+
+
 _banner()
 {
   echo "uname="$(uname -a)
@@ -121,6 +187,29 @@
 WITH_LOW_MP=""
 TEST_VS_MTEST=""
 MTEST_RAND=""
+# timed with an AMD A8-6600K
+# 25 minutes
+#VALGRIND_OPTS=" --track-origins=yes --leak-check=full --show-leak-kinds=all --error-exitcode=1 "
+# 9 minutes (14 minutes with --test-vs-mtest=333333 --mtest-real-rand)
+VALGRIND_OPTS=" --leak-check=full --show-leak-kinds=all --error-exitcode=1 "
+#VALGRIND_OPTS=""
+VALGRIND_BIN=""
+CHECK_FORMAT=""
+TUNE_CMD="./etc/tune -t -r 10 -L 3"
+
+alive_pid=0
+
+function kill_alive() {
+  disown $alive_pid || true
+  kill $alive_pid 2>/dev/null
+}
+
+function start_alive_printing() {
+  [ "$alive_pid" == "0" ] || return 0;
+  for i in `seq 1 10` ; do sleep 300 && echo "Tests still in Progress..."; done &
+  alive_pid=$!
+  trap kill_alive EXIT
+}
 
 while [ $# -gt 0 ];
 do
@@ -134,6 +223,30 @@
     --cflags=*)
       CFLAGS="$CFLAGS ${1#*=}"
     ;;
+    --valgrind-options=*)
+      VALGRIND_OPTS="$VALGRIND_OPTS ${1#*=}"
+    ;;
+    --with-valgrind*)
+      if [[ ${1#*d} != "" ]]
+      then
+        VALGRIND_BIN="${1#*=}"
+      else
+        VALGRIND_BIN="valgrind"
+      fi
+      start_alive_printing
+    ;;
+    --with-travis-valgrind*)
+      if [[ ("$TRAVIS_BRANCH" == "develop" && "$TRAVIS_PULL_REQUEST" == "false") || "$TRAVIS_BRANCH" == *"valgrind"* || "$TRAVIS_COMMIT_MESSAGE" == *"valgrind"* ]]
+      then
+        if [[ ${1#*d} != "" ]]
+        then
+          VALGRIND_BIN="${1#*=}"
+        else
+          VALGRIND_BIN="valgrind"
+        fi
+        start_alive_printing
+      fi
+    ;;
     --make-option=*)
       MAKE_OPTIONS="$MAKE_OPTIONS ${1#*=}"
     ;;
@@ -145,12 +258,16 @@
       if ! [ "$TEST_VS_MTEST" -eq "$TEST_VS_MTEST" ] 2> /dev/null
       then
          echo "--test-vs-mtest Parameter has to be int"
-         exit -1
+         exit 255
       fi
+      start_alive_printing
     ;;
     --mtest-real-rand)
       MTEST_RAND="-DLTM_MTEST_REAL_RAND"
     ;;
+    --format)
+      CHECK_FORMAT="1"
+    ;;
     --all)
       COMPILERS="gcc clang"
       ARCHFLAGS="-m64 -m32 -mx32"
@@ -158,6 +275,10 @@
     --help | -h)
       _help
     ;;
+    --version | -v)
+      echo $(git rev-list HEAD --count -- testme.sh) || echo "Unknown. Please run in original libtommath git repository."
+      exit 0
+    ;;
     *)
       echo "Ignoring option ${1}"
     ;;
@@ -165,18 +286,42 @@
   shift
 done
 
-# default to gcc if no compiler is defined but some other options
+function _check_git() {
+  git update-index --refresh >/dev/null || true
+  git diff-index --quiet HEAD -- . || ( echo "FAILURE: $*" && exit 1 )
+}
+
+if [[ "$CHECK_FORMAT" == "1" ]]
+then
+  make astyle
+  _check_git "make astyle"
+  perl helper.pl --update-files
+  _check_git "helper.pl --update-files"
+  perl helper.pl --check-all
+  _check_git "helper.pl --check-all"
+  exit $?
+fi
+
+[[ "$VALGRIND_BIN" == "" ]] && VALGRIND_OPTS=""
+
+# default to CC environment variable if no compiler is defined but some other options
 if [[ "$COMPILERS" == "" ]] && [[ "$ARCHFLAGS$MAKE_OPTIONS$CFLAGS" != "" ]]
 then
-   COMPILERS="gcc"
-# default to gcc and run only default config if no option is given
+   COMPILERS="$CC"
+# default to CC environment variable and run only default config if no option is given
 elif [[ "$COMPILERS" == "" ]]
 then
-  _banner gcc
-  _runtest "gcc" ""
+  _banner "$CC"
+  if [[ "$VALGRIND_BIN" != "" ]]
+  then
+    _runvalgrind "$CC" ""
+  else
+    _runtest "$CC" ""
+  fi
   _exit
 fi
 
+
 archflags=( $ARCHFLAGS )
 compilers=( $COMPILERS )
 
@@ -191,21 +336,18 @@
 if [[ "$TEST_VS_MTEST" != "" ]]
 then
    make clean > /dev/null
-   _make "${compilers[0]} ${archflags[0]}" "$CFLAGS" "test"
+   _make "${compilers[0]} ${archflags[0]}" "$CFLAGS" "mtest_opponent"
    echo
    _make "gcc" "$MTEST_RAND" "mtest"
    echo
    echo "Run test vs. mtest for $TEST_VS_MTEST iterations"
-   for i in `seq 1 10` ; do sleep 500 && echo alive; done &
-   alive_pid=$!
    _timeout=""
-   which timeout >/dev/null && _timeout="timeout --foreground 900"
-   $_TIMEOUT ./mtest/mtest $TEST_VS_MTEST | ./test > test.log
-   disown $alive_pid
-   kill $alive_pid 2>/dev/null
-   head -n 5 test.log
-   tail -n 2 test.log
-   exit 0
+   which timeout >/dev/null && _timeout="timeout --foreground 1800"
+   $_timeout ./mtest/mtest $TEST_VS_MTEST | $VALGRIND_BIN $VALGRIND_OPTS  ./mtest_opponent > valgrind_test.log 2> test_vs_mtest_err.log
+   retval=$?
+   head -n 5 valgrind_test.log
+   tail -n 2 valgrind_test.log
+   exit $retval
 fi
 
 for i in "${compilers[@]}"
@@ -232,12 +374,20 @@
       echo "clang -mx32 tests skipped"
       continue
     fi
-
-    _runtest "$i $a" "$CFLAGS"
-    [ "$WITH_LOW_MP" != "1" ] && continue
-    _runtest "$i $a" "-DMP_8BIT $CFLAGS"
-    _runtest "$i $a" "-DMP_16BIT $CFLAGS"
-    _runtest "$i $a" "-DMP_32BIT $CFLAGS"
+    if [[ "$VALGRIND_BIN" != "" ]]
+    then
+      _runvalgrind "$i $a" "$CFLAGS"
+      [ "$WITH_LOW_MP" != "1" ] && continue
+      _runvalgrind "$i $a" "-DMP_8BIT $CFLAGS"
+      _runvalgrind "$i $a" "-DMP_16BIT $CFLAGS"
+      _runvalgrind "$i $a" "-DMP_32BIT $CFLAGS"
+    else
+      _runtest "$i $a" "$CFLAGS"
+      [ "$WITH_LOW_MP" != "1" ] && continue
+      _runtest "$i $a" "-DMP_8BIT $CFLAGS"
+      _runtest "$i $a" "-DMP_16BIT $CFLAGS"
+      _runtest "$i $a" "-DMP_32BIT $CFLAGS"
+    fi
   done
 done