X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=tests%2Ftest-ovsdb.c;h=f516f9d27be116624bffd8738a1d235718b5b74e;hb=9200fb9ef9a1c55a76e4c4aa789f3fb0a76f0ed1;hp=a40b780fa630f5e1eb5d31caf03d7146260c2e66;hpb=93ff0290fda0f02904686989243089faaa9229e6;p=sliver-openvswitch.git diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c index a40b780fa..f516f9d27 100644 --- a/tests/test-ovsdb.c +++ b/tests/test-ovsdb.c @@ -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,8 +119,14 @@ 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" + " parse TYPE as OVSDB base type, and re-serialize\n" " parse-type JSON\n" " parse JSON as OVSDB type, and re-serialize\n" " parse-atoms TYPE ATOM...\n" @@ -133,6 +137,9 @@ usage(void) " print JSON ATOMs in sorted order\n" " parse-data TYPE DATUM...\n" " parse JSON DATUMs as data of given TYPE, and re-serialize\n" + " parse-data-unique TYPE DATUM...\n" + " parse JSON DATUMs as data of given TYPE, eliminating\n" + " duplicate keys, 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" @@ -157,6 +164,8 @@ usage(void) " query-distinct TABLE [ROW,...] [CONDITION,...] COLUMNS\n" " add each ROW to TABLE, then query and print the rows that\n" " satisfy each CONDITION and have distinct COLUMNS.\n" + " parse-schema JSON\n" + " parse JSON as an OVSDB schema, and re-serialize\n" " transact COMMAND\n" " execute each specified transactional COMMAND:\n" " commit\n" @@ -253,34 +262,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++) { @@ -321,7 +320,72 @@ do_log_io(int argc, char *argv[]) } static void -do_parse_atomic_type(int argc UNUSED, char *argv[]) +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[]) { enum ovsdb_atomic_type type; struct json *json; @@ -333,7 +397,20 @@ do_parse_atomic_type(int argc UNUSED, char *argv[]) } static void -do_parse_type(int argc UNUSED, char *argv[]) +do_parse_base_type(int argc OVS_UNUSED, char *argv[]) +{ + struct ovsdb_base_type base; + struct json *json; + + json = unbox_json(parse_json(argv[1])); + check_ovsdb_error(ovsdb_base_type_from_json(&base, json)); + json_destroy(json); + print_and_free_json(ovsdb_base_type_to_json(&base)); + ovsdb_base_type_destroy(&base); +} + +static void +do_parse_type(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_type type; struct json *json; @@ -342,60 +419,72 @@ do_parse_type(int argc UNUSED, char *argv[]) check_ovsdb_error(ovsdb_type_from_json(&type, json)); json_destroy(json); print_and_free_json(ovsdb_type_to_json(&type)); + ovsdb_type_destroy(&type); } static void do_parse_atoms(int argc, char *argv[]) { - enum ovsdb_atomic_type type; + struct ovsdb_base_type base; struct json *json; int i; json = unbox_json(parse_json(argv[1])); - check_ovsdb_error(ovsdb_atomic_type_from_json(&type, json)); + check_ovsdb_error(ovsdb_base_type_from_json(&base, json)); json_destroy(json); for (i = 2; i < argc; i++) { + struct ovsdb_error *error; union ovsdb_atom atom; json = unbox_json(parse_json(argv[i])); - check_ovsdb_error(ovsdb_atom_from_json(&atom, type, json, NULL)); + error = ovsdb_atom_from_json(&atom, &base, json, NULL); json_destroy(json); - print_and_free_json(ovsdb_atom_to_json(&atom, type)); - - ovsdb_atom_destroy(&atom, type); + if (error) { + print_and_free_ovsdb_error(error); + } else { + print_and_free_json(ovsdb_atom_to_json(&atom, base.type)); + ovsdb_atom_destroy(&atom, base.type); + } } + ovsdb_base_type_destroy(&base); } static void do_parse_atom_strings(int argc, char *argv[]) { - enum ovsdb_atomic_type type; + struct ovsdb_base_type base; struct json *json; int i; json = unbox_json(parse_json(argv[1])); - check_ovsdb_error(ovsdb_atomic_type_from_json(&type, json)); + check_ovsdb_error(ovsdb_base_type_from_json(&base, 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])); + die_if_error(ovsdb_atom_from_string(&atom, &base, argv[i], NULL)); ds_init(&out); - ovsdb_atom_to_string(&atom, type, &out); + ovsdb_atom_to_string(&atom, base.type, &out); puts(ds_cstr(&out)); ds_destroy(&out); - ovsdb_atom_destroy(&atom, type); + ovsdb_atom_destroy(&atom, base.type); } + ovsdb_base_type_destroy(&base); } 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; @@ -409,13 +498,26 @@ 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)); ovsdb_datum_destroy(&datum, &type); } + 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_unique(int argc, char *argv[]) +{ + do_parse_data__(argc, argv, ovsdb_datum_from_json_unique); } static void @@ -433,7 +535,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); @@ -442,6 +544,7 @@ do_parse_data_strings(int argc, char *argv[]) ovsdb_datum_destroy(&datum, &type); } + ovsdb_type_destroy(&type); } static enum ovsdb_atomic_type compare_atoms_atomic_type; @@ -456,16 +559,16 @@ compare_atoms(const void *a_, const void *b_) } static void -do_sort_atoms(int argc UNUSED, char *argv[]) +do_sort_atoms(int argc OVS_UNUSED, char *argv[]) { - enum ovsdb_atomic_type type; + struct ovsdb_base_type base; union ovsdb_atom *atoms; struct json *json, **json_atoms; size_t n_atoms; int i; json = unbox_json(parse_json(argv[1])); - check_ovsdb_error(ovsdb_atomic_type_from_json(&type, json)); + check_ovsdb_error(ovsdb_base_type_from_json(&base, json)); json_destroy(json); json = unbox_json(parse_json(argv[2])); @@ -477,27 +580,28 @@ do_sort_atoms(int argc UNUSED, char *argv[]) n_atoms = json->u.array.n; atoms = xmalloc(n_atoms * sizeof *atoms); for (i = 0; i < n_atoms; i++) { - check_ovsdb_error(ovsdb_atom_from_json(&atoms[i], type, + check_ovsdb_error(ovsdb_atom_from_json(&atoms[i], &base, json->u.array.elems[i], NULL)); } json_destroy(json); /* Sort atoms. */ - compare_atoms_atomic_type = type; + compare_atoms_atomic_type = base.type; qsort(atoms, n_atoms, sizeof *atoms, compare_atoms); /* Convert internal representation back to JSON. */ json_atoms = xmalloc(n_atoms * sizeof *json_atoms); for (i = 0; i < n_atoms; i++) { - json_atoms[i] = ovsdb_atom_to_json(&atoms[i], type); - ovsdb_atom_destroy(&atoms[i], type); + json_atoms[i] = ovsdb_atom_to_json(&atoms[i], base.type); + ovsdb_atom_destroy(&atoms[i], base.type); } print_and_free_json(json_array_create(json_atoms, n_atoms)); free(atoms); + ovsdb_base_type_destroy(&base); } static void -do_parse_column(int argc UNUSED, char *argv[]) +do_parse_column(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_column *column; struct json *json; @@ -510,7 +614,7 @@ do_parse_column(int argc UNUSED, char *argv[]) } static void -do_parse_table(int argc UNUSED, char *argv[]) +do_parse_table(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_table_schema *ts; struct json *json; @@ -678,7 +782,7 @@ do_parse_conditions(int argc, char *argv[]) } static void -do_evaluate_conditions(int argc UNUSED, char *argv[]) +do_evaluate_conditions(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_table_schema *ts; struct ovsdb_table *table; @@ -724,7 +828,7 @@ do_evaluate_conditions(int argc 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) { @@ -783,7 +887,7 @@ do_parse_mutations(int argc, char *argv[]) } static void -do_execute_mutations(int argc UNUSED, char *argv[]) +do_execute_mutations(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_table_schema *ts; struct ovsdb_table *table; @@ -830,7 +934,7 @@ do_execute_mutations(int argc 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; @@ -899,7 +1003,7 @@ do_query_cb(const struct ovsdb_row *row, void *cbdata_) } static void -do_query(int argc UNUSED, char *argv[]) +do_query(int argc OVS_UNUSED, char *argv[]) { struct do_query_cbdata cbdata; struct ovsdb_table_schema *ts; @@ -952,7 +1056,7 @@ do_query(int argc 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(' '); @@ -989,7 +1093,7 @@ struct do_query_distinct_row { }; static void -do_query_distinct(int argc UNUSED, char *argv[]) +do_query_distinct(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_column_set columns; struct ovsdb_table_schema *ts; @@ -1085,7 +1189,7 @@ do_query_distinct(int argc 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; @@ -1114,7 +1218,20 @@ do_query_distinct(int argc UNUSED, char *argv[]) } static void -do_execute(int argc UNUSED, char *argv[]) +do_parse_schema(int argc OVS_UNUSED, char *argv[]) +{ + struct ovsdb_schema *schema; + struct json *json; + + json = parse_json(argv[1]); + check_ovsdb_error(ovsdb_schema_from_json(json, &schema)); + json_destroy(json); + print_and_free_json(ovsdb_schema_to_json(schema)); + ovsdb_schema_destroy(schema); +} + +static void +do_execute(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_schema *schema; struct json *json; @@ -1164,7 +1281,7 @@ do_trigger_dump(struct test_trigger *t, long long int now, const char *title) } static void -do_trigger(int argc UNUSED, char *argv[]) +do_trigger(int argc OVS_UNUSED, char *argv[]) { struct ovsdb_schema *schema; struct list completions; @@ -1219,7 +1336,7 @@ do_trigger(int argc UNUSED, char *argv[]) } static void -do_help(int argc UNUSED, char *argv[] UNUSED) +do_help(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { usage(); } @@ -1231,14 +1348,14 @@ static struct ovsdb_txn *do_transact_txn; static struct ovsdb_table *do_transact_table; static void -do_transact_commit(int argc UNUSED, char *argv[] UNUSED) +do_transact_commit(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { ovsdb_txn_commit(do_transact_txn, false); do_transact_txn = NULL; } static void -do_transact_abort(int argc UNUSED, char *argv[] UNUSED) +do_transact_abort(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { ovsdb_txn_abort(do_transact_txn); do_transact_txn = NULL; @@ -1298,7 +1415,7 @@ do_transact_set_i_j(struct ovsdb_row *row, } static void -do_transact_insert(int argc UNUSED, char *argv[] UNUSED) +do_transact_insert(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { struct ovsdb_row *row; struct uuid *uuid; @@ -1320,14 +1437,14 @@ do_transact_insert(int argc UNUSED, char *argv[] UNUSED) } static void -do_transact_delete(int argc UNUSED, char *argv[] UNUSED) +do_transact_delete(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { const struct ovsdb_row *row = do_transact_find_row(argv[1]); ovsdb_txn_row_delete(do_transact_txn, row); } static void -do_transact_modify(int argc UNUSED, char *argv[] UNUSED) +do_transact_modify(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { const struct ovsdb_row *row_ro; struct ovsdb_row *row_rw; @@ -1347,7 +1464,7 @@ compare_rows_by_uuid(const void *a_, const void *b_) } static void -do_transact_print(int argc UNUSED, char *argv[] UNUSED) +do_transact_print(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) { const struct ovsdb_row **rows; const struct ovsdb_row *row; @@ -1535,31 +1652,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) @@ -1567,7 +1659,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); @@ -1705,12 +1797,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) { @@ -1733,11 +1820,14 @@ do_idl(int argc, char *argv[]) int error; int i; + idltest_init(); + idl = ovsdb_idl_create(argv[1], &idltest_idl_class); 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]); } @@ -1746,20 +1836,39 @@ do_idl(int argc, char *argv[]) rpc = NULL; } + setvbuf(stdout, NULL, _IOLBF, 0); + symtab = ovsdb_symbol_table_create(); for (i = 2; i < argc; i++) { + char *arg = argv[i]; struct jsonrpc_msg *request, *reply; int error; - seqno = print_updated_idl(idl, rpc, step++, seqno); + if (*arg == '+') { + /* The previous transaction didn't change anything. */ + arg++; + } else { + /* 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(); + } - if (!strcmp(argv[i], "reconnect")) { + /* Print update. */ + print_idl(idl, step++); + } + seqno = ovsdb_idl_get_seqno(idl); + + if (!strcmp(arg, "reconnect")) { printf("%03d: reconnect\n", step++); ovsdb_idl_force_reconnect(idl); - } else if (argv[i][0] != '[') { - idl_set(idl, argv[i], step++); + } else if (arg[0] != '[') { + idl_set(idl, arg, step++); } else { - struct json *json = parse_json(argv[i]); + struct json *json = parse_json(arg); substitute_uuids(json, symtab); request = jsonrpc_create_request("transact", json, NULL); error = jsonrpc_transact_block(rpc, request, &reply); @@ -1780,18 +1889,26 @@ 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 }, { "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-unique", 2, INT_MAX, do_parse_data_unique }, { "parse-data-strings", 2, INT_MAX, do_parse_data_strings }, { "sort-atoms", 2, 2, do_sort_atoms }, { "parse-column", 2, 2, do_parse_column }, @@ -1805,6 +1922,7 @@ static struct command all_commands[] = { { "query", 3, 3, do_query }, { "query-distinct", 4, 4, do_query_distinct }, { "transact", 1, INT_MAX, do_transact }, + { "parse-schema", 1, 1, do_parse_schema }, { "execute", 2, INT_MAX, do_execute }, { "trigger", 2, INT_MAX, do_trigger }, { "idl", 1, INT_MAX, do_idl },