m4_include([m4/compat.at])
+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 a quick sleep, so that the test completes very quickly
+ # 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 && exit 0
+ 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 && exit 0
+ ovs_wait_cond && return 0
done
- exit 1
+ return 1
}
# Prints the integers from $1 to $2, increasing by $3 (default 1) on stdout.
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 () {
- case "$1" in
- -0)
- shift
- for i in $*; do
- # tasklist will always have return code 0.
- # If pid does exist, there will be a line with the pid.
- if tasklist //fi "PID eq $i" | grep $i >/dev/null; then
- :
- else
- return 1
- fi
- done
- return 0
- ;;
- -[1-9]*)
- shift
- for i in $*; do
- taskkill //F //PID $i >/dev/null
- done
- ;;
+ signal=
+ retval=0
+ for arg; do
+ case $arg in
+ -*) signal=$arg ;;
[1-9][0-9]*)
- for i in $*; do
- taskkill //F //PID $i >/dev/null
- done
+ # 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
+ esac
+ done
+ return $retval
}
fi
]
m4_divert_pop([PREPARE_TESTS])
-m4_define([OVS_WAIT],
- [AT_CHECK(
- [ovs_wait_cond () { $1
+m4_define([OVS_WAIT], [dnl
+ovs_wait_cond () {
+ $1
}
-ovs_wait], [0], [ignore], [ignore], [$2])])
+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])])
[ovs-appctl -t $1 exit
OVS_WAIT_WHILE([test -e $1.pid])])
-dnl ON_EXIT([COMMANDS])
+dnl on_exit "COMMAND"
dnl
-dnl Adds the shell COMMANDS to a collection executed when the current test
+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 The commands will be added will be tht first one to excute.
-m4_define([ON_EXIT], [trap '. ./cleanup' 0; cat - cleanup << 'EOF' > __cleanup
-$1
-EOF
-mv __cleanup cleanup
+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
+}
])