tests: Add Autoconf 2.63 compatibility support for AS_VAR_APPEND.
[cascardo/ovs.git] / tests / ovs-macros.at
index c583c3d..6c0f58d 100644 (file)
@@ -4,20 +4,55 @@ AT_TESTED([perl])
 
 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.
@@ -37,48 +72,61 @@ if test "$IS_WIN32" = "yes"; then
         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
-                    if tasklist //fi "PID eq $i" | grep $i >/dev/null; then
-                        tskill $i
-                    fi
-                done
-                ;;
+        signal=
+        retval=0
+        for arg; do
+            case $arg in
+            -*) signal=$arg ;;
             [1-9][0-9]*)
-                for i in $*; do
-                    if tasklist //fi "PID eq $i" | grep $i >/dev/null; then
-                        tskill $i
+                # 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
-                done
+                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])])
 
@@ -90,28 +138,27 @@ m4_define([OVS_APP_EXIT_AND_WAIT],
   [ovs-appctl -t $1 exit
    OVS_WAIT_WHILE([test -e $1.pid])])
 
-m4_define([ON_EXIT__], [trap '. ./cleanup' 0; cat - cleanup << $2 > __cleanup
-$1
-EOF
-mv __cleanup cleanup
-])
-
-dnl ON_EXIT([COMMANDS])
-dnl ON_EXIT_UNQUOTED([COMMANDS])
+dnl on_exit "COMMAND"
 dnl
-dnl Add 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
-dnl The only difference between ON_EXIT and ON_EXIT_UNQUOTED is that only the
-dnl latter performs shell variable (e.g. $var) substitution, command
-dnl substitution (e.g. `command`), and backslash escaping (e.g. \\ becomes \)
-dnl in COMMANDS at the time that ON_EXIT_UNQUOTED is encountered.  ON_EXIT,
-dnl in contrast, copies the literal COMMANDS and only executes shell expansion
-dnl at cleanup time.
-dnl
-dnl Cleanup commands are executed in the reverse order of execution of
-dnl these macros.
-m4_define([ON_EXIT], [ON_EXIT__([$1], ['EOF'])])
-m4_define([ON_EXIT_UNQUOTED], [ON_EXIT__([$1], [EOF])])
+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])])