+m4_divert_push([PREPARE_TESTS])
+[
+ovs_wait () {
+ # First 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
+ # 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
+ done
+ exit 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 "$@"
+ }
+
+ 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; then
+ :
+ else
+ return 1
+ fi
+ done
+ return 0
+ ;;
+ -[1-9]*)
+ shift
+ for i in $*; do
+ taskkill //F //PID $i
+ done
+ ;;
+ [1-9][1-9]*)
+ for i in $*; do
+ taskkill //F //PID $i
+ done
+ ;;
+ esac
+ }
+fi
+]
+m4_divert_pop([PREPARE_TESTS])
+
+m4_define([OVS_WAIT],
+ [AT_CHECK(
+ [ovs_wait_cond () { $1
+}
+ovs_wait], [0], [ignore], [ignore], [$2])])
+m4_define([OVS_WAIT_UNTIL], [OVS_WAIT([$1], [$2])])
+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 waits for it
+dnl to exit.
+m4_define([OVS_APP_EXIT_AND_WAIT],
+ [ovs-appctl -t $1 exit
+ OVS_WAIT_WHILE([test -e $1.pid])])
+
+dnl ON_EXIT([COMMANDS])
+dnl
+dnl Adds the shell COMMANDS 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.)
+m4_define([ON_EXIT], [trap '. ./cleanup' 0; cat >>cleanup <<'EOF'
+$1
+EOF
+])
+
+m4_include([tests/ovsdb-macros.at])
+m4_include([tests/ofproto-macros.at])
+
+m4_include([tests/bfd.at])
+m4_include([tests/cfm.at])
+m4_include([tests/lacp.at])