#!/bin/bash

# Status files

CVS_CO_OUT=repoco.out
AUTO_CONFISCATE=autoconfiscate.out
CONFIGURE_OUT=configure.out
MAKE_OUT=make.out
TEST_OUT=test.out
MAIL_FILE=mailFile
REPORT_SUMMARY=report.summary
RC=0
BASE_DIR=$1
TESTNAME=$2
REPORT_DIR=$3
CONFIGOPTIONS=$4
COVERAGE_DIR="$BASE_DIR/sfcb/coverage"
CORE_DIR="$BASE_DIR/cores/"
REPORTDIR=$REPORT_DIR/"$TESTNAME"
RESULTDIR=$REPORTDIR/xmlFailure_reportFiles
HTMLFILE="$REPORTDIR/index.html"
FPCUR=$BASE_DIR/FP_"$TESTNAME".cur
FPPREV=/tmp/FP_"$TESTNAME".prev
n=0;

if [ ! -d $BASE_DIR ]; then
    mkdir -p $BASE_DIR
fi
if [ ! -d "$REPORTDIR" ]; then
    mkdir -p "$REPORTDIR"
fi
if [ ! -d "$CORE_DIR" ]; then
    mkdir -p "$CORE_DIR"
fi

#Output to the email and index.html files
# 1st arg is the text, 2nd is the link target
DUALOUT()
{
    echo $1 >> $BASE_DIR/$REPORT_SUMMARY
    if [[ $2 ]] 
    then
        #If a link was given, make the text hot
        echo "<a href=$2>$1</a><br>" >> $HTMLFILE
    else
        #If not, just plain text.
        echo "$1<br>" >> $HTMLFILE
    fi
}


# Clean SFCB
SFCB_CLEAN()
{
    if [ -d $BASE_DIR/sfcb ] ; then
        cd ${BASE_DIR}/sfcb
        make clean uninstall
    fi
}

# check-out the code from CVS

CVS_CHECK_OUT()
{
    cd ${BASE_DIR}
    if $SFCBREPO_CMD 1>"$REPORTDIR"/$CVS_CO_OUT 2>&1
    then
        RC=0
        DUALOUT "SFCB check-out : SUCCESS" "./$CVS_CO_OUT"
        cd sfcb
        if $MOFCREPO_CMD 1>>"$REPORTDIR"/$CVS_CO_OUT 2>&1
        then
            RC=0
            DUALOUT "MOFC check-out : SUCCESS" "./$CVS_CO_OUT"
        else
            RC=1
            DUALOUT "MOFC check-out : FAILURE" "./$CVS_CO_OUT"
            exit $RC
        fi
    else
        RC=1
        DUALOUT "SFCB check-out : FAILURE" "./$CVS_CO_OUT"
        exit $RC
    fi
}

SFCB_START()
{
    if [ -f /tmp/sfcb-vgout ]
    then
        rm /tmp/sfcb-vgout
    fi

    /usr/local/etc/init.d/sfcb  start
    if [ $? -eq 0 ] ; then
        DUALOUT "SFCB start : SUCCESS" 
    else
        DUALOUT "SFCB start : FAILURE" 
    fi
}

SFCB_STOP()
{
    /usr/local/etc/init.d/sfcb  stop
    if [ $? -eq 0 ] ; then
        DUALOUT "SFCB stop : SUCCESS"
    else
        DUALOUT "SFCB stop : FAILURE"
    fi
}

SFCB_RESULTFILES()
{
    find . -name "*.result" > $BASE_DIR/temp
    size_temp=`ls -ltr $BASE_DIR/temp | awk '{print $5}'`
    rm -f $BASE_DIR/temp
    if [ $size_temp -ne 0 ] ; then
        mkdir -p $RESULTDIR
        find . -name "*.result" -print0 | xargs  -0 -r -I file cp  file --target-directory=$RESULTDIR --parents
    fi
}
SFCB_CORE()
{
    # Check if any core files were generated
    if [ "$(ls -A /tmp/ABTcores/)" ]
    then
	cp /tmp/ABTcores/* $CORE_DIR
   	DUALOUT "FAILURE: Cores found, copied to $CORE_DIR"
	RC=1
    fi
}  
SFCB_VALGRIND()
{
    # Check the Valgrind output if it's there
    if [ -f /tmp/sfcb-vgout ]
    then
        DUALOUT "Checking Valgrind output...."
        if $BASE_DIR/sfcb/test/ABT/parseVG.pl >> $BASE_DIR/$REPORT_SUMMARY
	then
            DUALOUT "Complete"
	else
            DUALOUT "Complete"
	    RC=1
	    cp $BASE_DIR/sfcb/sfcbLeaks.txt $REPORTDIR
	fi
    fi
}
SFCB_TESTS()
{
    n=$((n+1)) # Keep track of test iteration
    echo "Starting Unit tests ........." >> $BASE_DIR/$TEST_OUT

    echo  -n "  Memory Footprint startup: " >> $BASE_DIR/$REPORT_SUMMARY
    out=$($BASE_DIR/sfcb/footprint.pl -qm) 
    FIND_DELTA "mem_startup$n" $out
    echo "$out bytes $delta">> $BASE_DIR/$REPORT_SUMMARY 
    echo "mem_startup$n:$out" >> $FPCUR
    if make test 1>>"$REPORTDIR"/$TEST_OUT 2>&1
    then
        RC=0
        cp -r  $COVERAGE_DIR    "$REPORTDIR"
        DUALOUT "SFCB Tests : SUCCESS" "./$TEST_OUT"
        echo -n "  Memory Footprint post test: " >> $BASE_DIR/$REPORT_SUMMARY
        out=$($BASE_DIR/sfcb/footprint.pl -qm) 
        FIND_DELTA "mem_posttest$n" $out
        echo "$out bytes $delta" >> $BASE_DIR/$REPORT_SUMMARY 
        echo "mem_posttest$n:$out"  >> $FPCUR
        # Sleep to allow provider unload
        sleep 300
        echo -n "  Memory Footprint idle: " >> $BASE_DIR/$REPORT_SUMMARY
        out=$($BASE_DIR/sfcb/footprint.pl -qm) 
        FIND_DELTA "mem_idle$n" $out
        echo "$out bytes $delta" >> $BASE_DIR/$REPORT_SUMMARY 
        echo "mem_idle$n:$out" >> $FPCUR
    else
        RC=1
        DUALOUT "SFCB Tests : FAILURE" "./$TEST_OUT"
    fi
}

AUTO_CONF()
{
    if sh ./autoconfiscate.sh 1> "$REPORTDIR"/$AUTO_CONFISCATE 2>&1
    then
        RC=0
        DUALOUT "Autoconfiscate : SUCCESS" "./$AUTO_CONFISCATE"
    else
        RC=1
        DUALOUT "Autoconfiscate : FAILURE" "./$AUTO_CONFISCATE"
        exit $RC
    fi
}

CONFIGURE_SFCB()
{
    if  sh ./configure  $CONFIGOPTIONS 1>> "$REPORTDIR"/$CONFIGURE_OUT 2>&1
    then
        RC=0
        DUALOUT "CONFIGURE : SUCCESS" "./$CONFIGURE_OUT"
        BUILD_SFCB
    else
        RC=1
        DUALOUT "CONFIGURE : FAILURE" "./$CONFIGURE_OUT"
    fi
}

FIND_DELTA()
{
    delta=""
    if (($DELTA))
    then
        prev=$(grep $1 $FPPREV | cut -d":" -f2)
        if [ -z $prev ]
        then
                prev=0
        fi
        del=$(($2-$prev))
        delta="(delta:$del)"
    fi
}

# Starts SFCB Build

BUILD_SFCB()
{
    echo " " >>  ${REPORTDIR}/${MAKE_OUT}
    echo "Starting Build " >> ${REPORTDIR}/${MAKE_OUT}
    echo " " >> ${REPORTDIR}/${MAKE_OUT}

    if  make  1>>${REPORTDIR}/${MAKE_OUT} 2>&1
    then
        DUALOUT "MAKE  : SUCCESS" "./$MAKE_OUT"
        if make install 1>>${REPORTDIR}/${MAKE_OUT} 2>&1
        then
            DUALOUT "MAKE INSTALL : SUCCESS" "./$MAKE_OUT"
            sfcbrepos -fi # Ensure we have a clean repo
            if make postinstall 1>>${REPORTDIR}/${MAKE_OUT} 2>&1
            then
                RC=0
                DUALOUT "MAKE POSTINSTALL : SUCCESS" "./$MAKE_OUT"
                make footprint 1>>${REPORTDIR}/${MAKE_OUT} 2>&1
                echo  -n "  Source code line count: " >> $BASE_DIR/$REPORT_SUMMARY
                out=$($BASE_DIR/sfcb/footprint.pl -sq) 
                FIND_DELTA "sloc" $out
                echo "$out $delta" >> $BASE_DIR/$REPORT_SUMMARY 
                echo "sloc:$out" > $FPCUR
                echo  -n "  Disk footprint: " >> $BASE_DIR/$REPORT_SUMMARY
                out=$($BASE_DIR/sfcb/footprint.pl -dq) 
                FIND_DELTA "disk" $out
                echo "$out bytes $delta" >> $BASE_DIR/$REPORT_SUMMARY 
                echo "disk:$out" >> $FPCUR
                sfcbrepos -fi # Ensure we have a clean repo
                SFCB_START
                SFCB_TESTS
                DUALOUT "SECOND TEST RUN:" 
                SFCB_TESTS
                SFCB_STOP
                SFCB_CORE
                SFCB_VALGRIND
                SFCB_RESULTFILES
            else
                RC=1
                DUALOUT "MAKE POSTINSTALL : FAILURE" "./$MAKE_OUT"
            fi
        else
            RC=1
            DUALOUT "MAKE INSTALL : FAILURE" "./$MAKE_OUT"
        fi
    else
        RC=1
        DUALOUT "MAKE  : FAILURE" "./$MAKE_OUT"
    fi
}

# init the output files
echo "<HTML><BODY>" >$HTMLFILE

DUALOUT "TEST NAME :  $TESTNAME"
DUALOUT "CONFIG OPTIONS: $CONFIGOPTIONS"

# Check if there's previous footprint data
DELTA=0
if [ -r $FPPREV ]
then
    DELTA=1
fi

SFCB_CLEAN
if [ ! -d $BASE_DIR/sfcb ]; then
    CVS_CHECK_OUT
    AUTO_CONF
fi
CONFIGURE_SFCB
SFCB_CLEAN

echo "<a href=./coverage/index.html>Code Coverage Report</a><br>" >> $HTMLFILE

DUALOUT " " 
DUALOUT "============================================================== " 
echo "</BODY></HTML>" >>$HTMLFILE
cp $FPCUR $FPPREV

exit  $RC
