#! /bin/bash

do_help()
{
	echo You need to fill out the testrc with your machine\'s details before
	echo using this script.
	exit;
}

do_test()
{
	test_prog=$1
	test_name=`echo -n $test_prog | sed "s/test_//" | sed "s/_/ /" \
		   | tr '[:lower:]' '[:upper:]'`

	echo "-----------------------------------------------------------------"
	echo "TESTING $test_name..."
	echo "-----------------------------------------------------------------"

	echo "-----------------------------------------------------------------"\
		>> test_log
	echo "TESTING $test_name..." >> test_log
	echo "-----------------------------------------------------------------"\
		>> test_log

	if [ -e core* ]; then
		rm core*
	fi
	./$test_prog
	if [ -e test_out ]; then
		echo > test_out
	fi
}

do_tests()
{
	for walk in $TEST_LIST; do
		if [ -x $walk ]; then
			do_test $walk
		fi
	done
}

################################################
# GLOBAL HELPER FUNCTIONS
################################################

ped_testing()
{
	echo -n "testing $1... "
	echo -n "testing $1... " >> test_log
}

ped_testing_expect_fail()
{
	echo -n "testing for failure on $1... "
	echo -n "testing for failure on $1... " >> test_log
}

ped_test_ok()
{
	echo "ok"
	echo "ok" >> test_log

	if [ "x$VERBOSE_LOGS" = "x1" ]; then
		cat test_out >> test_log
		echo >> test_log
	fi

	export OK_COUNT=$[ $OK_COUNT + 1 ]
}

ped_test_failed()
{
	echo "failed"
	echo "failed" >> test_log

	cat test_out >> test_log
	echo >> test_log

	export FAILED_COUNT=$[ $FAILED_COUNT + 1 ]

	if [ -e core ]; then
		echo core dumped, saving to core-$CORE_COUNTER\
			>> test_log
		echo >> test_log
		mv core core-$CORE_COUNTER
		export CORE_COUNTER=$[ $CORE_COUNTER + 1 ]
	fi
}

check_leaks()
{
	if test "x$MALLOC_TRACE" != "x"; then
		./build_leak_list > leaks
		if test -s leaks; then
			printf \
'Found memory leaks: (add this list to dodgey_malloc_list in\n'\
'libparted/libparted.c to debug them)\n' \
				>> test_out
			cat leaks >> test_out
			return 0
		fi
		rm leaks
	fi

	return 1
}

ped_test_get_val()
{
	post_command=$2
	if test "x$input" = "x"; then
		input="Cancel"
	fi
	if test "x$post_command" = "x"; then
		post_command="true"
	fi

	if test -e leaks; then
		rm leaks
	fi
	if test "x$MALLOC_TRACE" != "x"; then
		if test -e $MALLOC_TRACE; then
			rm $MALLOC_TRACE
		fi
	fi

	if $TEST_PARTED_COMMAND -s $TEST_DRIVE $1 2>&1 > test_out; then
		if [ -e core ]; then
			return 0
		fi

		if check_leaks; then
			return 0
		fi

		if ( echo >> test_out ; ( eval $post_command ) 2>&1 >> test_out ); then
			return 1
		else
			return 0
		fi
	else
		return 0
	fi
}

ped_test()
{
	ped_testing "$1"
	if ped_test_get_val "$2" "$3"; then
		ped_test_failed
		return 1
	else
		ped_test_ok
		return 0
	fi
}

ped_test_expect_fail()
{
	ped_testing_expect_fail "$1"
	if ped_test_get_val "$2" "$3"; then

	# we expect a CLEAN fail :-)
		if [ -e core ]; then
			ped_test_failed
			return 1
		fi
		if check_leaks; then
			ped_test_failed
			return 1
		fi

		ped_test_ok
		return 0
	else
		ped_test_failed
		return 1
	fi
}

################################################
# the rest...
################################################

init_environment()
{
	if [ "x$UID" != "x0" ]; then
		echo Warning: you should probably be running this as root.
		echo
	fi

	. testrc
	`cat testrc | grep "^[^#].*=" | sed "s/=.*//" | sed "s/^/export /" `

	if [ "x$HOSTNAME" != "x$TEST_HOST" ]; then
		do_help
	fi

	export OLD_KERNEL_PRINTK=`cat /proc/sys/kernel/printk`

	if [ "x$QUIET_KERNEL" = "x1" ]; then
		echo 1 1 1 1 > /proc/sys/kernel/printk
	fi

	renice 20 $$ > /dev/null

	export CORE_COUNTER=1
	export OK_COUNT=0
	export FAILED_COUNT=0

	export -f ped_testing
	export -f ped_testing_expect_fail
	export -f ped_test_ok
	export -f ped_test_failed
	export -f ped_test_get_val
	export -f ped_test
	export -f ped_test_expect_fail
	export -f check_leaks
}

done_environment()
{
	echo $OLD_KERNEL_PRINTK > /proc/sys/kernel/printk
}

open_log()
{
	if [ -e test_log ]; then
		echo -n > test_log;
	fi
}

print_version()
{
	echo -n "Testing "
	$TEST_PARTED_COMMAND --version
	echo

	echo -n "Testing " >> test_log
	$TEST_PARTED_COMMAND --version >> test_log
	echo >> test_log
}

main()
{
	init_environment
	open_log
	print_version
	do_tests
	done_environment
}

if [ "x$1" !=  "x" ]; then
	export TEST_LIST="test_*$1*"
else
	export TEST_LIST="test_*"
fi

main

