#!/bin/bash

test_failed=0
test_runned=0
test_all=0
diff_res=""
acl_test_list=`find sql -name "acl*.sql" -type f | sort`
mac_test_list=`find sql -name "mac*.sql" -type f | sort`
misc_test_list=`find sql -name "misc*.sql" -type f | sort`
test_list=
list=
res_path="${HOME}/pg-$pg_ver-se-test"
psql="/usr/lib/postgresql/$PG_VERSION/bin/psql"
tmp_path=/tmp_test/

export PGPORT="$PG_SETEST_PORT"

usage="Использование: $0 {-all|-acl|-mac|-misc|-f ТЕСТ|-g ФАЙЛ_СО_СПИСОМ_ТЕСТОВ|--help|--version}

Опции:
-all		Весь набор тестов
-acl		Набор тестов дискреционного разграничения доступа.
-mac		Набор тестов мандатного разграничения доступа.
-misc		Набор дополнительных тестов.
-f			Указанный файл теста.
-g 			Файл со списком тестов.
--help  	Показать эту справку и выйти.
--version	Показать версию и выйти.
"

if [ "x$1" == "x" ]
then
	echo "$usage"
	exit $?;
fi

if [ "x${SUDO_UID}" != "x" ]
then
	res_path=`getent passwd | grep x:${SUDO_UID}: | cut -d : -f 6`"/pg-$PG_VERSION-se-test"
else
	res_path="/root/pg-$PG_VERSION-se-test"
fi

case $1 in
	-all) list=`find sql -name "*.sql" -type f | sort`
		;;

	-acl) list="$list $acl_test_list"
		;;

	-mac) list="$list $mac_test_list"
		;;

	-misc) list="$list $misc_test_list"
		;;

	-f) test_list=`find "$2" -type f | sort`
		list="$test_list"
		;;

	-g) # Удаляем возможные пробелы и табуляцию с конца строк
		sed -e 's/[ \t]*$//' $2 > $2.new
		mv $2.new $2
		# Убираем все пустые строки, а также закомментированные строки
		tests=`cat $2 | grep -v '#' | grep -v '^$' | sort`
		for test_name in $tests
		do
			test_name="sql/$test_name.sql"
			list="$list $test_name"
		done
		;;

	--help) echo "$usage"
			exit $?;;

	--version)  echo "$0 $scriptversion"
				exit $?
		;;

	*)	echo "$usage"
		exit $?
		;;
esac

echo "+-------------------------------------------------------------------------------"
echo "| Удаление результатов предыдущих тестов"

rm -fr $res_path

echo "+-------------------------------------------------------------------------------"
echo "| Подготовка к выполнению тестов"

if [ ! -e $res_path ]; then mkdir $res_path; fi;
if [ ! -e $res_path/results ]; then mkdir $res_path/results; fi;
if [ ! -e $tmp_path ]; then mkdir $tmp_path; fi;
pdpl-file 3:63:3:ccnr $tmp_path
chmod 777 $tmp_path

#mkdir /usr/lib/postgresql/$PG_VERSION/lib/plugins
#cp /usr/lib/postgresql/$PG_VERSION/lib/pg_hint_plan.so /usr/lib/postgresql/$PG_VERSION/lib/plugins/pg_hint_plan.so

echo -n "| Результаты выполнения тестов будут сохранены в "
echo "$res_path"
echo "+-------------------------------------------------------------------------------"
echo "| Запуск тестов"
echo "+-------------------------------------------------------------------------------"

for test_file in $list; do

	test_name=`basename "$test_file" .sql`

	test_info=" "$test_name
	while [ "${#test_info}" -lt 24 ]; do
		test_info="$test_info "
	done;

	echo -n "$test_info"

	# Заголовок теста: -- RBT-TEST
	test_header=`grep -m 1 'RBT-TEST' "$test_file" | cut -c 13-`

	if [ "x$test_header" != "x" ]; then

		while [ "${#test_header}" -lt 47 ]; do
			test_header="$test_header."
		done;
		echo -n "$test_header "

		# Принудительно очищаем кластера
		$psql -q -U postgres -f "support/clear-clusters.sql" template1 > /dev/null 2>&1

		# Выполняем тест
		$psql -a -q -U postgres -f "$test_file" template1 \
			> $res_path/results/$test_name.out 2>&1 \
		 || $psql -a -q -U postgres -f "$test_file.ext" template1 \
			>> $res_path/results/$test_name.out  2>&1

		# Обрабатываем вывод
		rm -f $res_path/tmp.out
		cat $res_path/results/$test_name.out | sed -f "support/sed_expressions" > $res_path/tmp.out
		mv $res_path/tmp.out $res_path/results/$test_name.out

		# Ищем различия
		diff_res=`diff -q -N expected/$test_name.out $res_path/results/$test_name.out`

		if [ "x$diff_res" != "x" ]; then
			((test_failed++))

			# Сохраняем различия
			diff -C3 -N "expected/$test_name.out" $res_path/results/$test_name.out >> $res_path/se-test.diffs

			echo "!ОШИБКА!"
		else
			echo "успех"
		fi

		((test_runned++))
	else
		echo "пропущен (не найден заголовок)"
	fi

	((test_all++))
done

rm -rf $tmp_path

echo "+-------------------------------------------------------------------------------"
echo "| Всего = $test_all, запущено = $test_runned, ошибочных = $test_failed"
echo "+-------------------------------------------------------------------------------"
