#!/bin/sh _help() { cat << EOF ### run-regtests.sh ### Running run-regtests.sh --help shows this information about how to use it Run without parameters to run all tests in the current folder (including subfolders) run-regtests.sh Provide paths to run tests from (including subfolders): run-regtests.sh ./tests1 ./tests2 Parameters: --j , To run vtest with multiple jobs / threads for a faster overall result run-regtests.sh ./fasttest --j 16 --v, to run verbose run-regtests.sh --v, disables the default vtest 'quiet' parameter --debug to show test logs on standard ouput (implies --v) run-regtests.sh --debug --keep-logs to keep all log directories (by default kept if test fails) run-regtests.sh --keep-logs --vtestparams , passes custom ARGS to vtest run-regtests.sh --vtestparams "-n 10" --clean to cleanup previous reg-tests log directories and exit run-regtests.sh --clean --use-htx to use the HTX in tests run-regtests.sh --use-htx, unsets the macro \${no-htx} In .vtc files, in HAProxy configuration, you should use the following line to "templatize" your tests: \${no-htx} option http-use-htx Including text below into a .vtc file will check for its requirements related to haproxy's target and compilation options # Below targets are not capable of completing this test succesfully #EXCLUDE_TARGET=freebsd, abns sockets are not available on freebsd #EXCLUDE_TARGETS=dos,freebsd,windows # Below option is required to complete this test succesfully #REQUIRE_OPTION=OPENSSL, this test needs OPENSSL compiled in. #REQUIRE_OPTIONS=ZLIB|SLZ,OPENSSL,LUA # To define a range of versions that a test can run with: #REQUIRE_VERSION=0.0 #REQUIRE_VERSION_BELOW=99.9 Configure environment variables to set the haproxy and vtest binaries to use setenv HAPROXY_PROGRAM /usr/local/sbin/haproxy setenv VTEST_PROGRAM /usr/local/bin/vtest or export HAPROXY_PROGRAM=/usr/local/sbin/haproxy export VTEST_PROGRAM=/usr/local/bin/vtest EOF exit 0 } add_range_to_test_list() { level0="*.vtc" level1="h*.vtc" level2="s*.vtc" level3="l*.vtc" level4="b*.vtc" level5="k*.vtc" level6="e*.vtc" new_range=$(echo $1 | tr '-' ' ') non_digit=$(echo $new_range | grep '[^0-9 ]') if [ -n "$non_digit" ] ; then return fi if [ "$new_range" = "$1" ] ; then if [ $1 -gt 6 ] ; then return fi eval echo '$'level$1 return fi if [ -z "$new_range" ] ; then return fi list= for l in $(seq $new_range) ; do if [ -n "l" ] ; then if [ -z "$list" ] ; then list="$(eval echo '$'level${l})" else list="$list $(eval echo '$'level${l})" fi fi done echo $list } build_test_list() { # Remove any spacing character LEVEL="$(echo $LEVEL | tr -d ' ')" # Replave any comma character by a space character LEVEL="$(echo $LEVEL | tr ',' ' ')" list= for range in $LEVEL ; do if [ -z "$list" ] ; then list=$(add_range_to_test_list $range) else list="$list $(add_range_to_test_list $range)" fi done echo $list } build_find_expr() { expr= for i in $@; do if [ -z "$expr" ] ; then expr="-name \"$i\"" else expr="$expr -o -name \"$i\"" fi done echo $expr } _startswith() { _str="$1" _sub="$2" echo "$_str" | grep "^$_sub" >/dev/null 2>&1 } _findtests() { set -f LEVEL=${LEVEL:-0}; list=$(build_test_list "$LEVEL") if [ -z "$list" ] ; then echo "Invalid level specification '"$LEVEL"' or no file was found." exit 1 fi EXPR=$(build_find_expr $list) for i in $( find "$1" $(eval echo $EXPR) ); do skiptest= require_version="$(sed -ne 's/^#REQUIRE_VERSION=//p' "$i")" require_version_below="$(sed -ne 's/^#REQUIRE_VERSION_BELOW=//p' "$i")" require_options="$(sed -ne 's/^#REQUIRE_OPTIONS=//p' "$i" | sed -e 's/,/ /g')" exclude_targets="$(sed -ne 's/^#EXCLUDE_TARGETS=//p' "$i" | sed -e 's/,/ /g')" requiredoption="$(sed -ne 's/^#REQUIRE_OPTION=//p' "$i" | sed -e 's/,.*//')" if [ -n "$requiredoption" ]; then require_options="$require_options $requiredoption" fi excludedtarget="$(sed -ne 's/^#EXCLUDE_TARGET=//p' "$i" | sed -e 's/,.*//')" if [ -n "$excludedtarget" ]; then exclude_targets="$exclude_targets $excludedtarget" fi if [ -n "$require_version" ]; then if [ $(_version "$HAPROXY_VERSION") -lt $(_version "$require_version") ]; then echo " Skip $i because option haproxy is version: $HAPROXY_VERSION" echo " REASON: this test requires at least version: $require_version" skiptest=1 fi fi if [ -n "$require_version_below" ]; then if [ $(_version "$HAPROXY_VERSION") -ge $(_version "$require_version_below") ]; then echo " Skip $i because option haproxy is version: $HAPROXY_VERSION" echo " REASON: this test requires a version below: $require_version_below" skiptest=1 fi fi for excludedtarget in $exclude_targets; do if [ "$excludedtarget" = "$TARGET" ]; then echo " Skip $i because haproxy is compiled for the excluded target $TARGET" skiptest=1 fi done for requiredoption in $require_options; do alternatives=$(echo "$requiredoption" | sed -e 's/|/ /g') found= for alt in $alternatives; do if [ -n "$( echo "$OPTIONS" | grep "USE_$alt=1" )" ]; then found=1; fi done if [ -z $found ]; then echo " Skip $i because haproxy is not compiled with the required option $requiredoption" skiptest=1 fi done if [ -z $skiptest ]; then echo " Add test: $i" testlist="$testlist $i" fi done } _cleanup() { DIRS=$(find "${TESTDIR}" -maxdepth 1 -type d -name "haregtests-*" -exec basename {} \; 2>/dev/null) if [ -z "${DIRS}" ]; then echo "No reg-tests log directory found" else echo "Cleanup following reg-tests log directories:" for d in ${DIRS}; do echo " o ${TESTDIR}/$d" done read -p "Continue (y/n)?" reply case "$reply" in y|Y) for d in ${DIRS}; do rm -r "${TESTDIR}/$d" done echo "done" exit 0 ;; *) echo "aborted" exit 1 ;; esac fi } _process() { while [ ${#} -gt 0 ]; do if _startswith "$1" "-"; then case "${1}" in --j) jobcount="$2" shift ;; --vtestparams) vtestparams="$2" shift ;; --v) verbose="" ;; --debug) verbose="" debug="-v" ;; --keep-logs) keep_logs="-L" ;; --LEVEL) LEVEL="$2" shift ;; --use-htx) no_htx="" ;; --clean) _cleanup exit 0 ;; --help) _help ;; *) echo "Unknown parameter : $1" exit 1 ;; esac else REGTESTS="${REGTESTS} $1" fi shift 1 done } _version() { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\012", $1,$2,$3,$4); }'; } HAPROXY_PROGRAM="${HAPROXY_PROGRAM:-${PWD}/haproxy}" VTEST_PROGRAM="${VTEST_PROGRAM:-vtest}" TESTDIR="${TMPDIR:-/tmp}" REGTESTS="" jobcount="" verbose="-q" debug="" keep_logs="-l" no_htx="#" testlist="" _process "$@"; echo "" echo "########################## Preparing to run tests ##########################" preparefailed= if ! [ -x "$(command -v $HAPROXY_PROGRAM)" ]; then echo "haproxy not found in path, please specify HAPROXY_PROGRAM environment variable" preparefailed=1 fi if ! [ -x "$(command -v $VTEST_PROGRAM)" ]; then echo "vtest not found in path, please specify VTEST_PROGRAM environment variable" preparefailed=1 fi if [ $preparefailed ]; then exit 1 fi { read HAPROXY_VERSION; read TARGET; read OPTIONS; } << EOF $($HAPROXY_PROGRAM -vv |grep 'HA-Proxy version\|TARGET\|OPTIONS' | sed 's/.* = //') EOF HAPROXY_VERSION=$(echo $HAPROXY_VERSION | cut -d " " -f 3) echo "Testing with haproxy version: $HAPROXY_VERSION" TESTRUNDATETIME="$(date '+%Y-%m-%d_%H-%M-%S')" mkdir -p "$TESTDIR" || exit 1 TESTDIR=$(mktemp -d "$TESTDIR/haregtests-$TESTRUNDATETIME.XXXXXX") || exit 1 export TMPDIR="$TESTDIR" export HAPROXY_PROGRAM="$HAPROXY_PROGRAM" # Mimic implicit build options from haproxy MakeFile that are present for each target: if [ $TARGET = generic ] ; then #generic system target has nothing specific OPTIONS="$OPTIONS USE_POLL=1 USE_TPROXY=1" fi if [ $TARGET = haiku ] ; then #For Haiku OPTIONS="$OPTIONS USE_POLL=1 USE_TPROXY=1" fi if [ $TARGET = linux22 ] ; then #This is for Linux 2.2 OPTIONS="$OPTIONS USE_POLL=1 USE_TPROXY=1 USE_LIBCRYPT=1 USE_DL=1 USE_RT=1" fi if [ $TARGET = linux24 ] ; then #This is for standard Linux 2.4 with netfilter but without epoll() OPTIONS="$OPTIONS USE_NETFILTER=1 USE_POLL=1 USE_TPROXY=1 USE_CRYPT_H=1 USE_LIBCRYPT=1 USE_DL=1 USE_RT=1" fi if [ $TARGET = linux24e ] ; then #This is for enhanced Linux 2.4 with netfilter and epoll() patch>0.21 OPTIONS="$OPTIONS USE_NETFILTER=1 USE_POLL=1 USE_EPOLL=1 USE_MY_EPOLL=1 USE_TPROXY=1 USE_CRYPT_H=1 USE_LIBCRYPT=1 USE_DL=1 USE_RT=1" fi if [ $TARGET = linux26 ] ; then #This is for standard Linux 2.6 with netfilter and standard epoll() OPTIONS="$OPTIONS USE_NETFILTER=1 USE_POLL=1 USE_EPOLL=1 USE_TPROXY=1 USE_CRYPT_H=1 USE_LIBCRYPT=1 USE_FUTEX=1 USE_DL=1 USE_RT=1" fi if [ $TARGET = linux2628 ] ; then #This is for standard Linux >= 2.6.28 with netfilter, epoll, tproxy and splice OPTIONS="$OPTIONS USE_NETFILTER=1 USE_POLL=1 USE_EPOLL=1 USE_TPROXY=1 USE_CRYPT_H=1 USE_LIBCRYPT=1 USE_LINUX_SPLICE=1 USE_LINUX_TPROXY=1 USE_ACCEPT4=1 USE_FUTEX=1 USE_CPU_AFFINITY=1 ASSUME_SPLICE_WORKS=1 USE_DL=1 USE_RT=1 USE_THREAD=1" fi if [ $TARGET = solaris ] ; then #This is for Solaris8 OPTIONS="$OPTIONS USE_POLL=1 USE_TPROXY=1 USE_LIBCRYPT=1 USE_CRYPT_H=1 USE_GETADDRINFO=1 USE_THREAD=1" fi if [ $TARGET = freebsd ] ; then #This is for FreeBSD OPTIONS="$OPTIONS USE_POLL=1 USE_KQUEUE=1 USE_TPROXY=1 USE_LIBCRYPT=1 USE_THREAD=1 USE_CPU_AFFINITY=1" fi if [ $TARGET = osx ] ; then #This is for MacOS/X OPTIONS="$OPTIONS USE_POLL=1 USE_KQUEUE=1 USE_TPROXY=1" fi if [ $TARGET = openbsd ] ; then #This is for OpenBSD >= 5.7 OPTIONS="$OPTIONS USE_POLL=1 USE_KQUEUE=1 USE_TPROXY=1 USE_ACCEPT4=1 USE_THREAD=1" fi if [ $TARGET = netbsd ] ; then #This is for NetBSD OPTIONS="$OPTIONS USE_POLL=1 USE_KQUEUE=1 USE_TPROXY=1" fi if [ $TARGET = aix51 ] ; then #This is for AIX 5.1 OPTIONS="$OPTIONS USE_POLL=1 USE_LIBCRYPT=1" fi if [ $TARGET = aix52 ] ; then #This is for AIX 5.2 and later OPTIONS="$OPTIONS USE_POLL=1 USE_LIBCRYPT=1" fi if [ $TARGET = cygwin ] ; then #This is for Cygwin OPTIONS="$OPTIONS USE_POLL=1 USE_TPROXY=1" fi echo "Target : $TARGET" echo "Options : $OPTIONS" echo "########################## Gathering tests to run ##########################" # if 'use-htx' option is set, but HAProxy version is lower to 1.9, disable it if [ -z "$no_htx" ]; then if [ $(_version "$HAPROXY_VERSION") -lt $(_version "1.9") ]; then echo "" echo "WARNING : Unset HTX for haproxy (version: $HAPROXY_VERSION)" echo " REASON: this test requires at least version: 1.9" echo "" no_htx="#" fi fi if [ -z "$REGTESTS" ]; then _findtests ./ else for t in $REGTESTS; do _findtests $t done fi echo "########################## Starting vtest ##########################" echo "Testing with haproxy version: $HAPROXY_VERSION" _vtresult=0 if [ -n "$testlist" ]; then if [ -n "$jobcount" ]; then jobcount="-j $jobcount" fi cmd="$VTEST_PROGRAM -k -t 10 -Dno-htx=${no_htx} $keep_logs $verbose $debug $jobcount $vtestparams $testlist" eval $cmd _vtresult=$? else echo "No tests found that meet the required criteria" fi if [ $_vtresult -eq 0 ]; then # all tests were succesfull, removing tempdir (the last part.) # ignore errors is the directory is not empty or if it does not exist rmdir "$TESTDIR" 2>/dev/null fi if [ -d "${TESTDIR}" ]; then echo "########################## Gathering results ##########################" export TESTDIR find "$TESTDIR" -type d -name "vtc.*" -exec sh -c 'for i; do if [ ! -e "$i/LOG" ] ; then continue; fi cat <<- EOF | tee -a "$TESTDIR/failedtests.log" $(echo "###### $(cat "$i/INFO") ######") $(echo "## test results in: \"$i\"") $(grep -E -- "^(----|\* diag)" "$i/LOG") EOF done' sh {} + fi exit $_vtresult