tests: Run OVS_WAIT_WHILE, OVS_WAIT_UNTIL in main shell environment.
[cascardo/ovs.git] / tests / ovs-macros.at
1 AT_TESTED([ovs-vswitchd])
2 AT_TESTED([ovs-vsctl])
3 AT_TESTED([perl])
4
5 m4_include([m4/compat.at])
6
7 dnl Make AT_SETUP automatically run the ovs_init() shell function
8 dnl as the first step in every test.
9 m4_rename([AT_SETUP], [OVS_AT_SETUP])
10 m4_define([AT_SETUP], [OVS_AT_SETUP($@)
11 ovs_init
12 ])
13 m4_divert_push([PREPARE_TESTS])
14 [
15 # Set ovs_base to the base directory in which the test is running and
16 # initialize the OVS_*DIR environment variables to point to this
17 # directory.
18 ovs_init() {
19     ovs_base=`pwd`
20     trap '. "$ovs_base/cleanup"' 0
21     : > cleanup
22     ovs_setenv
23 }
24
25 # With no parameter or an empty parameter, sets the OVS_*DIR
26 # environment variables to point to $ovs_base, the base directory in
27 # which the test is running.
28 #
29 # With a parameter, sets them to $ovs_base/$1.
30 ovs_setenv() {
31     sandbox=$1
32     ovs_dir=$ovs_base${1:+/$1}
33     OVS_RUNDIR=$ovs_dir; export OVS_RUNDIR
34     OVS_LOGDIR=$ovs_dir; export OVS_LOGDIR
35     OVS_DBDIR=$ovs_dir; export OVS_DBDIR
36     OVS_SYSCONFDIR=$ovs_dir; export OVS_SYSCONFDIR
37     OVS_PKGDATADIR=$ovs_dir; export OVS_PKGDATADIR
38 }
39
40 ovs_wait () {
41     # First try a quick sleep, so that the test completes very quickly
42     # in the normal case.  POSIX doesn't require fractional times to
43     # work, so this might not work.
44     sleep 0.1
45     ovs_wait_cond && return 0
46
47     # Then wait up to 10 seconds.
48     for d in 0 1 2 3 4 5 6 7 8 9; do
49         sleep 1
50         ovs_wait_cond && return 0
51     done
52     return 1
53 }
54
55 # Prints the integers from $1 to $2, increasing by $3 (default 1) on stdout.
56 seq () {
57     while test $1 -le $2; do
58         echo $1
59         set `expr $1 + ${3-1}` $2 $3
60     done
61 }
62
63 if test "$IS_WIN32" = "yes"; then
64     pwd () {
65         command pwd -W "$@"
66     }
67
68     diff () {
69         command diff --strip-trailing-cr "$@"
70     }
71
72     # tskill is more effective than taskkill but it isn't always installed.
73     if (tskill //?) >/dev/null 2>&1; then :; else
74         tskill () { taskkill //F //PID $1 >/dev/null; }
75     fi
76
77     kill () {
78         signal=
79         retval=0
80         for arg; do
81             case $arg in
82             -*) signal=$arg ;;
83             [1-9][0-9]*)
84                 # tasklist always returns 0.
85                 # If pid does exist, there will be a line with the pid.
86                 if tasklist //fi "PID eq $arg" | grep $arg >/dev/null; then
87                     if test "X$signal" != "X-0"; then
88                         tskill $arg
89                     fi
90                 else
91                     retval=1
92                 fi
93                 ;;
94             esac
95         done
96         return $retval
97     }
98 fi
99 ]
100 m4_divert_pop([PREPARE_TESTS])
101
102 m4_define([OVS_WAIT], [dnl
103 ovs_wait_cond () {
104     $1
105 }
106 if ovs_wait; then :
107 else
108     $2
109     AT_FAIL_IF([:])
110 fi
111 ])
112
113 dnl OVS_WAIT_UNTIL(COMMAND)
114 dnl
115 dnl Executes shell COMMAND in a loop until it returns
116 dnl zero return code.  If COMMAND did not return
117 dnl zero code within reasonable time limit, then
118 dnl the test fails.
119 m4_define([OVS_WAIT_UNTIL], [OVS_WAIT([$1], [$2])])
120
121 dnl OVS_WAIT_WHILE(COMMAND)
122 dnl
123 dnl Executes shell COMMAND in a loop until it returns
124 dnl non-zero return code.  If COMMAND did not return
125 dnl non-zero code within reasonable time limit, then
126 dnl the test fails.
127 m4_define([OVS_WAIT_WHILE],
128   [OVS_WAIT([if $1; then return 1; else return 0; fi], [$2])])
129
130 dnl OVS_APP_EXIT_AND_WAIT(DAEMON)
131 dnl
132 dnl Ask the daemon named DAEMON to exit, via ovs-appctl, and then waits for it
133 dnl to exit.
134 m4_define([OVS_APP_EXIT_AND_WAIT],
135   [ovs-appctl -t $1 exit
136    OVS_WAIT_WHILE([test -e $1.pid])])
137
138 dnl on_exit "COMMAND"
139 dnl
140 dnl Add the shell COMMAND to a collection executed when the current test
141 dnl completes, as a cleanup action.  (The most common use is to kill a
142 dnl daemon started by the test.  This is important to prevent tests that
143 dnl start daemons from hanging at exit.)
144 dnl
145 dnl Cleanup commands are executed in the reverse order of calls to this
146 dnl function.
147 m4_divert_text([PREPARE_TESTS], [dnl
148 on_exit () {
149     (echo "$1"; cat cleanup) > cleanup.tmp
150     mv cleanup.tmp cleanup
151 }
152 ])