#!/bin/sh
# Copyright (C) 2021 David Anderson
# This test script is in the public domain for use
# by anyone for any purpose.

start=`date`
echo "start run-all-tests.sh at $start"
echo "This removes and recreates /tmp/dw-regression"
echo "Use --enable-nonstandardprintf to use Windows long long"
echo "  printf formats."

echo 'Starting run-all-tests.sh' \
   `date "+%Y-%m-%d %H:%M:%S"`
stsecs=`date '+%s'`

# Removes and recreates /tmp/dwtestalldd directory
# for the regression tests.

chkisdir() {
  if [ ! -d $1 ]
  then
    echo "The directory $1 is not found"
    echo "we are in the wrong directory to run-all-tests.sh"
    exit 1
  fi
}
here=`pwd`
ddsrc=$here/src/bin/dwarfdump
rosrc=$here/../readelfobj/code
rtestsrc=$here/../regressiontests
# Sanity checks ensuring we are in the right place.
chkisdir scripts
chkisdir $ddsrc
chkisdir $rtestsrc
chkisdir $here/src/lib/libdwarf
chkisdir $here/src/bin/dwarfexample
chkisdir $here/src/bin/dwarfgen
chkisdir $here/test
chkisdir $here/doc

# We run the regression tests here.
ddtestdir=/tmp/dw-regression
rm -rf $ddtestdir
mkdir $ddtestdir

ddbld=/tmp/vaddbld
robld=/tmp/varobld
argval=''
nonstdprintf=

goodcount=0
failcount=0
stsecs=`date '+%s'`
chkres () {
  if [ $1 = 0 ]
  then
    goodcount=`expr $goodcount + 1`
  else
    echo FAIL  $2
    failcount=`expr $failcount + 1`
  fi
}
while [ $# -ne 0 ]
do
  case $1 in
   --enable-nonstandardprintf ) nonstdprintf=$1 ; shift ;;
   * ) echo "Only  --enable-nonstandardprintf allowed."
       echo "No action taken. Exit"
       exit 1 ;;
  esac
done
if [ x$nonstdprintf != "x" ]
then
  echo "Use nonstandardprintf. $nonstdprintf"
fi

echo "Starting run-all-tests.sh now"
echo run from $here
if [ ! -d $here/src/bin/dwarfdump ]
then
   chkres 1 "A FAIL: This is not the libdwarf 'code' directory "
   echo "A FAIL: $here/src/bin/dwarfdump missing. Run from 'code'"
   exit 1
fi
if [ ! -d $here/src/lib/libdwarf ]
then
  chkres 1 "B FAIL: This is not the libdwarf 'code' directory "
  echo "B FAIL: $here/src/lib/libdwarf missing"
fi
if [ ! -d $here/src/bin/dwarfexample ]
then
  chkres 1 "C FAIL: This is not the libdwarf 'code' directory"
  echo "C FAIL: $here/src/bin/dwarfexample missing"
  exit 1
fi


# ========
builddwarfdump() {
  echo "Build dwarfdump source: $here builddir: $ddbld nonstdprintf $nonstdprintf"
  oac=$ddbld
  rm -rf $oac
  mkdir $oac
  chkres $? "D FAIL: unable to create $oac, giving up."
  cd $oac
  chkres $? "E FAIL: unable to cd to $oac, giving up."
  if [ x$1 = "x" ]
  then
    $here/configure --enable-wall $nonstdprintf --enable-dwarfgen --enable-dwarfexample
  else
    $here/configure --enable-wall $1  $nonstdprintf --enable-dwarfexample
  fi
  chkres $? "F FAIL: configure failed in $oac giving up."
  make check
  chkres $? "G FAIL: make check failed in $oac, giving up."
  if [ $failcount -eq 0 ]
  then
      echo "PASS Build dwarfdump"
  else
      echo "FAIL  FAIL Build dwarfdump give up"
      exit 1
  fi
}

rundistcheck()
{
  echo "Now rundistcheck"
  cd $here
  chkres $? "Q FAIL: scripts/buildandreleasetest.sh FAIL"
  sh scripts/buildandreleasetest.sh $1 $nonstdprintf
  r=$?
  chkres $r "R FAIL: scripts/buildandreleasetest.sh FAIL"
  if [ $failcount -eq 0 ]
  then
    echo "PASS run-all-tests.sh rundistcheck"
  else
    echo "Exit rundistcheck"
    exit 1
  fi
}

#======= readelfobj, readobjpe, readobjmacho etc tests
# with make check
buildreadelfobj() {
  echo "Now buildreadelfobj"
  rm -rf $robld
  mkdir $robld
  rodir=$rosrc
  echo "Build readelfobj source: $rosrc builddir: $robld"
  if [ ! -d $rodir  ]
  then
    echo "K FAIL: cd  $rodir not a directory, giving up."
    exit 1
  fi
  echo "Now run readelfobj in $robld from readelfobj source $rodir"
  chkres $? "L FAIL: $robld mkdir failed, giving up."
  cd $robld
  chkres $? "M FAIL: cd $robld failed, giving up."
  # Just safety, we do not care if distclean fails
  make distclean
  #
  $rodir/configure --enable-wall $nonstdprintf
  chkres $? "N FAIL: configure $rodir/configure failed, giving up."
  make
  chkres $? "Oa FAIL: make in $rodir failed, giving up."
  make check
  chkres $? "Ob FAIL: make check in $rodir failed, giving up."
  if [ $failcount -eq 0 ]
  then
      echo "PASS run-all-tests.sh buildreadelfobj"
  else
    echo "Exit buildreadelfobj"
    exit 1
  fi
}

#=================now run tests, meaning regressiontests

runfullddtest() {
  echo "Run full dd test: run regressiontests in $ddtestdir"
  cd $ddtestdir
  chkres $? "H FAIL: cd $ddtestdir failed , giving up."

  # so big diff files just do cmp
  export SUPPRESSBIGDIFFS=y
  $rtestsrc/INITIALSETUP.sh $rtestsrc  
  chkres $? "J FAIL  INITIALSETUP failed $ddtestdir. giving up."
  unset SUPPRESSBIGDIFFS

  $rtestsrc/RUNALL.sh
  chkres $? "J FAIL  RUNALL failed $ddtestdir."

  # Just show the fails, if any.
  grep FAIL <$ddtestdir/ALLdd
  # Now actually check result against the 'PASS' result.
  grep "FAIL     count: 0" $ddtestdir/ALLdd
  chkres $? "Q FAIL: something failed in $ddtestdir."

  tail -40 $ddtestdir/ALLdd
  if [ $failcount -eq 0 ]
  then
      head -n 15 ALLdd
      echo "..."
      head -n 30 ALLdd
      echo "PASS full run-all-tests.sh regressiontests"
  else
      echo "FAIL count $failcount full run-all-tests.sh regressiontests"
      if [ $r -ne 0 ]
      then
        echo "Stopping after RUNALL.sh"
        exit 1
      fi
  fi
}


#========actually run tests
if [ -d $ddsrc ]
then
  builddwarfdump $argval $nonstdprintf
  rundistcheck  $argval $nonstdprintf
  r=$?
  chkres $r "FAIL rundistcheck"
  if [ $r -ne 0 ]
  then
    echo "Stopping after distcheck"
    exit 1
  fi
  
else
  echo "dwarfdump make check etc not run"
fi
if [ -d $rosrc ]
then
  buildreadelfobj
  r=$?
  chkres $r "FAIL buildreadelfobj"
  if [ $r -ne 0 ]
  then
    echo "Stopping after buildreadelfobj"
    exit 1
  fi
  
else
  echo "readelfobj make check etc not run"
fi
if [ -d $rtestsrc ]
then
  runfullddtest $argval $nonstdprintf
  r=$?
  chkres $r "FAIL runddtest"
  if [ $r -ne 0 ]
  then
    echo "Stopping after buildreadelfobj"
    exit 1
  fi
else
  echo "dwarfdump regressiontests not run"
fi
echo "Done with all tests"
echo "FAIL $failcount in run-all-tests.sh"
if [ $failcount -ne 0 ]
then
   echo "FAIL $failcount as known to run-all-tests.sh"
else
   echo "PASS run-all-tests.sh"
fi
echo "run-all-tests.sh started at $start"
don=`date`
echo "run-all-tests.sh done    at $don"

ndsecs=`date '+%s'`
showminutes() {
   t=`expr  \( $2 \- $1 \+ 29  \) \/ 60`
   echo "Run time in minutes: $t"
}
showminutes $stsecs $ndsecs

if [ $failcount -ne 0 ]
then
   echo "run-all-tests.sh FAIL count $failcount"
   exit 1
else
   echo "run-all-tests.sh all PASS"
fi
exit 0