X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=tests%2Ftest-odp.c;h=dd80766f7c155249b36ca519cb8399bb32ef78da;hb=e7b4ef5eacebe5d5cae85c0076960f276b16554c;hp=9a2bc0aedca81910517cd013c209af14208c9358;hpb=df2c07f4338faac04f4969f243fe4e8083b309ac;p=openvswitch diff --git a/tests/test-odp.c b/tests/test-odp.c index 9a2bc0ae..dd80766f 100644 --- a/tests/test-odp.c +++ b/tests/test-odp.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 Nicira Networks. + * Copyright (c) 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,45 +22,47 @@ #include "flow.h" #include "odp-util.h" #include "ofpbuf.h" +#include "util.h" +#include "vlog.h" -int -main(void) +static int +parse_keys(void) { + int exit_code = 0; struct ds in; ds_init(&in); - while (!ds_get_line(&in, stdin)) { + vlog_set_levels_from_string("odp_util:console:dbg"); + while (!ds_get_test_line(&in, stdin)) { + enum odp_key_fitness fitness; struct ofpbuf odp_key; struct flow flow; struct ds out; int error; - char *s; - - /* Delete comments, skip blank lines. */ - s = ds_cstr(&in); - if (*s == '#') { - puts(s); - continue; - } - if (strchr(s, '#')) { - *strchr(s, '#') = '\0'; - } - if (s[strspn(s, " ")] == '\0') { - putchar('\n'); - continue; - } /* Convert string to OVS DP key. */ ofpbuf_init(&odp_key, 0); - error = odp_flow_key_from_string(ds_cstr(&in), &odp_key); + error = odp_flow_key_from_string(ds_cstr(&in), NULL, &odp_key); if (error) { printf("odp_flow_key_from_string: error\n"); goto next; } /* Convert odp_key to flow. */ - error = odp_flow_key_to_flow(odp_key.data, odp_key.size, &flow); - if (error) { + fitness = odp_flow_key_to_flow(odp_key.data, odp_key.size, &flow); + switch (fitness) { + case ODP_FIT_PERFECT: + break; + + case ODP_FIT_TOO_LITTLE: + printf("ODP_FIT_TOO_LITTLE: "); + break; + + case ODP_FIT_TOO_MUCH: + printf("ODP_FIT_TOO_MUCH: "); + break; + + case ODP_FIT_ERROR: printf("odp_flow_key_to_flow: error\n"); goto next; } @@ -70,6 +72,12 @@ main(void) ofpbuf_init(&odp_key, 0); odp_flow_key_from_flow(&odp_key, &flow); + if (odp_key.size > ODPUTIL_FLOW_KEY_BYTES) { + printf ("too long: %zu > %d\n", + odp_key.size, ODPUTIL_FLOW_KEY_BYTES); + exit_code = 1; + } + /* Convert odp_key to string. */ ds_init(&out); odp_flow_key_format(odp_key.data, odp_key.size, &out); @@ -81,5 +89,51 @@ main(void) } ds_destroy(&in); + return exit_code; +} + +static int +parse_actions(void) +{ + struct ds in; + + ds_init(&in); + vlog_set_levels_from_string("odp_util:console:dbg"); + while (!ds_get_test_line(&in, stdin)) { + struct ofpbuf odp_actions; + struct ds out; + int error; + + /* Convert string to OVS DP actions. */ + ofpbuf_init(&odp_actions, 0); + error = odp_actions_from_string(ds_cstr(&in), NULL, &odp_actions); + if (error) { + printf("odp_actions_from_string: error\n"); + goto next; + } + + /* Convert odp_actions back to string. */ + ds_init(&out); + format_odp_actions(&out, odp_actions.data, odp_actions.size); + puts(ds_cstr(&out)); + ds_destroy(&out); + + next: + ofpbuf_uninit(&odp_actions); + } + ds_destroy(&in); + return 0; } + +int +main(int argc, char *argv[]) +{ + if (argc == 2 &&!strcmp(argv[1], "parse-keys")) { + return parse_keys(); + } else if (argc == 2 && !strcmp(argv[1], "parse-actions")) { + return parse_actions(); + } else { + ovs_fatal(0, "usage: %s parse-keys | parse-actions", argv[0]); + } +}