]> git.proxmox.com Git - mirror_ovs.git/blob - tests/ovs-macros.at
system-traffic: Check frozen state handling with TLV map change
[mirror_ovs.git] / tests / ovs-macros.at
1 AT_TESTED([ovs-vswitchd])
2 AT_TESTED([ovs-vsctl])
3
4 m4_include([m4/compat.m4])
5
6 dnl Make AT_SETUP automatically run the ovs_init() shell function
7 dnl as the first step in every test.
8 m4_rename([AT_SETUP], [OVS_AT_SETUP])
9 m4_define([AT_SETUP], [OVS_AT_SETUP($@)
10 ovs_init
11 ])
12
13 dnl Make AT_CLEANUP check for Address Sanitizer errors as the last step
14 dnl in every test.
15 m4_rename([AT_CLEANUP], [OVS_AT_CLEANUP])
16 m4_define([AT_CLEANUP], [ovs_cleanup
17 OVS_AT_CLEANUP($@)
18 ])
19
20 dnl OVS_START_SHELL_HELPERS...OVS_END_SHELL_HELPERS may bracket shell
21 dnl function definitions that invoke AT_CHECK and other Autotest macros
22 dnl that can ordinarily be run only within AT_SETUP...AT_CLEANUP.
23 m4_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])])
27 m4_define([OVS_END_SHELL_HELPERS], [
28 m4_divert_pop([PREPARE_TESTS])
29 m4_undefine([AT_ingroup])])
30
31 m4_divert_push([PREPARE_TESTS])
32 [
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.
36 ovs_init() {
37 ovs_base=`pwd`
38 trap ovs_on_exit 0
39 : > cleanup
40 ovs_setenv
41 }
42
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.
49 ovs_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
57 ovs_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
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.
70 ovs_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
78 }
79
80 # Prints the integers from $1 to $2, increasing by $3 (default 1) on stdout.
81 seq () {
82 if test $# = 1; then
83 set 1 $1
84 fi
85 while test $1 -le $2; do
86 echo $1
87 set `expr $1 + ${3-1}` $2 $3
88 done
89 }
90
91 if test "$IS_WIN32" = "yes"; then
92 pwd () {
93 command pwd -W "$@"
94 }
95
96 diff () {
97 command diff --strip-trailing-cr "$@"
98 }
99
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
105 kill () {
106 signal=
107 retval=0
108 for arg; do
109 case $arg in
110 -*) signal=$arg ;;
111 [1-9][0-9]*)
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
117 fi
118 else
119 retval=1
120 fi
121 ;;
122 esac
123 done
124 return $retval
125 }
126 fi
127
128 # parent_pid PID
129 #
130 # Prints the PID of the parent of process PID.
131 parent_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
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
137 sed -n 's/^PPid: \([0-9]*\)/\1/p' /proc/$1/status
138 else
139 ps -o ppid= -p $1
140 fi
141 }
142
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.
150 kill_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 -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
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).
182 wc () {
183 command wc "$@" | tr -s ' ' ' ' | sed 's/^ *//'
184 }
185
186 uuidfilt () {
187 $PYTHON3 "$top_srcdir"/tests/uuidfilt.py "$@"
188 }
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.
198 if (exec -a myname true 2>/dev/null); then
199 run_as () {
200 (exec -a "$@")
201 }
202 else
203 run_as () {
204 shift
205 (exec "$@")
206 }
207 fi
208 ]
209 m4_divert_pop([PREPARE_TESTS])
210
211 OVS_START_SHELL_HELPERS
212 ovs_cleanup() {
213 if test "$(echo asan.*)" != 'asan.*'; then
214 echo "Address Sanitizer reported errors in:" asan.*
215 cat asan.*
216 AT_FAIL_IF([:])
217 fi
218 }
219
220 ovs_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 OVS_CTL_TIMEOUT seconds.
233 local d
234 for d in `seq 1 "$OVS_CTL_TIMEOUT"`; 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 }
243 OVS_END_SHELL_HELPERS
244 m4_define([OVS_WAIT], [dnl
245 ovs_wait_cond () {
246 $1
247 }
248 ovs_wait_failed () {
249 :
250 $2
251 }
252 ovs_wait "AS_ESCAPE([$3])" "AS_ESCAPE([$4])"
253 ])
254
255 dnl OVS_WAIT_UNTIL(COMMAND, [IF-FAILED])
256 dnl
257 dnl Executes shell COMMAND in a loop until it returns zero. If COMMAND does
258 dnl not return zero within a reasonable time limit, executes the commands
259 dnl in IF-FAILED (if provided) and fails the test.
260 m4_define([OVS_WAIT_UNTIL],
261 [OVS_WAIT([$1], [$2], [AT_LINE], [until $1])])
262
263 dnl OVS_WAIT_WHILE(COMMAND, [IF-FAILED])
264 dnl
265 dnl Executes shell COMMAND in a loop until it returns nonzero. If COMMAND does
266 dnl not return nonzero within a reasonable time limit, executes the commands
267 dnl in IF-FAILED (if provided) and fails the test.
268 m4_define([OVS_WAIT_WHILE],
269 [OVS_WAIT([if $1; then return 1; else return 0; fi], [$2],
270 [AT_LINE], [while $1])])
271
272 dnl OVS_APP_EXIT_AND_WAIT(DAEMON)
273 dnl
274 dnl Ask the daemon named DAEMON to exit, via ovs-appctl, and then wait for it
275 dnl to exit.
276 m4_define([OVS_APP_EXIT_AND_WAIT],
277 [AT_CHECK([test -e $OVS_RUNDIR/$1.pid])
278 TMPPID=$(cat $OVS_RUNDIR/$1.pid)
279 AT_CHECK(m4_if([$1],[ovs-vswitchd],
280 [ovs-appctl -t $1 exit --cleanup],
281 [ovs-appctl -t $1 exit]))
282 OVS_WAIT_WHILE([kill -0 $TMPPID 2>/dev/null])])
283
284 dnl OVS_APP_EXIT_AND_WAIT_BY_TARGET(TARGET, PIDFILE)
285 dnl
286 dnl Ask the daemon identified by TARGET to exit, via ovs-appctl (using the target
287 dnl argument), and then wait for it to exit.
288 m4_define([OVS_APP_EXIT_AND_WAIT_BY_TARGET],
289 [AT_CHECK([test -e $2])
290 TMPPID=$(cat $2)
291 AT_CHECK([ovs-appctl --target=$1 exit])
292 OVS_WAIT_WHILE([kill -0 $TMPPID 2>/dev/null])])
293
294 dnl on_exit "COMMAND"
295 dnl
296 dnl Add the shell COMMAND to a collection executed when the current test
297 dnl completes, as a cleanup action. (The most common use is to kill a
298 dnl daemon started by the test. This is important to prevent tests that
299 dnl start daemons from hanging at exit.)
300 dnl
301 dnl Cleanup commands are executed in the reverse order of calls to this
302 dnl function.
303 m4_divert_text([PREPARE_TESTS], [dnl
304 on_exit () {
305 (echo "$1"; cat cleanup) > cleanup.tmp
306 mv cleanup.tmp cleanup
307 }
308 ])
309
310 dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
311 m4_ifndef([AS_VAR_APPEND],
312 [m4_divert_text([PREPARE_TESTS],
313 [as_var_append () {
314 eval $1=\$$1\$2
315 }
316 ])
317 m4_define([AS_VAR_APPEND], [as_var_append $1 $2])])
318
319 dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
320 m4_ifndef([AT_CHECK_UNQUOTED],
321 [m4_define([AT_CHECK_UNQUOTED],
322 [_AT_CHECK([$1], [$2], AS_ESCAPE(m4_dquote(m4_expand([$3])), [""]),
323 AS_ESCAPE(m4_dquote(m4_expand([$4])),[""]), [$5], [$6])])])
324
325 dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
326 m4_ifndef([AT_SKIP_IF],
327 [m4_define([AT_SKIP_IF],
328 [AT_CHECK([($1) \
329 && exit 77 || exit 0], [0], [ignore], [ignore])])])
330
331 dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
332 m4_ifndef([AT_FAIL_IF],
333 [m4_define([AT_FAIL_IF],
334 [AT_CHECK([($1) \
335 && exit 99 || exit 0], [0], [ignore], [ignore])])])