Git fork
at reftables-rust 370 lines 9.2 kB view raw
1# Shell library to run an HTTP server for use in tests. 2# Ends the test early if httpd tests should not be run, 3# for example because the user has not enabled them. 4# 5# Usage: 6# 7# . ./test-lib.sh 8# . "$TEST_DIRECTORY"/lib-httpd.sh 9# start_httpd 10# 11# test_expect_success '...' ' 12# ... 13# ' 14# 15# test_expect_success ... 16# 17# test_done 18# 19# Can be configured using the following variables. 20# 21# GIT_TEST_HTTPD enable HTTPD tests 22# LIB_HTTPD_PATH web server path 23# LIB_HTTPD_MODULE_PATH web server modules path 24# LIB_HTTPD_PORT listening port 25# LIB_HTTPD_DAV enable DAV 26# LIB_HTTPD_SVN enable SVN at given location (e.g. "svn") 27# LIB_HTTPD_SSL enable SSL 28# LIB_HTTPD_PROXY enable proxy 29# 30# Copyright (c) 2008 Clemens Buchacher <drizzd@aon.at> 31# 32 33if ! test_have_prereq LIBCURL 34then 35 skip_all='skipping test, git built without http support' 36 test_done 37fi 38 39if test -n "$NO_EXPAT" && test -n "$LIB_HTTPD_DAV" 40then 41 skip_all='skipping test, git built without expat support' 42 test_done 43fi 44 45if ! test_bool_env GIT_TEST_HTTPD true 46then 47 skip_all="Network testing disabled (unset GIT_TEST_HTTPD to enable)" 48 test_done 49fi 50 51if ! test_have_prereq NOT_ROOT; then 52 test_skip_or_die GIT_TEST_HTTPD \ 53 "Cannot run httpd tests as root" 54fi 55 56HTTPD_PARA="" 57 58for DEFAULT_HTTPD_PATH in '/usr/sbin/httpd' \ 59 '/usr/sbin/apache2' \ 60 "$(command -v httpd)" \ 61 "$(command -v apache2)" 62do 63 if test -n "$DEFAULT_HTTPD_PATH" && test -x "$DEFAULT_HTTPD_PATH" 64 then 65 break 66 fi 67done 68 69if test -x "$DEFAULT_HTTPD_PATH" 70then 71 DETECTED_HTTPD_ROOT="$("$DEFAULT_HTTPD_PATH" -V 2>/dev/null | sed -n 's/^ -D HTTPD_ROOT="\(.*\)"$/\1/p')" 72fi 73 74for DEFAULT_HTTPD_MODULE_PATH in '/usr/libexec/apache2' \ 75 '/usr/lib/apache2/modules' \ 76 '/usr/lib64/httpd/modules' \ 77 '/usr/lib/httpd/modules' \ 78 '/usr/libexec/httpd' \ 79 '/usr/lib/apache2' \ 80 "${DETECTED_HTTPD_ROOT:+${DETECTED_HTTPD_ROOT}/modules}" 81do 82 if test -n "$DEFAULT_HTTPD_MODULE_PATH" && test -d "$DEFAULT_HTTPD_MODULE_PATH" 83 then 84 break 85 fi 86done 87 88case $(uname) in 89 Darwin) 90 HTTPD_PARA="$HTTPD_PARA -DDarwin" 91 ;; 92esac 93 94LIB_HTTPD_PATH=${LIB_HTTPD_PATH-"$DEFAULT_HTTPD_PATH"} 95test_set_port LIB_HTTPD_PORT 96 97TEST_PATH="$TEST_DIRECTORY"/lib-httpd 98HTTPD_ROOT_PATH="$PWD"/httpd 99HTTPD_DOCUMENT_ROOT_PATH=$HTTPD_ROOT_PATH/www 100 101# hack to suppress apache PassEnv warnings 102GIT_VALGRIND=$GIT_VALGRIND; export GIT_VALGRIND 103GIT_VALGRIND_OPTIONS=$GIT_VALGRIND_OPTIONS; export GIT_VALGRIND_OPTIONS 104GIT_TEST_SIDEBAND_ALL=$GIT_TEST_SIDEBAND_ALL; export GIT_TEST_SIDEBAND_ALL 105GIT_TRACE=$GIT_TRACE; export GIT_TRACE 106 107if ! test -x "$LIB_HTTPD_PATH" 108then 109 test_skip_or_die GIT_TEST_HTTPD "no web server found at '$LIB_HTTPD_PATH'" 110fi 111 112HTTPD_VERSION=$($LIB_HTTPD_PATH -v | \ 113 sed -n 's/^Server version: Apache\/\([0-9.]*\).*$/\1/p; q') 114HTTPD_VERSION_MAJOR=$(echo $HTTPD_VERSION | cut -d. -f1) 115HTTPD_VERSION_MINOR=$(echo $HTTPD_VERSION | cut -d. -f2) 116 117if test -n "$HTTPD_VERSION_MAJOR" 118then 119 if test -z "$LIB_HTTPD_MODULE_PATH" 120 then 121 if ! test "$HTTPD_VERSION_MAJOR" -eq 2 || 122 ! test "$HTTPD_VERSION_MINOR" -ge 4 123 then 124 test_skip_or_die GIT_TEST_HTTPD \ 125 "at least Apache version 2.4 is required" 126 fi 127 if ! test -d "$DEFAULT_HTTPD_MODULE_PATH" 128 then 129 test_skip_or_die GIT_TEST_HTTPD \ 130 "Apache module directory not found" 131 fi 132 133 LIB_HTTPD_MODULE_PATH="$DEFAULT_HTTPD_MODULE_PATH" 134 fi 135else 136 test_skip_or_die GIT_TEST_HTTPD \ 137 "Could not identify web server at '$LIB_HTTPD_PATH'" 138fi 139 140if test -n "$LIB_HTTPD_DAV" && test -f /etc/os-release 141then 142 case "$(grep "^ID=" /etc/os-release | cut -d= -f2-)" in 143 alpine) 144 # The WebDAV module in Alpine Linux is broken at least up to 145 # Alpine v3.16 as the default DBM driver is missing. 146 # 147 # https://gitlab.alpinelinux.org/alpine/aports/-/issues/13112 148 test_skip_or_die GIT_TEST_HTTPD \ 149 "Apache WebDAV module does not have default DBM backend driver" 150 ;; 151 esac 152fi 153 154install_script () { 155 write_script "$HTTPD_ROOT_PATH/$1" <"$TEST_PATH/$1" 156} 157 158prepare_httpd() { 159 mkdir -p "$HTTPD_DOCUMENT_ROOT_PATH" 160 cp "$TEST_PATH"/passwd "$HTTPD_ROOT_PATH" 161 cp "$TEST_PATH"/proxy-passwd "$HTTPD_ROOT_PATH" 162 install_script incomplete-length-upload-pack-v2-http.sh 163 install_script incomplete-body-upload-pack-v2-http.sh 164 install_script error-no-report.sh 165 install_script broken-smart-http.sh 166 install_script error-smart-http.sh 167 install_script error.sh 168 install_script apply-one-time-script.sh 169 install_script nph-custom-auth.sh 170 171 ln -s "$LIB_HTTPD_MODULE_PATH" "$HTTPD_ROOT_PATH/modules" 172 173 if test -n "$LIB_HTTPD_SSL" 174 then 175 HTTPD_PROTO=https 176 177 RANDFILE_PATH="$HTTPD_ROOT_PATH"/.rnd openssl req \ 178 -config "$TEST_PATH/ssl.cnf" \ 179 -new -x509 -nodes \ 180 -out "$HTTPD_ROOT_PATH/httpd.pem" \ 181 -keyout "$HTTPD_ROOT_PATH/httpd.pem" 182 GIT_SSL_NO_VERIFY=t 183 export GIT_SSL_NO_VERIFY 184 HTTPD_PARA="$HTTPD_PARA -DSSL" 185 else 186 HTTPD_PROTO=http 187 fi 188 HTTPD_DEST=127.0.0.1:$LIB_HTTPD_PORT 189 HTTPD_URL=$HTTPD_PROTO://$HTTPD_DEST 190 HTTPD_URL_USER=$HTTPD_PROTO://user%40host@$HTTPD_DEST 191 HTTPD_URL_USER_PASS=$HTTPD_PROTO://user%40host:pass%40host@$HTTPD_DEST 192 193 if test -n "$LIB_HTTPD_DAV" || test -n "$LIB_HTTPD_SVN" 194 then 195 HTTPD_PARA="$HTTPD_PARA -DDAV" 196 197 if test -n "$LIB_HTTPD_SVN" 198 then 199 HTTPD_PARA="$HTTPD_PARA -DSVN" 200 LIB_HTTPD_SVNPATH="$rawsvnrepo" 201 svnrepo="http://127.0.0.1:$LIB_HTTPD_PORT/" 202 svnrepo="$svnrepo$LIB_HTTPD_SVN" 203 export LIB_HTTPD_SVN LIB_HTTPD_SVNPATH 204 fi 205 fi 206 207 if test -n "$LIB_HTTPD_PROXY" 208 then 209 HTTPD_PARA="$HTTPD_PARA -DPROXY" 210 fi 211} 212 213enable_http2 () { 214 HTTPD_PARA="$HTTPD_PARA -DHTTP2" 215 test_set_prereq HTTP2 216} 217 218enable_cgipassauth () { 219 # We are looking for 2.4.13 or more recent. Since we only support 220 # 2.4 and up, no need to check for older major/minor. 221 if test "$HTTPD_VERSION_MAJOR" = 2 && 222 test "$HTTPD_VERSION_MINOR" = 4 && 223 test "$(echo $HTTPD_VERSION | cut -d. -f3)" -lt 13 224 then 225 echo >&4 "apache $HTTPD_VERSION too old for CGIPassAuth" 226 return 227 fi 228 HTTPD_PARA="$HTTPD_PARA -DUSE_CGIPASSAUTH" 229 test_set_prereq CGIPASSAUTH 230} 231 232start_httpd() { 233 prepare_httpd >&3 2>&4 234 235 test_atexit stop_httpd 236 237 "$LIB_HTTPD_PATH" -d "$HTTPD_ROOT_PATH" \ 238 -f "$TEST_PATH/apache.conf" $HTTPD_PARA \ 239 -c "Listen 127.0.0.1:$LIB_HTTPD_PORT" -k start \ 240 >&3 2>&4 241 if test $? -ne 0 242 then 243 cat "$HTTPD_ROOT_PATH"/error.log >&4 2>/dev/null 244 test_skip_or_die GIT_TEST_HTTPD "web server setup failed" 245 fi 246} 247 248stop_httpd() { 249 "$LIB_HTTPD_PATH" -d "$HTTPD_ROOT_PATH" \ 250 -f "$TEST_PATH/apache.conf" $HTTPD_PARA -k stop 251} 252 253test_http_push_nonff () { 254 REMOTE_REPO=$1 255 LOCAL_REPO=$2 256 BRANCH=$3 257 EXPECT_CAS_RESULT=${4-failure} 258 259 test_expect_success 'non-fast-forward push fails' ' 260 cd "$REMOTE_REPO" && 261 HEAD=$(git rev-parse --verify HEAD) && 262 263 cd "$LOCAL_REPO" && 264 git checkout $BRANCH && 265 echo "changed" > path2 && 266 git commit -a -m path2 --amend && 267 268 test_must_fail git push -v origin >output 2>&1 && 269 ( 270 cd "$REMOTE_REPO" && 271 echo "$HEAD" >expect && 272 git rev-parse --verify HEAD >actual && 273 test_cmp expect actual 274 ) 275 ' 276 277 test_expect_success 'non-fast-forward push show ref status' ' 278 grep "^ ! \[rejected\][ ]*$BRANCH -> $BRANCH (non-fast-forward)$" output 279 ' 280 281 test_expect_success 'non-fast-forward push shows help message' ' 282 test_grep "Updates were rejected because" output 283 ' 284 285 test_expect_${EXPECT_CAS_RESULT} 'force with lease aka cas' ' 286 HEAD=$( cd "$REMOTE_REPO" && git rev-parse --verify HEAD ) && 287 test_when_finished '\'' 288 (cd "$REMOTE_REPO" && git update-ref HEAD "$HEAD") 289 '\'' && 290 ( 291 cd "$LOCAL_REPO" && 292 git push -v --force-with-lease=$BRANCH:$HEAD origin 293 ) && 294 git rev-parse --verify "$BRANCH" >expect && 295 ( 296 cd "$REMOTE_REPO" && git rev-parse --verify HEAD 297 ) >actual && 298 test_cmp expect actual 299 ' 300} 301 302setup_askpass_helper() { 303 test_expect_success 'setup askpass helper' ' 304 write_script "$TRASH_DIRECTORY/askpass" <<-\EOF && 305 echo >>"$TRASH_DIRECTORY/askpass-query" "askpass: $*" && 306 case "$*" in 307 *Username*) 308 what=user 309 ;; 310 *Password*) 311 what=pass 312 ;; 313 esac && 314 cat "$TRASH_DIRECTORY/askpass-$what" 315 EOF 316 GIT_ASKPASS="$TRASH_DIRECTORY/askpass" && 317 export GIT_ASKPASS && 318 export TRASH_DIRECTORY 319 ' 320} 321 322set_askpass() { 323 >"$TRASH_DIRECTORY/askpass-query" && 324 echo "$1" >"$TRASH_DIRECTORY/askpass-user" && 325 echo "$2" >"$TRASH_DIRECTORY/askpass-pass" 326} 327 328expect_askpass() { 329 dest=$HTTPD_DEST${3+/$3} 330 331 { 332 case "$1" in 333 none) 334 ;; 335 pass) 336 echo "askpass: Password for '$HTTPD_PROTO://$2@$dest': " 337 ;; 338 both) 339 echo "askpass: Username for '$HTTPD_PROTO://$dest': " 340 echo "askpass: Password for '$HTTPD_PROTO://$2@$dest': " 341 ;; 342 *) 343 false 344 ;; 345 esac 346 } >"$TRASH_DIRECTORY/askpass-expect" && 347 test_cmp "$TRASH_DIRECTORY/askpass-expect" \ 348 "$TRASH_DIRECTORY/askpass-query" 349} 350 351strip_access_log() { 352 sed -e " 353 s/^.* \"// 354 s/\"// 355 s/ [1-9][0-9]*\$// 356 s/^GET /GET / 357 " "$HTTPD_ROOT_PATH"/access.log 358} 359 360# Requires one argument: the name of a file containing the expected stripped 361# access log entries. 362check_access_log() { 363 sort "$1" >"$1".sorted && 364 strip_access_log >access.log.stripped && 365 sort access.log.stripped >access.log.sorted && 366 if ! test_cmp "$1".sorted access.log.sorted 367 then 368 test_cmp "$1" access.log.stripped 369 fi 370}