diff options
Diffstat (limited to 'subversion/tests/cmdline/davautocheck.sh')
-rwxr-xr-x | subversion/tests/cmdline/davautocheck.sh | 213 |
1 files changed, 174 insertions, 39 deletions
diff --git a/subversion/tests/cmdline/davautocheck.sh b/subversion/tests/cmdline/davautocheck.sh index 5ff4cb1..21fe418 100755 --- a/subversion/tests/cmdline/davautocheck.sh +++ b/subversion/tests/cmdline/davautocheck.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # # # Licensed to the Apache Software Foundation (ASF) under one @@ -27,7 +27,7 @@ # testing are: # - Subversion built using --enable-shared --enable-dso --with-apxs options, # - Working Apache 2 HTTPD Server with the apxs program reachable through -# PATH or specified via the APXS environment variable, +# PATH or specified via the APXS Makefile variable or environment variable, # - Modules dav_module and log_config_module compiled as DSO or built into # Apache HTTPD Server executable. # The basic intension of this script is to be able to perform "make check" @@ -67,6 +67,10 @@ # # To prevent the server from advertising httpv2, pass USE_HTTPV1 in # the environment. +# +# To enable "SVNCacheRevProps on" set CACHE_REVPROPS in the environment. +# +# To test over https set USE_SSL in the environment. # # To use value for "SVNPathAuthz" directive set SVN_PATH_AUTHZ with # appropriate value in the environment. @@ -77,37 +81,51 @@ # Passing --no-tests as argv[1] will have the script start a server # but not run any tests. +PYTHON=${PYTHON:-python} + SCRIPTDIR=$(dirname $0) SCRIPT=$(basename $0) -trap stop_httpd_and_die SIGHUP SIGTERM SIGINT +trap stop_httpd_and_die HUP TERM INT # Ensure the server uses a known locale. LC_ALL=C export LC_ALL -function stop_httpd_and_die() { +stop_httpd_and_die() { [ -e "$HTTPD_PID" ] && kill $(cat "$HTTPD_PID") + echo "HTTPD stopped." exit 1 } -function say() { +say() { echo "$SCRIPT: $*" } -function fail() { +fail() { say $* stop_httpd_and_die } -function query() { - echo -n "$SCRIPT: $1 (y/n)? [$2] " - read -n 1 -t 32 +query() { + printf "%s" "$SCRIPT: $1 (y/n)? [$2] " + if [ -n "$BASH_VERSION" ]; then + read -n 1 -t 32 + else + # + prog=$(cat) <<'EOF' +import select as s +import sys +if s.select([sys.stdin.fileno()], [], [], 32)[0]: + sys.stdout.write(sys.stdin.read(1)) +EOF + REPLY=`stty cbreak; $PYTHON -c "$prog" "$@"; stty -cbreak` + fi echo [ "${REPLY:-$2}" = 'y' ] } -function get_loadmodule_config() { +get_loadmodule_config() { local SO="$($APXS -q LIBEXECDIR)/$1.so" # shared object module? @@ -124,7 +142,7 @@ function get_loadmodule_config() { } # Check apxs's SBINDIR and BINDIR for given program names -function get_prog_name() { +get_prog_name() { for prog in $* do for dir in $($APXS -q SBINDIR) $($APXS -q BINDIR) @@ -141,6 +159,17 @@ function get_prog_name() { # Don't assume sbin is in the PATH. PATH="$PATH:/usr/sbin:/usr/local/sbin" +# Find the source and build directories. The build dir can be found if it is +# the current working dir or the source dir. +ABS_SRCDIR=$(cd ${SCRIPTDIR}/../../../; pwd) +if [ -x subversion/svn/svn ]; then + ABS_BUILDDIR=$(pwd) +elif [ -x $ABS_SRCDIR/subversion/svn/svn ]; then + ABS_BUILDDIR=$ABS_SRCDIR +else + fail "Run this script from the root of Subversion's build tree!" +fi + # Remove any proxy environmental variables that affect wget or curl. # We don't need a proxy to connect to localhost and having the proxy # environmental variables set breaks the Apache configuration file @@ -151,10 +180,18 @@ unset http_proxy unset HTTPS_PROXY # Pick up value from environment or PATH (also try apxs2 - for Debian) -[ ${APXS:+set} ] \ - || APXS=$(which apxs) \ - || APXS=$(which apxs2) \ - || fail "neither apxs or apxs2 found - required to run davautocheck" +if [ ${APXS:+set} ]; then + : +elif APXS=$(grep '^APXS' $ABS_BUILDDIR/Makefile | sed 's/^APXS *= *//') && \ + [ -n "$APXS" ]; then + : +elif APXS=$(which apxs); then + : +elif APXS=$(which apxs2); then + : +else + fail "neither apxs or apxs2 found - required to run davautocheck" +fi [ -x $APXS ] || fail "Can't execute apxs executable $APXS" @@ -172,17 +209,9 @@ if [ ${SVN_PATH_AUTHZ:+set} ]; then SVN_PATH_AUTHZ_LINE="SVNPathAuthz ${SVN_PATH_AUTHZ}" fi -# Find the source and build directories. The build dir can be found if it is -# the current working dir or the source dir. -pushd ${SCRIPTDIR}/../../../ > /dev/null -ABS_SRCDIR=$(pwd) -popd > /dev/null -if [ -x subversion/svn/svn ]; then - ABS_BUILDDIR=$(pwd) -elif [ -x $ABS_SRCDIR/subversion/svn/svn ]; then - ABS_BUILDDIR=$ABS_SRCDIR -else - fail "Run this script from the root of Subversion's build tree!" +CACHE_REVPROPS_SETTING=off +if [ ${CACHE_REVPROPS:+set} ]; then + CACHE_REVPROPS_SETTING=on fi if [ ${MODULE_PATH:+set} ]; then @@ -198,12 +227,24 @@ fi [ -r "$MOD_AUTHZ_SVN" ] \ || fail "authz_svn_module not found, please use '--enable-shared --enable-dso --with-apxs' with your 'configure' script" -export LD_LIBRARY_PATH="$ABS_BUILDDIR/subversion/libsvn_ra_neon/.libs:$ABS_BUILDDIR/subversion/libsvn_ra_local/.libs:$ABS_BUILDDIR/subversion/libsvn_ra_svn/.libs" +for d in "$ABS_BUILDDIR"/subversion/*/.libs; do + if [ -z "$BUILDDIR_LIBRARY_PATH" ]; then + BUILDDIR_LIBRARY_PATH="$d" + else + BUILDDIR_LIBRARY_PATH="$BUILDDIR_LIBRARY_PATH:$d" + fi +done case "`uname`" in - Darwin*) LDD='otool -L' + Darwin*) + LDD='otool -L' + DYLD_LIBRARY_PATH="$BUILDDIR_LIBRARY_PATH:$DYLD_LIBRARY_PATH" + export DYLD_LIBRARY_PATH ;; - *) LDD='ldd' + *) + LDD='ldd' + LD_LIBRARY_PATH="$BUILDDIR_LIBRARY_PATH:$LD_LIBRARY_PATH" + export LD_LIBRARY_PATH ;; esac @@ -262,8 +303,23 @@ if [ ${APACHE_MPM:+set} ]; then LOAD_MOD_MPM=$(get_loadmodule_config mod_mpm_$APACHE_MPM) \ || fail "MPM module not found" fi +if [ ${USE_SSL:+set} ]; then + LOAD_MOD_SSL=$(get_loadmodule_config mod_ssl) \ + || fail "SSL module not found" +fi + +random_port() { + if [ -n "$BASH_VERSION" ]; then + echo $(($RANDOM+1024)) + else + $PYTHON -c 'import random; print random.randint(1024, 2**16-1)' + fi +} -HTTPD_PORT=$(($RANDOM+1024)) +HTTPD_PORT=$(random_port) +while netstat -an | grep $HTTPD_PORT | grep 'LISTEN'; do + HTTPD_PORT=$(random_port) +done HTTPD_ROOT="$ABS_BUILDDIR/subversion/tests/cmdline/httpd-$(date '+%Y%m%d-%H%M%S')" HTTPD_CFG="$HTTPD_ROOT/cfg" HTTPD_PID="$HTTPD_ROOT/pid" @@ -278,6 +334,57 @@ mkdir "$HTTPD_ROOT" \ say "Using directory '$HTTPD_ROOT'..." +if [ ${USE_SSL:+set} ]; then + say "Setting up SSL" + BASE_URL="https://localhost:$HTTPD_PORT" +# A self-signed certifcate for localhost that expires after 2039-12-30 +# generated via: +# openssl req -new -x509 -nodes -days 10000 -out cert.pem -keyout cert-key.pem +# This is embedded, rather than generated on-the-fly, to avoid consuming +# system entropy. + SSL_CERTIFICATE_FILE="$HTTPD_ROOT/cert.pem" +cat > "$SSL_CERTIFICATE_FILE" <<__EOF__ +-----BEGIN CERTIFICATE----- +MIIC7zCCAligAwIBAgIJALP1pLDiJRtuMA0GCSqGSIb3DQEBBQUAMFkxCzAJBgNV +BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX +aWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMTCWxvY2FsaG9zdDAeFw0xMjA4MTMxNDA5 +MDRaFw0zOTEyMzAxNDA5MDRaMFkxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21l +LVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNV +BAMTCWxvY2FsaG9zdDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA9kBx6trU +WQnFNDrW+dU159zEbSWGts3ScITIMTLE4EclMh50SP2BnJDnetkNO8JhPXOm4KZi +XdJugWAk0NmpawhAk3xVxHh5N8wwyPk3IMx7+Yu+sgcsd0Dj9YK1fIazgTUp/Dsk +VGJvqu+kgNYxPvzWi/OsBLW/ZNp+spTzoAcCAwEAAaOBvjCBuzAdBgNVHQ4EFgQU +f7OIDackB7zzPm10aiQgq9WzRdQwgYsGA1UdIwSBgzCBgIAUf7OIDackB7zzPm10 +aiQgq9WzRdShXaRbMFkxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRl +MSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEjAQBgNVBAMTCWxv +Y2FsaG9zdIIJALP1pLDiJRtuMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD +gYEAD2rdgeVYCSEeseEfFCTNte//rDsT3coO9SbGOpmlCJ5TfbmXjs2YaQZH7NST +mla3hw2Bf9ppTUw1ZWvOVgD3mpxAbYNBA/4HaxmK4GlS2kZsKiMr0xgcVGjmEIW/ +HS9q+PHwStDKNSyYc1+m+bUmeRGUKLgC4kuBF7JDK8A2WYc= +-----END CERTIFICATE----- +__EOF__ + SSL_CERTIFICATE_KEY_FILE="$HTTPD_ROOT/cert-key.pem" +cat > "$SSL_CERTIFICATE_KEY_FILE" <<__EOF__ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQD2QHHq2tRZCcU0Otb51TXn3MRtJYa2zdJwhMgxMsTgRyUyHnRI +/YGckOd62Q07wmE9c6bgpmJd0m6BYCTQ2alrCECTfFXEeHk3zDDI+TcgzHv5i76y +Byx3QOP1grV8hrOBNSn8OyRUYm+q76SA1jE+/NaL86wEtb9k2n6ylPOgBwIDAQAB +AoGBAJBzhV+rNl10qcXVrj2noJN+oYsVNE0Pt55hhb22dl7J3TvlOXmHm/xn1CHw +KR8hC0GtEfs+Hv3CbyhdabtJs2L7QxO5VjgLO+onBmAOw1iPF9DjbMcAlFJnoOWI +HYwANOWGp2jRxL5cHUfrBVCgUISen3VUZEnQkr4n/Zty/QEBAkEA/XIZ3oh5MiFA +o4IaFaFQpBc6K/e6fnM0217scaPvfZiYS1k9Fx/UQTAGsxJOnhnsi04WgHPMS5wB +RP4/PiIGIQJBAPi7yIKKS4E8hWBZL+79TI8Zm2uehGCB8V6m9k7e3I82To9Tgcow +qZHsAPtN50fg85I94L3REg2FSQlDlzbMkScCQQC2pweLv/EQNrS94eJomkRirban +vzYxMVfzjRp737iWXGXNT7feNXsjq7f4UAZGnMpDrvg6hLnD999WWKE9ZwnhAkBl +c9p9/EB9zxyrxtT5StGuUIiHJdnirz2vGLTASMB3nXP/m9UFjkGr5jIkTos2Uzel +/50qbxtI7oNyxuHnlRrjAkASfQ51kaBcABYRiacesQi94W/kE3MkgHWkCXNb6//u +gxk/ezALZ8neJzJudzRkX3auGwH1ne9vCM1ED5dkM54H +-----END RSA PRIVATE KEY----- +__EOF__ + SSL_MAKE_VAR="SSL_CERT=$SSL_CERTIFICATE_FILE" + SSL_TEST_ARG="--ssl-cert $SSL_CERTIFICATE_FILE" +fi + say "Adding users for lock authentication" $HTPASSWD -bc $HTTPD_USERS jrandom rayjandom $HTPASSWD -b $HTTPD_USERS jconstant rayjandom @@ -286,6 +393,7 @@ touch $HTTPD_MIME_TYPES cat > "$HTTPD_CFG" <<__EOF__ $LOAD_MOD_MPM +$LOAD_MOD_SSL $LOAD_MOD_LOG_CONFIG $LOAD_MOD_MIME $LOAD_MOD_ALIAS @@ -309,9 +417,25 @@ User $(id -un) Group $(id -gn) __EOF__ else +HTTPD_LOCK="$HTTPD_ROOT/lock" +mkdir "$HTTPD_LOCK" \ + || fail "couldn't create lock directory '$HTTPD_LOCK'" cat >> "$HTTPD_CFG" <<__EOF__ -# TODO: maybe uncomment this for prefork,worker MPMs only? -# Mutex file:lock mpm-accept +# worker and prefork MUST have a mpm-accept lockfile in 2.3.0+ +<IfModule worker.c> + Mutex "file:$HTTPD_LOCK" mpm-accept +</IfModule> +<IfModule prefork.c> + Mutex "file:$HTTPD_LOCK" mpm-accept +</IfModule> +__EOF__ +fi + +if [ ${USE_SSL:+set} ]; then +cat >> "$HTTPD_CFG" <<__EOF__ +SSLEngine on +SSLCertificateFile $SSL_CERTIFICATE_FILE +SSLCertificateKeyFile $SSL_CERTIFICATE_KEY_FILE __EOF__ fi @@ -333,7 +457,10 @@ MaxRequestsPerChild 0 <IfModule worker.c> ThreadsPerChild 8 </IfModule> -MaxClients 16 +<IfModule event.c> + ThreadsPerChild 8 +</IfModule> +MaxClients 32 HostNameLookups Off LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" format CustomLog "$HTTPD_ROOT/req" format @@ -356,6 +483,7 @@ CustomLog "$HTTPD_ROOT/ops" "%t %u %{SVN-REPOS-NAME}e %{SVN-ACTION}e" AuthUserFile $HTTPD_USERS Require valid-user SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL} + SVNCacheRevProps ${CACHE_REVPROPS_SETTING} ${SVN_PATH_AUTHZ_LINE} </Location> <Location /svn-test-work/local_tmp/repos> @@ -383,6 +511,7 @@ $START & sleep 2 say "HTTPD started and listening on '$BASE_URL'..." +#query "Ready" "y" # Perform a trivial validation of our httpd configuration by # downloading a file and comparing it to the original copy. @@ -391,7 +520,7 @@ say "HTTPD started and listening on '$BASE_URL'..." ### server/request.c:ap_process_request_internal(): ### [Wed Feb 22 13:06:55 2006] [crit] [client 127.0.0.1] configuration error: couldn't check user: /cfg HTTP_FETCH=wget -HTTP_FETCH_OUTPUT="-q -O" +HTTP_FETCH_OUTPUT="--no-check-certificate -q -O" type wget > /dev/null 2>&1 if [ $? -ne 0 ]; then type curl > /dev/null 2>&1 @@ -399,7 +528,7 @@ if [ $? -ne 0 ]; then fail "Neither curl or wget found." fi HTTP_FETCH=curl - HTTP_FETCH_OUTPUT='-s -o' + HTTP_FETCH_OUTPUT='-s -k -o' fi $HTTP_FETCH $HTTP_FETCH_OUTPUT "$HTTPD_CFG-copy" "$BASE_URL/cfg" diff -q "$HTTPD_CFG" "$HTTPD_CFG-copy" > /dev/null \ @@ -409,9 +538,16 @@ rm "$HTTPD_CFG-copy" say "HTTPD is good" if [ $# -eq 1 ] && [ "x$1" = 'x--no-tests' ]; then + echo "http://localhost:$HTTPD_PORT" exit fi +if type time > /dev/null; then + TIME_CMD=time +else + TIME_CMD="" +fi + say "starting the tests..." CLIENT_CMD="$ABS_BUILDDIR/subversion/svn/svn" @@ -429,15 +565,14 @@ else fi if [ $# = 0 ]; then - time make check "BASE_URL=$BASE_URL" + $TIME_CMD make check "BASE_URL=$BASE_URL" $SSL_MAKE_VAR r=$? else - pushd "$ABS_BUILDDIR/subversion/tests/cmdline/" >/dev/null + (cd "$ABS_BUILDDIR/subversion/tests/cmdline/" TEST="$1" shift - time "$ABS_SRCDIR/subversion/tests/cmdline/${TEST}_tests.py" "--url=$BASE_URL" "$@" + $TIME_CMD "$ABS_SRCDIR/subversion/tests/cmdline/${TEST}_tests.py" "--url=$BASE_URL" $SSL_TEST_ARG "$@") r=$? - popd >/dev/null fi say "Finished testing..." |