]> git.proxmox.com Git - ovs.git/blame - tests/ovs-macros.at
Fix ovs-dpctl-top by removing 3 wrong hunks in py3-compat.patch.
[ovs.git] / tests / ovs-macros.at
CommitLineData
02e6f2f7
AZ
1AT_TESTED([ovs-vswitchd])
2AT_TESTED([ovs-vsctl])
02e6f2f7 3
12878bc4 4m4_include([m4/compat.m4])
02e6f2f7 5
6132b241
BP
6dnl Make AT_SETUP automatically run the ovs_init() shell function
7dnl as the first step in every test.
8m4_rename([AT_SETUP], [OVS_AT_SETUP])
9m4_define([AT_SETUP], [OVS_AT_SETUP($@)
10ovs_init
11])
1b1d2e6d 12
5f223e92
BP
13dnl Make AT_CLEANUP check for Address Sanitizer errors as the last step
14dnl in every test.
15m4_rename([AT_CLEANUP], [OVS_AT_CLEANUP])
16m4_define([AT_CLEANUP], [ovs_cleanup
17OVS_AT_CLEANUP($@)
18])
19
1b1d2e6d
BP
20dnl OVS_START_SHELL_HELPERS...OVS_END_SHELL_HELPERS may bracket shell
21dnl function definitions that invoke AT_CHECK and other Autotest macros
22dnl that can ordinarily be run only within AT_SETUP...AT_CLEANUP.
23m4_define([OVS_START_SHELL_HELPERS],
24 [m4_ifdef([AT_ingroup], [m4_fatal([$0: AT_SETUP and OVS_DEFINE_SHELL_HELPERS may not nest])])
25 m4_define([AT_ingroup])
26 m4_divert_push([PREPARE_TESTS])])
27m4_define([OVS_END_SHELL_HELPERS], [
28 m4_divert_pop([PREPARE_TESTS])
29 m4_undefine([AT_ingroup])])
30
02e6f2f7
AZ
31m4_divert_push([PREPARE_TESTS])
32[
6132b241
BP
33# Set ovs_base to the base directory in which the test is running and
34# initialize the OVS_*DIR environment variables to point to this
35# directory.
36ovs_init() {
37 ovs_base=`pwd`
c99d1477 38 trap ovs_on_exit 0
53eb8cb8 39 : > cleanup
f295c17b
BP
40 ovs_setenv
41}
42
c99d1477
VD
43# Catch testsuite error condition and cleanup test environment by tearing down
44# all interfaces and processes spawned.
45# User has an option to leave the test environment in error state so that system
46# can be poked around to get more information. User can enable this option by setting
47# environment variable OVS_PAUSE_TEST=1. User needs to press CTRL-D to resume the
48# cleanup operation.
49ovs_pause() {
50 echo "====================================================="
51 echo "Set following environment variable to use various ovs utilities"
52 echo "export OVS_RUNDIR=$ovs_base"
53 echo "Press ENTER to continue: "
54 read
55}
56
57ovs_on_exit () {
58 if [ ! -z "${OVS_PAUSE_TEST}" ] && [ -z $at_verbose ]; then
59 trap '' INT
60 ovs_pause
61 fi
62 . "$ovs_base/cleanup"
63}
64
f295c17b
BP
65# With no parameter or an empty parameter, sets the OVS_*DIR
66# environment variables to point to $ovs_base, the base directory in
67# which the test is running.
68#
69# With a parameter, sets them to $ovs_base/$1.
70ovs_setenv() {
71 sandbox=$1
72 ovs_dir=$ovs_base${1:+/$1}
73 OVS_RUNDIR=$ovs_dir; export OVS_RUNDIR
74 OVS_LOGDIR=$ovs_dir; export OVS_LOGDIR
75 OVS_DBDIR=$ovs_dir; export OVS_DBDIR
76 OVS_SYSCONFDIR=$ovs_dir; export OVS_SYSCONFDIR
77 OVS_PKGDATADIR=$ovs_dir; export OVS_PKGDATADIR
6132b241
BP
78}
79
02e6f2f7
AZ
80# Prints the integers from $1 to $2, increasing by $3 (default 1) on stdout.
81seq () {
1011580e
BP
82 if test $# = 1; then
83 set 1 $1
84 fi
02e6f2f7
AZ
85 while test $1 -le $2; do
86 echo $1
87 set `expr $1 + ${3-1}` $2 $3
88 done
89}
90
91if test "$IS_WIN32" = "yes"; then
92 pwd () {
93 command pwd -W "$@"
94 }
95
96 diff () {
97 command diff --strip-trailing-cr "$@"
98 }
99
099772c0
BP
100 # tskill is more effective than taskkill but it isn't always installed.
101 if (tskill //?) >/dev/null 2>&1; then :; else
102 tskill () { taskkill //F //PID $1 >/dev/null; }
103 fi
104
02e6f2f7 105 kill () {
099772c0
BP
106 signal=
107 retval=0
108 for arg; do
c893685f 109 arg=$(echo $arg | tr -d '\n\r')
099772c0
BP
110 case $arg in
111 -*) signal=$arg ;;
02e6f2f7 112 [1-9][0-9]*)
099772c0
BP
113 # tasklist always returns 0.
114 # If pid does exist, there will be a line with the pid.
115 if tasklist //fi "PID eq $arg" | grep $arg >/dev/null; then
116 if test "X$signal" != "X-0"; then
117 tskill $arg
5e65e080 118 fi
099772c0
BP
119 else
120 retval=1
121 fi
02e6f2f7 122 ;;
099772c0
BP
123 esac
124 done
125 return $retval
02e6f2f7
AZ
126 }
127fi
03d971cc
BP
128
129# parent_pid PID
130#
131# Prints the PID of the parent of process PID.
132parent_pid () {
133 # Using "ps" is portable to any POSIX system, but busybox "ps" (used in
134 # e.g. Alpine Linux) is noncompliant, so we use a Linux-specific approach
4fd3d0ec
YT
135 # when it's available. We check the format of the status file to avoid
136 # the NetBSD file with the same name but different contents.
137 if egrep '^PPid:[[:space:]]*[0-9]*$' /proc/$1/status > /dev/null 2>&1; then
03d971cc 138 sed -n 's/^PPid: \([0-9]*\)/\1/p' /proc/$1/status
4fd3d0ec
YT
139 else
140 ps -o ppid= -p $1
03d971cc
BP
141 fi
142}
580b7484 143
7689bcf0
FL
144# kill_ovs_vswitchd [PID]
145#
146# Signal the ovs-vswitchd daemon to exit gracefully and wait for it to
147# terminate or kill it if that takes too long.
148#
149# It is used to cleanup all sorts of tests and results. It can't assume
150# any state, including the availability of PID file which can be provided.
151kill_ovs_vswitchd () {
152 # Use provided PID or save the current PID if available.
153 TMPPID=$1
154 if test -z "$TMPPID"; then
155 TMPPID=$(cat $OVS_RUNDIR/ovs-vswitchd.pid 2>/dev/null)
156 fi
157
158 # Tell the daemon to terminate gracefully
15394e0f 159 ovs-appctl -t ovs-vswitchd exit --cleanup 2>/dev/null
7689bcf0
FL
160
161 # Nothing else to be done if there is no PID
162 test -z "$TMPPID" && return
163
164 for i in 1 2 3 4 5 6 7 8 9; do
165 # Check if the daemon is alive.
166 kill -0 $TMPPID 2>/dev/null || return
167
168 # Fallback to whole number since POSIX doesn't require
169 # fractional times to work.
170 sleep 0.1 || sleep 1
171 done
172
173 # Make sure it is terminated.
174 kill $TMPPID
175}
176
580b7484
BP
177# Normalize the output of 'wc' to match POSIX.
178# POSIX says 'wc' should print "%d %d %d", but GNU prints "%7d %7d %7d".
179# POSIX says 'wc -l' should print "%d %s", but BSD prints "%8d".
180#
181# This fixes all of those (it will screw up filenames that contain
182# multiple sequential spaces, but that doesn't really matter).
183wc () {
184 command wc "$@" | tr -s ' ' ' ' | sed 's/^ *//'
185}
c724bd67
BP
186
187uuidfilt () {
1ca0323e 188 $PYTHON3 "$top_srcdir"/tests/uuidfilt.py "$@"
c724bd67 189}
1b1d2e6d
BP
190
191# run_as PROGRAM_NAME COMMAND [ARG...]
192#
193# Runs a command with argv[0] set to PROGRAM_NAME, if possible, in a
194# subshell. Most utilities print argc[0] as part of their messages,
195# so this makes it easier to figure out which particular utility
196# prints a message if a bunch of identical processes are running.
197#
198# Not all shells support "exec -a NAME", so test for it.
39bd2f6b 199if (exec -a myname true 2>/dev/null); then
1b1d2e6d 200 run_as () {
5a0e4aec 201 (exec -a "$@")
1b1d2e6d
BP
202 }
203else
204 run_as () {
205 shift
5a0e4aec 206 (exec "$@")
1b1d2e6d
BP
207 }
208fi
02e6f2f7
AZ
209]
210m4_divert_pop([PREPARE_TESTS])
211
697f5993 212OVS_START_SHELL_HELPERS
5f223e92
BP
213ovs_cleanup() {
214 if test "$(echo asan.*)" != 'asan.*'; then
215 echo "Address Sanitizer reported errors in:" asan.*
4df92691 216 cat asan.*
5f223e92
BP
217 AT_FAIL_IF([:])
218 fi
219}
220
697f5993
BP
221ovs_wait () {
222 echo "$1: waiting $2..." >&AS_MESSAGE_LOG_FD
223
224 # First try the condition without waiting.
225 if ovs_wait_cond; then echo "$1: wait succeeded immediately" >&AS_MESSAGE_LOG_FD; return 0; fi
226
227 # Try a quick sleep, so that the test completes very quickly
228 # in the normal case. POSIX doesn't require fractional times to
229 # work, so this might not work.
230 sleep 0.1
231 if ovs_wait_cond; then echo "$1: wait succeeded quickly" >&AS_MESSAGE_LOG_FD; return 0; fi
232
0c489cc5 233 # Then wait up to OVS_CTL_TIMEOUT seconds.
697f5993 234 local d
0c489cc5 235 for d in `seq 1 "$OVS_CTL_TIMEOUT"`; do
697f5993
BP
236 sleep 1
237 if ovs_wait_cond; then echo "$1: wait succeeded after $d seconds" >&AS_MESSAGE_LOG_FD; return 0; fi
238 done
239
240 echo "$1: wait failed after $d seconds" >&AS_MESSAGE_LOG_FD
241 ovs_wait_failed
242 AT_FAIL_IF([:])
243}
244OVS_END_SHELL_HELPERS
2c920d9d
BP
245m4_define([OVS_WAIT], [dnl
246ovs_wait_cond () {
247 $1
02e6f2f7 248}
697f5993
BP
249ovs_wait_failed () {
250 :
2c920d9d 251 $2
697f5993
BP
252}
253ovs_wait "AS_ESCAPE([$3])" "AS_ESCAPE([$4])"
2c920d9d 254])
3ee7cc6c 255
e6eef111 256dnl OVS_WAIT_UNTIL(COMMAND, [IF-FAILED])
3ee7cc6c 257dnl
e6eef111
BP
258dnl Executes shell COMMAND in a loop until it returns zero. If COMMAND does
259dnl not return zero within a reasonable time limit, executes the commands
260dnl in IF-FAILED (if provided) and fails the test.
d1ba7d54
BP
261m4_define([OVS_WAIT_UNTIL],
262 [OVS_WAIT([$1], [$2], [AT_LINE], [until $1])])
3ee7cc6c 263
e6eef111 264dnl OVS_WAIT_WHILE(COMMAND, [IF-FAILED])
3ee7cc6c 265dnl
e6eef111
BP
266dnl Executes shell COMMAND in a loop until it returns nonzero. If COMMAND does
267dnl not return nonzero within a reasonable time limit, executes the commands
268dnl in IF-FAILED (if provided) and fails the test.
02e6f2f7 269m4_define([OVS_WAIT_WHILE],
d1ba7d54
BP
270 [OVS_WAIT([if $1; then return 1; else return 0; fi], [$2],
271 [AT_LINE], [while $1])])
02e6f2f7
AZ
272
273dnl OVS_APP_EXIT_AND_WAIT(DAEMON)
274dnl
8a16ab90 275dnl Ask the daemon named DAEMON to exit, via ovs-appctl, and then wait for it
02e6f2f7
AZ
276dnl to exit.
277m4_define([OVS_APP_EXIT_AND_WAIT],
8a16ab90
LR
278 [AT_CHECK([test -e $OVS_RUNDIR/$1.pid])
279 TMPPID=$(cat $OVS_RUNDIR/$1.pid)
81847acf 280 AT_CHECK(m4_if([$1],[ovs-vswitchd],
15394e0f
IM
281 [ovs-appctl -t $1 exit --cleanup],
282 [ovs-appctl -t $1 exit]))
f9b11f2a 283 OVS_WAIT_WHILE([kill -0 $TMPPID 2>/dev/null])])
02e6f2f7 284
8a16ab90 285dnl OVS_APP_EXIT_AND_WAIT_BY_TARGET(TARGET, PIDFILE)
60bdd011 286dnl
8a16ab90
LR
287dnl Ask the daemon identified by TARGET to exit, via ovs-appctl (using the target
288dnl argument), and then wait for it to exit.
60bdd011 289m4_define([OVS_APP_EXIT_AND_WAIT_BY_TARGET],
8a16ab90
LR
290 [AT_CHECK([test -e $2])
291 TMPPID=$(cat $2)
15394e0f 292 AT_CHECK([ovs-appctl --target=$1 exit])
60bdd011
RM
293 OVS_WAIT_WHILE([kill -0 $TMPPID 2>/dev/null])])
294
53eb8cb8 295dnl on_exit "COMMAND"
02e6f2f7 296dnl
53eb8cb8 297dnl Add the shell COMMAND to a collection executed when the current test
02e6f2f7
AZ
298dnl completes, as a cleanup action. (The most common use is to kill a
299dnl daemon started by the test. This is important to prevent tests that
300dnl start daemons from hanging at exit.)
5e65e080 301dnl
53eb8cb8
BP
302dnl Cleanup commands are executed in the reverse order of calls to this
303dnl function.
304m4_divert_text([PREPARE_TESTS], [dnl
305on_exit () {
306 (echo "$1"; cat cleanup) > cleanup.tmp
307 mv cleanup.tmp cleanup
308}
309])
fc99370f
BP
310
311dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
312m4_ifndef([AS_VAR_APPEND],
313 [m4_divert_text([PREPARE_TESTS],
314 [as_var_append () {
315 eval $1=\$$1\$2
316 }
317])
318 m4_define([AS_VAR_APPEND], [as_var_append $1 $2])])
47b31247
BP
319
320dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
321m4_ifndef([AT_CHECK_UNQUOTED],
322 [m4_define([AT_CHECK_UNQUOTED],
323 [_AT_CHECK([$1], [$2], AS_ESCAPE(m4_dquote(m4_expand([$3])), [""]),
324 AS_ESCAPE(m4_dquote(m4_expand([$4])),[""]), [$5], [$6])])])
325
326dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
327m4_ifndef([AT_SKIP_IF],
328 [m4_define([AT_SKIP_IF],
329 [AT_CHECK([($1) \
330 && exit 77 || exit 0], [0], [ignore], [ignore])])])
331
332dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
333m4_ifndef([AT_FAIL_IF],
334 [m4_define([AT_FAIL_IF],
335 [AT_CHECK([($1) \
336 && exit 99 || exit 0], [0], [ignore], [ignore])])])
5e06e7ac
WT
337
338dnl Certain Linux distributions, like CentOS, have default iptable rules
339dnl to reject input traffic from bridges such as br-underlay.
340dnl Add a rule to always accept the traffic.
341m4_define([IPTABLES_ACCEPT],
342 [AT_CHECK([iptables -I INPUT 1 -i $1 -j ACCEPT])
343 on_exit 'iptables -D INPUT 1 -i $1'])