#!/bin/bash

# Copyright 2011 George Danchev <danchev@spnet.net>
# Copyright 2011 - 2014 Thomas Schmitt <scdbackup@gmx.net>
# Licensed under GNU GPL version 2 or later

set -e

export RELENG_SCRIPT_RUN_BY_RUN_ALL_AUTO=1

SELF=$(basename "$0")
GEN_DATA_DIR=releng_generated_data
CLOG=${GEN_DATA_DIR}/log.${SELF}
CLOG_PREV=${CLOG}.prev
PASSED_OPTIONS="$@"
RELENG_XORRISO=
CLEANUP_LOG=0

# It is not a good idea to include inc/releng_getopts.inc with the
# master script as it calls the subordinate scripts and they include
# this file too, and we want to avoid sharing variable with subshells
if [ ! -f inc/releng_getopts.inc ]; then
  printf "\nPlease execute the tests from releng directory.\n\n"
  exit 1
fi

# To catch the exit value of a command in a pipe
return_value_file="$GEN_DATA_DIR"/run_all_"$$"_return_value
return_wrapper()
{
 cmd="$1"
 shift 1
 "$cmd" "$@"
 RET="$?"
 echo "$RET" >"$return_value_file"
 return "$RET"
}

# Using only bash builtin commands.
# On 4 year old amd64 x2 3000 MHz, xterm local,it counts 22471 lines per second
# On 2 year old amd64 x4 2600 MHz, ssh remote, it counts 35348 lines per second
count_lines()
{
 # $1 if not empty: start count
 line=
 if test -n "$1"
 then
   count="$1"
 else
   count=0
 fi
 while read line
 do
   count=$(($count + 1))
   printf "\r  %4d lines logged ... " "$count" >&2
   printf "%s\n" "$line"
 done
 return 0
}

#############################################
# copied from releng/inc/releng_getopts.inc which is not included here.
boldify() {
 if which tput >/dev/null 2>&1
 then
   tput smso || dummy_variable=1
 fi
}

unboldify() {
 if which tput >/dev/null 2>&1
 then
   tput rmso || dummy_variable=1
 fi
}

#############################################
print_usage()
{
cat << HLP

${SELF} runs executables from releng directory starting with auto_*,
and passing them its own options. stdout/stderr output is stored in:
./${CLOG} (last run) and
./${CLOG_PREV} (previous run)

Usage: ${SELF} -x path/to/xorriso [-k] [-c] [-h]
   -x  absolute or relative path to xorriso binary to be run.
   -k  keep self-generated data in ./${GEN_DATA_DIR}.
   -c  cleanup self-generated data kept from previous run and exit.
   -h  print this help text
				   
Examples:
# run xorriso and keep the self-generated data
 $ ./${SELF} -x path/to/xorriso -k

# clean up self-generated data from previous run
 $ ./${SELF} -c

HLP
}

#############################################
if [ ! "${1}" ]; then
 print_usage
 exit 0
fi
next_is=
for i in "$@"
do
  if test x"$i" = x"-h" -o x"$i" = x"--h" -o x"$i" = x"-help" -o x"$i" = x"--help"
  then :
       print_usage
       exit 0
  fi

  if test "$next_is" = "ignore"
  then :
  elif test "$next_is" = "x"
  then
       RELENG_XORRISO="$i"
       next_is=
  elif test x"$i" = x"-x"
  then
       next_is="x"
  elif test x"$i" = x"-c"
  then
       CLEANUP_LOG=1
  fi
done
#############################################
if test "$next_is" = x
then
       echo
       echo "Option -x expects an argument (the path to the xorriso program)"
       exit 31
fi


########################################################
 if [ -f "${CLOG}" ]; then
   mv "${CLOG}" "${CLOG_PREV}"
 fi
 > ${CLOG}
 if [ -x "${RELENG_XORRISO}" ]; then
    echo "_OVERVIEW_______________________________________________________________" >> ${CLOG}
    date -u                                                                         >> ${CLOG}
    ${RELENG_XORRISO} --version                                                        >> ${CLOG}
    echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" >> ${CLOG}
 fi
 DSTART=`date -u`
 echo "${SELF}: Started at ${DSTART}" | tee -a ${CLOG}
 E1=`date '+%s'`
 exit_value=0
 # require ^auto_, avoid running (your)self explicitly
 for s in `ls | grep ^auto_ | grep -v ${SELF} | sort -n`; do
  if [ -x ${s} -a ! -d ${s} ]; then
    echo >> ${CLOG}
    echo >> ${CLOG}
    echo "_STARTING_TEST_________________________________________________________"      >> ${CLOG}
    echo "${SELF}: Running ./${s} ${PASSED_OPTIONS} :" \
    | tee -a ${CLOG}
    T1=`date '+%s'`
    set +e

    return_wrapper ./${s} ${PASSED_OPTIONS} 2>&1 | count_lines >> ${CLOG}
    RET=$(cat "$return_value_file")
    rm "$return_value_file"

#   echo "RET='$RET'" >/dev/tty

    T2=`date '+%s'`
    TS=`expr ${T2} - ${T1}`
    case ${RET} in
         0)
           echo "done in ${TS} sec. ok."
           ;;
         *)
           exit_value=2
	   printf "done in ${TS} sec. "
           boldify
           printf "FAIL -> EXIT CODE $RET"
           unboldify
           echo
           ;;
    esac
    set -e
  fi
 done

 DEND=`date -u`
 echo | tee -a ${CLOG}
 echo -n "${SELF}: Stopped at ${DEND}." | tee -a ${CLOG}
 if   [ "${CLEANUP_LOG}" -eq 1 ]; then
      if [ -f "${CLOG}" ]; then
	 rm -f "${CLOG}"
         echo # | tee -a ${CLOG}
         echo -n "${SELF}: Removed my own log ${CLOG}." # | tee -a ${CLOG}
      fi
      if [ -f "${CLOG_PREV}" ]; then
         rm -f "${CLOG_PREV}"
         echo # | tee -a ${CLOG}
         echo "${SELF}: Removed my own log ${CLOG_PREV}." # | tee -a ${CLOG}
      fi
 else
      E2=`date '+%s'`
      if [ ${E2} -eq ${E1} ]; then
        echo " Total elapsed 0 sec." | tee -a ${CLOG}
      else
        ES=`expr ${E2} - ${E1}`
        echo " Total elapsed ${ES} sec." | tee -a ${CLOG}
      fi
      #####
      echo >> ${CLOG}
      echo "_SUMMARY________________________________________________________________" >> ${CLOG}
      echo "${SELF}: Trivial log examination: ${CLOG}" | tee -a ${CLOG}
      echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" | tee -a ${CLOG}
      # severity classes of libdax_msgs.h in libburn and libisofs
      # List of boring keywords:
      #   'UPDATE|NOTE|DEBUG|ALL' - not considered interesting for lazy log inspection.
      # List of interesting keywords:
        # thrown by xorriso and underlying libraries
      LIST_KWD="NEVER|ABORT|FATAL|FAILURE|MISHAP|SORRY|WARNING|HINT"
        # thrown by others
      LIST_KWD="${LIST_KWD}|FAIL|ERROR|WRONG"

      if [ -f "${CLOG}" ]; then
          set +e
	  # lines, perl regex, leading tabs
          grep -n -E "${LIST_KWD}" "${CLOG}"
	  RET_GREP="$?"
	  ok=0
          case ${RET_GREP} in
              0) # found
                 ;;
              1) # not found
		 echo "${SELF}: Log file looks clear." # | tee -a ${CLOG}
		 ok=1
                 ;;
	      *) #
                 echo "${SELF}: grep returned EXIT CODE: ${RET_GREP}." # | tee -a ${CLOG}
		 ;;
          esac
	  if test "$ok" = 0 && test "$exit_value" = 0
	  then
	      exit_value=1
	  fi
	  set -e
      fi
      echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" | tee -a ${CLOG}

      ##### TODO: work out a less noisy diff'ing technique!
      if [ -f "${CLOG_PREV}" -a -f "${CLOG}" ]; then
        echo "${SELF}: See diff against previous log file (might be long):" | tee -a ${CLOG}
	echo "diff -Naur ${CLOG_PREV} ${CLOG} | less" | tee -a ${CLOG}
      fi

 fi
 
 #
 boldify
 echo # | tee -a ${CLOG}
 echo "${SELF}: Leaving the following cruft in ${GEN_DATA_DIR}:" # | tee -a ${CLOG}
 unboldify
 ls -lth "${GEN_DATA_DIR}" # | tee -a ${CLOG}

 # Fin
 if test "$exit_value" = 0
 then
	echo "${SELF}: +++ Test run and its log look like success."
 else
	echo
	echo "${SELF}: --- Test run detected some failures."
	echo
 fi
 exit $exit_value

