]>
Commit | Line | Data |
---|---|---|
02e6f2f7 AZ |
1 | AT_TESTED([ovs-vswitchd]) |
2 | AT_TESTED([ovs-vsctl]) | |
02e6f2f7 | 3 | |
12878bc4 | 4 | m4_include([m4/compat.m4]) |
02e6f2f7 | 5 | |
6132b241 BP |
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 | ]) | |
1b1d2e6d | 12 | |
5f223e92 BP |
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 | ||
1b1d2e6d BP |
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 | ||
02e6f2f7 AZ |
31 | m4_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. | |
36 | ovs_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. | |
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 | ||
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. | |
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 | |
6132b241 BP |
78 | } |
79 | ||
02e6f2f7 AZ |
80 | # Prints the integers from $1 to $2, increasing by $3 (default 1) on stdout. |
81 | seq () { | |
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 | ||
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 | ||
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 | } |
126 | fi | |
03d971cc BP |
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 | |
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. | |
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 --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). | |
182 | wc () { | |
183 | command wc "$@" | tr -s ' ' ' ' | sed 's/^ *//' | |
184 | } | |
c724bd67 BP |
185 | |
186 | uuidfilt () { | |
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 | 198 | if (exec -a myname true 2>/dev/null); then |
1b1d2e6d | 199 | run_as () { |
5a0e4aec | 200 | (exec -a "$@") |
1b1d2e6d BP |
201 | } |
202 | else | |
203 | run_as () { | |
204 | shift | |
5a0e4aec | 205 | (exec "$@") |
1b1d2e6d BP |
206 | } |
207 | fi | |
02e6f2f7 AZ |
208 | ] |
209 | m4_divert_pop([PREPARE_TESTS]) | |
210 | ||
697f5993 | 211 | OVS_START_SHELL_HELPERS |
5f223e92 BP |
212 | ovs_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 |
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 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 | } | |
243 | OVS_END_SHELL_HELPERS | |
2c920d9d BP |
244 | m4_define([OVS_WAIT], [dnl |
245 | ovs_wait_cond () { | |
246 | $1 | |
02e6f2f7 | 247 | } |
697f5993 BP |
248 | ovs_wait_failed () { |
249 | : | |
2c920d9d | 250 | $2 |
697f5993 BP |
251 | } |
252 | ovs_wait "AS_ESCAPE([$3])" "AS_ESCAPE([$4])" | |
2c920d9d | 253 | ]) |
3ee7cc6c AA |
254 | |
255 | dnl OVS_WAIT_UNTIL(COMMAND) | |
256 | dnl | |
257 | dnl Executes shell COMMAND in a loop until it returns | |
258 | dnl zero return code. If COMMAND did not return | |
259 | dnl zero code within reasonable time limit, then | |
260 | dnl the test fails. | |
d1ba7d54 BP |
261 | m4_define([OVS_WAIT_UNTIL], |
262 | [OVS_WAIT([$1], [$2], [AT_LINE], [until $1])]) | |
3ee7cc6c AA |
263 | |
264 | dnl OVS_WAIT_WHILE(COMMAND) | |
265 | dnl | |
266 | dnl Executes shell COMMAND in a loop until it returns | |
267 | dnl non-zero return code. If COMMAND did not return | |
268 | dnl non-zero code within reasonable time limit, then | |
269 | dnl the test fails. | |
02e6f2f7 | 270 | m4_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 | |
274 | dnl OVS_APP_EXIT_AND_WAIT(DAEMON) | |
275 | dnl | |
8a16ab90 | 276 | dnl Ask the daemon named DAEMON to exit, via ovs-appctl, and then wait for it |
02e6f2f7 AZ |
277 | dnl to exit. |
278 | m4_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 | 286 | dnl OVS_APP_EXIT_AND_WAIT_BY_TARGET(TARGET, PIDFILE) |
60bdd011 | 287 | dnl |
8a16ab90 LR |
288 | dnl Ask the daemon identified by TARGET to exit, via ovs-appctl (using the target |
289 | dnl argument), and then wait for it to exit. | |
60bdd011 | 290 | m4_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 | 296 | dnl on_exit "COMMAND" |
02e6f2f7 | 297 | dnl |
53eb8cb8 | 298 | dnl Add the shell COMMAND to a collection executed when the current test |
02e6f2f7 AZ |
299 | dnl completes, as a cleanup action. (The most common use is to kill a |
300 | dnl daemon started by the test. This is important to prevent tests that | |
301 | dnl start daemons from hanging at exit.) | |
5e65e080 | 302 | dnl |
53eb8cb8 BP |
303 | dnl Cleanup commands are executed in the reverse order of calls to this |
304 | dnl function. | |
305 | m4_divert_text([PREPARE_TESTS], [dnl | |
306 | on_exit () { | |
307 | (echo "$1"; cat cleanup) > cleanup.tmp | |
308 | mv cleanup.tmp cleanup | |
309 | } | |
310 | ]) | |
fc99370f BP |
311 | |
312 | dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64: | |
313 | m4_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 | |
321 | dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64: | |
322 | m4_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 | ||
327 | dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64: | |
328 | m4_ifndef([AT_SKIP_IF], | |
329 | [m4_define([AT_SKIP_IF], | |
330 | [AT_CHECK([($1) \ | |
331 | && exit 77 || exit 0], [0], [ignore], [ignore])])]) | |
332 | ||
333 | dnl Autoconf 2.63 compatibility verison of macro introduced in Autoconf 2.64: | |
334 | m4_ifndef([AT_FAIL_IF], | |
335 | [m4_define([AT_FAIL_IF], | |
336 | [AT_CHECK([($1) \ | |
337 | && exit 99 || exit 0], [0], [ignore], [ignore])])]) |