X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Ftest-ovsdb.c;h=4f44afe86979436cf0ccb193e2e2e274eb3aadfb;hb=a0a9f31ddc4fc213f9550c93478b4f03b948f606;hp=f3305edd0acd052e7b129f021d211dc04327f72e;hpb=58fda1dab104041fc693032475ec4662c1a52849;p=openvswitch diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c index f3305edd..4f44afe8 100644 --- a/tests/test-ovsdb.c +++ b/tests/test-ovsdb.c @@ -1232,13 +1232,12 @@ do_transact(int argc, char *argv[]) } static int -compare_selflink(const void *a_, const void *b_) +compare_link1(const void *a_, const void *b_) { - const struct idltest_selflink *const *ap = a_; - const struct idltest_selflink *const *bp = b_; - const struct idltest_selflink *a = *ap; - const struct idltest_selflink *b = *bp; - + const struct idltest_link1 *const *ap = a_; + const struct idltest_link1 *const *bp = b_; + const struct idltest_link1 *a = *ap; + const struct idltest_link1 *b = *bp; return a->i < b->i ? -1 : a->i > b->i; } @@ -1247,7 +1246,8 @@ static void print_idl(struct ovsdb_idl *idl, int step) { const struct idltest_simple *s; - const struct idltest_selflink *sl; + const struct idltest_link1 *l1; + const struct idltest_link2 *l2; int n = 0; IDLTEST_SIMPLE_FOR_EACH (s, idl) { @@ -1278,22 +1278,34 @@ print_idl(struct ovsdb_idl *idl, int step) printf("] uuid="UUID_FMT"\n", UUID_ARGS(&s->header_.uuid)); n++; } - IDLTEST_SELFLINK_FOR_EACH (sl, idl) { - struct idltest_selflink **links; + IDLTEST_LINK1_FOR_EACH (l1, idl) { + struct idltest_link1 **links; size_t i; - printf("%03d: i=%"PRId64" k=", step, sl->i); - if (sl->k) { - printf("%"PRId64, sl->k->i); + printf("%03d: i=%"PRId64" k=", step, l1->i); + if (l1->k) { + printf("%"PRId64, l1->k->i); } printf(" ka=["); - links = xmemdup(sl->ka, sl->n_ka * sizeof *sl->ka); - qsort(links, sl->n_ka, sizeof *links, compare_selflink); - for (i = 0; i < sl->n_ka; i++) { + links = xmemdup(l1->ka, l1->n_ka * sizeof *l1->ka); + qsort(links, l1->n_ka, sizeof *links, compare_link1); + for (i = 0; i < l1->n_ka; i++) { printf("%s%"PRId64, i ? " " : "", links[i]->i); } free(links); - printf("] uuid="UUID_FMT"\n", UUID_ARGS(&sl->header_.uuid)); + printf("] l2="); + if (l1->l2) { + printf("%"PRId64, l1->l2->i); + } + printf(" uuid="UUID_FMT"\n", UUID_ARGS(&l1->header_.uuid)); + n++; + } + IDLTEST_LINK2_FOR_EACH (l2, idl) { + printf("%03d: i=%"PRId64" l1=", step, l2->i); + if (l2->l1) { + printf("%"PRId64, l2->l1->i); + } + printf(" uuid="UUID_FMT"\n", UUID_ARGS(&l2->header_.uuid)); n++; } if (!n) { @@ -1334,7 +1346,8 @@ parse_uuids(const struct json *json, struct ovsdb_symbol_table *symtab, if (json->type == JSON_STRING && uuid_from_string(&uuid, json->u.string)) { char *name = xasprintf("#%d#", *n); - ovsdb_symbol_table_put(symtab, name, &uuid); + fprintf(stderr, "%s = "UUID_FMT"\n", name, UUID_ARGS(&uuid)); + ovsdb_symbol_table_put(symtab, name, &uuid, false); free(name); *n += 1; } else if (json->type == JSON_ARRAY) { @@ -1356,12 +1369,12 @@ static void substitute_uuids(struct json *json, const struct ovsdb_symbol_table *symtab) { if (json->type == JSON_STRING) { - const struct uuid *uuid; + const struct ovsdb_symbol *symbol; - uuid = ovsdb_symbol_table_get(symtab, json->u.string); - if (uuid) { + symbol = ovsdb_symbol_table_get(symtab, json->u.string); + if (symbol) { free(json->u.string); - json->u.string = xasprintf(UUID_FMT, UUID_ARGS(uuid)); + json->u.string = xasprintf(UUID_FMT, UUID_ARGS(&symbol->uuid)); } } else if (json->type == JSON_ARRAY) { size_t i; @@ -1378,6 +1391,102 @@ substitute_uuids(struct json *json, const struct ovsdb_symbol_table *symtab) } } +static const struct idltest_simple * +idltest_find_simple(struct ovsdb_idl *idl, int i) +{ + const struct idltest_simple *s; + + IDLTEST_SIMPLE_FOR_EACH (s, idl) { + if (s->i == i) { + return s; + } + } + return NULL; +} + +static void +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; + + txn = ovsdb_idl_txn_create(idl); + for (cmd = strtok_r(commands, ",", &save_ptr1); cmd; + cmd = strtok_r(NULL, ",", &save_ptr1)) { + char *save_ptr2 = NULL; + char *name, *arg1, *arg2, *arg3; + + name = strtok_r(cmd, " ", &save_ptr2); + arg1 = strtok_r(NULL, " ", &save_ptr2); + arg2 = strtok_r(NULL, " ", &save_ptr2); + arg3 = strtok_r(NULL, " ", &save_ptr2); + + if (!strcmp(name, "set")) { + const struct idltest_simple *s; + + if (!arg3) { + ovs_fatal(0, "\"set\" command requires 3 arguments"); + } + + s = idltest_find_simple(idl, atoi(arg1)); + if (!s) { + ovs_fatal(0, "\"set\" command asks for nonexistent " + "i=%d", atoi(arg1)); + } + + if (!strcmp(arg2, "b")) { + idltest_simple_set_b(s, atoi(arg3)); + } else if (!strcmp(arg2, "s")) { + idltest_simple_set_s(s, arg3); + } else if (!strcmp(arg2, "u")) { + struct uuid uuid; + uuid_from_string(&uuid, arg3); + idltest_simple_set_u(s, uuid); + } else if (!strcmp(arg2, "r")) { + idltest_simple_set_r(s, atof(arg3)); + } else { + ovs_fatal(0, "\"set\" command asks for unknown column %s", + arg2); + } + } else if (!strcmp(name, "insert")) { + struct idltest_simple *s; + + if (!arg1 || arg2) { + ovs_fatal(0, "\"set\" command requires 1 argument"); + } + + s = idltest_simple_insert(txn); + idltest_simple_set_i(s, atoi(arg1)); + } else if (!strcmp(name, "delete")) { + const struct idltest_simple *s; + + if (!arg1 || arg2) { + ovs_fatal(0, "\"set\" command requires 1 argument"); + } + + s = idltest_find_simple(idl, atoi(arg1)); + if (!s) { + ovs_fatal(0, "\"set\" command asks for nonexistent " + "i=%d", atoi(arg1)); + } + idltest_simple_delete(s); + } else { + ovs_fatal(0, "unknown command %s", name); + } + } + + while ((status = ovsdb_idl_txn_commit(txn)) == TXN_INCOMPLETE) { + ovsdb_idl_run(idl); + ovsdb_idl_wait(idl); + ovsdb_idl_txn_wait(txn); + poll_block(); + } + printf("%03d: commit, status=%s\n", + step, ovsdb_idl_txn_status_to_string(status)); + ovsdb_idl_txn_destroy(txn); +} + static void do_idl(int argc, char *argv[]) { @@ -1413,6 +1522,8 @@ do_idl(int argc, char *argv[]) if (!strcmp(argv[i], "reconnect")) { printf("%03d: reconnect\n", step++); ovsdb_idl_force_reconnect(idl); + } else if (argv[i][0] != '[') { + idl_set(idl, argv[i], step++); } else { struct json *json = parse_json(argv[i]); substitute_uuids(json, symtab);