#!/bin/bash
#
# Script for testing the correct results of parallel Hitmap and reference applications
#
# (c) 2015 Arturo Gonzalez-Escribano
#

# 1. EXPERIMENT INFORMATION
# 1.1. APP NAME AND DEFAULT EXECUTABLES LIST
APP_NAME="Cannon's algorithm for Matrix Multiplication"
EXE_NAMES="cannonAsync refMPICannon"

# 1.2. APP/EXPERIMENT SPECIFIC PARAMETERS
PROCS="1 4 9 16 25 36 49 64 81 100 121 144"

# 1.3. DIRECTORY WITH THE FILES CONTAINING THE EXPECTED RESULTS
RESULT_DIR=CorrectResults

# 1.3. NAME OF THE RESULTS FILE GENERATED BY THE EXECUTABLES
RESULT_FILE="C.dtxt"


# 2. WRITE HEADER
echo
echo TESTING SCRIPT
echo --------------
echo "APPLICATION: $APP_NAME"

# 3. CHECK PARAMETERS
# 3.1. HELP
if [ $# -lt 1 ]
then
	echo
	echo -e "\tUsage: $0 all | <executable_names>"
	echo
	exit 1
fi

# 3.2. TEST SPECIFIC EXECUTABLES INSTEAD OF THE PREDEFINED LIST
if [ $1 != all ]
then
	EXE_NAMES=$@
fi
echo "EXECUTABLES: $EXE_NAMES"
echo

# 3.3. CHECK THAT EXECUTABLES HAVE BEEN GENERATED
for name in $EXE_NAMES
do
	OK=y
	if [ ! -x $name ]
	then
		echo "Error: Executable not found -- $name"
		OK=n
	fi
done
if [ $OK != y ]
then
	echo
	echo -e "\tBefore using this script generate the executables with:  $ make check"
	echo
	exit 1
fi

# 4. TESTING EXPERIMENT
function doTest() {
	echo -e -n "Test $2:\t"

	# EXECUTE PROGRAM
	rm -f $RESULT_FILE
	mpiexec -n $2 ./$1 >/dev/null 2>check.err

	# EXECUTION ERRORS, SKIP TESTING RESULT FILE
	if [ 0 != $? ]
	then
			echo ERROR EXECUTING: $(cat check.err)
			continue
	fi

	# IF THE RESULTS FILE HAS NOT BEEN GENERATED
	if [ ! -r $RESULT_FILE ]
	then
		echo "Error: The executable \"$exe\" does no generate an ouput file. Try cleaning and recompiling with  $ make check"
		echo
		exit -1
	# CHECK THE CONTENTS OF THE RESULTS FILE
	else
		CHECK=""
		diff $RESULT_FILE $RESULT_DIR/Result.10.20 >/dev/null || CHECK=Result
		if [ "$CHECK" != "" ]
		then
			echo ERROR: $CHECK
		else
			echo OK
		fi
	fi
}

# 5. LOOPS FOR TESTS
for exe in $EXE_NAMES
do
	echo
	echo "Testing: $exe"
	echo "------------------------"
	for procs in $PROCS
	do
		doTest $exe $procs
	done
done

# 6. CLEAN
rm -f $RESULT_FILE
rm -f check.err
