#!/bin/sh

# $Id: execute_test,v 1.1 2009-02-13 16:21:15 potyra Exp $
#
# Copyright (C) 2004-2009 FAUmachine Team <info@faumachine.org>.
# This program is free software. You can redistribute it and/or modify it
# under the terms of the GNU General Public License, either version 2 of
# the License, or (at your option) any later version. See COPYING.

#
# ***** no parameters given? print usage
#
if [ $# = 0 ]; then
	echo "usage: ${0} <testname> name>] [direcory=<directory of test>]"
	echo "       ${0} should be called via make, only!"
	exit 1
fi


#
# ***** set dafault values
#
test_directory=$1
test_name=$1
make_rule="experiment"

# we live in scripts/test-FAUmachine/
# so look for experiments -> ../../experiments
#    then for ../FAUmachine-Experiments -> ../../../FAUmachine-Experiments
#    finally (for legacy reasons) in ..
test_dir_prefixes="../../experiments ../../../FAUmachine-Experiments .."

#
# ***** options enabled? compile FAUmachine
#
shift
while [ $# -gt 0 ]; do
	case $1 in
	-summary)
		summary="true"
		;;
	-history)
		history="true"
		;;
	-directory=*)
		test_directory=`echo $1 | sed -e 's/-directory=//g'`
		make_rule=$test_name
		;;
	*)
		echo "Option '$1' not known!"
		;;
	esac
	shift
done


#
# ***** prepare FAUresult variable
#
if [ "$FAUresults" != "" ]; then
	# if neccessary, a trailing slash will be removed
	myFAUresults=`echo ${FAUresults} | sed -e 's,/$,,'`
else
	# environment variable not set -> results will be stored in ./results
	myFAUresults=`pwd`/results
fi


#
# ***** add subdirectory and nodename
#
if [ -f subdirectory ]; then
	myFAUresults=${myFAUresults}/`cat subdirectory`
else
	myFAUresults=${myFAUresults}/debug
fi
myFAUresults=$myFAUresults/`uname -n`


#
# ***** add subdirectory and nodename
#
if [ -f xnest ]; then
	DISPLAY="`cat xnest`"
	export DISPLAY
fi

#
# ***** test available?
#

real_test_dir=""
for p in ${test_dir_prefixes}; do
	if [ -d ${p}/${test_directory} ]; then
		if [ -f ${p}/${test_directory}/Makefile ]; then
			real_test_dir=${p}/${test_directory}
			break;
		fi
	fi
done

if [ -z ${real_test_dir} ]; then
	echo "ERROR: Cannot find test ${test_directory}."
	exit 1
fi

#
# ***** clean up previous stuff 
#
(
	cd ${real_test_dir} > /dev/null
	if [ -x ./kill_all.sh ] ; then
		./kill_all.sh > /dev/null 2> /dev/null
	fi
	${MAKE} clean > /dev/null 2> /dev/null
)

#
# ***** mkdir result directory
#
result_dir=${myFAUresults}/${test_name}@${test_directory}/`date +%Y%m%d-%H%M`
mkdir -p ${result_dir}
date +"%d.%m.%y %H:%M" > ${result_dir}/timestamp


#
# ***** start test
#
echo
echo "Starting test '${test_name}@${test_directory}'..."

(
	cd ${real_test_dir}
	${MAKE} $make_rule
) > /dev/null 2> log.tmp

if [ $? -eq 0 ]; then
	touch ${result_dir}/test.success
	echo "   success."
else
	touch ${result_dir}/test.failed
	echo "   failure."
fi
if [ -f ${real_test_dir}/kill_all.sh ]; then
	(
		cd ${real_test_dir}
		./kill_all.sh > /dev/null 2> /dev/null
	)
fi
grep -v Error log.tmp > ${real_test_dir}/log.Makefile
rm log.tmp

#
# ***** log results
#
if ls ${real_test_dir}/log.* > /dev/null 2>&1 ; then
	mv ${real_test_dir}/log.* ${result_dir}
else
	echo "   no 'log.faum-*' files found, maybe this test is not configured correctly."
fi
if ls ${real_test_dir}/node.*/screenshot*.png > /dev/null 2>&1 ; then
	mv ${real_test_dir}/node.*/screenshot*.png ${result_dir}
fi
rm -f `find ${result_dir}/log.* -maxdepth 1 -size 0 2> /dev/null`


#
# ***** log additional infos
#
if [ -f /proc/meminfo ] ; then
	cat /proc/meminfo > ${myFAUresults}/log.meminfo
fi
if [ -f /proc/cpuinfo ] ; then
	cat /proc/cpuinfo > ${myFAUresults}/log.cpuinfo
fi

#
# ***** clean up stuff 
#
(
	cd ${real_test_dir} > /dev/null
	if [ -x ./kill_all.sh ] ; then
		./kill_all.sh > /dev/null 2> /dev/null
	fi
	${MAKE} clean > /dev/null 2> /dev/null
)

#
# ***** create summary, history, runtime
#
cd scripts
for prog in * ; do
	if [ -f ${prog} -a -x ${prog} ] ; then
		./${prog} ${myFAUresults} ${result_dir} ${test_name}@${test_directory}
	fi
done
cd ..


#
# ***** finished
#
echo
exit 0

