Add support for running the testsuite under 'valgrind'.
[openvswitch] / tests / test-ovsdb.c
index a0476a922becb52570a2410b7ab415da7a9ddab4..18f8c46ee5ad6dd5c0863a7624c8080ffa3808de 100644 (file)
@@ -24,6 +24,7 @@
 #include <stdlib.h>
 
 #include "command-line.h"
+#include "dynamic-string.h"
 #include "json.h"
 #include "jsonrpc.h"
 #include "ovsdb-data.h"
@@ -125,11 +126,15 @@ usage(void)
            "  parse-type JSON\n"
            "    parse JSON as OVSDB type, and re-serialize\n"
            "  parse-atoms TYPE ATOM...\n"
-           "    parse ATOMs as atoms of given TYPE, and re-serialize\n"
+           "    parse JSON ATOMs as atoms of TYPE, and re-serialize\n"
+           "  parse-atom-strings TYPE ATOM...\n"
+           "    parse string ATOMs as atoms of given TYPE, and re-serialize\n"
            "  sort-atoms TYPE ATOM...\n"
-           "    print ATOMs in sorted order, and re-serialize\n"
+           "    print JSON ATOMs in sorted order\n"
            "  parse-data TYPE DATUM...\n"
-           "    parse DATUMs as data of given TYPE, and re-serialize\n"
+           "    parse JSON DATUMs as data of given TYPE, and re-serialize\n"
+           "  parse-data-strings TYPE DATUM...\n"
+           "    parse string DATUMs as data of given TYPE, and re-serialize\n"
            "  parse-column NAME OBJECT\n"
            "    parse column NAME with info OBJECT, and re-serialize\n"
            "  parse-table NAME OBJECT\n"
@@ -231,6 +236,14 @@ check_ovsdb_error(struct ovsdb_error *error)
         ovs_fatal(0, "%s", ovsdb_error_to_string(error));
     }
 }
+
+static void
+die_if_error(char *error)
+{
+    if (error) {
+        ovs_fatal(0, "%s", error);
+    }
+}
 \f
 /* Command implementations. */
 
@@ -352,6 +365,32 @@ do_parse_atoms(int argc, char *argv[])
     }
 }
 
+static void
+do_parse_atom_strings(int argc, char *argv[])
+{
+    enum ovsdb_atomic_type type;
+    struct json *json;
+    int i;
+
+    json = unbox_json(parse_json(argv[1]));
+    check_ovsdb_error(ovsdb_atomic_type_from_json(&type, json));
+    json_destroy(json);
+
+    for (i = 2; i < argc; i++) {
+        union ovsdb_atom atom;
+        struct ds out;
+
+        die_if_error(ovsdb_atom_from_string(&atom, type, argv[i]));
+
+        ds_init(&out);
+        ovsdb_atom_to_string(&atom, type, &out);
+        puts(ds_cstr(&out));
+        ds_destroy(&out);
+
+        ovsdb_atom_destroy(&atom, type);
+    }
+}
+
 static void
 do_parse_data(int argc, char *argv[])
 {
@@ -376,6 +415,32 @@ do_parse_data(int argc, char *argv[])
     }
 }
 
+static void
+do_parse_data_strings(int argc, char *argv[])
+{
+    struct ovsdb_type type;
+    struct json *json;
+    int i;
+
+    json = unbox_json(parse_json(argv[1]));
+    check_ovsdb_error(ovsdb_type_from_json(&type, json));
+    json_destroy(json);
+
+    for (i = 2; i < argc; i++) {
+        struct ovsdb_datum datum;
+        struct ds out;
+
+        die_if_error(ovsdb_datum_from_string(&datum, &type, argv[i]));
+
+        ds_init(&out);
+        ovsdb_datum_to_string(&datum, &type, &out);
+        puts(ds_cstr(&out));
+        ds_destroy(&out);
+
+        ovsdb_datum_destroy(&datum, &type);
+    }
+}
+
 static enum ovsdb_atomic_type compare_atoms_atomic_type;
 
 static int
@@ -1553,6 +1618,7 @@ idl_set(struct ovsdb_idl *idl, char *commands, int step)
     char *cmd, *save_ptr1 = NULL;
     struct ovsdb_idl_txn *txn;
     enum ovsdb_idl_txn_status status;
+    bool increment = false;
 
     txn = ovsdb_idl_txn_create(idl);
     for (cmd = strtok_r(commands, ",", &save_ptr1); cmd;
@@ -1614,6 +1680,12 @@ idl_set(struct ovsdb_idl *idl, char *commands, int step)
                           "i=%d", atoi(arg1));
             }
             idltest_simple_delete(s);
+        } else if (!strcmp(name, "increment")) {
+            if (!arg2 || arg3) {
+                ovs_fatal(0, "\"set\" command requires 2 arguments");
+            }
+            ovsdb_idl_txn_increment(txn, arg1, arg2, NULL);
+            increment = true;
         } else {
             ovs_fatal(0, "unknown command %s", name);
         }
@@ -1625,8 +1697,13 @@ idl_set(struct ovsdb_idl *idl, char *commands, int step)
         ovsdb_idl_txn_wait(txn);
         poll_block();
     }
-    printf("%03d: commit, status=%s\n",
+    printf("%03d: commit, status=%s",
            step, ovsdb_idl_txn_status_to_string(status));
+    if (increment) {
+        printf(", increment=%"PRId64,
+               ovsdb_idl_txn_get_increment_new_value(txn));
+    }
+    putchar('\n');
     ovsdb_idl_txn_destroy(txn);
 }
 
@@ -1699,7 +1776,9 @@ static struct command all_commands[] = {
     { "parse-atomic-type", 1, 1, do_parse_atomic_type },
     { "parse-type", 1, 1, do_parse_type },
     { "parse-atoms", 2, INT_MAX, do_parse_atoms },
+    { "parse-atom-strings", 2, INT_MAX, do_parse_atom_strings },
     { "parse-data", 2, INT_MAX, do_parse_data },
+    { "parse-data-strings", 2, INT_MAX, do_parse_data_strings },
     { "sort-atoms", 2, 2, do_sort_atoms },
     { "parse-column", 2, 2, do_parse_column },
     { "parse-table", 2, 2, do_parse_table },