test-lib.sh 3.2 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
PAGER=cat
9
TZ=UTC
10
export LANG PAGER TZ
11 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
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: $*"
39
	trap - exit
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
	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 已提交
55 56
	-i|--i|--im|--imm|--imme|--immed|--immedi|--immedia|--immediat|--immediate)
		immediate=t; shift ;;
57 58 59 60 61 62 63 64 65 66
	-h|--h|--he|--hel|--help)
		echo "$test_description"
		exit 0 ;;
	-v|--v|--ve|--ver|--verb|--verbo|--verbos|--verbose)
		verbose=t; shift ;;
	*)
		break ;;
	esac
done

67
exec 5>&1
68 69 70 71 72 73 74 75 76 77
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

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

80

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

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

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


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

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

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

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

test_done () {
136
	trap - exit
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
	case "$test_failure" in
	0)	
		# 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

# Test repository
test=trash
rm -fr "$test"
mkdir "$test"
cd "$test"
git-init-db 2>/dev/null || error "cannot run git-init-db"