#!/bin/bash
SCRIPTDIR=$(dirname $0)
SCRIPT=$(basename $0)
trap stop_httpd_and_die SIGHUP SIGTERM SIGINT
LC_ALL=C
export LC_ALL
function stop_httpd_and_die() {
[ -e "$HTTPD_PID" ] && kill $(cat "$HTTPD_PID")
exit 1
}
function say() {
echo "$SCRIPT: $*"
}
function fail() {
say $*
stop_httpd_and_die
}
function query() {
echo -n "$SCRIPT: $1 (y/n)? [$2] "
read -n 1 -t 32
echo
[ "${REPLY:-$2}" = 'y' ]
}
function get_loadmodule_config() {
local SO="$($APXS -q LIBEXECDIR)/$1.so"
if [ -r "$SO" ]; then
local NM=$(echo "$1" | sed 's|mod_\(.*\)|\1_module|')
echo "LoadModule $NM \"$SO\"" &&
return
fi
"$HTTPD" -l | grep -q "$1\\.c" && return
return 1
}
function get_prog_name() {
for prog in $*
do
for dir in $($APXS -q SBINDIR) $($APXS -q BINDIR)
do
if [ -e "$dir/$prog" ]; then
echo "$dir/$prog" && return
fi
done
done
return 1
}
PATH="$PATH:/usr/sbin:/usr/local/sbin"
unset PROXY
unset http_proxy
unset HTTPS_PROXY
[ ${APXS:+set} ] \
|| APXS=$(which apxs) \
|| APXS=$(which apxs2) \
|| fail "neither apxs or apxs2 found - required to run davautocheck"
[ -x $APXS ] || fail "Can't execute apxs executable $APXS"
say "Using '$APXS'..."
ADVERTISE_V2_PROTOCOL=on
if [ ${USE_HTTPV1:+set} ]; then
ADVERTISE_V2_PROTOCOL=off
fi
SVN_PATH_AUTHZ_LINE=""
if [ ${SVN_PATH_AUTHZ:+set} ]; then
SVN_PATH_AUTHZ_LINE="SVNPathAuthz ${SVN_PATH_AUTHZ}"
fi
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!"
fi
if [ ${MODULE_PATH:+set} ]; then
MOD_DAV_SVN="$MODULE_PATH/mod_dav_svn.so"
MOD_AUTHZ_SVN="$MODULE_PATH/mod_authz_svn.so"
else
MOD_DAV_SVN="$ABS_BUILDDIR/subversion/mod_dav_svn/.libs/mod_dav_svn.so"
MOD_AUTHZ_SVN="$ABS_BUILDDIR/subversion/mod_authz_svn/.libs/mod_authz_svn.so"
fi
[ -r "$MOD_DAV_SVN" ] \
|| fail "dav_svn_module not found, please use '--enable-shared --enable-dso --with-apxs' with your 'configure' script"
[ -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"
case "`uname`" in
Darwin*) LDD='otool -L'
;;
*) LDD='ldd'
;;
esac
httpd="$($APXS -q PROGNAME)"
HTTPD=$(get_prog_name $httpd) || fail "HTTPD '$HTTPD' not found"
[ -x $HTTPD ] || fail "HTTPD '$HTTPD' not executable"
"$HTTPD" -v 1>/dev/null 2>&1 \
|| fail "HTTPD '$HTTPD' doesn't start properly"
say "Using '$HTTPD'..."
HTPASSWD=$(get_prog_name htpasswd htpasswd2) \
|| fail "Could not find htpasswd or htpasswd2"
[ -x $HTPASSWD ] \
|| fail "HTPASSWD '$HTPASSWD' not executable"
say "Using '$HTPASSWD'..."
LOAD_MOD_DAV=$(get_loadmodule_config mod_dav) \
|| fail "DAV module not found"
LOAD_MOD_LOG_CONFIG=$(get_loadmodule_config mod_log_config) \
|| fail "log_config module not found"
LOAD_MOD_MIME=$(get_loadmodule_config mod_mime) \
|| fail "MIME module not found"
LOAD_MOD_ALIAS=$(get_loadmodule_config mod_alias) \
|| fail "ALIAS module not found"
LOAD_MOD_AUTH=$(get_loadmodule_config mod_auth) \
|| {
say "Monolithic Auth module not found. Assuming we run against Apache 2.1+"
LOAD_MOD_AUTH="$(get_loadmodule_config mod_auth_basic)" \
|| fail "Auth_Basic module not found."
LOAD_MOD_ACCESS_COMPAT="$(get_loadmodule_config mod_access_compat)" \
&& {
say "Found modules for Apache 2.3.0+"
LOAD_MOD_AUTHN_CORE="$(get_loadmodule_config mod_authn_core)" \
|| fail "Authn_Core module not found."
LOAD_MOD_AUTHZ_CORE="$(get_loadmodule_config mod_authz_core)" \
|| fail "Authz_Core module not found."
LOAD_MOD_AUTHZ_HOST="$(get_loadmodule_config mod_authz_host)" \
|| fail "Authz_Host module not found."
LOAD_MOD_UNIXD=$(get_loadmodule_config mod_unixd) \
|| fail "UnixD module not found"
}
LOAD_MOD_AUTHN_FILE="$(get_loadmodule_config mod_authn_file)" \
|| fail "Authn_File module not found."
LOAD_MOD_AUTHZ_USER="$(get_loadmodule_config mod_authz_user)" \
|| fail "Authz_User module not found."
}
if [ ${APACHE_MPM:+set} ]; then
LOAD_MOD_MPM=$(get_loadmodule_config mod_mpm_$APACHE_MPM) \
|| fail "MPM module not found"
fi
HTTPD_PORT=$(($RANDOM+1024))
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"
HTTPD_ACCESS_LOG="$HTTPD_ROOT/access_log"
HTTPD_ERROR_LOG="$HTTPD_ROOT/error_log"
HTTPD_MIME_TYPES="$HTTPD_ROOT/mime.types"
BASE_URL="http://localhost:$HTTPD_PORT"
HTTPD_USERS="$HTTPD_ROOT/users"
mkdir "$HTTPD_ROOT" \
|| fail "couldn't create temporary directory '$HTTPD_ROOT'"
say "Using directory '$HTTPD_ROOT'..."
say "Adding users for lock authentication"
$HTPASSWD -bc $HTTPD_USERS jrandom rayjandom
$HTPASSWD -b $HTTPD_USERS jconstant rayjandom
touch $HTTPD_MIME_TYPES
cat > "$HTTPD_CFG" <<__EOF__
$LOAD_MOD_MPM
$LOAD_MOD_LOG_CONFIG
$LOAD_MOD_MIME
$LOAD_MOD_ALIAS
$LOAD_MOD_UNIXD
$LOAD_MOD_DAV
LoadModule dav_svn_module "$MOD_DAV_SVN"
$LOAD_MOD_AUTH
$LOAD_MOD_AUTHN_CORE
$LOAD_MOD_AUTHN_FILE
$LOAD_MOD_AUTHZ_CORE
$LOAD_MOD_AUTHZ_USER
$LOAD_MOD_AUTHZ_HOST
LoadModule authz_svn_module "$MOD_AUTHZ_SVN"
__EOF__
if "$HTTPD" -v | grep '/2\.[012]' >/dev/null; then
cat >> "$HTTPD_CFG" <<__EOF__
LockFile lock
User $(id -un)
Group $(id -gn)
__EOF__
else
cat >> "$HTTPD_CFG" <<__EOF__
__EOF__
fi
cat >> "$HTTPD_CFG" <<__EOF__
Listen $HTTPD_PORT
ServerName localhost
PidFile "$HTTPD_PID"
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog "$HTTPD_ACCESS_LOG" common
ErrorLog "$HTTPD_ERROR_LOG"
LogLevel Debug
ServerRoot "$HTTPD_ROOT"
DocumentRoot "$HTTPD_ROOT"
ScoreBoardFile "$HTTPD_ROOT/run"
CoreDumpDirectory "$HTTPD_ROOT"
TypesConfig "$HTTPD_MIME_TYPES"
StartServers 4
MaxRequestsPerChild 0
<IfModule worker.c>
ThreadsPerChild 8
</IfModule>
MaxClients 16
HostNameLookups Off
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" format
CustomLog "$HTTPD_ROOT/req" format
CustomLog "$HTTPD_ROOT/ops" "%t %u %{SVN-REPOS-NAME}e %{SVN-ACTION}e" env=SVN-ACTION
<Directory />
AllowOverride none
</Directory>
<Directory "$HTTPD_ROOT">
AllowOverride none
</Directory>
<Location /svn-test-work/repositories>
DAV svn
SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/repositories"
AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile $HTTPD_USERS
Require valid-user
SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
${SVN_PATH_AUTHZ_LINE}
</Location>
<Location /svn-test-work/local_tmp/repos>
DAV svn
SVNPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp/repos"
AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
AuthType Basic
AuthName "Subversion Repository"
AuthUserFile $HTTPD_USERS
Require valid-user
SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
${SVN_PATH_AUTHZ_LINE}
</Location>
RedirectMatch permanent ^/svn-test-work/repositories/REDIRECT-PERM-(.*)\$ /svn-test-work/repositories/\$1
RedirectMatch ^/svn-test-work/repositories/REDIRECT-TEMP-(.*)\$ /svn-test-work/repositories/\$1
__EOF__
START="$HTTPD -f $HTTPD_CFG"
$START -t \
|| fail "Configuration file didn't pass the check, most likely modules couldn't be loaded"
$START &
sleep 2
say "HTTPD started and listening on '$BASE_URL'..."
HTTP_FETCH=wget
HTTP_FETCH_OUTPUT="-q -O"
type wget > /dev/null 2>&1
if [ $? -ne 0 ]; then
type curl > /dev/null 2>&1
if [ $? -ne 0 ]; then
fail "Neither curl or wget found."
fi
HTTP_FETCH=curl
HTTP_FETCH_OUTPUT='-s -o'
fi
$HTTP_FETCH $HTTP_FETCH_OUTPUT "$HTTPD_CFG-copy" "$BASE_URL/cfg"
diff -q "$HTTPD_CFG" "$HTTPD_CFG-copy" > /dev/null \
|| fail "HTTPD doesn't operate according to the generated configuration"
rm "$HTTPD_CFG-copy"
say "HTTPD is good"
if [ $ exit
fi
say "starting the tests..."
CLIENT_CMD="$ABS_BUILDDIR/subversion/svn/svn"
$LDD "$CLIENT_CMD" | grep -q 'not found' \
&& fail "Subversion client couldn't be fully linked at run-time"
if [ "$HTTP_LIBRARY" = "" ]; then
say "Using default dav library"
"$CLIENT_CMD" --version | egrep -q '^[*] ra_(neon|serf)' \
|| fail "Subversion client couldn't find and/or load ra_dav library"
else
say "Requesting dav library '$HTTP_LIBRARY'"
"$CLIENT_CMD" --version | egrep -q "^[*] ra_$HTTP_LIBRARY" \
|| fail "Subversion client couldn't find and/or load ra_dav library '$HTTP_LIBRARY'"
fi
if [ $ time make check "BASE_URL=$BASE_URL"
r=$?
else
pushd "$ABS_BUILDDIR/subversion/tests/cmdline/" >/dev/null
TEST="$1"
shift
time "$ABS_SRCDIR/subversion/tests/cmdline/${TEST}_tests.py" "--url=$BASE_URL" "$@"
r=$?
popd >/dev/null
fi
say "Finished testing..."
kill $(cat "$HTTPD_PID")
query 'Browse server access log' n \
&& less "$HTTPD_ACCESS_LOG"
query 'Browse server error log' n \
&& less "$HTTPD_ERROR_LOG"
query 'Delete HTTPD root directory' y \
&& rm -fr "$HTTPD_ROOT/"
say 'Done'
exit $r