This probably fixes #3944
[oweals/gnunet.git] / src / transport / test_transport_blacklisting.c
index d6961d8d037ded5241e8b33510bac55875566017..2972e7dae894ec5afa72f9d80fcb5341eb3c0875 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2009, 2010, 2011 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2009, 2010, 2011 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
  * @file transport/transport_api_blacklisting.c
- * @brief test for the blacklisting API
- *             stage 0: init
- *             stage 1: connect peers and stop
- *             stage 2: blacklist whole peer and connect
- *             stage 3: blacklist tcp and try connect
+ * @brief test for the blacklisting with blacklistings defined in cfg
+ *
+ * this file contains multiple tests:
+ *
+ * test_transport_blacklisting_no_bl:
+ *      no blacklisting entries
+ *      peers are expected to connect
+ * test_transport_blacklisting_outbound_bl_full:
+ *      both peers contain bl entries for full peer
+ *      test is expected to not connect
+ * test_transport_blacklisting_outbound_bl_plugin:
+ *      both peers contain bl entries for plugin
+ *      test is expected to not connect
+ * test_transport_blacklisting_inbound_bl_plugin:
+ *      peer 1 contains no bl entries
+ *      peer 2 contain bl entries for full peer
+ *      test is expected to not connect
+ * test_transport_blacklisting_inbound_bl_full:
+ *      peer 1 contains no bl entries
+ *      peer 2 contain bl entries for plugin
+ *      test is expected to not connect
+ * test_transport_blacklisting_multiple_plugins:
+ *      both peers contain bl entries for plugin
+ *      test is expected to  connect with not bl'ed plugin
  *
  * @author Matthias Wachs
  *
@@ -54,11 +73,11 @@ static int stage;
 static int ok;
 static int connected;
 
-static GNUNET_SCHEDULER_TaskIdentifier die_task;
+static struct GNUNET_SCHEDULER_Task * die_task;
 
-static GNUNET_SCHEDULER_TaskIdentifier timeout_task;
+static struct GNUNET_SCHEDULER_Task * timeout_task;
 
-static GNUNET_SCHEDULER_TaskIdentifier stage_task;
+static struct GNUNET_SCHEDULER_Task * stage_task;
 
 #if VERBOSE
 #define OKPP do { ok++; FPRINTF (stderr, "Now at stage %u at %s:%u\n", ok, __FILE__, __LINE__); } while (0)
@@ -74,22 +93,22 @@ end(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Stopping\n");
 
-  if (die_task != GNUNET_SCHEDULER_NO_TASK )
+  if (die_task != NULL )
   {
     GNUNET_SCHEDULER_cancel (die_task);
-    die_task = GNUNET_SCHEDULER_NO_TASK;
+    die_task = NULL;
   }
 
-  if (timeout_task != GNUNET_SCHEDULER_NO_TASK )
+  if (timeout_task != NULL )
   {
     GNUNET_SCHEDULER_cancel (timeout_task);
-    timeout_task = GNUNET_SCHEDULER_NO_TASK;
+    timeout_task = NULL;
   }
 
-  if (stage_task != GNUNET_SCHEDULER_NO_TASK )
+  if (stage_task != NULL )
   {
     GNUNET_SCHEDULER_cancel (stage_task);
-    stage_task = GNUNET_SCHEDULER_NO_TASK;
+    stage_task = NULL;
   }
 
   if (cc != NULL )
@@ -113,18 +132,18 @@ end(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 static void
 end_badly(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-  die_task = GNUNET_SCHEDULER_NO_TASK;
+  die_task = NULL;
 
-  if (timeout_task != GNUNET_SCHEDULER_NO_TASK )
+  if (timeout_task != NULL )
   {
     GNUNET_SCHEDULER_cancel (timeout_task);
-    timeout_task = GNUNET_SCHEDULER_NO_TASK;
+    timeout_task = NULL;
   }
 
-  if (stage_task != GNUNET_SCHEDULER_NO_TASK )
+  if (stage_task != NULL )
   {
     GNUNET_SCHEDULER_cancel (stage_task);
-    stage_task = GNUNET_SCHEDULER_NO_TASK;
+    stage_task = NULL;
   }
 
   if (cc != NULL )
@@ -157,7 +176,7 @@ static void
 connect_timeout(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Peers not connected, next stage\n");
-  timeout_task = GNUNET_SCHEDULER_NO_TASK;
+  timeout_task = NULL;
   stage_task = GNUNET_SCHEDULER_add_now (&run_stage, NULL );
 }
 
@@ -168,8 +187,8 @@ start_cb(struct PeerContext *p, void *cls)
 {
 
   started++;
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Peer %u (`%s') started\n", p->no,
-      GNUNET_i2s (&p->id));
+  GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Peer %u (`%s') started\n", p->no,
+      GNUNET_i2s_full (&p->id));
 
   if (started != 2)
     return;
@@ -186,11 +205,49 @@ start_cb(struct PeerContext *p, void *cls)
 
 }
 
+static int check_blacklist_config (char *cfg_file,
+    struct GNUNET_PeerIdentity *peer, struct GNUNET_PeerIdentity *bl_peer)
+{
+  struct GNUNET_CONFIGURATION_Handle *cfg;
+  char *section;
+  char *peer_str;
+  cfg = GNUNET_CONFIGURATION_create ();
+  if (GNUNET_OK != GNUNET_CONFIGURATION_load (cfg, cfg_file))
+  {
+    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Could not load configuration `%s'\n", cfg_file);
+    GNUNET_CONFIGURATION_destroy (cfg);
+    return GNUNET_SYSERR;
+  }
+
+  peer_str = GNUNET_strdup (GNUNET_i2s_full(peer));
+  GNUNET_asprintf (&section, "transport-blacklist-%s", peer_str);
+
+  if (GNUNET_NO == GNUNET_CONFIGURATION_have_value (cfg, section, GNUNET_i2s_full(bl_peer)))
+  {
+    GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
+        "Configuration `%s' does not have blacklisting section for peer `%s' blacklisting `%s'\n",
+        cfg_file, peer_str, GNUNET_i2s_full(bl_peer));
+    GNUNET_CONFIGURATION_destroy (cfg);
+    GNUNET_free (section);
+    GNUNET_free (peer_str);
+    return GNUNET_SYSERR;
+  }
+
+  GNUNET_log(GNUNET_ERROR_TYPE_INFO,
+      "Configuration `%s' does have blacklisting section for peer `%s' blacklisting `%s'\n",
+      cfg_file, peer_str, GNUNET_i2s_full(bl_peer));
+
+  GNUNET_CONFIGURATION_destroy (cfg);
+  GNUNET_free (section);
+  GNUNET_free (peer_str);
+  return GNUNET_OK;
+}
+
 static void
 run_stage(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
-  stage_task = GNUNET_SCHEDULER_NO_TASK;
-  if (GNUNET_SCHEDULER_NO_TASK != die_task)
+  stage_task = NULL;
+  if (NULL != die_task)
     GNUNET_SCHEDULER_cancel (die_task);
   die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL );
   GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Running stage %u\n", stage);
@@ -213,57 +270,130 @@ run_stage(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
     else if (0
         == strcmp (test_name, "test_transport_blacklisting_outbound_bl_full"))
     {
+      char * cfg_p1 = "test_transport_blacklisting_cfg_blp_peer1_full.conf";
+      char * cfg_p2 = "test_transport_blacklisting_cfg_blp_peer2_full.conf";
       p1 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
-          "test_transport_blacklisting_cfg_blp_peer1_full.conf", 1, NULL, NULL,
-          NULL, &start_cb, NULL );
+          cfg_p1 , 1, NULL, NULL, NULL, &start_cb, NULL );
 
       p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
-          "test_transport_blacklisting_cfg_peer2.conf", 2, NULL, NULL, NULL,
+          cfg_p2, 2, NULL, NULL, NULL,
           &start_cb, NULL );
+
+      /* check if configuration contain correct blacklist entries */
+      if ((GNUNET_SYSERR == check_blacklist_config (cfg_p1, &p1->id, &p2->id)) ||
+          (GNUNET_SYSERR == check_blacklist_config (cfg_p2, &p2->id, &p1->id)) )
+      {
+        GNUNET_TRANSPORT_TESTING_stop_peer(tth, p1);
+        p1 = NULL;
+        GNUNET_TRANSPORT_TESTING_stop_peer(tth, p2);
+        p2 = NULL;
+        ok = 1;
+        GNUNET_SCHEDULER_add_now (&end, NULL );
+      }
+
     }
     else if (0
         == strcmp (test_name, "test_transport_blacklisting_outbound_bl_plugin"))
     {
+      char * cfg_p1 = "test_transport_blacklisting_cfg_blp_peer1_plugin.conf";
+      char * cfg_p2 = "test_transport_blacklisting_cfg_blp_peer2_plugin.conf";
+
       p1 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
-          "test_transport_blacklisting_cfg_blp_peer1_plugin.conf", 1, NULL,
+          cfg_p1, 1, NULL,
           NULL, NULL, &start_cb, NULL );
 
       p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
-          "test_transport_blacklisting_cfg_peer2.conf", 2, NULL, NULL, NULL,
+          cfg_p2, 2, NULL, NULL, NULL,
           &start_cb, NULL );
+
+      /* check if configuration contain correct blacklist entries */
+      if ((GNUNET_SYSERR == check_blacklist_config (cfg_p1, &p1->id, &p2->id)) ||
+          (GNUNET_SYSERR == check_blacklist_config (cfg_p2, &p2->id, &p1->id)) )
+      {
+        GNUNET_TRANSPORT_TESTING_stop_peer(tth, p1);
+        p1 = NULL;
+        GNUNET_TRANSPORT_TESTING_stop_peer(tth, p2);
+        p2 = NULL;
+        ok = 1;
+        GNUNET_SCHEDULER_add_now (&end, NULL );
+      }
     }
     else if (0
         == strcmp (test_name, "test_transport_blacklisting_inbound_bl_full"))
     {
+      char * cfg_p1 = "test_transport_blacklisting_cfg_peer1.conf";
+      char * cfg_p2 = "test_transport_blacklisting_cfg_blp_peer2_full.conf";
+
       p1 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
-          "test_transport_blacklisting_cfg_peer1.conf", 1, NULL, NULL, NULL,
+          cfg_p1, 1, NULL, NULL, NULL,
           &start_cb, NULL );
 
       p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
-          "test_transport_blacklisting_cfg_blp_peer2_full.conf", 2, NULL, NULL,
+          cfg_p2, 2, NULL, NULL,
           NULL, &start_cb, NULL );
+
+      /* check if configuration contain correct blacklist entries */
+      if ((GNUNET_SYSERR == check_blacklist_config (cfg_p2, &p2->id, &p1->id)) )
+      {
+        GNUNET_TRANSPORT_TESTING_stop_peer(tth, p1);
+        p1 = NULL;
+        GNUNET_TRANSPORT_TESTING_stop_peer(tth, p2);
+        p2 = NULL;
+        ok = 1;
+        GNUNET_SCHEDULER_add_now (&end, NULL );
+      }
     }
     else if (0
         == strcmp (test_name, "test_transport_blacklisting_inbound_bl_plugin"))
     {
+      char * cfg_p1 = "test_transport_blacklisting_cfg_peer1.conf";
+      char * cfg_p2 = "test_transport_blacklisting_cfg_blp_peer2_plugin.conf";
+
       p1 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
-          "test_transport_blacklisting_cfg_peer1.conf", 1, NULL, NULL, NULL,
+          cfg_p1, 1, NULL, NULL, NULL,
           &start_cb, NULL );
 
       p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
-          "test_transport_blacklisting_cfg_blp_peer2_plugin.conf", 2, NULL,
-          NULL, NULL, &start_cb, NULL );
+          cfg_p2, 2, NULL, NULL,
+          NULL, &start_cb, NULL );
+
+      /* check if configuration contain correct blacklist entries */
+      if ((GNUNET_SYSERR == check_blacklist_config (cfg_p2, &p2->id, &p1->id)) )
+      {
+        GNUNET_TRANSPORT_TESTING_stop_peer(tth, p1);
+        p1 = NULL;
+        GNUNET_TRANSPORT_TESTING_stop_peer(tth, p2);
+        p2 = NULL;
+        ok = 1;
+        GNUNET_SCHEDULER_add_now (&end, NULL );
+      }
+
     }
     else if (0
         == strcmp (test_name, "test_transport_blacklisting_multiple_plugins"))
     {
+      char * cfg_p1 = "test_transport_blacklisting_cfg_blp_peer1_multiple_plugins.conf";
+      char * cfg_p2 = "test_transport_blacklisting_cfg_blp_peer2_multiple_plugins.conf";
+
       p1 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
-          "test_transport_blacklisting_cfg_blp_peer1_multiple_plugins.conf", 1,
+          cfg_p1, 1,
           NULL, NULL, NULL, &start_cb, NULL );
 
       p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth,
-          "test_transport_blacklisting_cfg_blp_peer2_multiple_plugins.conf", 2,
+          cfg_p2, 2,
           NULL, NULL, NULL, &start_cb, NULL );
+
+      /* check if configuration contain correct blacklist entries */
+      if ((GNUNET_SYSERR == check_blacklist_config (cfg_p1, &p1->id, &p2->id)) ||
+          (GNUNET_SYSERR == check_blacklist_config (cfg_p2, &p2->id, &p1->id)))
+      {
+        GNUNET_TRANSPORT_TESTING_stop_peer(tth, p1);
+        p1 = NULL;
+        GNUNET_TRANSPORT_TESTING_stop_peer(tth, p2);
+        p2 = NULL;
+        ok = 1;
+        GNUNET_SCHEDULER_add_now (&end, NULL );
+      }
     }
     else
     {
@@ -306,8 +436,7 @@ run_stage(void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
       (GNUNET_YES == connected) ? "CONNECTED" : "NOT CONNECTED");
 
   if ((0 == strcmp (test_name, "test_transport_blacklisting_no_bl"))
-      || (0
-          == strcmp (test_name, "test_transport_blacklisting_multiple_plugins")))
+      || (0 == strcmp (test_name, "test_transport_blacklisting_multiple_plugins")))
   {
     if ((GNUNET_NO != started) && (GNUNET_YES == connected))
       ok = 0;