#!/bin/sh
#
# This file: /usr/lib/sat/system/paranoia/run
#

if [ x"${SAT_DEBUG-0}" != x0 ] ; then
   echo "*** SAT_DEBUG Environmental variable = $SAT_DEBUG"
   echo "Environment is:"
   env
fi

# run just one thread
DFLT_NCPUS=1
export DFLT_NCPUS

# Initialize local variables
exitCode=0
testError=1
miscError=2
abortCode=3
title="`sed -n '1p' README`"

# Source directory
sourceDir=`pwd`

# working directory for sats (default is /usr/tmp)
SAT_USR_TMP=${SAT_USR_TMP-/usr/tmp}

# Define temporary scratch files
#        Must be in "$SAT_USR_TMP" and allow for multiple invocations
programScratchFile=$SAT_USR_TMP/paranoia.scratch.$$
programResultsFile=$SAT_USR_TMP/paranoia.results.$$
programErrorFile=$SAT_USR_TMP/paranoia.errors.$$
phase=1		# specifies which test version being run, which logs in use

# Define temporary directory to run program in
programWorkDir=$SAT_USR_TMP/paranoia.$$

#
# Signal handling - trap typical signals and special signal from sat driver
#
# Leave logs alone if interrupted for debugging purposes. Tell sat driver
# we were interrupted via special exit code.
#
trap "Interrupt 1" 1
trap "Interrupt 2" 2
trap "Interrupt 3" 3
trap "Interrupt 15" 15
trap "Interrupt 30" 30  # sat wants us to abort

Interrupt() {

        echo "SAT run shell script interrupted by signal $1"
        cleanup $abortCode
}

# Remove temporary file(s) function: expected cleanup
removeFiles() {

   # Remove scratch/result files
   rm -f $programScratchFile.$phase
   rm -f $programResultsFile.$phase
   rm -f $programErrorFile.$phase

   if test -f $programWorkDir.$phase/core -o -d $programWorkDir.$phase/core
   then
      echo "paranoia sat dumped core in phase $phase" 1>&2
      coreinfo $programWorkDir.$phase/core 1>&2
   fi

   # Remove temporary directory
   cd $sourceDir
   rm -fr $programWorkDir.$phase
}

# General cleanup and exit routine (optional arg 1 is exit code)
cleanup() {

   case "$#" in
   0)  exitCode=$miscError;;
   *)  exitCode=$1;;
   esac

   if [ x"${SAT_DEBUG-0}" = x0 -o "$exitCode" -eq 0 -o \
	 "$#" -ge 2 -a "$2" = nosave ]; then
      removeFiles
   else
      if test -f $programWorkDir.$phase/core -o -d $programWorkDir.$phase/core
      then
         echo "paranoia sat dumped core in phase $phase" 1>&2
         coreinfo $programWorkDir.$phase/core 1>&2
      fi
   fi

   exit $exitCode
}


echo ""
echo "********Starting Phase 1 of Paranoia Test********"
echo ""

# Prepare
removeFiles

# Create and change to temporary directory
if mkdir $programWorkDir.$phase
then
   cd $programWorkDir.$phase
else
   echo "Cannot create temporary directory \"$programWorkDir.$phase\"" 1>&2
   cleanup $miscError
fi

# Check for compute partition name, passed from sat command
if test -z "$1"
then
   echo "No partition argument supplied." 1>&2
   cleanup $miscError
fi

# Verify input files exist
if test ! -r $sourceDir/dstart -o ! -r $sourceDir/sstart
then
   echo "Required input files for paranoia not available" 1>&2
   cleanup $miscError
fi

# Verify double-precision program is executable
if test -x $sourceDir/dpara
then
   # Execute program
   if $sourceDir/dpara < $sourceDir/dstart > $programScratchFile.$phase 2> $programErrorFile.$phase
   then
      # Verify double-precision results
      grep Excellent $programScratchFile.$phase > $programResultsFile.$phase 2>> $programErrorFile.$phase
      if test `grep -c Excellent $programResultsFile.$phase` -gt 0 -a ! -f core -a ! -d core
      then
         echo "PASS: $title, double-precision."

         cat $programResultsFile.$phase
      else
         echo "FAIL: $title, double-precision."

         cat $programScratchFile.$phase
         cat $programErrorFile.$phase 1>&2

         cleanup $testError
      fi
   else
      # Non-zero test exit, pass to sat
      exitCode=$?
      echo "$sourceDir/dpara exit code: $exitCode" >> $programScratchFile.$phase

      cat $programScratchFile.$phase
      cat $programErrorFile.$phase 1>&2

      cleanup $testError
   fi
else
   echo "Double-precision executable dpara not found" 1>&2
   cleanup $miscError
fi

# remove scratch files from phase 1
removeFiles


#
# Run phase 2
#

echo ""
echo "********Starting Phase 2 of Paranoia Test********"
echo ""

phase=2

# Prepare -- remove any leftover phase 2 files
# removeFiles cd's to $sourceDir as a side effect
removeFiles

# Create and change to temporary directory
if mkdir $programWorkDir.$phase
then
   cd $programWorkDir.$phase
else
   echo "Cannot create temporary directory \"$programWorkDir.$phase\"" 1>&2
   cleanup $miscError
fi

# Verify single-precision program is executable
if test -x $sourceDir/spara
then
   # Execute program
   if $sourceDir/spara < $sourceDir/sstart > $programScratchFile.$phase 2> $programErrorFile.$phase
   then
      # Verify single-precision results
      grep Excellent $programScratchFile.$phase > $programResultsFile.$phase 2>> $programErrorFile.$phase
      if test `grep -c Excellent $programResultsFile.$phase` -gt 0 -a ! -f core -a ! -d core
      then
         echo "PASS: Paranoia, single-precision."
         cat $programResultsFile.$phase
      else
         echo "FAIL: Paranoia, single-precision."

         cat $programScratchFile.$phase
         cat $programErrorFile.$phase 1>&2

         cleanup $testError
      fi
   else
      # Non-zero test exit, pass to sat
      exitCode=$?
      echo "$sourceDir/spara exit code: $exitCode" >> $programScratchFile.$phase

      cat $programScratchFile.$phase
      cat $programErrorFile.$phase 1>&2

      cleanup $testError
   fi
else
   echo "Single-precision executable spara not found" 1>&2
   cleanup $miscError
fi

echo ""
echo "********Finishing Paranoia Test********"
echo ""

# Finish and exit
cleanup $exitCode
