wdp-xflow: Remove wx structure from global list when closing.
[sliver-openvswitch.git] / tests / test-ovsdb.c
index 2e12d49..cdc939b 100644 (file)
@@ -59,8 +59,6 @@ int
 main(int argc, char *argv[])
 {
     set_program_name(argv[0]);
-    time_init();
-    vlog_init();
     parse_options(argc, argv);
     run_command(argc - optind, argv + optind, all_commands);
     return 0;
@@ -121,6 +119,10 @@ usage(void)
            "usage: %s [OPTIONS] COMMAND [ARG...]\n\n"
            "  log-io FILE FLAGS COMMAND...\n"
            "    open FILE with FLAGS, run COMMANDs\n"
+           "  default-atoms\n"
+           "    test ovsdb_atom_default()\n"
+           "  default-data\n"
+           "    test ovsdb_datum_default()\n"
            "  parse-atomic-type TYPE\n"
            "    parse TYPE as OVSDB atomic type, and re-serialize\n"
            "  parse-base-type TYPE\n"
@@ -257,34 +259,24 @@ static void
 do_log_io(int argc, char *argv[])
 {
     const char *name = argv[1];
-    char *mode = argv[2];
+    char *mode_string = argv[2];
 
     struct ovsdb_error *error;
+    enum ovsdb_log_open_mode mode;
     struct ovsdb_log *log;
-    char *save_ptr = NULL;
-    const char *token;
-    int flags;
     int i;
 
-    for (flags = 0, token = strtok_r(mode, " |", &save_ptr); token != NULL;
-         token = strtok_r(NULL, " |", &save_ptr))
-    {
-        if (!strcmp(token, "O_RDONLY")) {
-            flags |= O_RDONLY;
-        } else if (!strcmp(token, "O_RDWR")) {
-            flags |= O_RDWR;
-        } else if (!strcmp(token, "O_TRUNC")) {
-            flags |= O_TRUNC;
-        } else if (!strcmp(token, "O_CREAT")) {
-            flags |= O_CREAT;
-        } else if (!strcmp(token, "O_EXCL")) {
-            flags |= O_EXCL;
-        } else if (!strcmp(token, "O_TRUNC")) {
-            flags |= O_TRUNC;
-        }
+    if (!strcmp(mode_string, "read-only")) {
+        mode = OVSDB_LOG_READ_ONLY;
+    } else if (!strcmp(mode_string, "read/write")) {
+        mode = OVSDB_LOG_READ_WRITE;
+    } else if (!strcmp(mode_string, "create")) {
+        mode = OVSDB_LOG_CREATE;
+    } else {
+        ovs_fatal(0, "unknown log-io open mode \"%s\"", mode_string);
     }
 
-    check_ovsdb_error(ovsdb_log_open(name, flags, &log));
+    check_ovsdb_error(ovsdb_log_open(name, mode, -1, &log));
     printf("%s: open successful\n", name);
 
     for (i = 3; i < argc; i++) {
@@ -324,6 +316,71 @@ do_log_io(int argc, char *argv[])
     ovsdb_log_close(log);
 }
 
+static void
+do_default_atoms(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
+{
+    int type;
+
+    for (type = 0; type < OVSDB_N_TYPES; type++) {
+        union ovsdb_atom atom;
+
+        if (type == OVSDB_TYPE_VOID) {
+            continue;
+        }
+
+        printf("%s: ", ovsdb_atomic_type_to_string(type));
+
+        ovsdb_atom_init_default(&atom, type);
+        if (!ovsdb_atom_equals(&atom, ovsdb_atom_default(type), type)) {
+            printf("wrong\n");
+            exit(1);
+        }
+        ovsdb_atom_destroy(&atom, type);
+
+        printf("OK\n");
+    }
+}
+
+static void
+do_default_data(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
+{
+    unsigned int n_min;
+    int key, value;
+
+    for (n_min = 0; n_min <= 1; n_min++) {
+        for (key = 0; key < OVSDB_N_TYPES; key++) {
+            if (key == OVSDB_TYPE_VOID) {
+                continue;
+            }
+            for (value = 0; value < OVSDB_N_TYPES; value++) {
+                struct ovsdb_datum datum;
+                struct ovsdb_type type;
+
+                ovsdb_base_type_init(&type.key, key);
+                ovsdb_base_type_init(&type.value, value);
+                type.n_min = n_min;
+                type.n_max = 1;
+                assert(ovsdb_type_is_valid(&type));
+
+                printf("key %s, value %s, n_min %u: ",
+                       ovsdb_atomic_type_to_string(key),
+                       ovsdb_atomic_type_to_string(value), n_min);
+
+                ovsdb_datum_init_default(&datum, &type);
+                if (!ovsdb_datum_equals(&datum, ovsdb_datum_default(&type),
+                                        &type)) {
+                    printf("wrong\n");
+                    exit(1);
+                }
+                ovsdb_datum_destroy(&datum, &type);
+                ovsdb_type_destroy(&type);
+
+                printf("OK\n");
+            }
+        }
+    }
+}
+
 static void
 do_parse_atomic_type(int argc OVS_UNUSED, char *argv[])
 {
@@ -406,7 +463,7 @@ do_parse_atom_strings(int argc, char *argv[])
         union ovsdb_atom atom;
         struct ds out;
 
-        die_if_error(ovsdb_atom_from_string(&atom, &base, argv[i]));
+        die_if_error(ovsdb_atom_from_string(&atom, &base, argv[i], NULL));
 
         ds_init(&out);
         ovsdb_atom_to_string(&atom, base.type, &out);
@@ -419,7 +476,12 @@ do_parse_atom_strings(int argc, char *argv[])
 }
 
 static void
-do_parse_data(int argc, char *argv[])
+do_parse_data__(int argc, char *argv[],
+                struct ovsdb_error *
+                (*parse)(struct ovsdb_datum *datum,
+                         const struct ovsdb_type *type,
+                         const struct json *json,
+                         struct ovsdb_symbol_table *symtab))
 {
     struct ovsdb_type type;
     struct json *json;
@@ -433,7 +495,7 @@ do_parse_data(int argc, char *argv[])
         struct ovsdb_datum datum;
 
         json = unbox_json(parse_json(argv[i]));
-        check_ovsdb_error(ovsdb_datum_from_json(&datum, &type, json, NULL));
+        check_ovsdb_error(parse(&datum, &type, json, NULL));
         json_destroy(json);
 
         print_and_free_json(ovsdb_datum_to_json(&datum, &type));
@@ -443,6 +505,12 @@ do_parse_data(int argc, char *argv[])
     ovsdb_type_destroy(&type);
 }
 
+static void
+do_parse_data(int argc, char *argv[])
+{
+    do_parse_data__(argc, argv, ovsdb_datum_from_json);
+}
+
 static void
 do_parse_data_strings(int argc, char *argv[])
 {
@@ -458,7 +526,7 @@ do_parse_data_strings(int argc, char *argv[])
         struct ovsdb_datum datum;
         struct ds out;
 
-        die_if_error(ovsdb_datum_from_string(&datum, &type, argv[i]));
+        die_if_error(ovsdb_datum_from_string(&datum, &type, argv[i], NULL));
 
         ds_init(&out);
         ovsdb_datum_to_string(&datum, &type, &out);
@@ -751,7 +819,7 @@ do_evaluate_conditions(int argc OVS_UNUSED, char *argv[])
     json_destroy(json);
 
     for (i = 0; i < n_conditions; i++) {
-        printf("condition %2d:", i);
+        printf("condition %2zu:", i);
         for (j = 0; j < n_rows; j++) {
             bool result = ovsdb_condition_evaluate(rows[j], &conditions[i]);
             if (j % 5 == 0) {
@@ -857,7 +925,7 @@ do_execute_mutations(int argc OVS_UNUSED, char *argv[])
     json_destroy(json);
 
     for (i = 0; i < n_sets; i++) {
-        printf("mutation %2d:\n", i);
+        printf("mutation %2zu:\n", i);
         for (j = 0; j < n_rows; j++) {
             struct ovsdb_error *error;
             struct ovsdb_row *row;
@@ -979,7 +1047,7 @@ do_query(int argc OVS_UNUSED, char *argv[])
         memset(cbdata.counts, 0, cbdata.n_rows * sizeof *cbdata.counts);
         ovsdb_query(table, &cnd, do_query_cb, &cbdata);
 
-        printf("query %2d:", i);
+        printf("query %2zu:", i);
         for (j = 0; j < cbdata.n_rows; j++) {
             if (j % 5 == 0) {
                 putchar(' ');
@@ -1027,7 +1095,7 @@ do_query_distinct(int argc OVS_UNUSED, char *argv[])
     size_t n_classes;
     struct json *json;
     int exit_code = 0;
-    size_t i, j, k;
+    size_t i;
 
     /* Parse table schema, create table. */
     json = unbox_json(parse_json(argv[1]));
@@ -1093,6 +1161,7 @@ do_query_distinct(int argc OVS_UNUSED, char *argv[])
     for (i = 0; i < json->u.array.n; i++) {
         struct ovsdb_row_set results;
         struct ovsdb_condition cnd;
+        size_t j;
 
         check_ovsdb_error(ovsdb_condition_from_json(ts, json->u.array.elems[i],
                                                     NULL, &cnd));
@@ -1103,6 +1172,8 @@ do_query_distinct(int argc OVS_UNUSED, char *argv[])
         ovsdb_row_set_init(&results);
         ovsdb_query_distinct(table, &cnd, &columns, &results);
         for (j = 0; j < results.n_rows; j++) {
+            size_t k;
+
             for (k = 0; k < n_rows; k++) {
                 if (uuid_equals(ovsdb_row_get_uuid(results.rows[j]),
                                 &rows[k].uuid)) {
@@ -1112,7 +1183,7 @@ do_query_distinct(int argc OVS_UNUSED, char *argv[])
         }
         ovsdb_row_set_destroy(&results);
 
-        printf("query %2d:", i);
+        printf("query %2zu:", i);
         for (j = 0; j < n_rows; j++) {
             int count = rows[j].class->count;
 
@@ -1397,8 +1468,7 @@ do_transact_print(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
     n_rows = hmap_count(&do_transact_table->rows);
     rows = xmalloc(n_rows * sizeof *rows);
     i = 0;
-    HMAP_FOR_EACH (row, struct ovsdb_row, hmap_node,
-                   &do_transact_table->rows) {
+    HMAP_FOR_EACH (row, hmap_node, &do_transact_table->rows) {
         rows[i++] = row;
     }
     assert(i == n_rows);
@@ -1575,31 +1645,6 @@ print_idl(struct ovsdb_idl *idl, int step)
     }
 }
 
-static unsigned int
-print_updated_idl(struct ovsdb_idl *idl, struct jsonrpc *rpc,
-                  int step, unsigned int seqno)
-{
-    for (;;) {
-        unsigned int new_seqno;
-
-        if (rpc) {
-            jsonrpc_run(rpc);
-        }
-        ovsdb_idl_run(idl);
-        new_seqno = ovsdb_idl_get_seqno(idl);
-        if (new_seqno != seqno) {
-            print_idl(idl, step);
-            return new_seqno;
-        }
-
-        if (rpc) {
-            jsonrpc_wait(rpc);
-        }
-        ovsdb_idl_wait(idl);
-        poll_block();
-    }
-}
-
 static void
 parse_uuids(const struct json *json, struct ovsdb_symbol_table *symtab,
             size_t *n)
@@ -1607,7 +1652,7 @@ parse_uuids(const struct json *json, struct ovsdb_symbol_table *symtab,
     struct uuid uuid;
 
     if (json->type == JSON_STRING && uuid_from_string(&uuid, json->u.string)) {
-        char *name = xasprintf("#%d#", *n);
+        char *name = xasprintf("#%zu#", *n);
         fprintf(stderr, "%s = "UUID_FMT"\n", name, UUID_ARGS(&uuid));
         ovsdb_symbol_table_put(symtab, name, &uuid, false);
         free(name);
@@ -1745,12 +1790,7 @@ idl_set(struct ovsdb_idl *idl, char *commands, int step)
         }
     }
 
-    while ((status = ovsdb_idl_txn_commit(txn)) == TXN_INCOMPLETE) {
-        ovsdb_idl_run(idl);
-        ovsdb_idl_wait(idl);
-        ovsdb_idl_txn_wait(txn);
-        poll_block();
-    }
+    status = ovsdb_idl_txn_commit_block(txn);
     printf("%03d: commit, status=%s",
            step, ovsdb_idl_txn_status_to_string(status));
     if (increment) {
@@ -1779,7 +1819,8 @@ do_idl(int argc, char *argv[])
     if (argc > 2) {
         struct stream *stream;
 
-        error = stream_open_block(argv[1], &stream);
+        error = stream_open_block(jsonrpc_stream_open(argv[1], &stream),
+                                  &stream);
         if (error) {
             ovs_fatal(error, "failed to connect to \"%s\"", argv[1]);
         }
@@ -1794,14 +1835,24 @@ do_idl(int argc, char *argv[])
     for (i = 2; i < argc; i++) {
         char *arg = argv[i];
         struct jsonrpc_msg *request, *reply;
-        int error;
 
         if (*arg == '+') {
             /* The previous transaction didn't change anything. */
             arg++;
         } else {
-            seqno = print_updated_idl(idl, rpc, step++, seqno);
+            /* Wait for update. */
+            while (ovsdb_idl_get_seqno(idl) == seqno && !ovsdb_idl_run(idl)) {
+                jsonrpc_run(rpc);
+
+                ovsdb_idl_wait(idl);
+                jsonrpc_wait(rpc);
+                poll_block();
+            }
+
+            /* Print update. */
+            print_idl(idl, step++);
         }
+        seqno = ovsdb_idl_get_seqno(idl);
 
         if (!strcmp(arg, "reconnect")) {
             printf("%03d: reconnect\n", step++);
@@ -1830,13 +1881,19 @@ do_idl(int argc, char *argv[])
     if (rpc) {
         jsonrpc_close(rpc);
     }
-    print_updated_idl(idl, NULL, step++, seqno);
+    while (ovsdb_idl_get_seqno(idl) == seqno && !ovsdb_idl_run(idl)) {
+        ovsdb_idl_wait(idl);
+        poll_block();
+    }
+    print_idl(idl, step++);
     ovsdb_idl_destroy(idl);
     printf("%03d: done\n", step);
 }
 
 static struct command all_commands[] = {
     { "log-io", 2, INT_MAX, do_log_io },
+    { "default-atoms", 0, 0, do_default_atoms },
+    { "default-data", 0, 0, do_default_data },
     { "parse-atomic-type", 1, 1, do_parse_atomic_type },
     { "parse-base-type", 1, 1, do_parse_base_type },
     { "parse-type", 1, 1, do_parse_type },