#!/bin/bash
#
# do_tests
#
# Aufruf der einzelnen Testschritte fuers Logging
#
####################################################
#
ASEC=0
ANUM=1
FLUSH=1
unset NODATE ND MAXTESTSECS PARALLEL
#
while getopts fn:S:s:pd? op; do
  case "$op" in
    f) FLUSH=0;;
    s) ASEC=$OPTARG;;
    S) MAXTESTSECS=$OPTARG;;
    n) ANUM=$OPTARG;;
    p) PARALLEL=1;;
    d) NODATE=1
       ND="-d";;
    ?) echo "usage: `basename $0` [-f] [-s <secs>] [-n <num>] [-d] <test-list>"
       echo "  -f         kein flush_test_values"
       echo "  -s <secs>  Sekunden bis zur Wiederholung"
       echo "  -S <secs>  Zeitbegrenzung in Sekunden der Test-Skripte"
       echo "  -n <num>   Anzahl der Wiederholungen"
       echo "  -d         Jeder Test generiert eigenen Zeitstempel"
       echo "  -p         Tests parallel ausführen"
       exit 0;;
    *) echo "usage: `basename $0` [-f] [-s <secs>] [-n <num>] [-d] [-p] <test-list>"
       exit 0;;
  esac
done
shift $(( $OPTIND - 1))
#
if [[ $# -ne 1 ]]; then
  echo "usage: `basename $0` [-f] [-s <secs>] [-n <num>] [-d] [-p] <test-list>"
  exit 1
fi
#
if [[ $ANUM -gt 1 && $ASEC -gt 0 ]]; then
  (sleep $ASEC ; $0 $ND -s "$ASEC" -n $(( $ANUM - 1 )) "$1" )&
fi
#
cd $(dirname $0)
PATH=/sbin:/usr/sbin:/usr/local/bin:$PATH
LANG=C
LC_ALL=C
export PATH LANG LC_ALL TMPDIR
if [[ -d /dev/shm ]]; then
  export TMPDIR=/dev/shm
fi
#
if [[ -n "$NODATE" ]]; then
  unset DTZ
elif [[ $ASEC -gt 0 ]]; then
  DTZ=$(date '+%F %T%:z')
else
  DTZ=$(date '+%F %H:%M:00%:z')
fi
#
while [[ $# -ge 1 ]]; do
  if [[ -s "$1" ]]; then
    while read e p; do
      if [[ -f $e ]]; then
        if [[ -x $e ]]; then
          unset startbash
          if [[ $e == */* ]]; then
            unset ep
          else
            ep='./'
          fi
        else
          startbash=/bin/bash
          unset ep
        fi
        if [[ -n "$PARALLEL" ]]; then
          timeout ${MAXTESTSECS:-59} $startbash $ep$e $p $DTZ </dev/null &
        else
          timeout ${MAXTESTSECS:-59} $startbash $ep$e $p $DTZ </dev/null
        fi
      fi
    done < <(grep -v '^ *#' "$1" | sort -u)
    if [[ -n "$PARALLEL" ]]; then
      wait
    fi
  fi
  shift
done
if [[ $FLUSH = 1 && $ANUM = 1 ]]; then
  sleep 10
  flush_test_values
fi
