lib-httpd.sh 5.1 KB
Newer Older
1 2 3 4 5 6 7
#!/bin/sh
#
# Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at>
#

if test -z "$GIT_TEST_HTTPD"
then
8
	skip_all="Network testing disabled (define GIT_TEST_HTTPD to enable)"
9 10 11
	test_done
fi

J
Jay Soffian 已提交
12 13
HTTPD_PARA=""

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
for DEFAULT_HTTPD_PATH in '/usr/sbin/httpd' '/usr/sbin/apache2'
do
	if test -x "$DEFAULT_HTTPD_PATH"
	then
		break
	fi
done

for DEFAULT_HTTPD_MODULE_PATH in '/usr/libexec/apache2' \
				 '/usr/lib/apache2/modules' \
				 '/usr/lib64/httpd/modules' \
				 '/usr/lib/httpd/modules'
do
	if test -d "$DEFAULT_HTTPD_MODULE_PATH"
	then
		break
	fi
done

J
Jay Soffian 已提交
33 34 35 36 37 38 39
case $(uname) in
	Darwin)
		HTTPD_PARA="$HTTPD_PARA -DDarwin"
	;;
esac

LIB_HTTPD_PATH=${LIB_HTTPD_PATH-"$DEFAULT_HTTPD_PATH"}
40 41
LIB_HTTPD_PORT=${LIB_HTTPD_PORT-'8111'}

42
TEST_PATH="$TEST_DIRECTORY"/lib-httpd
43 44 45
HTTPD_ROOT_PATH="$PWD"/httpd
HTTPD_DOCUMENT_ROOT_PATH=$HTTPD_ROOT_PATH/www

46 47 48 49
# hack to suppress apache PassEnv warnings
GIT_VALGRIND=$GIT_VALGRIND; export GIT_VALGRIND
GIT_VALGRIND_OPTIONS=$GIT_VALGRIND_OPTIONS; export GIT_VALGRIND_OPTIONS

50 51
if ! test -x "$LIB_HTTPD_PATH"
then
52
	skip_all="skipping test, no web server found at '$LIB_HTTPD_PATH'"
53
	test_done
54 55 56 57 58 59 60 61 62 63 64
fi

HTTPD_VERSION=`$LIB_HTTPD_PATH -v | \
	sed -n 's/^Server version: Apache\/\([0-9]*\)\..*$/\1/p; q'`

if test -n "$HTTPD_VERSION"
then
	if test -z "$LIB_HTTPD_MODULE_PATH"
	then
		if ! test $HTTPD_VERSION -ge 2
		then
65
			skip_all="skipping test, at least Apache version 2 is required"
66 67
			test_done
		fi
68 69
		if ! test -d "$DEFAULT_HTTPD_MODULE_PATH"
		then
70
			skip_all="Apache module directory not found.  Skipping tests."
71 72
			test_done
		fi
73

J
Jay Soffian 已提交
74
		LIB_HTTPD_MODULE_PATH="$DEFAULT_HTTPD_MODULE_PATH"
75 76 77 78 79 80
	fi
else
	error "Could not identify web server at '$LIB_HTTPD_PATH'"
fi

prepare_httpd() {
M
Mike Hommey 已提交
81
	mkdir -p "$HTTPD_DOCUMENT_ROOT_PATH"
82
	cp "$TEST_PATH"/passwd "$HTTPD_ROOT_PATH"
83
	cp "$TEST_PATH"/broken-smart-http.sh "$HTTPD_ROOT_PATH"
84

M
Mike Hommey 已提交
85
	ln -s "$LIB_HTTPD_MODULE_PATH" "$HTTPD_ROOT_PATH/modules"
86 87 88

	if test -n "$LIB_HTTPD_SSL"
	then
J
Jeff King 已提交
89
		HTTPD_PROTO=https
90 91

		RANDFILE_PATH="$HTTPD_ROOT_PATH"/.rnd openssl req \
M
Mike Hommey 已提交
92
			-config "$TEST_PATH/ssl.cnf" \
93
			-new -x509 -nodes \
M
Mike Hommey 已提交
94 95
			-out "$HTTPD_ROOT_PATH/httpd.pem" \
			-keyout "$HTTPD_ROOT_PATH/httpd.pem"
96 97
		GIT_SSL_NO_VERIFY=t
		export GIT_SSL_NO_VERIFY
98 99
		HTTPD_PARA="$HTTPD_PARA -DSSL"
	else
J
Jeff King 已提交
100
		HTTPD_PROTO=http
101
	fi
J
Jeff King 已提交
102 103 104 105
	HTTPD_DEST=127.0.0.1:$LIB_HTTPD_PORT
	HTTPD_URL=$HTTPD_PROTO://$HTTPD_DEST
	HTTPD_URL_USER=$HTTPD_PROTO://user%40host@$HTTPD_DEST
	HTTPD_URL_USER_PASS=$HTTPD_PROTO://user%40host:user%40host@$HTTPD_DEST
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120

	if test -n "$LIB_HTTPD_DAV" -o -n "$LIB_HTTPD_SVN"
	then
		HTTPD_PARA="$HTTPD_PARA -DDAV"

		if test -n "$LIB_HTTPD_SVN"
		then
			HTTPD_PARA="$HTTPD_PARA -DSVN"
			rawsvnrepo="$HTTPD_ROOT_PATH/svnrepo"
			svnrepo="http://127.0.0.1:$LIB_HTTPD_PORT/svn"
		fi
	fi
}

start_httpd() {
121
	prepare_httpd >&3 2>&4
122

123
	trap 'code=$?; stop_httpd; (exit $code); die' EXIT
124

M
Mike Hommey 已提交
125 126
	"$LIB_HTTPD_PATH" -d "$HTTPD_ROOT_PATH" \
		-f "$TEST_PATH/apache.conf" $HTTPD_PARA \
127 128
		-c "Listen 127.0.0.1:$LIB_HTTPD_PORT" -k start \
		>&3 2>&4
129 130
	if test $? -ne 0
	then
131
		skip_all="skipping test, web server setup failed"
132
		trap 'die' EXIT
133 134
		test_done
	fi
135 136 137
}

stop_httpd() {
138
	trap 'die' EXIT
139

M
Mike Hommey 已提交
140
	"$LIB_HTTPD_PATH" -d "$HTTPD_ROOT_PATH" \
J
Jay Soffian 已提交
141
		-f "$TEST_PATH/apache.conf" $HTTPD_PARA -k stop
142
}
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157

test_http_push_nonff() {
	REMOTE_REPO=$1
	LOCAL_REPO=$2
	BRANCH=$3

	test_expect_success 'non-fast-forward push fails' '
		cd "$REMOTE_REPO" &&
		HEAD=$(git rev-parse --verify HEAD) &&

		cd "$LOCAL_REPO" &&
		git checkout $BRANCH &&
		echo "changed" > path2 &&
		git commit -a -m path2 --amend &&

158
		test_must_fail git push -v origin >output 2>&1 &&
159 160 161 162 163 164 165 166
		(cd "$REMOTE_REPO" &&
		 test $HEAD = $(git rev-parse --verify HEAD))
	'

	test_expect_success 'non-fast-forward push show ref status' '
		grep "^ ! \[rejected\][ ]*$BRANCH -> $BRANCH (non-fast-forward)$" output
	'

167
	test_expect_success 'non-fast-forward push shows help message' '
168
		test_i18ngrep "Updates were rejected because" output
169
	'
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185

	test_expect_failure 'force with lease aka cas' '
		HEAD=$(	cd "$REMOTE_REPO" && git rev-parse --verify HEAD ) &&
		test_when_finished '\''
			(cd "$REMOTE_REPO" && git update-ref HEAD "$HEAD")
		'\'' &&
		(
			cd "$LOCAL_REPO" &&
			git push -v --force-with-lease=$BRANCH:$HEAD origin
		) &&
		git rev-parse --verify "$BRANCH" >expect &&
		(
			cd "$REMOTE_REPO" && git rev-parse --verify HEAD
		) >actual &&
		test_cmp expect actual
	'
186
}
J
Jeff King 已提交
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225

setup_askpass_helper() {
	test_expect_success 'setup askpass helper' '
		write_script "$TRASH_DIRECTORY/askpass" <<-\EOF &&
		echo >>"$TRASH_DIRECTORY/askpass-query" "askpass: $*" &&
		cat "$TRASH_DIRECTORY/askpass-response"
		EOF
		GIT_ASKPASS="$TRASH_DIRECTORY/askpass" &&
		export GIT_ASKPASS &&
		export TRASH_DIRECTORY
	'
}

set_askpass() {
	>"$TRASH_DIRECTORY/askpass-query" &&
	echo "$*" >"$TRASH_DIRECTORY/askpass-response"
}

expect_askpass() {
	dest=$HTTPD_DEST
	{
		case "$1" in
		none)
			;;
		pass)
			echo "askpass: Password for 'http://$2@$dest': "
			;;
		both)
			echo "askpass: Username for 'http://$dest': "
			echo "askpass: Password for 'http://$2@$dest': "
			;;
		*)
			false
			;;
		esac
	} >"$TRASH_DIRECTORY/askpass-expect" &&
	test_cmp "$TRASH_DIRECTORY/askpass-expect" \
		 "$TRASH_DIRECTORY/askpass-query"
}