X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Ftest-ovsdb.c;h=3025ce390510a076b91b9d60548c9ef4a654e5a0;hb=0d0f05b909b6428d44eb147bd4edd73782d2a137;hp=18f8c46ee5ad6dd5c0863a7624c8080ffa3808de;hpb=5c414a2ed8c21762292776ecee294a11e0b5468b;p=openvswitch diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c index 18f8c46e..3025ce39 100644 --- a/tests/test-ovsdb.c +++ b/tests/test-ovsdb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009 Nicira Networks. + * Copyright (c) 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -123,6 +123,8 @@ usage(void) " open FILE with FLAGS, run COMMANDs\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" @@ -157,6 +159,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" @@ -233,7 +237,9 @@ static void check_ovsdb_error(struct ovsdb_error *error) { if (error) { - ovs_fatal(0, "%s", ovsdb_error_to_string(error)); + char *s = ovsdb_error_to_string(error); + ovsdb_error_destroy(error); + ovs_fatal(0, "%s", s); } } @@ -309,6 +315,7 @@ do_log_io(int argc, char *argv[]) char *s = ovsdb_error_to_string(error); printf("%s: %s failed: %s\n", name, command, s); free(s); + ovsdb_error_destroy(error); } else { printf("%s: %s successful\n", name, command); } @@ -329,6 +336,19 @@ do_parse_atomic_type(int argc UNUSED, char *argv[]) print_and_free_json(ovsdb_atomic_type_to_json(type)); } +static void +do_parse_base_type(int argc 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 UNUSED, char *argv[]) { @@ -339,56 +359,63 @@ 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])); 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 @@ -413,6 +440,7 @@ do_parse_data(int argc, char *argv[]) ovsdb_datum_destroy(&datum, &type); } + ovsdb_type_destroy(&type); } static void @@ -439,6 +467,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; @@ -455,14 +484,14 @@ compare_atoms(const void *a_, const void *b_) static void do_sort_atoms(int argc 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])); @@ -474,22 +503,24 @@ 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 @@ -626,6 +657,10 @@ do_compare_rows(int argc, char *argv[]) } } } + for (i = 0; i < n_rows; i++) { + ovsdb_row_destroy(rows[i]); + free(names[i]); + } free(rows); free(names); @@ -730,9 +765,11 @@ do_evaluate_conditions(int argc UNUSED, char *argv[]) for (i = 0; i < n_conditions; i++) { ovsdb_condition_destroy(&conditions[i]); } + free(conditions); for (i = 0; i < n_rows; i++) { ovsdb_row_destroy(rows[i]); } + free(rows); ovsdb_table_destroy(table); /* Also destroys 'ts'. */ } @@ -859,9 +896,11 @@ do_execute_mutations(int argc UNUSED, char *argv[]) for (i = 0; i < n_sets; i++) { ovsdb_mutation_set_destroy(&sets[i]); } + free(sets); for (i = 0; i < n_rows; i++) { ovsdb_row_destroy(rows[i]); } + free(rows); ovsdb_table_destroy(table); /* Also destroys 'ts'. */ } @@ -1101,6 +1140,19 @@ do_query_distinct(int argc UNUSED, char *argv[]) exit(exit_code); } +static void +do_parse_schema(int argc 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 UNUSED, char *argv[]) { @@ -1123,6 +1175,7 @@ do_execute(int argc UNUSED, char *argv[]) result = ovsdb_execute(db, params, 0, NULL); s = json_to_string(result, JSSF_SORT); printf("%s\n", s); + free(s); json_destroy(params); json_destroy(result); } @@ -1144,6 +1197,7 @@ do_trigger_dump(struct test_trigger *t, long long int now, const char *title) result = ovsdb_trigger_steal_result(&t->trigger); s = json_to_string(result, JSSF_SORT); printf("t=%lld: trigger %d (%s): %s\n", now, t->number, title, s); + free(s); json_destroy(result); ovsdb_trigger_destroy(&t->trigger); free(t); @@ -1719,6 +1773,8 @@ 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; @@ -1732,20 +1788,28 @@ 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 { + seqno = print_updated_idl(idl, rpc, step++, seqno); + } - if (!strcmp(argv[i], "reconnect")) { + 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); @@ -1774,6 +1838,7 @@ do_idl(int argc, char *argv[]) static struct command all_commands[] = { { "log-io", 2, INT_MAX, do_log_io }, { "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 }, @@ -1791,6 +1856,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 },