- compiler warning
[oweals/gnunet.git] / src / rps / test_rps.c
index 4a4a9ee1ae2305d0e6e378528e00434fc8441d0e..8c0be24fbcb5757ea0f3c2fbf886baecc641e036 100644 (file)
@@ -214,15 +214,10 @@ struct RPSPeer
    */
   unsigned int num_pending_reps;
 
-  /**
-   * Received PeerIDs
-   */
-  struct GNUNET_PeerIdentity *rec_ids;
-
   /**
    * Number of received PeerIDs
    */
-  unsigned int num_rec_ids;
+  unsigned int num_recv_ids;
 };
 
 
@@ -267,6 +262,11 @@ static int ok;
  */
 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
@@ -453,25 +453,23 @@ ids_to_file (char *file_name,
  * Test the success of a single test
  */
 static int
-evaluate (struct RPSPeer *loc_rps_peers,
-          unsigned int num_loc_rps_peers,
-          unsigned int expected_recv)
+evaluate (void)
 {
   unsigned int i;
   int tmp_ok;
 
-  tmp_ok = (1 == loc_rps_peers[0].num_rec_ids);
+  tmp_ok = 1;
 
-  for (i = 0 ; i < num_loc_rps_peers ; i++)
+  for (i = 0; i < num_peers; i++)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "%u. peer [%s] received %u of %u expected peer_ids: %i\n",
-                i,
-                GNUNET_i2s (loc_rps_peers[i].peer_id),
-                loc_rps_peers[i].num_rec_ids,
-                expected_recv,
-                (1 == loc_rps_peers[i].num_rec_ids));
-    tmp_ok &= (1 == loc_rps_peers[i].num_rec_ids);
+        "%u. peer [%s] received %u of %u expected peer_ids: %i\n",
+        i,
+        GNUNET_i2s (rps_peers[i].peer_id),
+        rps_peers[i].num_recv_ids,
+        rps_peers[i].num_ids_to_request,
+        (rps_peers[i].num_ids_to_request == rps_peers[i].num_recv_ids));
+    tmp_ok &= (rps_peers[i].num_ids_to_request == rps_peers[i].num_recv_ids);
   }
   return tmp_ok? 0 : 1;
 }
@@ -495,7 +493,7 @@ make_oplist_entry ()
  * Task run on timeout to shut everything down.
  */
 static void
-shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+shutdown_op (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   unsigned int i;
 
@@ -503,8 +501,9 @@ shutdown_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   if (NULL != churn_task)
     GNUNET_SCHEDULER_cancel (churn_task);
 
-  for (i = 0 ; i < num_peers ; i++)
-    GNUNET_TESTBED_operation_done (rps_peers[i].op);
+  for (i = 0; i < num_peers; i++)
+    if (NULL != rps_peers[i].op)
+      GNUNET_TESTBED_operation_done (rps_peers[i].op);
   GNUNET_SCHEDULER_shutdown ();
 }
 
@@ -531,6 +530,39 @@ seed_peers (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   GNUNET_RPS_seed_ids (peer->rps_handle, amount, rps_peer_ids);
 }
 
+/**
+ * Seed peers.
+ */
+  void
+seed_peers_big (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+{
+  struct RPSPeer *peer = (struct RPSPeer *) 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.
@@ -546,6 +578,7 @@ info_cb (void *cb_cls,
   if (NULL == pinfo || NULL != emsg)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Got Error: %s\n", emsg);
+    GNUNET_TESTBED_operation_done (entry->op);
     return;
   }
 
@@ -556,8 +589,6 @@ info_cb (void *cb_cls,
 
   rps_peer_ids[entry->index] = *(pinfo->result.id);
   rps_peers[entry->index].peer_id = &rps_peer_ids[entry->index];
-  rps_peers[entry->index].rec_ids = NULL;
-  rps_peers[entry->index].num_rec_ids = 0;
 
   GNUNET_CONTAINER_multipeermap_put (peer_map,
       &rps_peer_ids[entry->index],
@@ -568,11 +599,8 @@ info_cb (void *cb_cls,
            entry->index,
            GNUNET_i2s_full (&rps_peer_ids[entry->index]));
 
-  if (NULL != cur_test_run.init_peer)
-    cur_test_run.init_peer (&rps_peers[entry->index]);
-
-  GNUNET_TESTBED_operation_done (entry->op);
   GNUNET_CONTAINER_DLL_remove (oplist_head, oplist_tail, entry);
+  GNUNET_TESTBED_operation_done (entry->op);
   GNUNET_free (entry);
 }
 
@@ -650,10 +678,13 @@ rps_connect_adapter (void *cls,
  */
 static void
 rps_disconnect_adapter (void *cls,
-                        void *op_result)
+                                         void *op_result)
 {
+  struct RPSPeer *peer = cls;
   struct GNUNET_RPS_Handle *h = op_result;
+  GNUNET_assert (NULL != peer);
   GNUNET_RPS_disconnect (h);
+  peer->rps_handle = NULL;
 }
 
 
@@ -665,7 +696,7 @@ rps_disconnect_adapter (void *cls,
 static int
 default_eval_cb (void)
 {
-  return evaluate (rps_peers, num_peers, 1);
+  return evaluate ();
 }
 
 static int
@@ -708,14 +739,20 @@ default_reply_handle (void *cls,
               GNUNET_i2s (rps_peer->peer_id),
               n);
   
-  for (i = 0 ; i < n ; i++)
+  for (i = 0; i < n; i++)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "%u: %s\n",
                 i,
                 GNUNET_i2s (&recv_peers[i]));
 
-    GNUNET_array_append (rps_peer->rec_ids, rps_peer->num_rec_ids, recv_peers[i]);
+    rps_peer->num_recv_ids++;
+  }
+
+  if (0 == evaluate ())
+  {
+    GNUNET_SCHEDULER_cancel (shutdown_task);
+    shutdown_task = GNUNET_SCHEDULER_add_now (&shutdown_op, NULL);
   }
 }
 
@@ -812,6 +849,12 @@ schedule_missing_requests (struct RPSPeer *rps_peer)
   unsigned int i;
   struct PendingRequest *pending_req;
 
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+      "Scheduling %u - %u missing requests\n",
+      rps_peer->num_ids_to_request,
+      rps_peer->num_pending_reqs + rps_peer->num_pending_reps);
+  GNUNET_assert (rps_peer->num_pending_reqs + rps_peer->num_pending_reps <=
+      rps_peer->num_ids_to_request);
   for (i = rps_peer->num_pending_reqs + rps_peer->num_pending_reps;
        i < rps_peer->num_ids_to_request; i++)
   {
@@ -832,6 +875,8 @@ schedule_missing_requests (struct RPSPeer *rps_peer)
 void
 cancel_pending_req_rep (struct RPSPeer *rps_peer)
 {
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+      "Cancelling all (pending) requests.\n");
   while (NULL != rps_peer->pending_req_head)
     cancel_pending_req (rps_peer->pending_req_head);
   GNUNET_assert (0 == rps_peer->num_pending_reqs);
@@ -843,6 +888,16 @@ cancel_pending_req_rep (struct RPSPeer *rps_peer)
 /***********************************
  * MALICIOUS
 ***********************************/
+
+/**
+ * Initialise only non-mal RPSPeers
+ */
+static void mal_init_peer (struct RPSPeer *rps_peer)
+{
+  if (rps_peer->index >= round (portion * num_peers))
+    rps_peer->num_ids_to_request = 1;
+}
+
 static void
 mal_pre (void *cls, struct GNUNET_RPS_Handle *h)
 {
@@ -888,17 +943,6 @@ mal_cb (struct RPSPeer *rps_peer)
   #endif /* ENABLE_MALICIOUS */
 }
 
-static int
-mal_eval (void)
-{
-  unsigned int num_mal_peers;
-
-  num_mal_peers = round (num_peers * portion);
-  return evaluate (&rps_peers[num_mal_peers],
-                   num_peers - (num_mal_peers),
-                   1);
-}
-
 
 /***********************************
  * SINGLE_REQUEST
@@ -924,8 +968,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);
 }
 
 /***********************************
@@ -935,6 +980,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);
 }
 
 /***********************************
@@ -952,8 +1000,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);
 }
 
@@ -1064,14 +1113,16 @@ manage_service_wrapper (unsigned int i, unsigned int j, int delta,
               i,
               j,
               GNUNET_i2s (rps_peers[j].peer_id),
-              (delta < 0)? "online" : "offline");
+              (0 > delta) ? "online" : "offline");
   if (prob < prob_go_on_off * UINT32_MAX)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "%s goes %s\n",
                 GNUNET_i2s (rps_peers[j].peer_id),
-                (delta < 0) ? "offline" : "online");
+                (0 > delta) ? "offline" : "online");
 
+    if (0 > delta)
+      cancel_pending_req_rep (&rps_peers[j]);
     entry = make_oplist_entry ();
     entry->delta = delta;
     entry->index = j;
@@ -1080,7 +1131,7 @@ manage_service_wrapper (unsigned int i, unsigned int j, int delta,
                                                     "rps",
                                                     &churn_cb,
                                                     entry,
-                                                    (delta < 0) ? 0 : 1);
+                                                    (0 > delta) ? 0 : 1);
   }
 }
 
@@ -1125,7 +1176,6 @@ churn (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
     /* If online, shut down with certain probability */
     if (GNUNET_YES == rps_peers[j].online)
     {
-      cancel_pending_req_rep (&rps_peers[j]);
       manage_service_wrapper (i, j, -1, prob_go_offline);
     }
 
@@ -1195,11 +1245,7 @@ profiler_reply_handle (void *cls,
              "%" PRIu32 "\n",
              (uint32_t) rcv_rps_peer->index);
   }
-  /* Find #PendingReply holding the request handle */
-  GNUNET_CONTAINER_DLL_remove (rps_peer->pending_rep_head,
-                               rps_peer->pending_rep_tail,
-                               pending_rep);
-  rps_peer->num_pending_reps--;
+  default_reply_handle (cls, n, recv_peers);
 }
 
 
@@ -1270,7 +1316,7 @@ profiler_eval (void)
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Scan of directory failed\n");
   }
 
-  return 0;
+  return evaluate ();
 }
 
 
@@ -1301,37 +1347,46 @@ run (void *cls,
 {
   unsigned int i;
   struct OpListEntry *entry;
+  uint32_t num_mal_peers;
 
   testbed_peers = peers;
   num_peers_online = 0;
-  for (i = 0 ; i < num_peers ; i++)
+  for (i = 0; i < num_peers; i++)
   {
     entry = make_oplist_entry ();
     entry->index = i;
+    rps_peers[i].index = i;
+    if (NULL != cur_test_run.init_peer)
+      cur_test_run.init_peer (&rps_peers[i]);
     entry->op = GNUNET_TESTBED_peer_get_information (peers[i],
                                                      GNUNET_TESTBED_PIT_IDENTITY,
                                                      &info_cb,
                                                      entry);
   }
 
+  num_mal_peers = round (portion * num_peers);
   GNUNET_assert (num_peers == n_peers);
-  for (i = 0 ; i < n_peers ; i++)
+  for (i = 0; i < n_peers; i++)
   {
     rps_peers[i].index = i;
-    rps_peers[i].op =
-      GNUNET_TESTBED_service_connect (&rps_peers[i],
-                                      peers[i],
-                                      "rps",
-                                      &rps_connect_complete_cb,
-                                      &rps_peers[i],
-                                      &rps_connect_adapter,
-                                      &rps_disconnect_adapter,
-                                      &rps_peers[i]);
+    if ( (rps_peers[i].num_recv_ids < rps_peers[i].num_ids_to_request) ||
+         (i < num_mal_peers) )
+    {
+      rps_peers[i].op =
+        GNUNET_TESTBED_service_connect (&rps_peers[i],
+                                        peers[i],
+                                        "rps",
+                                        &rps_connect_complete_cb,
+                                        &rps_peers[i],
+                                        &rps_connect_adapter,
+                                        &rps_disconnect_adapter,
+                                        &rps_peers[i]);
+    }
   }
 
   if (NULL != churn_task)
     GNUNET_SCHEDULER_cancel (churn_task);
-  GNUNET_SCHEDULER_add_delayed (timeout, &shutdown_task, NULL);
+  shutdown_task = GNUNET_SCHEDULER_add_delayed (timeout, &shutdown_op, NULL);
 }
 
 
@@ -1360,7 +1415,7 @@ main (int argc, char *argv[])
   {
     cur_test_run.pre_test = mal_pre;
     cur_test_run.main_test = mal_cb;
-    cur_test_run.eval_cb = mal_eval;
+    cur_test_run.init_peer = mal_init_peer;
 
     if (strstr (argv[0], "_1") != NULL)
     {
@@ -1399,8 +1454,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)
@@ -1432,6 +1490,7 @@ main (int argc, char *argv[])
     num_peers = 1;
     cur_test_run.main_test = req_cancel_cb;
     cur_test_run.eval_cb = no_eval;
+    timeout = GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 10);
   }
 
   else if (strstr (argv[0], "profiler") != NULL)