]> git.proxmox.com Git - mirror_ovs.git/blame - tests/ovs-macros.at
OVN: fix DNAT/SNAT system-ovn unit tests
[mirror_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
109 case $arg in
110 -*) signal=$arg ;;
02e6f2f7 111 [1-9][0-9]*)
099772c0
BP
112 # tasklist always returns 0.
113 # If pid does exist, there will be a line with the pid.
114 if tasklist //fi "PID eq $arg" | grep $arg >/dev/null; then
115 if test "X$signal" != "X-0"; then
116 tskill $arg
5e65e080 117 fi
099772c0
BP
118 else
119 retval=1
120 fi
02e6f2f7 121 ;;
099772c0
BP
122 esac
123 done
124 return $retval
02e6f2f7
AZ
125 }
126fi
03d971cc
BP
127
128# parent_pid PID
129#
130# Prints the PID of the parent of process PID.
131parent_pid () {
132 # Using "ps" is portable to any POSIX system, but busybox "ps" (used in
133 # e.g. Alpine Linux) is noncompliant, so we use a Linux-specific approach
4fd3d0ec
YT
134 # when it's available. We check the format of the status file to avoid
135 # the NetBSD file with the same name but different contents.
136 if egrep '^PPid:[[:space:]]*[0-9]*$' /proc/$1/status > /dev/null 2>&1; then
03d971cc 137 sed -n 's/^PPid: \([0-9]*\)/\1/p' /proc/$1/status
4fd3d0ec
YT
138 else
139 ps -o ppid= -p $1
03d971cc
BP
140 fi
141}
580b7484 142
7689bcf0
FL
143# kill_ovs_vswitchd [PID]
144#
145# Signal the ovs-vswitchd daemon to exit gracefully and wait for it to
146# terminate or kill it if that takes too long.
147#
148# It is used to cleanup all sorts of tests and results. It can't assume
149# any state, including the availability of PID file which can be provided.
150kill_ovs_vswitchd () {
151 # Use provided PID or save the current PID if available.
152 TMPPID=$1
153 if test -z "$TMPPID"; then
154 TMPPID=$(cat $OVS_RUNDIR/ovs-vswitchd.pid 2>/dev/null)
155 fi
156
157 # Tell the daemon to terminate gracefully
158 ovs-appctl --timeout=10 -t ovs-vswitchd exit --cleanup 2>/dev/null
159
160 # Nothing else to be done if there is no PID
161 test -z "$TMPPID" && return
162
163 for i in 1 2 3 4 5 6 7 8 9; do
164 # Check if the daemon is alive.
165 kill -0 $TMPPID 2>/dev/null || return
166
167 # Fallback to whole number since POSIX doesn't require
168 # fractional times to work.
169 sleep 0.1 || sleep 1
170 done
171
172 # Make sure it is terminated.
173 kill $TMPPID
174}
175
580b7484
BP
176# Normalize the output of 'wc' to match POSIX.
177# POSIX says 'wc' should print "%d %d %d", but GNU prints "%7d %7d %7d".
178# POSIX says 'wc -l' should print "%d %s", but BSD prints "%8d".
179#
180# This fixes all of those (it will screw up filenames that contain
181# multiple sequential spaces, but that doesn't really matter).
182wc () {
183 command wc "$@" | tr -s ' ' ' ' | sed 's/^ *//'
184}
c724bd67
BP
185
186uuidfilt () {
187 $PYTHON "$top_srcdir"/tests/uuidfilt.py "$@"
188}
1b1d2e6d
BP
189
190# run_as PROGRAM_NAME COMMAND [ARG...]
191#
192# Runs a command with argv[0] set to PROGRAM_NAME, if possible, in a
193# subshell. Most utilities print argc[0] as part of their messages,
194# so this makes it easier to figure out which particular utility
195# prints a message if a bunch of identical processes are running.
196#
197# Not all shells support "exec -a NAME", so test for it.
39bd2f6b 198if (exec -a myname true 2>/dev/null); then
1b1d2e6d 199 run_as () {
5a0e4aec 200 (exec -a "$@")
1b1d2e6d
BP
201 }
202else
203 run_as () {
204 shift
5a0e4aec 205 (exec "$@")
1b1d2e6d
BP
206 }
207fi
02e6f2f7
AZ
208]
209m4_divert_pop([PREPARE_TESTS])
210
697f5993 211OVS_START_SHELL_HELPERS
5f223e92
BP
212ovs_cleanup() {
213 if test "$(echo asan.*)" != 'asan.*'; then
214 echo "Address Sanitizer reported errors in:" asan.*
4df92691 215 cat asan.*
5f223e92
BP
216 AT_FAIL_IF([:])
217 fi
218}
219
697f5993
BP
220ovs_wait () {
221 echo "$1: waiting $2..." >&AS_MESSAGE_LOG_FD
222
223 # First try the condition without waiting.
224 if ovs_wait_cond; then echo "$1: wait succeeded immediately" >&AS_MESSAGE_LOG_FD; return 0; fi
225
226 # Try a quick sleep, so that the test completes very quickly
227 # in the normal case. POSIX doesn't require fractional times to
228 # work, so this might not work.
229 sleep 0.1
230 if ovs_wait_cond; then echo "$1: wait succeeded quickly" >&AS_MESSAGE_LOG_FD; return 0; fi
231
232 # Then wait up to 10 seconds.
233 local d
234 for d in 1 2 3 4 5 6 7 8 9 10; do
235 sleep 1
236 if ovs_wait_cond; then echo "$1: wait succeeded after $d seconds" >&AS_MESSAGE_LOG_FD; return 0; fi
237 done
238
239 echo "$1: wait failed after $d seconds" >&AS_MESSAGE_LOG_FD
240 ovs_wait_failed
241 AT_FAIL_IF([:])
242}
243OVS_END_SHELL_HELPERS
2c920d9d
BP
244m4_define([OVS_WAIT], [dnl
245ovs_wait_cond () {
246 $1
02e6f2f7 247}
697f5993
BP
248ovs_wait_failed () {
249 :
2c920d9d 250 $2
697f5993
BP
251}
252ovs_wait "AS_ESCAPE([$3])" "AS_ESCAPE([$4])"
2c920d9d 253])
3ee7cc6c
AA
254
255dnl OVS_WAIT_UNTIL(COMMAND)
256dnl
257dnl Executes shell COMMAND in a loop until it returns
258dnl zero return code. If COMMAND did not return
259dnl zero code within reasonable time limit, then
260dnl the test fails.
d1ba7d54
BP
261m4_define([OVS_WAIT_UNTIL],
262 [OVS_WAIT([$1], [$2], [AT_LINE], [until $1])])
3ee7cc6c
AA
263
264dnl OVS_WAIT_WHILE(COMMAND)
265dnl
266dnl Executes shell COMMAND in a loop until it returns
267dnl non-zero return code. If COMMAND did not return
268dnl non-zero code within reasonable time limit, then
269dnl the test fails.
02e6f2f7 270m4_define([OVS_WAIT_WHILE],
d1ba7d54
BP
271 [OVS_WAIT([if $1; then return 1; else return 0; fi], [$2],
272 [AT_LINE], [while $1])])
02e6f2f7
AZ
273
274dnl OVS_APP_EXIT_AND_WAIT(DAEMON)
275dnl
8a16ab90 276dnl Ask the daemon named DAEMON to exit, via ovs-appctl, and then wait for it
02e6f2f7
AZ
277dnl to exit.
278m4_define([OVS_APP_EXIT_AND_WAIT],
8a16ab90
LR
279 [AT_CHECK([test -e $OVS_RUNDIR/$1.pid])
280 TMPPID=$(cat $OVS_RUNDIR/$1.pid)
81847acf 281 AT_CHECK(m4_if([$1],[ovs-vswitchd],
29a083ee
IM
282 [ovs-appctl --timeout=10 -t $1 exit --cleanup],
283 [ovs-appctl --timeout=10 -t $1 exit]))
f9b11f2a 284 OVS_WAIT_WHILE([kill -0 $TMPPID 2>/dev/null])])
02e6f2f7 285
8a16ab90 286dnl OVS_APP_EXIT_AND_WAIT_BY_TARGET(TARGET, PIDFILE)
60bdd011 287dnl
8a16ab90
LR
288dnl Ask the daemon identified by TARGET to exit, via ovs-appctl (using the target
289dnl argument), and then wait for it to exit.
60bdd011 290m4_define([OVS_APP_EXIT_AND_WAIT_BY_TARGET],
8a16ab90
LR
291 [AT_CHECK([test -e $2])
292 TMPPID=$(cat $2)
29a083ee 293 AT_CHECK([ovs-appctl --timeout=10 --target=$1 exit])
60bdd011
RM
294 OVS_WAIT_WHILE([kill -0 $TMPPID 2>/dev/null])])
295
53eb8cb8 296dnl on_exit "COMMAND"
02e6f2f7 297dnl
53eb8cb8 298dnl Add the shell COMMAND to a collection executed when the current test
02e6f2f7
AZ
299dnl completes, as a cleanup action. (The most common use is to kill a
300dnl daemon started by the test. This is important to prevent tests that
301dnl start daemons from hanging at exit.)
5e65e080 302dnl
53eb8cb8
BP
303dnl Cleanup commands are executed in the reverse order of calls to this
304dnl function.
305m4_divert_text([PREPARE_TESTS], [dnl
306on_exit () {
307 (echo "$1"; cat cleanup) > cleanup.tmp
308 mv cleanup.tmp cleanup
309}
310])
fc99370f
BP
311
312dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
313m4_ifndef([AS_VAR_APPEND],
314 [m4_divert_text([PREPARE_TESTS],
315 [as_var_append () {
316 eval $1=\$$1\$2
317 }
318])
319 m4_define([AS_VAR_APPEND], [as_var_append $1 $2])])
47b31247
BP
320
321dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
322m4_ifndef([AT_CHECK_UNQUOTED],
323 [m4_define([AT_CHECK_UNQUOTED],
324 [_AT_CHECK([$1], [$2], AS_ESCAPE(m4_dquote(m4_expand([$3])), [""]),
325 AS_ESCAPE(m4_dquote(m4_expand([$4])),[""]), [$5], [$6])])])
326
327dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
328m4_ifndef([AT_SKIP_IF],
329 [m4_define([AT_SKIP_IF],
330 [AT_CHECK([($1) \
331 && exit 77 || exit 0], [0], [ignore], [ignore])])])
332
333dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
334m4_ifndef([AT_FAIL_IF],
335 [m4_define([AT_FAIL_IF],
336 [AT_CHECK([($1) \
337 && exit 99 || exit 0], [0], [ignore], [ignore])])])