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