Hi Frederic,
I still have a '
' newline, with the IFS= but the \n and \012 didnt seem to work there..

Strangely on my PC with both bash and dash I do not have to change
IFS value to parse HAPROXY_VERSION, TARGET and OPTIONS with "read"
internal command.
Reading version,target and options works fine indeed without, however the loop over test files fails if any .vtc file has a space character in its filename. Or should we 'forbid' that with documentation.? Or is there another better workaround for that?

I do not think it is a good idea to build TESTDIR like that:
   TESTRUNDATETIME="$(date '+%Y-%m-%d_%H-%M-%S')"
   TESTDIR=${TMPDIR:-/tmp}/varnishtest_haproxy/$TESTRUNDATETIME
   mkdir -p $TESTDIR
What if we run the tests several times at the same time?
Well they would have to run at the same second. Not sure if that would be wise to do.. But mktemp now solved that i guess :) at least for the directory name part..
Please have a look to mkstemp utility.
Without the 's' right? Done, combined with the rundatetime which i do like, so its 'readable' and unique, best of both ways i think?.
Remaining details:
    cat $i/LOG | grep -- ----
should be replaced by
    grep -- ---- $i/LOG
I guess ill never learn do do this right the first time around ;). Fixed.
Note that you script is plenty of '\r' characters with no newline character at the end of file position:
Not sure what the 'correct' way would be. I think there is a CR LF everywhere at the moment? And the scripts hashbang tries to point to 'sh', will this be a issue.? (acme.sh does the same, and seems to be run an lots of systems..) And if so what can i best do to avoid issues?
Also note that some shells do not like == operator (at line 3):
Used a single = now.
When I do not set both HAPROY_PROGRAM I get this output with a script
with a successful result.

Checks added to avoid this issue for both haproxy and varnishtest so they are checked to exist.

Next round :).

Regards,

PiBa-NL (Pieter)

#!/usr/bin/env sh

if [ "$1" = "--help" ]; then
  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 <NUM>, To run varnishtest 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 varnishtest 'quiet' parameter

    --varnishtestparams <ARGS>, passes custom ARGS to varnishtest
      run-regtests.sh --varnishtestparams "-n 10"

  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,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 varnishtest binaries 
to use
    setenv HAPROXY_PROGRAM /usr/local/sbin/haproxy
    setenv VARNISHTEST_PROGRAM /usr/local/bin/varnishtest
EOF
  return
fi

_startswith() {
  _str="$1"
  _sub="$2"
  echo "$_str" | grep "^$_sub" >/dev/null 2>&1
}

_findtests() {
  #find "$1" -name "*.vtc" | while read i; do
  set -f
  for i in $( find "$1" -name "*.vtc" ); do
    #echo "TESTcheck '$i'"

    skiptest=
    require_version="$(grep "#REQUIRE_VERSION=" "$i" | sed -e 's/.*=//')"
    require_version_below="$(grep "#REQUIRE_VERSION_BELOW=" "$i" | sed -e 
's/.*=//')"
    require_options="$(grep "#REQUIRE_OPTIONS=" "$i" | sed -e 's/.*=//')"
    exclude_targets=",$(grep "#EXCLUDE_TARGETS=" "$i" | sed -e 's/.*=//'),"

    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

    if [ -n "$( echo "$exclude_targets" | grep ",$TARGET," )" ]; then
      echo "  Skip $i because exclude_targets"
      echo "    REASON: exclude_targets '$exclude_targets' contains '$TARGET'"
      skiptest=1
    fi

    #echo "REQUIRE_OPTIONS : $require_options" 
    for requiredoption in $(echo $require_options | tr "," "\012" ); do
      if [ -z "$( echo "$OPTIONS" | grep "USE_$requiredoption=1" )" ]
      then
        echo "  Skip $i because option $requiredoption not found"
        echo -n "    REASON: "
        echo -n "$required" | sed -e 's/.*,//' -e 's/^[[:space:]]//'
        echo
        skiptest=1
      fi
    done
    for required in "$(grep "#REQUIRE_OPTION=" "$i")";
    do
      if [ -z "$required" ]
      then
        continue
      fi
      requiredoption=$(echo "$required" | sed -e 's/.*=//' -e 's/,.*//')
      if [ -z "$( echo "$OPTIONS" | grep "USE_$requiredoption=1" )" ]
      then
        echo "  Skip $i because option $requiredoption not found"
        echo -n "    REASON: "
        echo "$required" | sed -e 's/.*,//' -e 's/^[[:space:]]//'
        skiptest=1
      fi
    done
    testtarget=$(grep "#EXCLUDE_TARGET=" "$i")
    if [ "$( echo "$testtarget" | grep "#EXCLUDE_TARGET=$TARGET," )" ]
    then
      echo "  Skip $i because: TARGET = $TARGET"
      echo -n "    REASON: "
      echo "$testtarget" | sed -e 's/.*,//' -e 's/^[[:space:]]//'
      skiptest=1
    fi

    if [ -z $skiptest ]; then
      echo "  Add test: $i"
      testlist="$testlist
$i"
    fi
  done
}

_process() {
  jobcount=""
  verbose="-q"
#  for 
  while [ ${#} -gt 0 ]; do
    if _startswith "$1" "-"; then
      case "${1}" in
        --j)
          jobcount="$2"
          shift
          ;;
        --varnishtestparams)
          varnishtestparams="$2"
          shift
          ;;
        --v)
          verbose=""
          ;;
        *)
          echo "Unknown parameter : $1"
          return 1
          ;;
      esac
    else
      _findtests "$1"
  pathwasset=1
    fi
    shift 1
  done
  if [ -z $pathwasset ]; then
    # no path was given, find all tests under current path
    _findtests ./
  fi
}

_version() {
  echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\012", $1,$2,$3,$4); }';
}

echo ""
echo "########################## Preparing to run tests 
##########################"

HAPROXY_PROGRAM=${HAPROXY_PROGRAM:-haproxy}
VARNISHTEST_PROGRAM=${VARNISHTEST_PROGRAM:-varnishtest}

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 $VARNISHTEST_PROGRAM)" ]; then
  echo "varnishtest not found in path, please specify VARNISHTEST_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')"

TESTDIR=${TMPDIR:-/tmp}/varnishtest_haproxy/$TESTRUNDATETIME
TESTDIR=$(mktemp -d $TESTDIR.XXXX)

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 
##########################"

testlist=""
pathwasset=

_process "$@";

echo "########################## Starting varnishtest 
##########################"
_vtresult=0
if [ -n "$testlist" ]; then
  if [ -n "$jobcount" ]; then
    jobcount="-j $jobcount"
  fi
  $VARNISHTEST_PROGRAM $varnishtestparams $verbose $jobcount -l -k -t 10 
$testlist
  _vtresult=$?
  #echo "result: $_vtresult"
else
  echo "No tests found that meet the required criteria"
fi
if [ $_vtresult != 0 ]
then
  echo "########################## Gathering failed results 
##########################"
  for i in $(find $TESTDIR/ -type d -name "vtc.*");
  do
    echo "###### $(cat $i/INFO) ######"
    echo "## test results in: $i"
    grep -- ---- $i/LOG

    echo "###### $(cat $i/INFO) ######" >> $TESTDIR/failedtests.log
    echo "## test results in: $i" >> $TESTDIR/failedtests.log
    grep -- ---- $i/LOG >> $TESTDIR/failedtests.log
    echo >> $TESTDIR/failedtests.log
  done
  exit 1
else
  # all tests were succesfull, removing tempdir (the last part.)
  rm -d $TESTDIR
fi
exit 0

Reply via email to