#!/bin/sh
#
# This script runs the tests
#

# bug 2871 - install the test data and locales each run (if we're root)
if [ "`id -un`" = "root" ]; then
	/opt/lsb/test/olver-core/testdata/install_testdata.sh
fi

TESTER=`cat ${0%/*}/../etc/olver.conf | grep USER_NAME_TESTER | sed 's/.*=\s*//'`
id $TESTER > /dev/null 2>&1
if [ $? -ne 0 ]; then
	echo "Error: there is no such a user '$TESTER'"
	exit 1
fi

if [ -z $RESTART ]; then
#
# Parameters
#
export TTIMEMARK=${TTIMEMARK:-`date +%Y-%m-%d_%H-%M-%S`}
export OLVER_REPORT_DIR=${OLVER_REPORT_DIR:-/var/opt/lsb/test/olver-core}
export AGENT_LOG=${AGENT_LOG:-/tmp/olver-log/agent.log} # Hardcoded in agent.c
export REPORT_DIR=$OLVER_REPORT_DIR/$TTIMEMARK
export RUN_LOG=${RUN_LOG:-$OLVER_REPORT_DIR/$TTIMEMARK/run.log}
export TIMES_LOG=${TIMES_LOG:-$OLVER_REPORT_DIR/$TTIMEMARK/times.log}

#
# Prepare dirs for reports and logs
#
mkdir -p -m 755 $OLVER_REPORT_DIR
chown $TESTER:"`id $TESTER -gn`" $OLVER_REPORT_DIR >/dev/null 2>&1

mkdir -p -m 755 $REPORT_DIR
chown $TESTER:"`id $TESTER -gn`" $REPORT_DIR >/dev/null 2>&1

rm -rf /tmp/olver > /dev/null 2>&1
mkdir -p -m 755 /tmp/olver/agent
chown $TESTER:"`id $TESTER -gn`" /tmp/olver >/dev/null 2>&1
chown $TESTER:"`id $TESTER -gn`" /tmp/olver/agent >/dev/null 2>&1

AGENT_DIR=${AGENT_LOG%/*}
rm -rf $AGENT_DIR > /dev/null 2>&1
mkdir -p -m 755 $AGENT_DIR
echo > $AGENT_LOG
chmod 755 $AGENT_LOG > /dev/null 2>&1
chown -R $TESTER:"`id $TESTER -gn`" $AGENT_DIR >/dev/null 2>&1

fi

#
# Change current user
#
if [ "`id -un`" != "$TESTER" ]; then
    export RESTART="yes"
    su $TESTER -c "${0%/*}/olver_run_tests $1 $2"
    exit $?
fi

#
# Adjust Directory
#
cd ${0%/*}

#
# Check Prerequisites
#
./olver_pre
if [ ! $? = 0 ]; then
    exit 2
fi

#
# Execution Parameters
#
TEST_TIMEOUT=1800
TEST_PLAN=testplan

# External test plan specified
if [ $# -gt 0 ]; then
    if [ -f $1 ]; then
        TEST_PLAN=$1
    fi
fi

# External timeout specified
if [ $# -gt 1 ]; then
    TEST_TIMEOUT=$2
fi

#
# Count Scenarios
#
SCENARIO_CNT=`cat $TEST_PLAN | grep -v '^#' | wc -l`

echo "OLVER Test Suite"
echo "Using test plan:                        $TEST_PLAN"
echo "Number of scenarios in the test plan:   $SCENARIO_CNT"
echo "Scenario execution timeout:             $TEST_TIMEOUT second(s)"

count_scen=0

count_pass=0
count_fail=0
count_exit=0
count_unkn=0
count_term=0
count_known=0
count_unknown=0

#
# Execute Function
#
run() {
count_scen=$(( $count_scen + 1 ))
echo "Running scenario $1 ($count_scen of $SCENARIO_CNT)" | tee -a $RUN_LOG
./olver -l -c "../etc/olver.conf" -r $REPORT_DIR -t $TEST_TIMEOUT $1
code=$?
echo " "

if [ -f $REPORT_DIR/$1.utt ]; then
    if [ -x /usr/bin/zip ]; then
        zip -q -j -T -m $REPORT_DIR/$1.utz $REPORT_DIR/$1.utt >/dev/null 2>&1
    else
        gzip -q -c $REPORT_DIR/$1.utt > $REPORT_DIR/$1.utgz 2>&1
        rm -f $REPORT_DIR/$1.utt >/dev/null 2>&1
    fi
fi

echo -n Scenario $1 status: | tee -a $RUN_LOG
if [ $code -eq 0 ]; then
    echo " PASS" | tee -a $RUN_LOG
    count_pass=$(( $count_pass + 1 ))
elif [ $code -eq 137 ]; then
    echo " TERMINATED" | tee -a $RUN_LOG
    count_term=$(( $count_term + 1 ))
elif [ $code -eq 143 ]; then
    echo " TERMINATED" | tee -a $RUN_LOG
    count_term=$(( $count_term + 1 ))
elif [ $code -eq 2 ]; then
    echo " FAIL" | tee -a $RUN_LOG
    count_fail=$(( $count_fail + 1 ))
elif [ $code -eq 1 ]; then
    echo " ABNORMAL" | tee -a $RUN_LOG
    count_exit=$(( $count_exit + 1 ))
else
    echo " UNKNOWN" | tee -a $RUN_LOG
    count_unkn=$(( $count_unkn + 1 ))
fi
}

#
# Prepare for Execution
#
export TEST_SYSTEM_HOST=127.0.0.1
export LD_LIBRARY_PATH=.

#
# Run Tests
#
echo Running... | tee -a $RUN_LOG

for scen in `cat $TEST_PLAN`
do
    if [ "$scen" != "${scen#\#}" ]
    then
        echo Skipping commented:${scen#\#} | tee -a $RUN_LOG
    else
        run $scen
    fi
done

cp -f $TIMES_LOG ../etc/times.ref >/dev/null 2>&1
gzip -q -c $AGENT_LOG > $REPORT_DIR/agent.log.gz 2>&1

#
# Execution Status
#
echo PASSED: $count_pass, FAILED: $count_fail, TERMINATED: $count_term, ABNORMAL: $count_exit, UNKNOWN: $count_unkn | tee -a $RUN_LOG

#
# Process Results
#
echo
echo
echo Generating report...
./olver_report

#
# Test Run Return Code
#
if [ $count_term -gt 0 -o $count_fail -gt 0 -o $count_exit -gt 0 -o $count_unkn -gt 0 ]; then
    exit 1
else
    exit 0
fi
