Fixed tree behavior for relay peers, adapted testcase to look for it.
authorBart Polot <bart@net.in.tum.de>
Mon, 31 Oct 2011 17:12:30 +0000 (17:12 +0000)
committerBart Polot <bart@net.in.tum.de>
Mon, 31 Oct 2011 17:12:30 +0000 (17:12 +0000)
src/mesh/mesh_tunnel_tree.c
src/mesh/test_mesh_path_api.c

index 50f6dc5c7948bf2eee4634f8d14dbc0be269097f..d052a3c4deecf057bff7dfa3a114df4cd23d45fa 100644 (file)
@@ -108,7 +108,25 @@ path_get_first_hop (struct MeshTunnelTree *t, GNUNET_PEER_Id peer)
 
   GNUNET_PEER_resolve (peer, &id);
   r = GNUNET_CONTAINER_multihashmap_get (t->first_hops, &id.hashPubKey);
-  GNUNET_break (NULL != r);
+  if (NULL == r)
+  {
+    struct MeshTunnelTreeNode *n;
+
+    n = tree_find_peer(t->root, peer);
+    if (NULL != t->me && NULL != n)
+    {
+      tree_update_first_hops(t, n, NULL);
+      r = GNUNET_CONTAINER_multihashmap_get (t->first_hops, &id.hashPubKey);
+      GNUNET_assert (NULL != r);
+    }
+    else
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                  "Tree structure inconsistent! me: %p, n: %p",
+                  t->me, n);
+      GNUNET_break (0);
+    }
+  }
 
   return r;
 }
@@ -570,7 +588,6 @@ tree_add_path (struct MeshTunnelTree *t,
   struct GNUNET_PeerIdentity id;
   GNUNET_PEER_Id myid;
   int me;
-//   int oldnode_is_me;
   unsigned int i;
 
 #if MESH_TREE_DEBUG
@@ -640,9 +657,12 @@ tree_add_path (struct MeshTunnelTree *t,
   while (i < p->length)
   {
 #if MESH_TREE_DEBUG
+    GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+               "tree:   Adding peer %u to %u.\n",
+               p->peers[i], parent->peer);
     GNUNET_PEER_resolve(p->peers[i], &id);
     GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-               "tree:   Adding  peer %s.\n",
+               "tree:   Adding peer %s.\n",
                GNUNET_i2s (&id));
     GNUNET_PEER_resolve(parent->peer, &id);
     GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
@@ -671,6 +691,8 @@ tree_add_path (struct MeshTunnelTree *t,
       n = tree_node_new(parent, p->peers[i]);
       n->t = t->t;
       n->status = MESH_PEER_RELAY;
+      if (n->peer == myid)
+        t->me = n;
     }
     i++;
     parent = n;
index eb3ce57db80011944e7e3f35924bdc1d4b622204..e7c2a6fdfb668311e2b429bfa48196dd37da7bf6 100644 (file)
@@ -125,7 +125,6 @@ finish(void)
   {
     GNUNET_free(pi[i]);
   }
-  tree_destroy(tree);
   exit(0);
 }
 
@@ -244,7 +243,8 @@ main (int argc, char *argv[])
   GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "test: Destroying node copy...\n");
   GNUNET_free (node2);
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "test: Adding new shorter first path...\n");
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
+             "test: Adding new shorter first path...\n");
   path->length = 2;
   path->peers[1] = 4;
   cb_call = 1;
@@ -262,15 +262,53 @@ main (int argc, char *argv[])
   test_assert (2, MESH_PEER_RELAY, 1, 0);
   test_assert (1, MESH_PEER_ROOT, 2, 0);
 
+  GNUNET_free (path->peers);
+  GNUNET_free (path);
+  tree_destroy (tree);
+
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "test:\n");
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "test: Testing relay trees\n");
+  for (i = 0; i < 10; i++)
+  {
+      pi[i] = get_pi(i);
+      GNUNET_break (i + 1 == GNUNET_PEER_intern(pi[i]));
+      GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Peer %u: %s\n",
+                 i + 1,
+                 GNUNET_h2s(&pi[i]->hashPubKey));
+  }
+  tree = GNUNET_malloc(sizeof(struct MeshTunnelTree));
+  tree->first_hops = GNUNET_CONTAINER_multihashmap_create(32);
+  tree->root = GNUNET_malloc(sizeof(struct MeshTunnelTreeNode));
+  tree->root->peer = 1;
+  path = path_new (3);
+  path->peers[0] = 1;
+  path->peers[1] = 2;
+  path->peers[2] = 3;
+  path->length = 3;
+
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "test: Adding first path: 1 2 3\n");
+  tree_add_path(tree, path, &cb);
+  tree_debug(tree);
+  tree->me = tree_find_peer (tree->root, 2);
+
+  test_assert (3, MESH_PEER_SEARCHING, 0, 3);
+  test_assert (2, MESH_PEER_RELAY, 1, 0);
+  test_assert (1, MESH_PEER_ROOT, 1, 0);
+
+  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "test: Adding same path: 1 2 3\n");
+  tree_add_path(tree, path, &cb);
+  
+  GNUNET_free (path->peers);
+  GNUNET_free (path);
+  tree_destroy (tree);
+
   if (failed > 0)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "%u tests failed\n", failed);
     return 1;
   }
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "test: OK\n");
-  GNUNET_free (path->peers);
-  GNUNET_free (path);
   finish();
-
+  
   return 0;
 }