summaryrefslogtreecommitdiff
path: root/pkgtools/pkg_regress/files/pkg_regress.sh
blob: cde085581401684e31cc78821a828de634da6a17 (plain)
1
2
3
4
5
6
7
8
9
10
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#! @SH@
#
# $NetBSD: pkg_regress.sh,v 1.5 2016/06/11 09:37:16 rillig Exp $
#
set -e

: ${PKGSRCDIR="@PKGSRCDIR@"}
: ${TEST_EGREP="@EGREP@"}
: ${TEST_MAKE="@MAKE@"}

# hooks overridable by test spec file

do_setup() {
	return
}

do_cleanup() {
	return
}

do_test() {
	do_test_default
}

check_result() {
	return
}

# Internal helper functions

do_test_default() {
	# The if is necessary to prevent sh -e from exiting.
	if $TEST_MAKE $MAKEARGS_TEST >$TEST_OUTFILE 2>&1; then
		TEST_EXITSTATUS=$?
	else
		TEST_EXITSTATUS=$?
	fi
}

# usage: regress_fail msg...
regress_fail() {

	echo "ERROR: $*" 1>&2
	TEST_RESULT=1
}

# result checking routines

# Text exit status
exit_status() {

	[ "$1" -eq "$TEST_EXITSTATUS" ] \
	|| regress_fail "Expected exit code $1, but got $TEST_EXITSTATUS."
}

# Test positive match against output
output_require() {

	for re in "$@"; do
		$TEST_EGREP "$re" < $TEST_OUTFILE >/dev/null \
		|| regress_fail "Expected \"$re\" in the output, but it is not there."
	done
}

# Test negative match against output
output_prohibit() {

	for re in "$@"; do
		if $TEST_EGREP "$re" < $TEST_OUTFILE >/dev/null; then
			regress_fail "Didn't expect \"$re\" in the output, but found it."
		fi
	done
}

do_runtest() {
	cd "$1"
	TEST_RESULT=0
	TEST_EXITSTATUS=0
	TEST_OUTFILE=`mktemp -t pkg_regress` || exit 1
	. ./spec

	do_setup

	do_test

	check_result

	# Perform cleanup

	do_cleanup

	if [ -n "$MAKEARGS_CLEAN" ]; then
		$TEST_MAKE $MAKEARGS_CLEAN >>$TEST_OUTFILE
	fi

	if [ "$verbose" = "yes" ]; then
		cat $TEST_OUTFILE
	fi

	rm -f $TEST_OUTFILE
	exit $TEST_RESULT
}

# runtest runs a test in a subshell, so that environment settings etc in
# one test do not interfere with other tests.
runtest() {
	if [ "$verbose" = "yes" ]; then
		echo "Running $1"
	fi

	if (do_runtest "$1"); then
		passed=`expr $passed + 1`
	else
		failed=`expr $failed + 1`
		failed_names="$failed_names $1"
    	fi
}

verbose=no
passed=0
failed=0
failed_names=""

cd $PKGSRCDIR/regress

while [ $# -gt 0 ]; do
	case "$1" in
	-v) shift; verbose=yes;;
	--) shift; break;;
	-*) echo "usage: $0 [-v] [directory...]" 1>&2; exit 1 ;;
	*) break
	esac
done

if [ $# -eq 0 ]; then
	set -- *
fi

for dir in "$@"; do
	if [ -f $dir/spec ]; then
		runtest $dir
	fi
done

if [ -n "$failed_names" ]; then
	echo "Tests failed:$failed_names"
	echo
fi

echo "Statistics:"
echo "  $passed passed, $failed failed"