plugin datastore mysql
[oweals/gnunet.git] / src / rps / test_rps.c
index f6c7ec205de7ebc8b116ee0bd40c96177f08353f..e0fbdbb887ae214d6af6c53a2e16548d449dd264 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     Copyright (C) 2009, 2012 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2009, 2012 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -38,7 +38,7 @@
 /**
  * How many peers do we start?
  */
-uint32_t num_peers;
+static uint32_t num_peers;
 
 /**
  * How long do we run the test?
@@ -256,18 +256,11 @@ static unsigned int num_peers_online;
  */
 static int ok;
 
-
 /**
  * Identifier for the churn task that runs periodically
  */
 static struct GNUNET_SCHEDULER_Task *churn_task;
 
-/**
- * Identifier for the churn task that runs periodically
- */
-static struct GNUNET_SCHEDULER_Task *shutdown_task;
-
-
 /**
  * Called to initialise the given RPSPeer
  */
@@ -362,7 +355,7 @@ static int in_shutdown;
  * Append arguments to file
  */
 static void
-tofile_ (const char *file_name, char *line)
+tofile_ (const char *file_name, const char *line)
 {
   struct GNUNET_DISK_FileHandle *f;
   /* char output_buffer[512]; */
@@ -403,7 +396,7 @@ tofile_ (const char *file_name, char *line)
   if (size != size2)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                "Unable to write to file! (Size: %u, size2: %u)\n",
+                "Unable to write to file! (Size: %lu, size2: %lu)\n",
                 size,
                 size2);
     return;
@@ -430,7 +423,7 @@ tofile_ (const char *file_name, char *line)
 
 
 /**
- * Write the ids and their according index in the given array to a file 
+ * Write the ids and their according index in the given array to a file
  * Unused
  */
 /* static void
@@ -493,14 +486,16 @@ make_oplist_entry ()
  * Task run on timeout to shut everything down.
  */
 static void
-shutdown_op (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+shutdown_op (void *cls)
 {
   unsigned int i;
 
   in_shutdown = GNUNET_YES;
   if (NULL != churn_task)
+  {
     GNUNET_SCHEDULER_cancel (churn_task);
-
+    churn_task = NULL;
+  }
   for (i = 0; i < num_peers; i++)
     if (NULL != rps_peers[i].op)
       GNUNET_TESTBED_operation_done (rps_peers[i].op);
@@ -511,11 +506,11 @@ shutdown_op (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 /**
  * Seed peers.
  */
-  void
-seed_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+static void
+seed_peers (void *cls)
 {
+  struct RPSPeer *peer = cls;
   unsigned int amount;
-  struct RPSPeer *peer = (struct RPSPeer *) cls;
   unsigned int i;
 
   // TODO if malicious don't seed mal peers
@@ -531,6 +526,40 @@ seed_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 }
 
 
+/**
+ * Seed peers.
+ */
+static void
+seed_peers_big (void *cls)
+{
+  struct RPSPeer *peer = cls;
+  unsigned int seed_msg_size;
+  uint32_t num_peers_max;
+  unsigned int amount;
+  unsigned int i;
+
+  seed_msg_size = 8; /* sizeof (struct GNUNET_RPS_CS_SeedMessage) */
+  num_peers_max = (GNUNET_SERVER_MAX_MESSAGE_SIZE - seed_msg_size) /
+    sizeof (struct GNUNET_PeerIdentity);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+      "Peers that fit in one seed msg; %u\n",
+      num_peers_max);
+  amount = num_peers_max + (0.5 * num_peers_max);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+      "Seeding many (%u) peers:\n",
+      amount);
+  struct GNUNET_PeerIdentity ids_to_seed[amount];
+  for (i = 0; i < amount; i++)
+  {
+    ids_to_seed[i] = *peer->peer_id;
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Seeding %u. peer: %s\n",
+                i,
+                GNUNET_i2s (&ids_to_seed[i]));
+  }
+
+  GNUNET_RPS_seed_ids (peer->rps_handle, amount, ids_to_seed);
+}
+
 /**
  * Get the id of peer i.
  */
@@ -705,7 +734,7 @@ default_reply_handle (void *cls,
               "[%s] got %" PRIu64 " peers:\n",
               GNUNET_i2s (rps_peer->peer_id),
               n);
-  
+
   for (i = 0; i < n; i++)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -718,8 +747,7 @@ default_reply_handle (void *cls,
 
   if (0 == evaluate ())
   {
-    GNUNET_SCHEDULER_cancel (shutdown_task);
-    shutdown_task = GNUNET_SCHEDULER_add_now (&shutdown_op, NULL);
+    GNUNET_SCHEDULER_shutdown ();
   }
 }
 
@@ -727,11 +755,10 @@ default_reply_handle (void *cls,
  * Request random peers.
  */
 static void
-request_peers (void *cls,
-               const struct GNUNET_SCHEDULER_TaskContext *tc)
+request_peers (void *cls)
 {
+  struct PendingRequest *pending_req = cls;
   struct RPSPeer *rps_peer;
-  struct PendingRequest *pending_req = (struct PendingRequest *) cls;
   struct PendingReply *pending_rep;
 
   if (GNUNET_YES == in_shutdown)
@@ -792,11 +819,10 @@ cancel_request (struct PendingReply *pending_rep)
  * Cancel a request.
  */
 static void
-cancel_request_cb (void *cls,
-                const struct GNUNET_SCHEDULER_TaskContext *tc)
+cancel_request_cb (void *cls)
 {
+  struct RPSPeer *rps_peer = cls;
   struct PendingReply *pending_rep;
-  struct RPSPeer *rps_peer = (struct RPSPeer *) cls;
 
   if (GNUNET_YES == in_shutdown)
     return;
@@ -935,8 +961,9 @@ delay_req_cb (struct RPSPeer *rps_peer)
 static void
 seed_cb (struct RPSPeer *rps_peer)
 {
-  GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10),
-                                seed_peers, rps_peer);
+  GNUNET_SCHEDULER_add_delayed (
+      GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10),
+      seed_peers, rps_peer);
 }
 
 /***********************************
@@ -946,6 +973,9 @@ static void
 seed_big_cb (struct RPSPeer *rps_peer)
 {
   // TODO test seeding > GNUNET_SERVER_MAX_MESSAGE_SIZE peers
+  GNUNET_SCHEDULER_add_delayed (
+      GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 2),
+      seed_peers_big, rps_peer);
 }
 
 /***********************************
@@ -963,8 +993,9 @@ single_peer_seed_cb (struct RPSPeer *rps_peer)
 static void
 seed_req_cb (struct RPSPeer *rps_peer)
 {
-  GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 2),
-                                seed_peers, rps_peer);
+  GNUNET_SCHEDULER_add_delayed (
+      GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 2),
+      seed_peers, rps_peer);
   schedule_missing_requests (rps_peer);
 }
 
@@ -1097,8 +1128,9 @@ manage_service_wrapper (unsigned int i, unsigned int j, int delta,
   }
 }
 
+
 static void
-churn (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+churn (void *cls)
 {
   unsigned int i;
   unsigned int j;
@@ -1348,7 +1380,7 @@ run (void *cls,
 
   if (NULL != churn_task)
     GNUNET_SCHEDULER_cancel (churn_task);
-  shutdown_task = GNUNET_SCHEDULER_add_delayed (timeout, &shutdown_op, NULL);
+  GNUNET_SCHEDULER_add_delayed (timeout, &shutdown_op, NULL);
 }
 
 
@@ -1416,8 +1448,11 @@ main (int argc, char *argv[])
   else if (strstr (argv[0], "_seed_big") != NULL)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Test seeding (num_peers > GNUNET_SERVER_MAX_MESSAGE_SIZE)\n");
+    num_peers = 1;
     cur_test_run.name = "test-rps-seed-big";
     cur_test_run.main_test = seed_big_cb;
+    cur_test_run.eval_cb = no_eval;
+    timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10);
   }
 
   else if (strstr (argv[0], "_single_peer_seed") != NULL)
@@ -1479,7 +1514,9 @@ main (int argc, char *argv[])
        (3 == mal_type))
     target_peer = &rps_peer_ids[num_peers - 2];
   if (profiler_eval == cur_test_run.eval_cb)
-    eval_peer = &rps_peers[num_peers - 1];
+    eval_peer = &rps_peers[num_peers - 1];    /* FIXME: eval_peer could be a
+                                                 malicious peer if not careful
+                                                 with the malicious portion */
 
   ok = 1;
   (void) GNUNET_TESTBED_test_run (cur_test_run.name,