OVS_CHECK_LCOV([ovsdb-client transact unix:socket '[[]]'], [0],
                   [ignore], [ignore], [kill `cat server-pid client-pid`])
    AT_CHECK([ovs-appctl -t $PWD/unixctl -e exit], [0], [ignore], [ignore])
-   OVS_WAIT_UNTIL([test ! -e server-pid && test ! -e client-pid && exit 0])
+   OVS_WAIT_UNTIL([test ! -e server-pid && test ! -e client-pid])
    AT_CHECK([perl $srcdir/uuidfilt.pl output], [0], [$6], [ignore])
    AT_CLEANUP])
 
 
 AT_TESTED([ovs-vsctl])
 AT_TESTED([perl])
 
-m4_define([OVS_WAIT_UNTIL],
+m4_define([OVS_WAIT],
   [AT_CHECK(
     [# First try a quick sleep, so that the test completes very quickly
      # in the normal case.  POSIX doesn't require fractional times to
        sleep 1
        $1
      done
-     exit 1], [0], [ignore], [ignore])])
+     exit 1], [0], [ignore], [ignore], [$2])])
+
+m4_define([OVS_WAIT_UNTIL], [OVS_WAIT([if $1; then exit 0; fi], [$2])])
+m4_define([OVS_WAIT_WHILE], [OVS_WAIT([if $1; then :; else exit 0; fi], [$2])])
 
 m4_include([tests/ovsdb-macros.at])
 m4_include([tests/lcov-pre.at])