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 OVS_START_SHELL_HELPERS...OVS_END_SHELL_HELPERS may bracket shell
14 dnl function definitions that invoke AT_CHECK and other Autotest macros
15 dnl that can ordinarily be run only within AT_SETUP...AT_CLEANUP.
16 m4_define([OVS_START_SHELL_HELPERS],
17 [m4_ifdef([AT_ingroup], [m4_fatal([$0: AT_SETUP and OVS_DEFINE_SHELL_HELPERS may not nest])])
18 m4_define([AT_ingroup])
19 m4_divert_push([PREPARE_TESTS])])
20 m4_define([OVS_END_SHELL_HELPERS], [
21 m4_divert_pop([PREPARE_TESTS])
22 m4_undefine([AT_ingroup])])
24 m4_divert_push([PREPARE_TESTS])
26 # Set ovs_base to the base directory in which the test is running and
27 # initialize the OVS_*DIR environment variables to point to this
31 trap '. "$ovs_base/cleanup"' 0
36 # With no parameter or an empty parameter, sets the OVS_*DIR
37 # environment variables to point to $ovs_base, the base directory in
38 # which the test is running.
40 # With a parameter, sets them to $ovs_base/$1.
43 ovs_dir=$ovs_base${1:+/$1}
44 OVS_RUNDIR=$ovs_dir; export OVS_RUNDIR
45 OVS_LOGDIR=$ovs_dir; export OVS_LOGDIR
46 OVS_DBDIR=$ovs_dir; export OVS_DBDIR
47 OVS_SYSCONFDIR=$ovs_dir; export OVS_SYSCONFDIR
48 OVS_PKGDATADIR=$ovs_dir; export OVS_PKGDATADIR
52 # First try the condition without waiting.
53 ovs_wait_cond && return 0
55 # Try a quick sleep, so that the test completes very quickly
56 # in the normal case. POSIX doesn't require fractional times to
57 # work, so this might not work.
59 ovs_wait_cond && return 0
61 # Then wait up to 10 seconds.
62 for d in 0 1 2 3 4 5 6 7 8 9; do
64 ovs_wait_cond && return 0
69 # Prints the integers from $1 to $2, increasing by $3 (default 1) on stdout.
74 while test $1 -le $2; do
76 set `expr $1 + ${3-1}` $2 $3
80 if test "$IS_WIN32" = "yes"; then
86 command diff --strip-trailing-cr "$@"
89 # tskill is more effective than taskkill but it isn't always installed.
90 if (tskill //?) >/dev/null 2>&1; then :; else
91 tskill () { taskkill //F //PID $1 >/dev/null; }
101 # tasklist always returns 0.
102 # If pid does exist, there will be a line with the pid.
103 if tasklist //fi "PID eq $arg" | grep $arg >/dev/null; then
104 if test "X$signal" != "X-0"; then
117 # Try to add a default timeout for the following control utilities:
124 # Set default timeout for 30 seconds.
125 # This should be sufficient on all platforms.
127 alias ovs-vsctl='OVS_VSCTL_TIMEOUT' >/dev/null 2>&1
128 if [ $? -eq 0 ]; then
129 OVS_VSCTL_TIMEOUT () {
130 command ovs-vsctl --timeout=$OVS_TIMEOUT "$@"
132 alias ovs-ofctl='OVS_OFCTL_TIMEOUT'
133 alias ovs-appctl='OVS_APPCTL_TIMEOUT'
134 alias ovn-sbctl='OVS_SBCTL_TIMEOUT'
135 alias ovn-nbctl='OVN_NBCTL_TIMEOUT'
136 alias vtep-ctl='VTEP_CTL_TIMEOUT'
137 alias ovsdb-client='OVSDB_CLIENT_TIMEOUT'
138 OVS_OFCTL_TIMEOUT () {
139 command ovs-ofctl --timeout=$OVS_TIMEOUT "$@"
141 OVS_APPCTL_TIMEOUT () {
142 command ovs-appctl --timeout=$OVS_TIMEOUT "$@"
144 OVS_SBCTL_TIMEOUT () {
145 command ovn-sbctl --timeout=$OVS_TIMEOUT "$@"
147 OVN_NBCTL_TIMEOUT () {
148 command ovn-nbctl --timeout=$OVS_TIMEOUT "$@"
150 VTEP_CTL_TIMEOUT () {
151 command vtep-ctl --timeout=$OVS_TIMEOUT "$@"
153 OVSDB_CLIENT_TIMEOUT () {
154 command ovsdb-client --timeout=$OVS_TIMEOUT "$@"
160 # Prints the PID of the parent of process PID.
162 # Using "ps" is portable to any POSIX system, but busybox "ps" (used in
163 # e.g. Alpine Linux) is noncompliant, so we use a Linux-specific approach
164 # when it's available. We check the format of the status file to avoid
165 # the NetBSD file with the same name but different contents.
166 if egrep '^PPid:[[:space:]]*[0-9]*$' /proc/$1/status > /dev/null 2>&1; then
167 sed -n 's/^PPid: \([0-9]*\)/\1/p' /proc/$1/status
173 # kill_ovs_vswitchd [PID]
175 # Signal the ovs-vswitchd daemon to exit gracefully and wait for it to
176 # terminate or kill it if that takes too long.
178 # It is used to cleanup all sorts of tests and results. It can't assume
179 # any state, including the availability of PID file which can be provided.
180 kill_ovs_vswitchd () {
181 # Use provided PID or save the current PID if available.
183 if test -z "$TMPPID"; then
184 TMPPID=$(cat $OVS_RUNDIR/ovs-vswitchd.pid 2>/dev/null)
187 # Tell the daemon to terminate gracefully
188 ovs-appctl --timeout=10 -t ovs-vswitchd exit --cleanup 2>/dev/null
190 # Nothing else to be done if there is no PID
191 test -z "$TMPPID" && return
193 for i in 1 2 3 4 5 6 7 8 9; do
194 # Check if the daemon is alive.
195 kill -0 $TMPPID 2>/dev/null || return
197 # Fallback to whole number since POSIX doesn't require
198 # fractional times to work.
202 # Make sure it is terminated.
206 # Normalize the output of 'wc' to match POSIX.
207 # POSIX says 'wc' should print "%d %d %d", but GNU prints "%7d %7d %7d".
208 # POSIX says 'wc -l' should print "%d %s", but BSD prints "%8d".
210 # This fixes all of those (it will screw up filenames that contain
211 # multiple sequential spaces, but that doesn't really matter).
213 command wc "$@" | tr -s ' ' ' ' | sed 's/^ *//'
217 $PYTHON "$top_srcdir"/tests/uuidfilt.py "$@"
220 # run_as PROGRAM_NAME COMMAND [ARG...]
222 # Runs a command with argv[0] set to PROGRAM_NAME, if possible, in a
223 # subshell. Most utilities print argc[0] as part of their messages,
224 # so this makes it easier to figure out which particular utility
225 # prints a message if a bunch of identical processes are running.
227 # Not all shells support "exec -a NAME", so test for it.
228 if (exec -a myname true); then
239 m4_divert_pop([PREPARE_TESTS])
241 m4_define([OVS_WAIT], [dnl
242 AS_ECHO(["AS_ESCAPE([$3: waiting $4...])"]) >&AS_MESSAGE_LOG_FD
248 AS_ECHO(["AS_ESCAPE([$3: wait failed])"]) >&AS_MESSAGE_LOG_FD
254 dnl OVS_WAIT_UNTIL(COMMAND)
256 dnl Executes shell COMMAND in a loop until it returns
257 dnl zero return code. If COMMAND did not return
258 dnl zero code within reasonable time limit, then
260 m4_define([OVS_WAIT_UNTIL],
261 [OVS_WAIT([$1], [$2], [AT_LINE], [until $1])])
263 dnl OVS_WAIT_WHILE(COMMAND)
265 dnl Executes shell COMMAND in a loop until it returns
266 dnl non-zero return code. If COMMAND did not return
267 dnl non-zero code within reasonable time limit, then
269 m4_define([OVS_WAIT_WHILE],
270 [OVS_WAIT([if $1; then return 1; else return 0; fi], [$2],
271 [AT_LINE], [while $1])])
273 dnl OVS_APP_EXIT_AND_WAIT(DAEMON)
275 dnl Ask the daemon named DAEMON to exit, via ovs-appctl, and then wait for it
277 m4_define([OVS_APP_EXIT_AND_WAIT],
278 [AT_CHECK([test -e $OVS_RUNDIR/$1.pid])
279 TMPPID=$(cat $OVS_RUNDIR/$1.pid)
280 AT_CHECK(m4_if([$1],[ovs-vswitchd],
281 [ovs-appctl --timeout=10 -t $1 exit --cleanup],
282 [ovs-appctl --timeout=10 -t $1 exit]))
283 OVS_WAIT_WHILE([kill -0 $TMPPID 2>/dev/null])])
285 dnl OVS_APP_EXIT_AND_WAIT_BY_TARGET(TARGET, PIDFILE)
287 dnl Ask the daemon identified by TARGET to exit, via ovs-appctl (using the target
288 dnl argument), and then wait for it to exit.
289 m4_define([OVS_APP_EXIT_AND_WAIT_BY_TARGET],
290 [AT_CHECK([test -e $2])
292 AT_CHECK([ovs-appctl --timeout=10 --target=$1 exit])
293 OVS_WAIT_WHILE([kill -0 $TMPPID 2>/dev/null])])
295 dnl on_exit "COMMAND"
297 dnl Add the shell COMMAND to a collection executed when the current test
298 dnl completes, as a cleanup action. (The most common use is to kill a
299 dnl daemon started by the test. This is important to prevent tests that
300 dnl start daemons from hanging at exit.)
302 dnl Cleanup commands are executed in the reverse order of calls to this
304 m4_divert_text([PREPARE_TESTS], [dnl
306 (echo "$1"; cat cleanup) > cleanup.tmp
307 mv cleanup.tmp cleanup
311 dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
312 m4_ifndef([AS_VAR_APPEND],
313 [m4_divert_text([PREPARE_TESTS],
318 m4_define([AS_VAR_APPEND], [as_var_append $1 $2])])
320 dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
321 m4_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])])])
326 dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
327 m4_ifndef([AT_SKIP_IF],
328 [m4_define([AT_SKIP_IF],
330 && exit 77 || exit 0], [0], [ignore], [ignore])])])
332 dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64:
333 m4_ifndef([AT_FAIL_IF],
334 [m4_define([AT_FAIL_IF],
336 && exit 99 || exit 0], [0], [ignore], [ignore])])])