From eb1b39b31365161d4e4a6e948147fec239de9782 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Wed, 9 May 2012 12:22:18 -0700 Subject: [PATCH] odp-util: Add tests for parsing and formatting ODP actions. Signed-off-by: Ben Pfaff --- tests/odp.at | 36 +++++++++++++++++++++++++++++--- tests/test-odp.c | 53 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 83 insertions(+), 6 deletions(-) diff --git a/tests/odp.at b/tests/odp.at index 90a11920..caedc94d 100644 --- a/tests/odp.at +++ b/tests/odp.at @@ -1,6 +1,7 @@ AT_BANNER([datapath parsing and formatting]) -AT_SETUP([OVS datapath parsing and formatting - valid forms]) +AT_SETUP([OVS datapath key parsing and formatting - valid forms]) +dnl We could add a test for invalid forms, but that's less important. AT_DATA([odp-base.txt], [dnl in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15) in_port(1),eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15),eth_type(0x1234) @@ -55,8 +56,37 @@ sed -n 's/,frag=no),/,frag=first),/p' odp-base.txt echo '# Valid forms with IP later fragment.' sed -n 's/,frag=no),.*/,frag=later)/p' odp-base.txt) > odp.txt AT_CAPTURE_FILE([odp.txt]) -AT_CHECK_UNQUOTED([test-odp < odp.txt], [0], [`cat odp.txt` +AT_CHECK_UNQUOTED([test-odp parse-keys < odp.txt], [0], [`cat odp.txt` ]) AT_CLEANUP -dnl We could add a test for invalid forms, but that's less important. +AT_SETUP([OVS datapath actions parsing and formatting - valid forms]) +AT_DATA([actions.txt], [dnl +1,2,3 +userspace(pid=555666777) +userspace(pid=6633,sFlow(vid=9,pcp=7,output=10)) +userspace(pid=9765,slow_path()) +userspace(pid=9765,slow_path(cfm)) +userspace(pid=9765,slow_path(cfm,match)) +userspace(pid=9123,userdata=0x815309) +set(tun_id(0x7f10354)) +set(in_port(2)) +set(eth(src=00:01:02:03:04:05,dst=10:11:12:13:14:15)) +set(eth_type(0x1234)) +set(ipv4(src=35.8.2.41,dst=172.16.0.20,proto=5,tos=0x80,ttl=128,frag=no)) +set(tcp(src=80,dst=8080)) +set(udp(src=81,dst=6632)) +set(icmp(type=1,code=2)) +set(ipv6(src=::1,dst=::2,label=0,proto=10,tclass=0x70,hlimit=128,frag=no)) +set(icmpv6(type=1,code=2)) +push_vlan(vid=12,pcp=0) +push_vlan(vid=13,pcp=5,cfi=0) +push_vlan(tpid=0x9100,vid=13,pcp=5) +push_vlan(tpid=0x9100,vid=13,pcp=5,cfi=0) +pop_vlan +sample(sample=9.7%,actions(1,2,3,push_vlan(vid=1,pcp=2))) +]) +AT_CHECK_UNQUOTED([test-odp parse-actions < actions.txt], [0], + [`cat actions.txt` +]) +AT_CLEANUP diff --git a/tests/test-odp.c b/tests/test-odp.c index 29732eb5..2b4cfe19 100644 --- a/tests/test-odp.c +++ b/tests/test-odp.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011 Nicira, Inc. + * 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,10 +22,11 @@ #include "flow.h" #include "odp-util.h" #include "ofpbuf.h" +#include "util.h" #include "vlog.h" -int -main(void) +static int +parse_keys(void) { struct ds in; @@ -83,3 +84,49 @@ main(void) return 0; } + +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]); + } +} -- 2.30.2