# Shell library to run an HTTP server for use in tests. # Ends the test early if httpd tests should not be run, # for example because the user has not enabled them. # # Usage: # # . ./test-lib.sh # . "$TEST_DIRECTORY"/lib-httpd.sh # start_httpd # # test_expect_success '...' ' # ... # ' # # test_expect_success ... # # stop_httpd # test_done # # Can be configured using the following variables. # # GIT_TEST_HTTPD enable HTTPD tests # LIB_HTTPD_PATH web server path # LIB_HTTPD_MODULE_PATH web server modules path # LIB_HTTPD_PORT listening port # LIB_HTTPD_DAV enable DAV # LIB_HTTPD_SVN enable SVN at given location (e.g. "svn") # LIB_HTTPD_SSL enable SSL # # Copyright (c) 2008 Clemens Buchacher # if test -n $NO_CURL { setglobal skip_all = ''skipping test, git built without http support'' test_done } if test -n $NO_EXPAT && test -n $LIB_HTTPD_DAV { setglobal skip_all = ''skipping test, git built without expat support'' test_done } test_tristate GIT_TEST_HTTPD if test $GIT_TEST_HTTPD = false { setglobal skip_all = '"Network testing disabled (unset GIT_TEST_HTTPD to enable)'" test_done } if ! test_have_prereq NOT_ROOT { test_skip_or_die $GIT_TEST_HTTPD \ "Cannot run httpd tests as root" } setglobal HTTPD_PARA = ''"" for DEFAULT_HTTPD_PATH in ['/usr/sbin/httpd' '/usr/sbin/apache2]' { if test -x $DEFAULT_HTTPD_PATH { break } } for DEFAULT_HTTPD_MODULE_PATH in ['/usr/libexec/apache2' \ '/usr/lib/apache2/modules' \ '/usr/lib64/httpd/modules' \ '/usr/lib/httpd/modules]' { if test -d $DEFAULT_HTTPD_MODULE_PATH { break } } match $[uname] { with Darwin setglobal HTTPD_PARA = ""$HTTPD_PARA -DDarwin"" } setglobal LIB_HTTPD_PATH = $(LIB_HTTPD_PATH-"$DEFAULT_HTTPD_PATH") setglobal LIB_HTTPD_PORT = $(LIB_HTTPD_PORT-${this_test#t}) setglobal TEST_PATH = ""$TEST_DIRECTORY"/lib-httpd" setglobal HTTPD_ROOT_PATH = ""$PWD"/httpd" setglobal HTTPD_DOCUMENT_ROOT_PATH = "$HTTPD_ROOT_PATH/www" # hack to suppress apache PassEnv warnings setglobal GIT_VALGRIND = $GIT_VALGRIND; export GIT_VALGRIND setglobal GIT_VALGRIND_OPTIONS = $GIT_VALGRIND_OPTIONS; export GIT_VALGRIND_OPTIONS setglobal GIT_TRACE = $GIT_TRACE; export GIT_TRACE if ! test -x $LIB_HTTPD_PATH { test_skip_or_die $GIT_TEST_HTTPD "no web server found at '$LIB_HTTPD_PATH'" } setglobal HTTPD_VERSION = $[$LIB_HTTPD_PATH -v | \ sed -n 's/^Server version: Apache\/\([0-9]*\)\..*$/\1/p; q] if test -n $HTTPD_VERSION { if test -z $LIB_HTTPD_MODULE_PATH { if ! test $HTTPD_VERSION -ge 2 { test_skip_or_die $GIT_TEST_HTTPD \ "at least Apache version 2 is required" } if ! test -d $DEFAULT_HTTPD_MODULE_PATH { test_skip_or_die $GIT_TEST_HTTPD \ "Apache module directory not found" } setglobal LIB_HTTPD_MODULE_PATH = $DEFAULT_HTTPD_MODULE_PATH } } else { test_skip_or_die $GIT_TEST_HTTPD \ "Could not identify web server at '$LIB_HTTPD_PATH'" } proc install_script { write_script "$HTTPD_ROOT_PATH/$1" <"$TEST_PATH/$1" } proc prepare_httpd { mkdir -p $HTTPD_DOCUMENT_ROOT_PATH cp "$TEST_PATH"/passwd $HTTPD_ROOT_PATH install_script broken-smart-http.sh install_script error.sh ln -s $LIB_HTTPD_MODULE_PATH "$HTTPD_ROOT_PATH/modules" if test -n $LIB_HTTPD_SSL { setglobal HTTPD_PROTO = 'https' env RANDFILE_PATH="$HTTPD_ROOT_PATH"/.rnd openssl req \ -config "$TEST_PATH/ssl.cnf" \ -new -x509 -nodes \ -out "$HTTPD_ROOT_PATH/httpd.pem" \ -keyout "$HTTPD_ROOT_PATH/httpd.pem" setglobal GIT_SSL_NO_VERIFY = 't' export GIT_SSL_NO_VERIFY setglobal HTTPD_PARA = ""$HTTPD_PARA -DSSL"" } else { setglobal HTTPD_PROTO = 'http' } setglobal HTTPD_DEST = "127.0.0.1:$LIB_HTTPD_PORT" setglobal HTTPD_URL = "$HTTPD_PROTO://$HTTPD_DEST" setglobal HTTPD_URL_USER = "$HTTPD_PROTO://user%40host@$HTTPD_DEST" setglobal HTTPD_URL_USER_PASS = "$HTTPD_PROTO://user%40host:pass%40host@$HTTPD_DEST" if test -n $LIB_HTTPD_DAV || test -n $LIB_HTTPD_SVN { setglobal HTTPD_PARA = ""$HTTPD_PARA -DDAV"" if test -n $LIB_HTTPD_SVN { setglobal HTTPD_PARA = ""$HTTPD_PARA -DSVN"" setglobal LIB_HTTPD_SVNPATH = $rawsvnrepo setglobal svnrepo = ""http://127.0.0.1:$LIB_HTTPD_PORT/"" setglobal svnrepo = ""$svnrepo$LIB_HTTPD_SVN"" export LIB_HTTPD_SVN LIB_HTTPD_SVNPATH } } } proc start_httpd { prepare_httpd > !3 !2 > !4 trap 'code=$?; stop_httpd; (exit $code); die' EXIT $LIB_HTTPD_PATH -d $HTTPD_ROOT_PATH \ -f "$TEST_PATH/apache.conf" $HTTPD_PARA \ -c "Listen 127.0.0.1:$LIB_HTTPD_PORT" -k start \ > !3 !2 > !4 if test $Status -ne 0 { trap 'die' EXIT cat "$HTTPD_ROOT_PATH"/error.log > !4 !2 >/dev/null test_skip_or_die $GIT_TEST_HTTPD "web server setup failed" } } proc stop_httpd { trap 'die' EXIT $LIB_HTTPD_PATH -d $HTTPD_ROOT_PATH \ -f "$TEST_PATH/apache.conf" $HTTPD_PARA -k stop } proc test_http_push_nonff { setglobal REMOTE_REPO = $1 setglobal LOCAL_REPO = $2 setglobal BRANCH = $3 setglobal EXPECT_CAS_RESULT = $(4-failure) 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 && test_must_fail git push -v origin >output 2>&1 && (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 ' test_expect_success 'non-fast-forward push shows help message' ' test_i18ngrep "Updates were rejected because" output ' test_expect_$(EXPECT_CAS_RESULT) '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 ' } proc setup_askpass_helper { test_expect_success 'setup askpass helper' ' write_script "$TRASH_DIRECTORY/askpass" <<-\EOF && echo >>"$TRASH_DIRECTORY/askpass-query" "askpass: $*" && case "$*" in *Username*) what=user ;; *Password*) what=pass ;; esac && cat "$TRASH_DIRECTORY/askpass-$what" EOF GIT_ASKPASS="$TRASH_DIRECTORY/askpass" && export GIT_ASKPASS && export TRASH_DIRECTORY ' } proc set_askpass { >"$TRASH_DIRECTORY/askpass-query" && echo $1 >"$TRASH_DIRECTORY/askpass-user" && echo $2 >"$TRASH_DIRECTORY/askpass-pass" } proc expect_askpass { setglobal dest = "$HTTPD_DEST$(3+/$3)" do { match $1 { with none with pass echo "askpass: Password for 'http://$2@$dest': " with both echo "askpass: Username for 'http://$dest': " echo "askpass: Password for 'http://$2@$dest': " with * false } } >"$TRASH_DIRECTORY/askpass-expect" && test_cmp "$TRASH_DIRECTORY/askpass-expect" \ "$TRASH_DIRECTORY/askpass-query" }