test-lib.sh 4.0 KB
Newer Older
1 2 3 4 5 6 7
#!/bin/sh
#
# Copyright (c) 2005 Junio C Hamano
#

# For repeatability, reset the environment to known value.
LANG=C
8
LC_ALL=C
9
PAGER=cat
10
TZ=UTC
11
export LANG LC_ALL PAGER TZ
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
unset AUTHOR_DATE
unset AUTHOR_EMAIL
unset AUTHOR_NAME
unset COMMIT_AUTHOR_EMAIL
unset COMMIT_AUTHOR_NAME
unset GIT_ALTERNATE_OBJECT_DIRECTORIES
unset GIT_AUTHOR_DATE
unset GIT_AUTHOR_EMAIL
unset GIT_AUTHOR_NAME
unset GIT_COMMITTER_EMAIL
unset GIT_COMMITTER_NAME
unset GIT_DIFF_OPTS
unset GIT_DIR
unset GIT_EXTERNAL_DIFF
unset GIT_INDEX_FILE
unset GIT_OBJECT_DIRECTORY
unset SHA1_FILE_DIRECTORIES
unset SHA1_FILE_DIRECTORY

# Each test should start with something like this, after copyright notices:
#
# test_description='Description of this test...
# This test checks if command xyzzy does the right thing...
# '
# . ./test-lib.sh

error () {
	echo "* error: $*"
40
	trap - exit
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
	exit 1
}

say () {
	echo "* $*"
}

test "${test_description}" != "" ||
error "Test script did not set test_description."

while test "$#" -ne 0
do
	case "$1" in
	-d|--d|--de|--deb|--debu|--debug)
		debug=t; shift ;;
J
Junio C Hamano 已提交
56 57
	-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
		immediate=t; shift ;;
58 59 60 61 62 63 64 65 66 67
	-h|--h|--he|--hel|--help)
		echo "$test_description"
		exit 0 ;;
	-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
		verbose=t; shift ;;
	*)
		break ;;
	esac
done

68
exec 5>&1
69 70 71 72 73 74 75 76 77 78
if test "$verbose" = "t"
then
	exec 4>&2 3>&1
else
	exec 4>/dev/null 3>/dev/null
fi

test_failure=0
test_count=0

79 80
trap 'echo >&5 "FATAL: Unexpected exit with code $?"; exit 1' exit

81

J
Junio C Hamano 已提交
82 83 84 85
# You are not expected to call test_ok_ and test_failure_ directly, use
# the text_expect_* functions instead.

test_ok_ () {
86
	test_count=$(expr "$test_count" + 1)
87
	say "  ok $test_count: $@"
88 89
}

J
Junio C Hamano 已提交
90
test_failure_ () {
91 92
	test_count=$(expr "$test_count" + 1)
	test_failure=$(expr "$test_failure" + 1);
93 94 95
	say "FAIL $test_count: $1"
	shift
	echo "$@" | sed -e 's/^/	/'
96
	test "$immediate" = "" || { trap - exit; exit 1; }
J
Junio C Hamano 已提交
97 98 99 100
}


test_debug () {
101
	test "$debug" = "" || eval "$1"
102 103
}

104 105 106 107 108 109
test_run_ () {
	eval >&3 2>&4 "$1"
	eval_ret="$?"
	return 0
}

110
test_expect_failure () {
111
	test "$#" = 2 ||
112 113
	error "bug in the test script: not 2 parameters to test-expect-failure"
	say >&3 "expecting failure: $2"
114 115
	test_run_ "$2"
	if [ "$?" = 0 -a "$eval_ret" != 0 ]
116
	then
J
Junio C Hamano 已提交
117
		test_ok_ "$1"
118 119
	else
		test_failure_ "$@"
120 121 122 123
	fi
}

test_expect_success () {
124
	test "$#" = 2 ||
125 126
	error "bug in the test script: not 2 parameters to test-expect-success"
	say >&3 "expecting success: $2"
127 128
	test_run_ "$2"
	if [ "$?" = 0 -a "$eval_ret" = 0 ]
129
	then
J
Junio C Hamano 已提交
130
		test_ok_ "$1"
131
	else
J
Junio C Hamano 已提交
132
		test_failure_ "$@"
133 134 135
	fi
}

136 137 138 139 140 141 142 143 144 145 146 147 148
test_expect_code () {
	test "$#" = 3 ||
	error "bug in the test script: not 3 parameters to test-expect-code"
	say >&3 "expecting exit code $1: $3"
	test_run_ "$3"
	if [ "$?" = 0 -a "$eval_ret" = "$1" ]
	then
		test_ok_ "$2"
	else
		test_failure_ "$@"
	fi
}

149
test_done () {
150
	trap - exit
151
	case "$test_failure" in
152
	0)
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
		# We could:
		# cd .. && rm -fr trash
		# but that means we forbid any tests that use their own
		# subdirectory from calling test_done without coming back
		# to where they started from.
		# The Makefile provided will clean this test area so
		# we will leave things as they are.

		say "passed all $test_count test(s)"
		exit 0 ;;

	*)
		say "failed $test_failure among $test_count test(s)"
		exit 1 ;;

	esac
}

# Test the binaries we have just built.  The tests are kept in
# t/ subdirectory and are run in trash subdirectory.
PATH=$(pwd)/..:$PATH
J
Johannes Schindelin 已提交
174
GIT_EXEC_PATH=$(pwd)/..
175 176 177 178 179 180 181
export PATH GIT_EXEC_PATH

# Similarly use ../compat/subprocess.py if our python does not
# have subprocess.py on its own.
PYTHON=`sed -e '1{
	s/^#!//
	q
182 183 184
}' ../git-merge-recursive` || {
	error "You haven't built things yet, have you?"
}
185 186 187 188
"$PYTHON" -c 'import subprocess' 2>/dev/null || {
	PYTHONPATH=$(pwd)/../compat
	export PYTHONPATH
}
189 190 191
test -d ../templates/blt || {
	error "You haven't built things yet, have you?"
}
192 193 194 195 196 197

# Test repository
test=trash
rm -fr "$test"
mkdir "$test"
cd "$test"
198
"$GIT_EXEC_PATH/git" init-db --template=../../templates/blt/ 2>/dev/null ||
199
error "cannot run git init-db -- have you built things yet?"
J
Junio C Hamano 已提交
200 201

mv .git/hooks .git/hooks-disabled