blob: b542f24f834f3cf36581c388e768676d13edb6ad [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:
Frédéric Lécaille43361232019-01-11 10:10:21 +010016 --j <NUM>, To run vtest with multiple jobs / threads for a faster overall result
PiBa-NL72504042018-11-27 22:26:38 +010017 run-regtests.sh ./fasttest --j 16
18
19 --v, to run verbose
Frédéric Lécaille43361232019-01-11 10:10:21 +010020 run-regtests.sh --v, disables the default vtest 'quiet' parameter
PiBa-NL72504042018-11-27 22:26:38 +010021
Ilya Shipitsin856aabc2020-04-16 23:51:34 +050022 --debug to show test logs on standard output (implies --v)
Christopher Faulet2a7cf922018-12-19 10:22:01 +010023 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
Frédéric Lécaille43361232019-01-11 10:10:21 +010028 --vtestparams <ARGS>, passes custom ARGS to vtest
29 run-regtests.sh --vtestparams "-n 10"
PiBa-NL72504042018-11-27 22:26:38 +010030
Frédéric Lécailledc1a3bd2019-03-29 15:07:24 +010031 --type <reg tests types> filter the types of the tests to be run, depending on
32 the commented REGTESTS_TYPE variable value in each VTC file.
Christopher Faulet1eee6ca2019-12-11 16:26:11 +010033 The value of REGTESTS_TYPE supported are: default, slow, bug, broken, devel
34 and experimental. When not specified, it is set to 'default' as default value.
Frédéric Lécailledc1a3bd2019-03-29 15:07:24 +010035
36 run-regtest.sh --type slow,default
37
Christopher Faulet8d0fdf52018-12-19 10:18:40 +010038 --clean to cleanup previous reg-tests log directories and exit
39 run-regtests.sh --clean
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
Bertrand Jacquin7e30b502019-05-16 22:15:31 +010043 # Below targets are not capable of completing this test successfully
PiBa-NL72504042018-11-27 22:26:38 +010044 #EXCLUDE_TARGET=freebsd, abns sockets are not available on freebsd
45
46 #EXCLUDE_TARGETS=dos,freebsd,windows
47
Bertrand Jacquin7e30b502019-05-16 22:15:31 +010048 # Below option is required to complete this test successfully
PiBa-NL72504042018-11-27 22:26:38 +010049 #REQUIRE_OPTION=OPENSSL, this test needs OPENSSL compiled in.
Christopher Faulet7e245df2018-12-21 15:18:02 +010050 #REQUIRE_OPTIONS=ZLIB|SLZ,OPENSSL,LUA
PiBa-NL72504042018-11-27 22:26:38 +010051
William Dauchyaabde712021-01-09 17:26:20 +010052 #REQUIRE_SERVICE=prometheus-exporter
53 #REQUIRE_SERVICES=prometheus-exporter,foo
54
PiBa-NL72504042018-11-27 22:26:38 +010055 # To define a range of versions that a test can run with:
56 #REQUIRE_VERSION=0.0
57 #REQUIRE_VERSION_BELOW=99.9
58
William Lallemandd5b464b2019-12-19 14:30:00 +010059 # To define required binaries for a test:
60 #REQUIRE_BINARIES=socat,curl
61
Frédéric Lécaille43361232019-01-11 10:10:21 +010062 Configure environment variables to set the haproxy and vtest binaries to use
PiBa-NL72504042018-11-27 22:26:38 +010063 setenv HAPROXY_PROGRAM /usr/local/sbin/haproxy
Frédéric Lécaille43361232019-01-11 10:10:21 +010064 setenv VTEST_PROGRAM /usr/local/bin/vtest
Willy Tarreaua4009cd2020-12-16 10:39:20 +010065 setenv HAPROXY_ARGS "-dM -de -m 50"
Frederic Lecailled4f36e32018-12-13 22:15:05 +010066 or
67 export HAPROXY_PROGRAM=/usr/local/sbin/haproxy
Frédéric Lécaille43361232019-01-11 10:10:21 +010068 export VTEST_PROGRAM=/usr/local/bin/vtest
Willy Tarreaua4009cd2020-12-16 10:39:20 +010069 export HAPROXY_ARGS="-dM -de -m 50"
PiBa-NL72504042018-11-27 22:26:38 +010070EOF
Christopher Faulet8d67cf82018-12-18 22:41:20 +010071 exit 0
72}
PiBa-NL72504042018-11-27 22:26:38 +010073
Frederic Lecailled4f36e32018-12-13 22:15:05 +010074add_range_to_test_list()
75{
76 level0="*.vtc"
77 level1="h*.vtc"
78 level2="s*.vtc"
79 level3="l*.vtc"
80 level4="b*.vtc"
81 level5="k*.vtc"
82 level6="e*.vtc"
83
84 new_range=$(echo $1 | tr '-' ' ')
85 non_digit=$(echo $new_range | grep '[^0-9 ]')
86 if [ -n "$non_digit" ] ; then
87 return
88 fi
89 if [ "$new_range" = "$1" ] ; then
90 if [ $1 -gt 6 ] ; then
91 return
92 fi
93 eval echo '$'level$1
94 return
95 fi
96 if [ -z "$new_range" ] ; then
97 return
98 fi
99 list=
100 for l in $(seq $new_range) ; do
101 if [ -n "l" ] ; then
102 if [ -z "$list" ] ; then
103 list="$(eval echo '$'level${l})"
104 else
105 list="$list $(eval echo '$'level${l})"
106 fi
107 fi
108 done
109
110 echo $list
111}
112
PiBa-NL72504042018-11-27 22:26:38 +0100113_startswith() {
114 _str="$1"
115 _sub="$2"
116 echo "$_str" | grep "^$_sub" >/dev/null 2>&1
117}
118
119_findtests() {
120 set -f
PiBa-NL72504042018-11-27 22:26:38 +0100121
William Lallemandc1ddcaf2021-02-05 11:27:54 +0100122 REGTESTS_TYPES="${REGTESTS_TYPES:-default,bug,devel,slow}"
Frédéric Lécailledc1a3bd2019-03-29 15:07:24 +0100123 any_test=$(echo $REGTESTS_TYPES | grep -cw "any")
124 for i in $( find "$1" -name *.vtc ); do
PiBa-NL72504042018-11-27 22:26:38 +0100125 skiptest=
Willy Tarreau939193a2018-12-06 15:49:27 +0100126 require_version="$(sed -ne 's/^#REQUIRE_VERSION=//p' "$i")"
127 require_version_below="$(sed -ne 's/^#REQUIRE_VERSION_BELOW=//p' "$i")"
Christopher Faulet7e245df2018-12-21 15:18:02 +0100128 require_options="$(sed -ne 's/^#REQUIRE_OPTIONS=//p' "$i" | sed -e 's/,/ /g')"
William Dauchyaabde712021-01-09 17:26:20 +0100129 require_services="$(sed -ne 's/^#REQUIRE_SERVICES=//p' "$i" | sed -e 's/,/ /g')"
Christopher Faulet7e245df2018-12-21 15:18:02 +0100130 exclude_targets="$(sed -ne 's/^#EXCLUDE_TARGETS=//p' "$i" | sed -e 's/,/ /g')"
William Lallemandd5b464b2019-12-19 14:30:00 +0100131 require_binaries="$(sed -ne 's/^#REQUIRE_BINARIES=//p' "$i" | sed -e 's/,/ /g')"
Frédéric Lécailledc1a3bd2019-03-29 15:07:24 +0100132 if [ $any_test -ne 1 ] ; then
133 regtest_type="$(sed -ne 's/^#REGTEST_TYPE=//p' "$i")"
134 if [ -z $regtest_type ] ; then
135 regtest_type=default
136 fi
137 if ! $(echo $REGTESTS_TYPES | grep -wq $regtest_type) ; then
138 echo " Skip $i because its type '"$regtest_type"' is excluded"
139 skiptest=1
140 fi
141 fi
Christopher Faulet7e245df2018-12-21 15:18:02 +0100142
143 requiredoption="$(sed -ne 's/^#REQUIRE_OPTION=//p' "$i" | sed -e 's/,.*//')"
144 if [ -n "$requiredoption" ]; then
145 require_options="$require_options $requiredoption"
146 fi
147
William Dauchyaabde712021-01-09 17:26:20 +0100148 requiredservice="$(sed -ne 's/^#REQUIRE_SERVICE=//p' "$i" | sed -e 's/,.*//')"
149 if [ -n "$requiredservice" ]; then
150 require_services="$require_services $requiredservice"
151 fi
152
Christopher Faulet7e245df2018-12-21 15:18:02 +0100153 excludedtarget="$(sed -ne 's/^#EXCLUDE_TARGET=//p' "$i" | sed -e 's/,.*//')"
154 if [ -n "$excludedtarget" ]; then
155 exclude_targets="$exclude_targets $excludedtarget"
156 fi
PiBa-NL72504042018-11-27 22:26:38 +0100157
158 if [ -n "$require_version" ]; then
159 if [ $(_version "$HAPROXY_VERSION") -lt $(_version "$require_version") ]; then
160 echo " Skip $i because option haproxy is version: $HAPROXY_VERSION"
161 echo " REASON: this test requires at least version: $require_version"
162 skiptest=1
163 fi
164 fi
165 if [ -n "$require_version_below" ]; then
166 if [ $(_version "$HAPROXY_VERSION") -ge $(_version "$require_version_below") ]; then
167 echo " Skip $i because option haproxy is version: $HAPROXY_VERSION"
168 echo " REASON: this test requires a version below: $require_version_below"
169 skiptest=1
170 fi
171 fi
172
Christopher Faulet7e245df2018-12-21 15:18:02 +0100173 for excludedtarget in $exclude_targets; do
174 if [ "$excludedtarget" = "$TARGET" ]; then
175 echo " Skip $i because haproxy is compiled for the excluded target $TARGET"
PiBa-NL72504042018-11-27 22:26:38 +0100176 skiptest=1
177 fi
178 done
Christopher Faulet7e245df2018-12-21 15:18:02 +0100179
180 for requiredoption in $require_options; do
181 alternatives=$(echo "$requiredoption" | sed -e 's/|/ /g')
182 found=
183 for alt in $alternatives; do
Willy Tarreau87586e12019-03-27 13:52:39 +0100184 if echo "$FEATURES" | grep -qw "\+$alt"; then
Christopher Faulet7e245df2018-12-21 15:18:02 +0100185 found=1;
186 fi
187 done
188 if [ -z $found ]; then
189 echo " Skip $i because haproxy is not compiled with the required option $requiredoption"
PiBa-NL72504042018-11-27 22:26:38 +0100190 skiptest=1
191 fi
192 done
PiBa-NL72504042018-11-27 22:26:38 +0100193
William Dauchyaabde712021-01-09 17:26:20 +0100194 for requiredservice in $require_services; do
195 alternatives=$(echo "$requiredservice" | sed -e 's/|/ /g')
196 found=
197 for alt in $alternatives; do
William Dauchy44884342021-01-10 21:13:05 +0100198 if echo "$SERVICES" | grep -qw "$alt"; then
William Dauchyaabde712021-01-09 17:26:20 +0100199 found=1;
200 fi
201 done
202 if [ -z $found ]; then
203 echo " Skip $i because haproxy is not compiled with the required service $requiredservice"
204 skiptest=1
205 fi
206 done
207
William Lallemandd5b464b2019-12-19 14:30:00 +0100208 for requiredbin in $require_binaries; do
Ilya Shipitsin7faeea92020-09-26 11:54:27 +0500209 if ! command -v $requiredbin >/dev/null 2>&1
210 then
William Lallemandd5b464b2019-12-19 14:30:00 +0100211 echo " Skip $i because '"$requiredbin"' is not installed"
212 skiptest=1
213 fi
214 done
215
PiBa-NL72504042018-11-27 22:26:38 +0100216 if [ -z $skiptest ]; then
217 echo " Add test: $i"
218 testlist="$testlist $i"
219 fi
220 done
221}
222
Christopher Faulet8d0fdf52018-12-19 10:18:40 +0100223_cleanup()
224{
225 DIRS=$(find "${TESTDIR}" -maxdepth 1 -type d -name "haregtests-*" -exec basename {} \; 2>/dev/null)
226 if [ -z "${DIRS}" ]; then
227 echo "No reg-tests log directory found"
228 else
229 echo "Cleanup following reg-tests log directories:"
230 for d in ${DIRS}; do
231 echo " o ${TESTDIR}/$d"
232 done
233 read -p "Continue (y/n)?" reply
234 case "$reply" in
235 y|Y)
236 for d in ${DIRS}; do
237 rm -r "${TESTDIR}/$d"
238 done
239 echo "done"
240 exit 0
241 ;;
242 *)
243 echo "aborted"
244 exit 1
245 ;;
246 esac
247 fi
248}
249
250
PiBa-NL72504042018-11-27 22:26:38 +0100251_process() {
PiBa-NL72504042018-11-27 22:26:38 +0100252 while [ ${#} -gt 0 ]; do
253 if _startswith "$1" "-"; then
254 case "${1}" in
255 --j)
256 jobcount="$2"
257 shift
258 ;;
Frédéric Lécaille43361232019-01-11 10:10:21 +0100259 --vtestparams)
260 vtestparams="$2"
PiBa-NL72504042018-11-27 22:26:38 +0100261 shift
262 ;;
263 --v)
264 verbose=""
Christopher Faulet2a7cf922018-12-19 10:22:01 +0100265 ;;
266 --debug)
267 verbose=""
268 debug="-v"
PiBa-NL72504042018-11-27 22:26:38 +0100269 ;;
Christopher Faulet9c6df5e2018-12-19 10:25:07 +0100270 --keep-logs)
271 keep_logs="-L"
272 ;;
Frédéric Lécailledc1a3bd2019-03-29 15:07:24 +0100273 --type)
274 REGTESTS_TYPES="$2"
275 shift
276 ;;
Christopher Faulet8d0fdf52018-12-19 10:18:40 +0100277 --clean)
278 _cleanup
279 exit 0
280 ;;
Christopher Faulet8d67cf82018-12-18 22:41:20 +0100281 --help)
282 _help
283 ;;
PiBa-NL72504042018-11-27 22:26:38 +0100284 *)
285 echo "Unknown parameter : $1"
Christopher Faulet8d67cf82018-12-18 22:41:20 +0100286 exit 1
PiBa-NL72504042018-11-27 22:26:38 +0100287 ;;
288 esac
289 else
Christopher Faulet8d67cf82018-12-18 22:41:20 +0100290 REGTESTS="${REGTESTS} $1"
PiBa-NL72504042018-11-27 22:26:38 +0100291 fi
292 shift 1
293 done
PiBa-NL72504042018-11-27 22:26:38 +0100294}
295
296_version() {
297 echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\012", $1,$2,$3,$4); }';
298}
299
PiBa-NL72504042018-11-27 22:26:38 +0100300
Frédéric Lécaille51e01b52018-11-29 21:41:42 +0100301HAPROXY_PROGRAM="${HAPROXY_PROGRAM:-${PWD}/haproxy}"
Willy Tarreaua4009cd2020-12-16 10:39:20 +0100302HAPROXY_ARGS="${HAPROXY_ARGS--dM}"
Frédéric Lécaille43361232019-01-11 10:10:21 +0100303VTEST_PROGRAM="${VTEST_PROGRAM:-vtest}"
Christopher Faulet8d0fdf52018-12-19 10:18:40 +0100304TESTDIR="${TMPDIR:-/tmp}"
Christopher Faulet8d67cf82018-12-18 22:41:20 +0100305REGTESTS=""
306
307jobcount=""
308verbose="-q"
Christopher Faulet2a7cf922018-12-19 10:22:01 +0100309debug=""
Christopher Faulet9c6df5e2018-12-19 10:25:07 +0100310keep_logs="-l"
Christopher Faulet8d67cf82018-12-18 22:41:20 +0100311testlist=""
312
313_process "$@";
314
315echo ""
316echo "########################## Preparing to run tests ##########################"
PiBa-NL72504042018-11-27 22:26:38 +0100317
318preparefailed=
319if ! [ -x "$(command -v $HAPROXY_PROGRAM)" ]; then
320 echo "haproxy not found in path, please specify HAPROXY_PROGRAM environment variable"
321 preparefailed=1
322fi
Frédéric Lécaille43361232019-01-11 10:10:21 +0100323if ! [ -x "$(command -v $VTEST_PROGRAM)" ]; then
324 echo "vtest not found in path, please specify VTEST_PROGRAM environment variable"
PiBa-NL72504042018-11-27 22:26:38 +0100325 preparefailed=1
326fi
327if [ $preparefailed ]; then
328 exit 1
329fi
330
William Dauchyaabde712021-01-09 17:26:20 +0100331{ read HAPROXY_VERSION; read TARGET; read FEATURES; read SERVICES; } << EOF
Willy Tarreau5f3448f2021-05-09 06:12:41 +0200332$($HAPROXY_PROGRAM $HAPROXY_ARGS -vv | grep 'HA-\?Proxy version\|TARGET.*=\|^Feature\|^Available services' | sed 's/.* [:=] //')
PiBa-NL72504042018-11-27 22:26:38 +0100333EOF
334
335HAPROXY_VERSION=$(echo $HAPROXY_VERSION | cut -d " " -f 3)
336echo "Testing with haproxy version: $HAPROXY_VERSION"
337
338TESTRUNDATETIME="$(date '+%Y-%m-%d_%H-%M-%S')"
339
Frédéric Lécaille51e01b52018-11-29 21:41:42 +0100340mkdir -p "$TESTDIR" || exit 1
Christopher Faulet8d0fdf52018-12-19 10:18:40 +0100341TESTDIR=$(mktemp -d "$TESTDIR/haregtests-$TESTRUNDATETIME.XXXXXX") || exit 1
PiBa-NL72504042018-11-27 22:26:38 +0100342
Frédéric Lécaille51e01b52018-11-29 21:41:42 +0100343export TMPDIR="$TESTDIR"
344export HAPROXY_PROGRAM="$HAPROXY_PROGRAM"
Willy Tarreaua4009cd2020-12-16 10:39:20 +0100345if [ -n "$HAPROXY_ARGS" ]; then
346 export HAPROXY_ARGS
347fi
PiBa-NL72504042018-11-27 22:26:38 +0100348
PiBa-NL72504042018-11-27 22:26:38 +0100349echo "Target : $TARGET"
Willy Tarreau87586e12019-03-27 13:52:39 +0100350echo "Options : $FEATURES"
William Dauchyaabde712021-01-09 17:26:20 +0100351echo "Services : $SERVICES"
PiBa-NL72504042018-11-27 22:26:38 +0100352
353echo "########################## Gathering tests to run ##########################"
Christopher Fauletfa6798f2018-12-19 11:22:04 +0100354
Christopher Faulet8d67cf82018-12-18 22:41:20 +0100355if [ -z "$REGTESTS" ]; then
Willy Tarreauca8df4c2019-04-23 16:09:50 +0200356 _findtests reg-tests/
Christopher Faulet8d67cf82018-12-18 22:41:20 +0100357else
358 for t in $REGTESTS; do
359 _findtests $t
360 done
361fi
PiBa-NL72504042018-11-27 22:26:38 +0100362
Frédéric Lécaille43361232019-01-11 10:10:21 +0100363echo "########################## Starting vtest ##########################"
PiBa-NL72504042018-11-27 22:26:38 +0100364echo "Testing with haproxy version: $HAPROXY_VERSION"
365_vtresult=0
366if [ -n "$testlist" ]; then
367 if [ -n "$jobcount" ]; then
368 jobcount="-j $jobcount"
369 fi
Tim Duesterhusa9334df2021-05-31 23:07:29 +0200370 cmd="$VTEST_PROGRAM -b $((2<<20)) -k -t 10 $keep_logs $verbose $debug $jobcount $vtestparams $testlist"
Christopher Faulet1ecf0ea2018-12-18 22:47:23 +0100371 eval $cmd
PiBa-NL72504042018-11-27 22:26:38 +0100372 _vtresult=$?
373else
374 echo "No tests found that meet the required criteria"
375fi
Christopher Faulet9c6df5e2018-12-19 10:25:07 +0100376
377
378if [ $_vtresult -eq 0 ]; then
Bertrand Jacquin7e30b502019-05-16 22:15:31 +0100379 # all tests were successful, removing tempdir (the last part.)
Christopher Faulet9c6df5e2018-12-19 10:25:07 +0100380 # ignore errors is the directory is not empty or if it does not exist
381 rmdir "$TESTDIR" 2>/dev/null
382fi
383
384if [ -d "${TESTDIR}" ]; then
385 echo "########################## Gathering results ##########################"
Frédéric Lécaille51e01b52018-11-29 21:41:42 +0100386 export TESTDIR
387 find "$TESTDIR" -type d -name "vtc.*" -exec sh -c 'for i; do
388 if [ ! -e "$i/LOG" ] ; then continue; fi
Christopher Faulet9c6df5e2018-12-19 10:25:07 +0100389
Frédéric Lécaille51e01b52018-11-29 21:41:42 +0100390 cat <<- EOF | tee -a "$TESTDIR/failedtests.log"
391$(echo "###### $(cat "$i/INFO") ######")
392$(echo "## test results in: \"$i\"")
Frédéric Lécaillef9a48ef2019-01-08 11:30:28 +0100393$(grep -E -- "^(----|\* diag)" "$i/LOG")
PiBa-NL72504042018-11-27 22:26:38 +0100394EOF
Frédéric Lécaille51e01b52018-11-29 21:41:42 +0100395 done' sh {} +
PiBa-NL72504042018-11-27 22:26:38 +0100396fi
Christopher Faulet9c6df5e2018-12-19 10:25:07 +0100397
398exit $_vtresult