Merge pull request #86 from painless-security/jennifer/aaa_server_port
[trust_router.git] / trp / test / ptbl_test.c
index 15d6d15..05c3997 100644 (file)
@@ -1,22 +1,63 @@
+/*
+ * Copyright (c) 2016, JANET(UK)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of JANET(UK) nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
 #include <stdio.h>
 #include <talloc.h>
 #include <assert.h>
 
+#include <tr_gss_names.h>
+#include <trp_route.h>
 #include <trp_internal.h>
+#include <trp_peer.h>
 #include <trp_ptable.h>
 
+/* Can't do the updates test because trps_select_updates_for_peer() is now static */
+#define VERIFY_UPDATES 0
+
 struct peer_entry {
   char *server;
-  unsigned int port;
+  char *gss_name;
+  int port;
   unsigned int linkcost;
 };
 
 static struct peer_entry peer_data[]={
-  {"peer0", 10000, 0x0001},
-  {"peer1", 15000, 0x0002},
-  {"peer2", 20000, 0x0004},
-  {"peer3", 25000, 0x0008},
-  {"peer4", 30000, 0x0010}
+  {"peer0", "trustrouter@peer0", 10000, 0x0001},
+  {"peer1", "trustrouter@peer1", 15000, 0x0002},
+  {"peer2", "trustrouter@peer2", 20000, 0x0004},
+  {"peer3", "trustrouter@peer3", 25000, 0x0008},
+  {"peer4", "trustrouter@peer4", 30000, 0x0010}
 };
 static size_t n_peers=sizeof(peer_data)/sizeof(peer_data[0]);
 
@@ -30,6 +71,8 @@ static void populate_ptable(TRPS_INSTANCE *trps)
     assert(new_peer!=NULL);
     trp_peer_set_server(new_peer, peer_data[i].server);
     assert(trp_peer_get_server(new_peer)!=NULL);
+    trp_peer_add_gss_name(new_peer, tr_new_name(peer_data[i].gss_name));
+    assert(trp_peer_get_gss_names(new_peer)!=NULL);
     trp_peer_set_port(new_peer, peer_data[i].port);
     trp_peer_set_linkcost(new_peer, peer_data[i].linkcost);
     assert(trps_add_peer(trps, new_peer)==TRP_SUCCESS);
@@ -65,7 +108,7 @@ static void verify_ptable(TRPS_INSTANCE *trps)
     gssname=tr_new_name(s);
     free(s);
     assert(gssname!=NULL);
-    assert(!tr_name_cmp(trp_peer_get_gssname(peer), gssname));
+    assert(tr_gss_names_matches(trp_peer_get_gss_names(peer), gssname));
     tr_free_name(gssname);
     peer=peer->next;
   }
@@ -103,6 +146,7 @@ static struct route_data route_table[]={
 };
 static size_t n_routes=sizeof(route_table)/sizeof(route_table[0]);
 
+#if VERIFY_UPDATES
 /* These are the correct updates to select from the above route table for each peer.
  * The rule is: send selected route unless it is through that peer, otherwise send
  * the best (lowest metric) alternative route. 
@@ -152,30 +196,32 @@ static struct route_data update_table[][10]={
     {NULL}
   }
 };
+#endif /* VERIFY_UPDATES */
 
 static void populate_rtable(TRPS_INSTANCE *trps)
 {
   int i;
-  TRP_RENTRY *new;
+  TRP_ROUTE *new;
 
   for (i=0; i<n_routes; i++) {
-    new=trp_rentry_new(NULL);
+    new=trp_route_new(NULL);
     assert(new!=NULL);
-    trp_rentry_set_apc(new, tr_new_name(route_table[i].apc));
-    trp_rentry_set_realm(new, tr_new_name(route_table[i].realm));
-    trp_rentry_set_peer(new, tr_new_name(route_table[i].peer));
-    trp_rentry_set_metric(new, route_table[i].metric);
-    trp_rentry_set_trust_router(new, tr_new_name(route_table[i].trust_router));
-    trp_rentry_set_next_hop(new, tr_new_name(route_table[i].next_hop));
-    trp_rentry_set_selected(new, route_table[i].selected);
-    trp_rentry_set_interval(new, route_table[i].interval);
+    trp_route_set_comm(new, tr_new_name(route_table[i].apc));
+    trp_route_set_realm(new, tr_new_name(route_table[i].realm));
+    trp_route_set_peer(new, tr_new_name(route_table[i].peer));
+    trp_route_set_metric(new, route_table[i].metric);
+    trp_route_set_trust_router(new, tr_new_name(route_table[i].trust_router));
+    trp_route_set_next_hop(new, tr_new_name(route_table[i].next_hop));
+    trp_route_set_selected(new, route_table[i].selected);
+    trp_route_set_interval(new, route_table[i].interval);
     /* do not set expiry */
     trp_rtable_add(trps->rtable, new);
     new=NULL;
   }
 }
 
-static void verify_update(TRP_RENTRY **updates, size_t n_updates, struct route_data *expected)
+#if VERIFY_UPDATES
+static void verify_update(TRP_ROUTE **updates, size_t n_updates, struct route_data *expected)
 {
   int ii,jj;
   int found;
@@ -183,7 +229,7 @@ static void verify_update(TRP_RENTRY **updates, size_t n_updates, struct route_d
   for(jj=0; jj<n_updates; jj++) {
     found=0;
     for (ii=0; expected[ii].apc!=NULL; ii++) {
-      if ((0==strcmp(expected[ii].apc, updates[jj]->apc->buf))
+      if ((0==strcmp(expected[ii].apc, updates[jj]->comm->buf))
          &&(0==strcmp(expected[ii].realm, updates[jj]->realm->buf))
          &&(0==strcmp(expected[ii].peer, updates[jj]->peer->buf))
          &&(expected[ii].metric==updates[jj]->metric)
@@ -198,7 +244,7 @@ static void verify_update(TRP_RENTRY **updates, size_t n_updates, struct route_d
       }
     }
     if (!found) {
-      printf("missing:\n%s\n", trp_rentry_to_str(NULL,updates[jj], " | "));
+      printf("missing:\n%s\n", trp_route_to_str(NULL,updates[jj], " | "));
       assert(0);
     }
   }
@@ -209,7 +255,7 @@ static void verify_update(TRP_RENTRY **updates, size_t n_updates, struct route_d
 static void verify_update_selection(TRPS_INSTANCE *trps)
 {
   int ii;
-  TRP_RENTRY **updates=NULL;
+  TRP_ROUTE **updates=NULL;
   size_t n_updates;
   TR_NAME *gssname=NULL;
   char *s;
@@ -218,12 +264,14 @@ static void verify_update_selection(TRPS_INSTANCE *trps)
     assert(0<asprintf(&s, "trustrouter@%s", peer_data[ii].server));
     assert(NULL!=(gssname=tr_new_name(s)));
     free(s);
+
     updates=trps_select_updates_for_peer(NULL, trps, gssname, &n_updates);
     tr_free_name(gssname);
     verify_update(updates, n_updates, update_table[ii]);
     talloc_free(updates);
   }
 }
+#endif /* VERIFY_UPDATES */
 
 int main(void)
 {
@@ -244,8 +292,10 @@ int main(void)
   s=trp_rtable_to_str(main_ctx, trps->rtable, " | ", NULL);
   printf("Route Table:\n%s---\n", s);
 
+#if VERIFY_UPDATES
   printf("\nVerifying route update selection...\n");
   verify_update_selection(trps);
+#endif /* VERIFY_UPDATES */
 
   printf("\nDone\n\n");
   talloc_report_full(main_ctx, stderr);