ovsdb-server: Refactoring and clean up remote status reporting.
[cascardo/ovs.git] / tests / test-stp.c
index ce9decc..ce3b689 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2009 Nicira Networks.
+ * Copyright (c) 2008, 2009, 2010, 2012, 2013, 2014 Nicira, Inc.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,6 +14,8 @@
  * limitations under the License.
  */
 
+#include <config.h>
+#undef NDEBUG
 #include "stp.h"
 #include <assert.h>
 #include <ctype.h>
 #include <inttypes.h>
 #include <stdarg.h>
 #include <stdlib.h>
+#include "dp-packet.h"
 #include "ofpbuf.h"
+#include "ovstest.h"
 #include "packets.h"
+#include "openvswitch/vlog.h"
 
 struct bpdu {
     int port_no;
@@ -81,7 +86,7 @@ new_test_case(void)
 }
 
 static void
-send_bpdu(struct ofpbuf *pkt, int port_no, void *b_)
+send_bpdu(struct dp_packet *pkt, int port_no, void *b_)
 {
     struct bridge *b = b_;
     struct lan *lan;
@@ -89,8 +94,8 @@ send_bpdu(struct ofpbuf *pkt, int port_no, void *b_)
     assert(port_no < b->n_ports);
     lan = b->ports[port_no];
     if (lan) {
-        const void *data = pkt->l3;
-        size_t size = (char *) ofpbuf_tail(pkt) - (char *) data;
+        const void *data = dp_packet_l3(pkt);
+        size_t size = (char *) dp_packet_tail(pkt) - (char *) data;
         int i;
 
         for (i = 0; i < lan->n_conns; i++) {
@@ -105,7 +110,7 @@ send_bpdu(struct ofpbuf *pkt, int port_no, void *b_)
             }
         }
     }
-    ofpbuf_delete(pkt);
+    dp_packet_delete(pkt);
 }
 
 static struct bridge *
@@ -241,7 +246,7 @@ dump_bridge_tree(struct test_case *tc, struct bridge *b, int level)
 }
 
 static void
-dump_lan_tree(struct test_case *tc, struct lan *lan, int level) 
+dump_lan_tree(struct test_case *tc, struct lan *lan, int level)
 {
     int i;
 
@@ -301,6 +306,7 @@ simulate(struct test_case *tc, int granularity)
                     struct bpdu *bpdu = &b->rxq[b->rxq_tail % RXQ_SIZE];
                     stp_received_bpdu(stp_get_port(b->stp, bpdu->port_no),
                                       bpdu->data, bpdu->size);
+                    free(bpdu->data);
                     any = true;
                 }
             }
@@ -311,17 +317,16 @@ simulate(struct test_case *tc, int granularity)
     }
 }
 
-static void
+OVS_NO_RETURN static void
 err(const char *message, ...)
-    PRINTF_FORMAT(1, 2)
-    NO_RETURN;
+    OVS_PRINTF_FORMAT(1, 2);
 
 static void
 err(const char *message, ...)
 {
     va_list args;
 
-    fprintf(stderr, "%s:%d:%td: ", file_name, line_number, pos - line);
+    fprintf(stderr, "%s:%d:%"PRIdPTR": ", file_name, line_number, pos - line);
     va_start(args, message);
     vfprintf(stderr, message, args);
     va_end(args);
@@ -332,7 +337,7 @@ err(const char *message, ...)
 
 static void
 warn(const char *message, ...)
-    PRINTF_FORMAT(1, 2);
+    OVS_PRINTF_FORMAT(1, 2);
 
 static void
 warn(const char *message, ...)
@@ -357,6 +362,7 @@ get_token(void)
         pos++;
     }
     if (*pos == '\0') {
+        free(token);
         token = NULL;
         return false;
     }
@@ -429,13 +435,16 @@ must_match(const char *want)
     }
 }
 
-int
-main(int argc, char *argv[])
+static void
+test_stp_main(int argc, char *argv[])
 {
     struct test_case *tc;
     FILE *input_file;
     int i;
 
+    vlog_set_pattern(VLF_CONSOLE, "%c|%p|%m");
+    vlog_set_levels(NULL, VLF_SYSLOG, VLL_OFF);
+
     if (argc != 2) {
         ovs_fatal(0, "usage: test-stp INPUT.STP\n");
     }
@@ -503,7 +512,7 @@ main(int argc, char *argv[])
                             lan = NULL;
                         } else if (strlen(token) == 1
                                 && islower((unsigned char)*token)) {
-                            lan = tc->lans[*token - 'a']; 
+                            lan = tc->lans[*token - 'a'];
                         } else {
                             err("%s is not a valid LAN name "
                                 "(0 or a lowercase letter)", token);
@@ -644,6 +653,20 @@ main(int argc, char *argv[])
             err("trailing garbage on line");
         }
     }
+    free(token);
 
-    return 0;
+    for (i = 0; i < tc->n_lans; i++) {
+        struct lan *lan = tc->lans[i];
+        free(CONST_CAST(char *, lan->name));
+        free(lan);
+    }
+    for (i = 0; i < tc->n_bridges; i++) {
+        struct bridge *bridge = tc->bridges[i];
+        stp_unref(bridge->stp);
+        free(bridge);
+    }
+    free(tc);
+    fclose(input_file);
 }
+
+OVSTEST_REGISTER("test-stp", test_stp_main);