gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r10325 - gnunet/src/testing


From: gnunet
Subject: [GNUnet-SVN] r10325 - gnunet/src/testing
Date: Tue, 16 Feb 2010 13:13:06 +0100

Author: nevans
Date: 2010-02-16 13:13:05 +0100 (Tue, 16 Feb 2010)
New Revision: 10325

Modified:
   gnunet/src/testing/testing.c
   gnunet/src/testing/testing_group.c
Log:
testing changes

Modified: gnunet/src/testing/testing.c
===================================================================
--- gnunet/src/testing/testing.c        2010-02-16 12:11:42 UTC (rev 10324)
+++ gnunet/src/testing/testing.c        2010-02-16 12:13:05 UTC (rev 10325)
@@ -40,7 +40,7 @@
 #include "gnunet_testing_lib.h"
 #include "gnunet_transport_service.h"
 
-#define DEBUG_TESTING GNUNET_NO
+#define DEBUG_TESTING GNUNET_YES
 
 /**
  * How long do we wait after starting gnunet-service-arm
@@ -800,13 +800,13 @@
 
 #if DEBUG_TESTING
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Core notified us about connection to a peer\n\n\n");
+              "Core notified us about connection to a peer\n");
 #endif
   if (memcmp(&ctx->d2->id, peer, sizeof(struct GNUNET_PeerIdentity)) == 0)
     {
 #if DEBUG_TESTING
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Core notified us about connection to peer %s\n\n\n", 
GNUNET_i2s(peer));
+              "Core notified us about connection to peer %s\n", 
GNUNET_i2s(peer));
 #endif
       /*
        * If we disconnect here, then the hello may never get sent (if it was 
delayed!)
@@ -825,10 +825,12 @@
 {
   struct ConnectContext *ctx = cls;
 
-  GNUNET_assert (ctx->hello != NULL);
-  GNUNET_TRANSPORT_offer_hello (ctx->d2th, ctx->hello);
+  if (ctx->hello != NULL)
+    {
+      GNUNET_TRANSPORT_offer_hello (ctx->d2th, ctx->hello);
+      ctx->timeout_hello = GNUNET_TIME_relative_add(ctx->timeout_hello, 
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 200));
+    }
 
-  ctx->timeout_hello = GNUNET_TIME_relative_multiply(ctx->timeout_hello, 2);
   ctx->hello_send_task = GNUNET_SCHEDULER_add_delayed(ctx->d1->sched, 
ctx->timeout_hello, &send_hello, ctx);
 }
 
@@ -904,7 +906,7 @@
   ctx->timeout = GNUNET_TIME_relative_to_absolute (timeout);
   ctx->cb = cb;
   ctx->cb_cls = cb_cls;
-  ctx->timeout_hello = 
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 800);
+  ctx->timeout_hello = 
GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_MILLISECONDS, 400);
   ctx->connected = GNUNET_NO;
 #if DEBUG_TESTING
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,

Modified: gnunet/src/testing/testing_group.c
===================================================================
--- gnunet/src/testing/testing_group.c  2010-02-16 12:11:42 UTC (rev 10324)
+++ gnunet/src/testing/testing_group.c  2010-02-16 12:13:05 UTC (rev 10325)
@@ -44,7 +44,7 @@
  */
 #define HIGH_PORT 32000
 
-#define CONNECT_TIMEOUT GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 60)
+#define CONNECT_TIMEOUT GNUNET_TIME_relative_multiply 
(GNUNET_TIME_UNIT_SECONDS, 180)
 
 struct PeerConnection
 {
@@ -295,7 +295,402 @@
   return added;
 }
 
+int
+create_small_world_ring(struct GNUNET_TESTING_PeerGroup *pg)
+{
+  unsigned int i, j;
+  int nodeToConnect;
+  unsigned int natLog;
+  unsigned int randomPeer;
+  double random, logNModifier, percentage;
+  unsigned int smallWorldConnections;
+  int connsPerPeer;
+  char *p_string;
+  int max;
+  int min;
+  unsigned int useAnd;
+  int connect_attempts;
+  struct GNUNET_TIME_Absolute time;
+
+  GNUNET_CONFIGURATION_get_value_string(pg->cfg, "TESTING", "LOGNMODIFIER", 
&p_string);
+  if (p_string != NULL)
+    logNModifier = atof(p_string);
+  else
+    logNModifier = 0.5; /* FIXME: default modifier? */
+
+  GNUNET_free_non_null(p_string);
+
+  GNUNET_CONFIGURATION_get_value_string(pg->cfg, "TESTING", "PERCENTAGE", 
&p_string);
+  if (p_string != NULL)
+    percentage = atof(p_string);
+  else
+    percentage = 0.5; /* FIXME: default percentage? */
+
+  GNUNET_free_non_null(p_string);
+
+  natLog = log (pg->total);
+  connsPerPeer = ceil (natLog * logNModifier);
+
+  if (connsPerPeer % 2 == 1)
+    connsPerPeer += 1;
+
+  time = GNUNET_TIME_absolute_get ();
+  srand ((unsigned int) time.value);
+  smallWorldConnections = 0;
+  connect_attempts = 0;
+  for (i = 0; i < pg->total; i++)
+    {
+      useAnd = 0;
+      max = i + connsPerPeer / 2;
+      min = i - connsPerPeer / 2;
+
+      if (max > pg->total - 1)
+        {
+          max = max - pg->total;
+          useAnd = 1;
+        }
+
+      if (min < 0)
+        {
+          min = pg->total - 1 + min;
+          useAnd = 1;
+        }
+
+      for (j = 0; j < connsPerPeer / 2; j++)
+        {
+          random = ((double) rand () / RAND_MAX);
+          if (random < percentage)
+            {
+              /* Connect to uniformly selected random peer */
+              randomPeer =
+                GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
+                                   pg->total);
+              while ((((randomPeer < max) && (randomPeer > min))
+                      && (useAnd == 0)) || (((randomPeer > min)
+                                             || (randomPeer < max))
+                                            && (useAnd == 1)))
+                {
+                  randomPeer =
+                      GNUNET_CRYPTO_random_u32 (GNUNET_CRYPTO_QUALITY_WEAK,
+                                                         pg->total);
+                }
+              smallWorldConnections +=
+                add_connections (pg, i, randomPeer);
+            }
+          else
+            {
+              nodeToConnect = i + j + 1;
+              if (nodeToConnect > pg->total - 1)
+                {
+                  nodeToConnect = nodeToConnect - pg->total;
+                }
+              connect_attempts +=
+                add_connections (pg, i, nodeToConnect);
+            }
+        }
+
+    }
+
+  connect_attempts += smallWorldConnections;
+
+  return GNUNET_OK;
+}
+
+
 static int
+create_nated_internet (struct GNUNET_TESTING_PeerGroup *pg)
+{
+  unsigned int outer_count, inner_count;
+  unsigned int cutoff;
+  int connect_attempts;
+  double nat_percentage;
+  char *p_string;
+
+  GNUNET_CONFIGURATION_get_value_string(pg->cfg, "TESTING", "NATPERCENTAGE", 
&p_string);
+  if (p_string != NULL)
+    nat_percentage = atof(p_string);
+  else
+    nat_percentage = 0.0; /* FIXME: default modifier? */
+
+  GNUNET_free_non_null(p_string);
+
+  cutoff = (unsigned int) (nat_percentage * pg->total);
+
+  connect_attempts = 0;
+
+  for (outer_count = 0; outer_count < pg->total - 1; outer_count++)
+    {
+      for (inner_count = outer_count + 1; inner_count < pg->total;
+           inner_count++)
+        {
+          if ((outer_count > cutoff) || (inner_count > cutoff))
+            {
+#if VERBOSE_TESTING
+              GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                          "Connecting peer %d to peer %d\n",
+                          outer_count, inner_count);
+#endif
+              connect_attempts += add_connections(pg, outer_count, 
inner_count);
+            }
+        }
+    }
+
+  return connect_attempts;
+
+}
+
+
+
+static int
+create_small_world (struct GNUNET_TESTING_PeerGroup *pg)
+{
+  unsigned int i, j, k;
+  unsigned int square;
+  unsigned int rows;
+  unsigned int cols;
+  unsigned int toggle = 1;
+  unsigned int nodeToConnect;
+  unsigned int natLog;
+  unsigned int node1Row;
+  unsigned int node1Col;
+  unsigned int node2Row;
+  unsigned int node2Col;
+  unsigned int distance;
+  double probability, random, percentage;
+  unsigned int smallWorldConnections;
+  char *p_string;
+  int connect_attempts;
+  square = floor (sqrt (pg->total));
+  rows = square;
+  cols = square;
+
+  GNUNET_CONFIGURATION_get_value_string(pg->cfg, "TESTING", "PERCENTAGE", 
&p_string);
+  if (p_string != NULL)
+    percentage = atof(p_string);
+  else
+    percentage = 0.5; /* FIXME: default percentage? */
+
+  GNUNET_free_non_null(p_string);
+
+  GNUNET_CONFIGURATION_get_value_string(pg->cfg, "TESTING", "PROBABILITY", 
&p_string);
+  if (p_string != NULL)
+    probability = atof(p_string);
+  else
+    probability = 0.5; /* FIXME: default probability? */
+
+  GNUNET_free_non_null(p_string);
+
+  if (square * square != pg->total)
+    {
+      while (rows * cols < pg->total)
+        {
+          if (toggle % 2 == 0)
+            rows++;
+          else
+            cols++;
+
+          toggle++;
+        }
+    }
+#if VERBOSE_TESTING
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  _("Connecting nodes in 2d torus topology: %u rows %u 
columns\n"),
+                  rows, cols);
+#endif
+
+  connect_attempts = 0;
+  /* Rows and columns are all sorted out, now iterate over all nodes and 
connect each
+   * to the node to its right and above.  Once this is over, we'll have our 
torus!
+   * Special case for the last node (if the rows and columns are not equal), 
connect
+   * to the first in the row to maintain topology.
+   */
+  for (i = 0; i < pg->total; i++)
+    {
+      /* First connect to the node to the right */
+      if (((i + 1) % cols != 0) && (i + 1 != pg->total))
+        nodeToConnect = i + 1;
+      else if (i + 1 == pg->total)
+        nodeToConnect = rows * cols - cols;
+      else
+        nodeToConnect = i - cols + 1;
+
+      connect_attempts += add_connections (pg, i, nodeToConnect);
+
+      if (i < cols)
+        nodeToConnect = (rows * cols) - cols + i;
+      else
+        nodeToConnect = i - cols;
+
+      if (nodeToConnect < pg->total)
+        connect_attempts += add_connections (pg, i, nodeToConnect);
+    }
+  natLog = log (pg->total);
+#if VERBOSE_TESTING
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              _("natural log of %d is %d, will run %d iterations\n"),
+             pg->total, natLog, (int) (natLog * percentage));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, _("Total connections added thus far: 
%u!\n"), connect_attempts);
+#endif
+  smallWorldConnections = 0;
+  for (i = 0; i < (int) (natLog * percentage); i++)
+    {
+      for (j = 0; j < pg->total; j++)
+        {
+          /* Determine the row and column of node at position j on the 2d 
torus */
+          node1Row = j / cols;
+          node1Col = j - (node1Row * cols);
+          for (k = 0; k < pg->total; k++)
+            {
+              /* Determine the row and column of node at position k on the 2d 
torus */
+              node2Row = k / cols;
+              node2Col = k - (node2Row * cols);
+              /* Simple Cartesian distance */
+              distance = abs (node1Row - node2Row) + abs (node1Col - node2Col);
+              if (distance > 1)
+                {
+                  /* Calculate probability as 1 over the square of the 
distance */
+                  probability = 1.0 / (distance * distance);
+                  /* Choose a random, divide by RAND_MAX to get a number 
between 0 and 1 */
+                  random = ((double) rand () / RAND_MAX);
+                  /* If random < probability, then connect the two nodes */
+                  if (random < probability)
+                    smallWorldConnections += add_connections (pg, j, k);
+
+                }
+            }
+        }
+    }
+  connect_attempts += smallWorldConnections;
+#if VERBOSE_TESTING
+          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                      _("Total connections added for small world: %d!\n"),
+                      smallWorldConnections);
+#endif
+  return GNUNET_OK;
+}
+
+
+
+static int
+create_erdos_renyi (struct GNUNET_TESTING_PeerGroup *pg)
+{
+  double temp_rand;
+  unsigned int outer_count;
+  unsigned int inner_count;
+  int connect_attempts;
+  double probability;
+  char *p_string;
+  connect_attempts = 0;
+
+  probability = GNUNET_CONFIGURATION_get_value_string(pg->cfg, "TESTING", 
"PROBABILITY", &p_string);
+  if (p_string != NULL)
+    {
+      probability = atof(p_string);
+    }
+  else
+    {
+      probability = 0.0; /* FIXME: default probability? */
+    }
+  for (outer_count = 0; outer_count < pg->total - 1; outer_count++)
+    {
+      for (inner_count = outer_count + 1; inner_count < pg->total;
+           inner_count++)
+        {
+          temp_rand = ((double) RANDOM () / RAND_MAX);
+#if VERBOSE_TESTING
+          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                      _("rand is %f probability is %f\n"), temp_rand,
+                      probability);
+#endif
+          if (temp_rand < probability)
+            {
+              connect_attempts += add_connections (pg, outer_count, 
inner_count);
+            }
+        }
+    }
+
+  return connect_attempts;
+}
+
+static int
+create_2d_torus (struct GNUNET_TESTING_PeerGroup *pg)
+{
+  unsigned int i;
+  unsigned int square;
+  unsigned int rows;
+  unsigned int cols;
+  unsigned int toggle = 1;
+  unsigned int nodeToConnect;
+  int connect_attempts;
+
+  connect_attempts = 0;
+
+  square = floor (sqrt (pg->total));
+  rows = square;
+  cols = square;
+
+  if (square * square != pg->total)
+    {
+      while (rows * cols < pg->total)
+        {
+          if (toggle % 2 == 0)
+            rows++;
+          else
+            cols++;
+
+          toggle++;
+        }
+    }
+#if VERBOSE_TESTING
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  _("Connecting nodes in 2d torus topology: %u rows %u 
columns\n"),
+                  rows, cols);
+#endif
+  /* Rows and columns are all sorted out, now iterate over all nodes and 
connect each
+   * to the node to its right and above.  Once this is over, we'll have our 
torus!
+   * Special case for the last node (if the rows and columns are not equal), 
connect
+   * to the first in the row to maintain topology.
+   */
+  for (i = 0; i < pg->total; i++)
+    {
+      /* First connect to the node to the right */
+      if (((i + 1) % cols != 0) && (i + 1 != pg->total))
+        nodeToConnect = i + 1;
+      else if (i + 1 == pg->total)
+        nodeToConnect = rows * cols - cols;
+      else
+        nodeToConnect = i - cols + 1;
+#if VERBOSE_TESTING
+          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                      "Connecting peer %d to peer %d\n",
+                      i, nodeToConnect);
+#endif
+      connect_attempts += add_connections(pg, i, nodeToConnect);
+
+      /* Second connect to the node immediately above */
+      if (i < cols)
+        nodeToConnect = (rows * cols) - cols + i;
+      else
+        nodeToConnect = i - cols;
+
+      if (nodeToConnect < pg->total)
+        {
+#if VERBOSE_TESTING
+          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                      "Connecting peer %d to peer %d\n",
+                      i, nodeToConnect);
+#endif
+          connect_attempts += add_connections(pg, i, nodeToConnect);
+        }
+
+    }
+
+  return connect_attempts;
+}
+
+
+
+static int
 create_clique (struct GNUNET_TESTING_PeerGroup *pg)
 {
   unsigned int outer_count;
@@ -315,11 +710,6 @@
                       outer_count, inner_count);
 #endif
           connect_attempts += add_connections(pg, outer_count, inner_count);
-          /*GNUNET_TESTING_daemons_connect (pg->peers[outer_count].daemon,
-                                          pg->peers[inner_count].daemon,
-                                          CONNECT_TIMEOUT,
-                                          pg->notify_connection,
-                                          pg->notify_connection_cls);*/
         }
     }
 
@@ -327,6 +717,32 @@
 }
 
 
+static int
+create_ring (struct GNUNET_TESTING_PeerGroup *pg)
+{
+  unsigned int count;
+  int connect_attempts;
+
+  connect_attempts = 0;
+
+  /* Connect each peer to the next highest numbered peer */
+  for (count = 0; count < pg->total - 1; count++)
+    {
+#if VERBOSE_TESTING
+          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                      "Connecting peer %d to peer %d\n",
+                      count, count + 1);
+#endif
+      connect_attempts += add_connections(pg, count, count + 1);
+    }
+
+  /* Connect the last peer to the first peer */
+  connect_attempts += add_connections(pg, pg->total - 1, 0);
+
+  return connect_attempts;
+}
+
+
 /*
  * Create the friend files based on the PeerConnection's
  * of each peer in the peer group, and copy the files
@@ -460,65 +876,50 @@
 #if VERBOSE_TESTING
           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                       _("Creating clique topology (may take a bit!)\n"));
+#endif
           ret = create_clique (pg);
           break;
+        case GNUNET_TESTING_TOPOLOGY_SMALL_WORLD_RING:
+#if VERBOSE_TESTING
+          GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                      _("Creating small world (ring) topology (may take a 
bit!)\n"));
+#endif
+          ret = create_small_world_ring (pg);
+          break;
         case GNUNET_TESTING_TOPOLOGY_SMALL_WORLD:
+#if VERBOSE_TESTING
           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                      _("Creating small world topology (may take a bit!)\n"));
+                      _("Creating small world (2d-torus) topology (may take a 
bit!)\n"));
 #endif
-          ret = GNUNET_SYSERR;
-/*        ret =
-          GNUNET_REMOTE_connect_small_world_ring (&totalConnections,
-                                                  number_of_daemons,
-                                                  list_as_array, dotOutFile,
-                                                  percentage, logNModifier);
-                                                  */
+          ret = create_small_world (pg);
           break;
         case GNUNET_TESTING_TOPOLOGY_RING:
 #if VERBOSE_TESTING
           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                       _("Creating ring topology (may take a bit!)\n"));
 #endif
-          /*
-             ret = GNUNET_REMOTE_connect_ring (&totalConnections, head, 
dotOutFile);
-           */
-          ret = GNUNET_SYSERR;
+          ret = create_ring (pg);
           break;
         case GNUNET_TESTING_TOPOLOGY_2D_TORUS:
 #if VERBOSE_TESTING
           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                       _("Creating 2d torus topology (may take a bit!)\n"));
 #endif
-          /*
-             ret =
-             GNUNET_REMOTE_connect_2d_torus (&totalConnections, 
number_of_daemons,
-             list_as_array, dotOutFile);
-           */
-          ret = GNUNET_SYSERR;
+          ret = create_2d_torus (pg);
           break;
         case GNUNET_TESTING_TOPOLOGY_ERDOS_RENYI:
 #if VERBOSE_TESTING
           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                       _("Creating Erdos-Renyi topology (may take a bit!)\n"));
 #endif
-          /* ret =
-             GNUNET_REMOTE_connect_erdos_renyi (&totalConnections, percentage,
-             head, dotOutFile);
-           */
-          ret = GNUNET_SYSERR;
+          ret = create_erdos_renyi (pg);
           break;
         case GNUNET_TESTING_TOPOLOGY_INTERNAT:
 #if VERBOSE_TESTING
           GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                       _("Creating InterNAT topology (may take a bit!)\n"));
 #endif
-          /*
-             ret =
-             GNUNET_REMOTE_connect_nated_internet (&totalConnections, 
percentage,
-             number_of_daemons, head,
-             dotOutFile);
-           */
-          ret = GNUNET_SYSERR;
+          ret = create_nated_internet (pg);
           break;
         case GNUNET_TESTING_TOPOLOGY_NONE:
           ret = 0;





reply via email to

[Prev in Thread] Current Thread [Next in Thread]