1 AT_TESTED([ovs-vswitchd])
4 m4_include([m4/compat.m4])
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($@)
13 dnl Make AT_CLEANUP check for Address Sanitizer errors as the last step
15 m4_rename([AT_CLEANUP], [OVS_AT_CLEANUP])
16 m4_define([AT_CLEANUP], [ovs_cleanup
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])])
31 m4_divert_push([PREPARE_TESTS])
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
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
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: "
58 if [ ! -z "${OVS_PAUSE_TEST}" ] && [ -z $at_verbose ]; then
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.
69 # With a parameter, sets them to $ovs_base/$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
80 # Prints the integers from $1 to $2, increasing by $3 (default 1) on stdout.
85 while test $1 -le $2; do
87 set `expr $1 + ${3-1}` $2 $3
91 if test "$IS_WIN32" = "yes"; then
97 command diff --strip-trailing-cr "$@"
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; }
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
130 # Prints the PID of the parent of process 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
143 # kill_ovs_vswitchd [PID]
145 # Signal the ovs-vswitchd daemon to exit gracefully and wait for it to
146 # terminate or kill it if that takes too long.
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.
153 if test -z "$TMPPID"; then
154 TMPPID=$(cat $OVS_RUNDIR/ovs-vswitchd.pid 2>/dev/null)
157 # Tell the daemon to terminate gracefully
158 ovs-appctl -t ovs-vswitchd exit --cleanup 2>/dev/null
160 # Nothing else to be done if there is no PID
161 test -z "$TMPPID" && return
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
167 # Fallback to whole number since POSIX doesn't require
168 # fractional times to work.
172 # Make sure it is terminated.
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".
180 # This fixes all of those (it will screw up filenames that contain
181 # multiple sequential spaces, but that doesn't really matter).
183 command wc "$@" | tr -s ' ' ' ' | sed 's/^ *//'
187 $PYTHON3 "$top_srcdir"/tests/uuidfilt.py "$@"
190 # run_as PROGRAM_NAME COMMAND [ARG...]
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.
197 # Not all shells support "exec -a NAME", so test for it.
198 if (exec -a myname true 2>/dev/null); then
209 m4_divert_pop([PREPARE_TESTS])
211 OVS_START_SHELL_HELPERS
213 if test "$(echo asan.*)" != 'asan.*'; then
214 echo "Address Sanitizer reported errors in:" asan.*
221 echo "$1: waiting $2..." >&AS_MESSAGE_LOG_FD
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
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.
230 if ovs_wait_cond; then echo "$1: wait succeeded quickly" >&AS_MESSAGE_LOG_FD; return 0; fi
232 # Then wait up to OVS_CTL_TIMEOUT seconds.
234 for d in `seq 1 "$OVS_CTL_TIMEOUT"`; do
236 if ovs_wait_cond; then echo "$1: wait succeeded after $d seconds" >&AS_MESSAGE_LOG_FD; return 0; fi
239 echo "$1: wait failed after $d seconds" >&AS_MESSAGE_LOG_FD
243 OVS_END_SHELL_HELPERS
244 m4_define([OVS_WAIT], [dnl
252 ovs_wait "AS_ESCAPE([$3])" "AS_ESCAPE([$4])"
255 dnl OVS_WAIT_UNTIL(COMMAND, [IF-FAILED])
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])])
263 dnl OVS_WAIT_WHILE(COMMAND, [IF-FAILED])
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])])
272 dnl OVS_APP_EXIT_AND_WAIT(DAEMON)
274 dnl Ask the daemon named DAEMON to exit, via ovs-appctl, and then wait for it
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])])
284 dnl OVS_APP_EXIT_AND_WAIT_BY_TARGET(TARGET, PIDFILE)
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])
291 AT_CHECK([ovs-appctl --target=$1 exit])
292 OVS_WAIT_WHILE([kill -0 $TMPPID 2>/dev/null])])
294 dnl on_exit "COMMAND"
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.)
301 dnl Cleanup commands are executed in the reverse order of calls to this
303 m4_divert_text([PREPARE_TESTS], [dnl
305 (echo "$1"; cat cleanup) > cleanup.tmp
306 mv cleanup.tmp cleanup
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],
317 m4_define([AS_VAR_APPEND], [as_var_append $1 $2])])
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])])])
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],
329 && exit 77 || exit 0], [0], [ignore], [ignore])])])
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],
335 && exit 99 || exit 0], [0], [ignore], [ignore])])])