blob: d10a43e24f0b111b2e7cc0eac72994996475e64a [file] [log] [blame]
Frédéric Lécaille51e01b52018-11-29 21:41:42 +01001#!/bin/sh
PiBa-NL72504042018-11-27 22:26:38 +01002
Christopher Faulet8d67cf82018-12-18 22:41:20 +01003_help()
4{
PiBa-NL72504042018-11-27 22:26:38 +01005 cat << EOF
6### run-regtests.sh ###
7 Running run-regtests.sh --help shows this information about how to use it
8
9 Run without parameters to run all tests in the current folder (including subfolders)
10 run-regtests.sh
11
12 Provide paths to run tests from (including subfolders):
13 run-regtests.sh ./tests1 ./tests2
14
15 Parameters:
16 --j <NUM>, To run varnishtest with multiple jobs / threads for a faster overall result
17 run-regtests.sh ./fasttest --j 16
18
19 --v, to run verbose
20 run-regtests.sh --v, disables the default varnishtest 'quiet' parameter
21
Christopher Faulet2a7cf922018-12-19 10:22:01 +010022 --debug to show test logs on standard ouput (implies --v)
23 run-regtests.sh --debug
24
Christopher Faulet9c6df5e2018-12-19 10:25:07 +010025 --keep-logs to keep all log directories (by default kept if test fails)
26 run-regtests.sh --keep-logs
27
PiBa-NL72504042018-11-27 22:26:38 +010028 --varnishtestparams <ARGS>, passes custom ARGS to varnishtest
29 run-regtests.sh --varnishtestparams "-n 10"
30
Christopher Faulet8d0fdf52018-12-19 10:18:40 +010031 --clean to cleanup previous reg-tests log directories and exit
32 run-regtests.sh --clean
33
Christopher Fauletfa6798f2018-12-19 11:22:04 +010034 --use-htx to use the HTX in tests
35 run-regtests.sh --use-htx, unsets the macro \${no-htx}
36 In .vtc files, in HAProxy configuration, you should use the following line
37 to "templatize" your tests:
38
39 \${no-htx} option http-use-htx
40
PiBa-NL72504042018-11-27 22:26:38 +010041 Including text below into a .vtc file will check for its requirements
42 related to haproxy's target and compilation options
43 # Below targets are not capable of completing this test succesfully
44 #EXCLUDE_TARGET=freebsd, abns sockets are not available on freebsd
45
46 #EXCLUDE_TARGETS=dos,freebsd,windows
47
48 # Below option is required to complete this test succesfully
49 #REQUIRE_OPTION=OPENSSL, this test needs OPENSSL compiled in.
50
51 #REQUIRE_OPTIONS=ZLIB,OPENSSL,LUA
52
53 # To define a range of versions that a test can run with:
54 #REQUIRE_VERSION=0.0
55 #REQUIRE_VERSION_BELOW=99.9
56
57 Configure environment variables to set the haproxy and varnishtest binaries to use
58 setenv HAPROXY_PROGRAM /usr/local/sbin/haproxy
59 setenv VARNISHTEST_PROGRAM /usr/local/bin/varnishtest
Frederic Lecailled4f36e32018-12-13 22:15:05 +010060 or
61 export HAPROXY_PROGRAM=/usr/local/sbin/haproxy
62 export VARNISHTEST_PROGRAM=/usr/local/bin/varnishtest
PiBa-NL72504042018-11-27 22:26:38 +010063EOF
Christopher Faulet8d67cf82018-12-18 22:41:20 +010064 exit 0
65}
PiBa-NL72504042018-11-27 22:26:38 +010066
Frederic Lecailled4f36e32018-12-13 22:15:05 +010067add_range_to_test_list()
68{
69 level0="*.vtc"
70 level1="h*.vtc"
71 level2="s*.vtc"
72 level3="l*.vtc"
73 level4="b*.vtc"
74 level5="k*.vtc"
75 level6="e*.vtc"
76
77 new_range=$(echo $1 | tr '-' ' ')
78 non_digit=$(echo $new_range | grep '[^0-9 ]')
79 if [ -n "$non_digit" ] ; then
80 return
81 fi
82 if [ "$new_range" = "$1" ] ; then
83 if [ $1 -gt 6 ] ; then
84 return
85 fi
86 eval echo '$'level$1
87 return
88 fi
89 if [ -z "$new_range" ] ; then
90 return
91 fi
92 list=
93 for l in $(seq $new_range) ; do
94 if [ -n "l" ] ; then
95 if [ -z "$list" ] ; then
96 list="$(eval echo '$'level${l})"
97 else
98 list="$list $(eval echo '$'level${l})"
99 fi
100 fi
101 done
102
103 echo $list
104}
105
106
107build_test_list()
108{
109 # Remove any spacing character
110 LEVEL="$(echo $LEVEL | tr -d ' ')"
111 # Replave any comma character by a space character
112 LEVEL="$(echo $LEVEL | tr ',' ' ')"
113 list=
114 for range in $LEVEL ; do
115 if [ -z "$list" ] ; then
116 list=$(add_range_to_test_list $range)
117 else
118 list="$list $(add_range_to_test_list $range)"
119 fi
120 done
121
122 echo $list
123}
124
125build_find_expr()
126{
127 expr=
128 for i in $@; do
129 if [ -z "$expr" ] ; then
130 expr="-name \"$i\""
131 else
132 expr="$expr -o -name \"$i\""
133 fi
134 done
135
136 echo $expr
137}
138
PiBa-NL72504042018-11-27 22:26:38 +0100139_startswith() {
140 _str="$1"
141 _sub="$2"
142 echo "$_str" | grep "^$_sub" >/dev/null 2>&1
143}
144
145_findtests() {
146 set -f
147 LEVEL=${LEVEL:-0};
Frederic Lecailled4f36e32018-12-13 22:15:05 +0100148 list=$(build_test_list "$LEVEL")
149 if [ -z "$list" ] ; then
150 echo "Invalid level specification '"$LEVEL"' or no file was found."
151 exit 1
PiBa-NL72504042018-11-27 22:26:38 +0100152 fi
Frederic Lecailled4f36e32018-12-13 22:15:05 +0100153 EXPR=$(build_find_expr $list)
PiBa-NL72504042018-11-27 22:26:38 +0100154
Frederic Lecailled4f36e32018-12-13 22:15:05 +0100155 for i in $( find "$1" $(eval echo $EXPR) ); do
PiBa-NL72504042018-11-27 22:26:38 +0100156 skiptest=
Willy Tarreau939193a2018-12-06 15:49:27 +0100157 require_version="$(sed -ne 's/^#REQUIRE_VERSION=//p' "$i")"
158 require_version_below="$(sed -ne 's/^#REQUIRE_VERSION_BELOW=//p' "$i")"
159 require_options="$(sed -ne 's/^#REQUIRE_OPTIONS=//p' "$i")"
160 exclude_targets=",$(sed -ne 's/^#EXCLUDE_TARGETS=//p' "$i"),"
PiBa-NL72504042018-11-27 22:26:38 +0100161
162 if [ -n "$require_version" ]; then
163 if [ $(_version "$HAPROXY_VERSION") -lt $(_version "$require_version") ]; then
164 echo " Skip $i because option haproxy is version: $HAPROXY_VERSION"
165 echo " REASON: this test requires at least version: $require_version"
166 skiptest=1
167 fi
168 fi
169 if [ -n "$require_version_below" ]; then
170 if [ $(_version "$HAPROXY_VERSION") -ge $(_version "$require_version_below") ]; then
171 echo " Skip $i because option haproxy is version: $HAPROXY_VERSION"
172 echo " REASON: this test requires a version below: $require_version_below"
173 skiptest=1
174 fi
175 fi
176
177 if [ -n "$( echo "$exclude_targets" | grep ",$TARGET," )" ]; then
178 echo " Skip $i because exclude_targets"
179 echo " REASON: exclude_targets '$exclude_targets' contains '$TARGET'"
180 skiptest=1
181 fi
182
183 #echo "REQUIRE_OPTIONS : $require_options"
184 for requiredoption in $(echo $require_options | tr "," "\012" ); do
185 if [ -z "$( echo "$OPTIONS" | grep "USE_$requiredoption=1" )" ]
186 then
187 echo " Skip $i because option $requiredoption not found"
188 echo -n " REASON: "
189 echo -n "$required" | sed -e 's/.*,//' -e 's/^[[:space:]]//'
190 echo
191 skiptest=1
192 fi
193 done
194 for required in "$(grep "#REQUIRE_OPTION=" "$i")";
195 do
196 if [ -z "$required" ]
197 then
198 continue
199 fi
200 requiredoption=$(echo "$required" | sed -e 's/.*=//' -e 's/,.*//')
201 if [ -z "$( echo "$OPTIONS" | grep "USE_$requiredoption=1" )" ]
202 then
203 echo " Skip $i because option $requiredoption not found"
204 echo -n " REASON: "
205 echo "$required" | sed -e 's/.*,//' -e 's/^[[:space:]]//'
206 skiptest=1
207 fi
208 done
209 testtarget=$(grep "#EXCLUDE_TARGET=" "$i")
210 if [ "$( echo "$testtarget" | grep "#EXCLUDE_TARGET=$TARGET," )" ]
211 then
212 echo " Skip $i because: TARGET = $TARGET"
213 echo -n " REASON: "
214 echo "$testtarget" | sed -e 's/.*,//' -e 's/^[[:space:]]//'
215 skiptest=1
216 fi
217
218 if [ -z $skiptest ]; then
219 echo " Add test: $i"
220 testlist="$testlist $i"
221 fi
222 done
223}
224
Christopher Faulet8d0fdf52018-12-19 10:18:40 +0100225_cleanup()
226{
227 DIRS=$(find "${TESTDIR}" -maxdepth 1 -type d -name "haregtests-*" -exec basename {} \; 2>/dev/null)
228 if [ -z "${DIRS}" ]; then
229 echo "No reg-tests log directory found"
230 else
231 echo "Cleanup following reg-tests log directories:"
232 for d in ${DIRS}; do
233 echo " o ${TESTDIR}/$d"
234 done
235 read -p "Continue (y/n)?" reply
236 case "$reply" in
237 y|Y)
238 for d in ${DIRS}; do
239 rm -r "${TESTDIR}/$d"
240 done
241 echo "done"
242 exit 0
243 ;;
244 *)
245 echo "aborted"
246 exit 1
247 ;;
248 esac
249 fi
250}
251
252
PiBa-NL72504042018-11-27 22:26:38 +0100253_process() {
PiBa-NL72504042018-11-27 22:26:38 +0100254 while [ ${#} -gt 0 ]; do
255 if _startswith "$1" "-"; then
256 case "${1}" in
257 --j)
258 jobcount="$2"
259 shift
260 ;;
261 --varnishtestparams)
262 varnishtestparams="$2"
263 shift
264 ;;
265 --v)
266 verbose=""
Christopher Faulet2a7cf922018-12-19 10:22:01 +0100267 ;;
268 --debug)
269 verbose=""
270 debug="-v"
PiBa-NL72504042018-11-27 22:26:38 +0100271 ;;
Christopher Faulet9c6df5e2018-12-19 10:25:07 +0100272 --keep-logs)
273 keep_logs="-L"
274 ;;
PiBa-NL72504042018-11-27 22:26:38 +0100275 --LEVEL)
276 LEVEL="$2"
277 shift
278 ;;
Christopher Fauletfa6798f2018-12-19 11:22:04 +0100279 --use-htx)
280 no_htx=""
281 ;;
Christopher Faulet8d0fdf52018-12-19 10:18:40 +0100282 --clean)
283 _cleanup
284 exit 0
285 ;;
Christopher Faulet8d67cf82018-12-18 22:41:20 +0100286 --help)
287 _help
288 ;;
PiBa-NL72504042018-11-27 22:26:38 +0100289 *)
290 echo "Unknown parameter : $1"
Christopher Faulet8d67cf82018-12-18 22:41:20 +0100291 exit 1
PiBa-NL72504042018-11-27 22:26:38 +0100292 ;;
293 esac
294 else
Christopher Faulet8d67cf82018-12-18 22:41:20 +0100295 REGTESTS="${REGTESTS} $1"
PiBa-NL72504042018-11-27 22:26:38 +0100296 fi
297 shift 1
298 done
PiBa-NL72504042018-11-27 22:26:38 +0100299}
300
301_version() {
302 echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\012", $1,$2,$3,$4); }';
303}
304
PiBa-NL72504042018-11-27 22:26:38 +0100305
Frédéric Lécaille51e01b52018-11-29 21:41:42 +0100306HAPROXY_PROGRAM="${HAPROXY_PROGRAM:-${PWD}/haproxy}"
307VARNISHTEST_PROGRAM="${VARNISHTEST_PROGRAM:-varnishtest}"
Christopher Faulet8d0fdf52018-12-19 10:18:40 +0100308TESTDIR="${TMPDIR:-/tmp}"
Christopher Faulet8d67cf82018-12-18 22:41:20 +0100309REGTESTS=""
310
311jobcount=""
312verbose="-q"
Christopher Faulet2a7cf922018-12-19 10:22:01 +0100313debug=""
Christopher Faulet9c6df5e2018-12-19 10:25:07 +0100314keep_logs="-l"
Christopher Fauletfa6798f2018-12-19 11:22:04 +0100315no_htx="#"
Christopher Faulet8d67cf82018-12-18 22:41:20 +0100316testlist=""
317
318_process "$@";
319
320echo ""
321echo "########################## Preparing to run tests ##########################"
PiBa-NL72504042018-11-27 22:26:38 +0100322
323preparefailed=
324if ! [ -x "$(command -v $HAPROXY_PROGRAM)" ]; then
325 echo "haproxy not found in path, please specify HAPROXY_PROGRAM environment variable"
326 preparefailed=1
327fi
328if ! [ -x "$(command -v $VARNISHTEST_PROGRAM)" ]; then
329 echo "varnishtest not found in path, please specify VARNISHTEST_PROGRAM environment variable"
330 preparefailed=1
331fi
332if [ $preparefailed ]; then
333 exit 1
334fi
335
336{ read HAPROXY_VERSION; read TARGET; read OPTIONS; } << EOF
337$($HAPROXY_PROGRAM -vv |grep 'HA-Proxy version\|TARGET\|OPTIONS' | sed 's/.* = //')
338EOF
339
340HAPROXY_VERSION=$(echo $HAPROXY_VERSION | cut -d " " -f 3)
341echo "Testing with haproxy version: $HAPROXY_VERSION"
342
343TESTRUNDATETIME="$(date '+%Y-%m-%d_%H-%M-%S')"
344
Frédéric Lécaille51e01b52018-11-29 21:41:42 +0100345mkdir -p "$TESTDIR" || exit 1
Christopher Faulet8d0fdf52018-12-19 10:18:40 +0100346TESTDIR=$(mktemp -d "$TESTDIR/haregtests-$TESTRUNDATETIME.XXXXXX") || exit 1
PiBa-NL72504042018-11-27 22:26:38 +0100347
Frédéric Lécaille51e01b52018-11-29 21:41:42 +0100348export TMPDIR="$TESTDIR"
349export HAPROXY_PROGRAM="$HAPROXY_PROGRAM"
PiBa-NL72504042018-11-27 22:26:38 +0100350
351# Mimic implicit build options from haproxy MakeFile that are present for each target:
352
353if [ $TARGET = generic ] ; then
354 #generic system target has nothing specific
355 OPTIONS="$OPTIONS USE_POLL=1 USE_TPROXY=1"
356fi
357if [ $TARGET = haiku ] ; then
358 #For Haiku
359 OPTIONS="$OPTIONS USE_POLL=1 USE_TPROXY=1"
360fi
361if [ $TARGET = linux22 ] ; then
362 #This is for Linux 2.2
363 OPTIONS="$OPTIONS USE_POLL=1 USE_TPROXY=1 USE_LIBCRYPT=1 USE_DL=1 USE_RT=1"
364fi
365if [ $TARGET = linux24 ] ; then
366 #This is for standard Linux 2.4 with netfilter but without epoll()
367 OPTIONS="$OPTIONS USE_NETFILTER=1 USE_POLL=1 USE_TPROXY=1 USE_CRYPT_H=1 USE_LIBCRYPT=1 USE_DL=1 USE_RT=1"
368fi
369if [ $TARGET = linux24e ] ; then
370 #This is for enhanced Linux 2.4 with netfilter and epoll() patch>0.21
371 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"
372fi
373if [ $TARGET = linux26 ] ; then
374 #This is for standard Linux 2.6 with netfilter and standard epoll()
375 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"
376fi
377if [ $TARGET = linux2628 ] ; then
378 #This is for standard Linux >= 2.6.28 with netfilter, epoll, tproxy and splice
379 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"
380fi
381if [ $TARGET = solaris ] ; then
382 #This is for Solaris8
383 OPTIONS="$OPTIONS USE_POLL=1 USE_TPROXY=1 USE_LIBCRYPT=1 USE_CRYPT_H=1 USE_GETADDRINFO=1 USE_THREAD=1"
384fi
385if [ $TARGET = freebsd ] ; then
386 #This is for FreeBSD
387 OPTIONS="$OPTIONS USE_POLL=1 USE_KQUEUE=1 USE_TPROXY=1 USE_LIBCRYPT=1 USE_THREAD=1 USE_CPU_AFFINITY=1"
388fi
389if [ $TARGET = osx ] ; then
390 #This is for MacOS/X
391 OPTIONS="$OPTIONS USE_POLL=1 USE_KQUEUE=1 USE_TPROXY=1"
392fi
393if [ $TARGET = openbsd ] ; then
394 #This is for OpenBSD >= 5.7
395 OPTIONS="$OPTIONS USE_POLL=1 USE_KQUEUE=1 USE_TPROXY=1 USE_ACCEPT4=1 USE_THREAD=1"
396fi
397if [ $TARGET = netbsd ] ; then
398 #This is for NetBSD
399 OPTIONS="$OPTIONS USE_POLL=1 USE_KQUEUE=1 USE_TPROXY=1"
400fi
401if [ $TARGET = aix51 ] ; then
402 #This is for AIX 5.1
403 OPTIONS="$OPTIONS USE_POLL=1 USE_LIBCRYPT=1"
404fi
405if [ $TARGET = aix52 ] ; then
406 #This is for AIX 5.2 and later
407 OPTIONS="$OPTIONS USE_POLL=1 USE_LIBCRYPT=1"
408fi
409if [ $TARGET = cygwin ] ; then
410 #This is for Cygwin
411 OPTIONS="$OPTIONS USE_POLL=1 USE_TPROXY=1"
412fi
413
414echo "Target : $TARGET"
415echo "Options : $OPTIONS"
416
417echo "########################## Gathering tests to run ##########################"
Christopher Fauletfa6798f2018-12-19 11:22:04 +0100418# if 'use-htx' option is set, but HAProxy version is lower to 1.9, disable it
419if [ -z "$no_htx" ]; then
420 if [ $(_version "$HAPROXY_VERSION") -lt $(_version "1.9") ]; then
421 echo ""
422 echo "WARNING : Unset HTX for haproxy (version: $HAPROXY_VERSION)"
423 echo " REASON: this test requires at least version: 1.9"
424 echo ""
425 no_htx="#"
426 fi
427fi
428
Christopher Faulet8d67cf82018-12-18 22:41:20 +0100429if [ -z "$REGTESTS" ]; then
430 _findtests ./
431else
432 for t in $REGTESTS; do
433 _findtests $t
434 done
435fi
PiBa-NL72504042018-11-27 22:26:38 +0100436
437echo "########################## Starting varnishtest ##########################"
438echo "Testing with haproxy version: $HAPROXY_VERSION"
439_vtresult=0
440if [ -n "$testlist" ]; then
441 if [ -n "$jobcount" ]; then
442 jobcount="-j $jobcount"
443 fi
Christopher Fauletfa6798f2018-12-19 11:22:04 +0100444 cmd="$VARNISHTEST_PROGRAM -k -t 10 -Dno-htx=${no_htx} $keep_logs $verbose $debug $jobcount $varnishtestparams $testlist"
Christopher Faulet1ecf0ea2018-12-18 22:47:23 +0100445 eval $cmd
PiBa-NL72504042018-11-27 22:26:38 +0100446 _vtresult=$?
447else
448 echo "No tests found that meet the required criteria"
449fi
Christopher Faulet9c6df5e2018-12-19 10:25:07 +0100450
451
452if [ $_vtresult -eq 0 ]; then
453 # all tests were succesfull, removing tempdir (the last part.)
454 # ignore errors is the directory is not empty or if it does not exist
455 rmdir "$TESTDIR" 2>/dev/null
456fi
457
458if [ -d "${TESTDIR}" ]; then
459 echo "########################## Gathering results ##########################"
Frédéric Lécaille51e01b52018-11-29 21:41:42 +0100460 export TESTDIR
461 find "$TESTDIR" -type d -name "vtc.*" -exec sh -c 'for i; do
462 if [ ! -e "$i/LOG" ] ; then continue; fi
Christopher Faulet9c6df5e2018-12-19 10:25:07 +0100463
Frédéric Lécaille51e01b52018-11-29 21:41:42 +0100464 cat <<- EOF | tee -a "$TESTDIR/failedtests.log"
465$(echo "###### $(cat "$i/INFO") ######")
466$(echo "## test results in: \"$i\"")
Christopher Faulet6bd82cd2018-12-19 11:28:49 +0100467$(grep -- ^---- "$i/LOG")
PiBa-NL72504042018-11-27 22:26:38 +0100468EOF
Frédéric Lécaille51e01b52018-11-29 21:41:42 +0100469 done' sh {} +
PiBa-NL72504042018-11-27 22:26:38 +0100470fi
Christopher Faulet9c6df5e2018-12-19 10:25:07 +0100471
472exit $_vtresult