dnl OVSDB_INIT([$1])
dnl
dnl Creates an empty database named $1.
m4_define([OVSDB_INIT],
  [AT_CHECK(
     [ovsdb-tool create $1 $abs_top_srcdir/vswitchd/vswitch.ovsschema],
     [0], [stdout], [ignore])
   AT_CHECK(
     [[ovsdb-tool transact $1 \
        '["Open_vSwitch",
          {"op": "insert",
           "table": "Open_vSwitch",
           "row": {}}]']],
     [0], [ignore], [ignore])])

dnl OVSDB_SERVER_SHUTDOWN([ALLOWLIST])
dnl
dnl Gracefully stops ovsdb-server, checking log files for messages with
dnl severity WARN or higher and signaling an error if any is present.
dnl The optional ALLOWLIST may contain shell-quoted "sed" commands to
dnl delete any warnings that are actually expected, e.g.:
dnl
dnl   OVSDB_SERVER_SHUTDOWN(["/expected error/d"])
m4_define([OVSDB_SERVER_SHUTDOWN],
  [AT_CHECK([check_logs $1])
   OVS_APP_EXIT_AND_WAIT_BY_TARGET([ovsdb-server], [ovsdb-server.pid])])

# OVSDB_CHECK_POSITIVE(TITLE, TEST-OVSDB-ARGS, OUTPUT, [KEYWORDS], [PREREQ])
#
# Runs "test-ovsdb TEST-OVSDB-ARGS" and checks that it exits with
# status 0 and prints OUTPUT on stdout.
#
# TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
m4_define([OVSDB_CHECK_POSITIVE],
  [AT_SETUP([$1])
   AT_KEYWORDS([ovsdb positive $4])
   AT_CHECK([test-ovsdb $2], [0], [$3
], [])
   AT_CLEANUP])

# OVSDB_CHECK_POSITIVE_PY(TITLE, TEST-OVSDB-ARGS, OUTPUT, [KEYWORDS], [PREREQ],
#                          [PY-CHECK])
#
# Runs "test-ovsdb.py TEST-OVSDB-ARGS" and checks that it exits with
# status 0 and prints OUTPUT on stdout.
#
# PY-CHECK is expanded before the check.  It can check for features of the
# Python implementation that are required for the test to pass.
#
# TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
m4_define([OVSDB_CHECK_POSITIVE_PY],
  [AT_SETUP([$1])
   $6
   AT_KEYWORDS([ovsdb positive Python $4])
   AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py $2], [0], [$3
], [])
   AT_CLEANUP])

# OVSDB_CHECK_POSITIVE_CPY(TITLE, TEST-OVSDB-ARGS, OUTPUT, [KEYWORDS],
#                          [PREREQ], [PY3-CHECK])
#
# Runs identical C and Python tests, as specified.
m4_define([OVSDB_CHECK_POSITIVE_CPY],
  [OVSDB_CHECK_POSITIVE([$1 - C], [$2], [$3], [$4], [$5])
   OVSDB_CHECK_POSITIVE_PY([$1 - Python3], [$2], [$3], [$4], [$5], [$7])])

# OVSDB_CHECK_NEGATIVE(TITLE, TEST-OVSDB-ARGS, OUTPUT, [KEYWORDS], [PREREQ])
#
# Runs "test-ovsdb TEST-OVSDB-ARGS" and checks that it exits with
# status 1 and that its output on stdout contains substring OUTPUT.
# TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
m4_define([OVSDB_CHECK_NEGATIVE],
  [AT_SETUP([$1])
   AT_KEYWORDS([ovsdb negative $4])
   AT_CHECK([test-ovsdb $2], [1], [], [stderr])
   m4_assert(m4_len([$3]))
   AT_CHECK(
     [if grep -F -e "AS_ESCAPE([$3])" stderr
      then
        :
      else
        exit 99
      fi],
            [0], [ignore], [ignore])
   AT_CLEANUP])

# OVSDB_CHECK_NEGATIVE_PY(TITLE, TEST-OVSDB-ARGS, OUTPUT, [KEYWORDS], [PREREQ])
#
# Runs "test-ovsdb TEST-OVSDB-ARGS" and checks that it exits with
# status 1 and that its output on stdout contains substring OUTPUT.
# TITLE is provided to AT_SETUP and KEYWORDS to AT_KEYWORDS.
m4_define([OVSDB_CHECK_NEGATIVE_PY],
  [AT_SETUP([$1])
   AT_KEYWORDS([ovsdb negative $4])
   AT_CHECK([$PYTHON3 $srcdir/test-ovsdb.py $2], [1], [], [stderr])
   m4_assert(m4_len([$3]))
   AT_CHECK(
     [if grep -F -e "AS_ESCAPE([$3])" stderr
      then
        :
      else
        exit 99
      fi],
            [0], [ignore], [ignore])
   AT_CLEANUP])

# OVSDB_CHECK_NEGATIVE_CPY(TITLE, TEST-OVSDB-ARGS, OUTPUT, [KEYWORDS],
#                          [PREREQ])
#
# Runs identical C and Python tests, as specified.
m4_define([OVSDB_CHECK_NEGATIVE_CPY],
  [OVSDB_CHECK_NEGATIVE([$1 - C], [$2], [$3], [$4], [$5])
   OVSDB_CHECK_NEGATIVE_PY([$1 - Python3], [$2], [$3], [$4], [$5])])

OVS_START_SHELL_HELPERS
ovsdb_client_wait() {
    ovsdb-client -vconsole:warn -vreconnect:err -vjsonrpc:err -vtimeval:off -vfile -vsyslog:off -vvlog:off wait "$@"
}
OVS_END_SHELL_HELPERS
