Check that you are not present in trail twice
[oweals/gnunet.git] / src / transport / transport-testing.c
index 87ce704232d9b43680561473d393be72b5b21944..d25d3f4b7b34f59dcdf1d0e0512dbd5d69bbbefb 100644 (file)
@@ -4,7 +4,7 @@
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
  *
  * @author Matthias Wachs
  */
-
 #include "transport-testing.h"
 
 
+#define LOG(kind,...) GNUNET_log_from(kind, "transport-testing", __VA_ARGS__)
+
+
 static struct PeerContext *
 find_peer_context (struct GNUNET_TRANSPORT_TESTING_handle *tth,
                    const struct GNUNET_PeerIdentity *peer)
@@ -67,30 +69,27 @@ find_connecting_context (struct GNUNET_TRANSPORT_TESTING_handle *tth,
 
 
 static void
-notify_connect (void *cls, const struct GNUNET_PeerIdentity *peer,
-                const struct GNUNET_ATS_Information *ats, uint32_t ats_count)
+notify_connect (void *cls, const struct GNUNET_PeerIdentity *peer)
 {
   struct PeerContext *p = cls;
+  char *p2_s;
+  struct PeerContext *p2;
 
-  /* Find PeerContext */
-  GNUNET_assert (p != 0);
-  GNUNET_assert (p->tth != NULL);
-  struct PeerContext *p2 = find_peer_context (p->tth, peer);
-
-  if (p == NULL)
-    return;
+  GNUNET_assert (NULL != p);
+  GNUNET_assert (NULL != p->tth);
+  p2 = find_peer_context (p->tth, peer);
   if (p->nc != NULL)
-    p->nc (p->cb_cls, peer, ats, ats_count);
-
-  char *p2_s;
+    p->nc (p->cb_cls, peer);
 
   if (p2 != NULL)
     GNUNET_asprintf (&p2_s, "%u (`%s')", p2->no, GNUNET_i2s (&p2->id));
   else
     GNUNET_asprintf (&p2_s, "`%s'", GNUNET_i2s (peer));
-  GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
-                   "Peers %s connected to peer %u (`%s')\n", p2_s, p->no,
-                   GNUNET_i2s (&p->id));
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Peers %s connected to peer %u (`%s')\n",
+       p2_s,
+       p->no,
+       GNUNET_i2s (&p->id));
   GNUNET_free (p2_s);
 
   /* Find ConnectingContext */
@@ -135,9 +134,11 @@ notify_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer)
     GNUNET_asprintf (&p2_s, "%u (`%s')", p2->no, GNUNET_i2s (&p2->id));
   else
     GNUNET_asprintf (&p2_s, "`%s'", GNUNET_i2s (peer));
-  GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
-                   "Peers %s disconnected from peer %u (`%s')\n", p2_s, no,
-                   GNUNET_i2s (&p->id));
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Peers %s disconnected from peer %u (`%s')\n",
+       p2_s,
+       no,
+       GNUNET_i2s (&p->id));
   GNUNET_free (p2_s);
 
   if (p == NULL)
@@ -149,15 +150,14 @@ notify_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer)
 
 static void
 notify_receive (void *cls, const struct GNUNET_PeerIdentity *peer,
-                const struct GNUNET_MessageHeader *message,
-                const struct GNUNET_ATS_Information *ats, uint32_t ats_count)
+                const struct GNUNET_MessageHeader *message)
 {
   struct PeerContext *p = cls;
 
   if (p == NULL)
     return;
   if (p->rec != NULL)
-    p->rec (p->cb_cls, peer, message, ats, ats_count);
+    p->rec (p->cb_cls, peer, message);
 }
 
 
@@ -177,9 +177,9 @@ get_hello (void *cb_cls, const struct GNUNET_MessageHeader *message)
 
   if (NULL != p->start_cb)
   {
-    GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
-                     "Peer %u (`%s') successfully started\n", p->no,
-                     GNUNET_i2s (&p->id));
+    LOG (GNUNET_ERROR_TYPE_DEBUG,
+         "Peer %u (`%s') successfully started\n", p->no,
+         GNUNET_i2s (&p->id));
     p->start_cb (p, p->cb_cls);
     p->start_cb = NULL;
   }
@@ -203,16 +203,16 @@ try_connect (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 
   char *p2_s = GNUNET_strdup (GNUNET_i2s (&p2->id));
 
-  GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
-                   "Asking peer %u (`%s') to connect peer %u (`%s'), providing HELLO with %u bytes\n",
-                   p1->no, GNUNET_i2s (&p1->id), p2->no, p2_s,
-                   GNUNET_HELLO_size (cc->p2->hello));
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Asking peer %u (`%s') to connect peer %u (`%s'), providing HELLO with %u bytes\n",
+       p1->no, GNUNET_i2s (&p1->id), p2->no, p2_s,
+       GNUNET_HELLO_size (cc->p2->hello));
   GNUNET_free (p2_s);
 
   GNUNET_TRANSPORT_offer_hello (cc->th_p1,
                                 (const struct GNUNET_MessageHeader *) cc->
                                 p2->hello, NULL, NULL);
-  GNUNET_TRANSPORT_try_connect (cc->th_p1, &p2->id);
+  GNUNET_TRANSPORT_try_connect (cc->th_p1, &p2->id, NULL, NULL); /*FIXME TRY_CONNECT change */
 
   cc->tct =
       GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS, &try_connect, cc);
@@ -248,23 +248,24 @@ GNUNET_TRANSPORT_TESTING_start_peer (struct GNUNET_TRANSPORT_TESTING_handle *tth
 
   if (GNUNET_DISK_file_test (cfgname) == GNUNET_NO)
   {
-    GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing",
-                     "File not found: `%s' \n", cfgname);
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         "File not found: `%s'\n",
+         cfgname);
     return NULL;
   }
 
-  struct PeerContext *p = GNUNET_malloc (sizeof (struct PeerContext));
+  struct PeerContext *p = GNUNET_new (struct PeerContext);
   GNUNET_CONTAINER_DLL_insert (tth->p_head, tth->p_tail, p);
 
   /* Create configuration and call testing lib to modify it */
   p->cfg = GNUNET_CONFIGURATION_create ();
-  GNUNET_assert (GNUNET_OK == GNUNET_CONFIGURATION_load (p->cfg, cfgname));
-
+  GNUNET_assert (GNUNET_OK ==
+                 GNUNET_CONFIGURATION_load (p->cfg, cfgname));
   if (GNUNET_SYSERR == GNUNET_TESTING_configuration_create (tth->tl_system, p->cfg))
   {
-    GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing",
-                     "Testing library failed to create unique configuration based on `%s'\n",
-                     cfgname);
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         "Testing library failed to create unique configuration based on `%s'\n",
+         cfgname);
     GNUNET_free (p);
     return NULL;
   }
@@ -274,38 +275,40 @@ GNUNET_TRANSPORT_TESTING_start_peer (struct GNUNET_TRANSPORT_TESTING_handle *tth
   p->peer = GNUNET_TESTING_peer_configure (tth->tl_system, p->cfg, p->no, NULL, &emsg);
   if (NULL == p->peer)
   {
-    GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing",
-                     "Testing library failed to create unique configuration based on `%s': `%s'\n",
-                     cfgname, emsg);
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         "Testing library failed to create unique configuration based on `%s': `%s'\n",
+         cfgname,
+         emsg);
     GNUNET_TRANSPORT_TESTING_stop_peer (tth, p);
+    GNUNET_free_non_null (emsg);
     return NULL;
   }
-
+  GNUNET_free_non_null (emsg);
   if (GNUNET_OK != GNUNET_TESTING_peer_start (p->peer))
   {
-    GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing",
-                     "Testing library failed to create unique configuration based on `%s'\n",
-                     cfgname);
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         "Testing library failed to create unique configuration based on `%s'\n",
+         cfgname);
     GNUNET_TRANSPORT_TESTING_stop_peer (tth, p);
     return NULL;
   }
 
   memset(&dummy, '\0', sizeof (dummy));
   GNUNET_TESTING_peer_get_identity (p->peer, &p->id);
-  if (0 == memcmp (&dummy, &p->id, sizeof (dummy)))
+  if (0 == memcmp (&dummy, &p->id, sizeof (struct GNUNET_PeerIdentity)))
   {
-    GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing",
-                     "Testing library failed to obtain peer identity for peer %u\n",
-                     p->no);
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         "Testing library failed to obtain peer identity for peer %u\n",
+         p->no);
     GNUNET_TRANSPORT_TESTING_stop_peer (tth, p);
     return NULL;
   }
   else
   {
-    GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
-                     "Peer %u configured with identity `%s'\n",
-                     p->no,
-                     GNUNET_i2s (&p->id));
+    LOG (GNUNET_ERROR_TYPE_DEBUG,
+         "Peer %u configured with identity `%s'\n",
+         p->no,
+         GNUNET_i2s_full (&p->id));
   }
 
   p->tth = tth;
@@ -323,9 +326,10 @@ GNUNET_TRANSPORT_TESTING_start_peer (struct GNUNET_TRANSPORT_TESTING_handle *tth
                                     &notify_connect, &notify_disconnect);
   if (NULL == p->th)
   {
-    GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing",
-                     "Failed to connect to transport service for peer  `%s': `%s'\n",
-                     cfgname, emsg);
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         "Failed to connect to transport service for peer  `%s': `%s'\n",
+         cfgname,
+         emsg);
     GNUNET_TRANSPORT_TESTING_stop_peer (tth, p);
     return NULL;
   }
@@ -356,12 +360,16 @@ GNUNET_TRANSPORT_TESTING_restart_peer (struct GNUNET_TRANSPORT_TESTING_handle
   GNUNET_assert (p != NULL);
   GNUNET_assert (NULL != p->peer);
 
-  GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
-                   "Restarting peer %u (`%s')\n", p->no, GNUNET_i2s (&p->id));
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Restarting peer %u (`%s')\n",
+       p->no,
+       GNUNET_i2s (&p->id));
 
   /* shutdown */
-  GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
-                   "Stopping peer %u (`%s')\n", p->no, GNUNET_i2s (&p->id));
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Stopping peer %u (`%s')\n",
+       p->no,
+       GNUNET_i2s (&p->id));
   if (NULL != p->ghh)
     GNUNET_TRANSPORT_get_hello_cancel (p->ghh);
   p->ghh = NULL;
@@ -371,19 +379,21 @@ GNUNET_TRANSPORT_TESTING_restart_peer (struct GNUNET_TRANSPORT_TESTING_handle
 
   if (GNUNET_SYSERR == GNUNET_TESTING_peer_stop(p->peer))
   {
-    GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing",
-                     "Failed to stop peer %u (`%s')\n", p->no, GNUNET_i2s (&p->id));
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         "Failed to stop peer %u (`%s')\n",
+         p->no,
+         GNUNET_i2s (&p->id));
     return GNUNET_SYSERR;
   }
 
-  sleep (5);
+  sleep (5); // YUCK!
 
   /* restart */
   if (GNUNET_SYSERR == GNUNET_TESTING_peer_start(p->peer))
   {
-    GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing",
-                     "Failed to restart peer %u (`%s')\n",
-                     p->no, GNUNET_i2s (&p->id));
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         "Failed to restart peer %u (`%s')\n",
+         p->no, GNUNET_i2s (&p->id));
     return GNUNET_SYSERR;
   }
 
@@ -429,9 +439,9 @@ GNUNET_TRANSPORT_TESTING_stop_peer (struct GNUNET_TRANSPORT_TESTING_handle *tth,
   {
     if (GNUNET_OK != GNUNET_TESTING_peer_stop (p->peer))
     {
-      GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
-                       "Testing lib failed to stop peer %u (`%s') \n", p->no,
-                       GNUNET_i2s (&p->id));
+      LOG (GNUNET_ERROR_TYPE_DEBUG,
+           "Testing lib failed to stop peer %u (`%s') \n", p->no,
+           GNUNET_i2s (&p->id));
     }
     GNUNET_TESTING_peer_destroy (p->peer);
     p->peer = NULL;
@@ -448,17 +458,17 @@ GNUNET_TRANSPORT_TESTING_stop_peer (struct GNUNET_TRANSPORT_TESTING_handle *tth,
     p->cfg = NULL;
   }
   GNUNET_CONTAINER_DLL_remove (tth->p_head, tth->p_tail, p);
-  GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
-                   "Peer %u (`%s') stopped \n", p->no,
-                   GNUNET_i2s (&p->id));
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Peer %u (`%s') stopped \n", p->no,
+       GNUNET_i2s (&p->id));
   GNUNET_free (p);
 }
 
 
 /**
- * Connect the given peers and call the callback when both peers report the
- * inbound connection. Remarks: start_peer's notify_connect callback can be called
- * before.
+ * Initiate a connection from p1 to p2 by offering p1 p2's HELLO message
+ *
+ * Remarks: start_peer's notify_connect callback can be called before.
  *
  * @param tth transport testing handle
  * @param p1 peer 1
@@ -477,7 +487,7 @@ GNUNET_TRANSPORT_TESTING_connect_peers (struct GNUNET_TRANSPORT_TESTING_handle *
   GNUNET_assert (tth != NULL);
 
   struct ConnectingContext *cc =
-      GNUNET_malloc (sizeof (struct ConnectingContext));
+      GNUNET_new (struct ConnectingContext);
 
   GNUNET_assert (p1 != NULL);
   GNUNET_assert (p2 != NULL);
@@ -494,8 +504,9 @@ GNUNET_TRANSPORT_TESTING_connect_peers (struct GNUNET_TRANSPORT_TESTING_handle *
   GNUNET_assert (cc->th_p2 != NULL);
   GNUNET_CONTAINER_DLL_insert (tth->cc_head, tth->cc_tail, cc);
   cc->tct = GNUNET_SCHEDULER_add_now (&try_connect, cc);
-  GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
-                   "New connect request %p\n", cc);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "New connect request %p\n",
+       cc);
 
   return cc;
 }
@@ -519,8 +530,9 @@ GNUNET_TRANSPORT_TESTING_connect_peers_cancel (struct
 
   GNUNET_assert (tth != NULL);
 
-  GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, "transport-testing",
-                   "Canceling connect request %p!\n", cc);
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Canceling connect request %p!\n",
+       cc);
 
   if (cc->tct != GNUNET_SCHEDULER_NO_TASK)
     GNUNET_SCHEDULER_cancel (cc->tct);
@@ -548,8 +560,9 @@ GNUNET_TRANSPORT_TESTING_done (struct GNUNET_TRANSPORT_TESTING_handle *tth)
   while (cc != tth->cc_tail)
   {
     ct = cc->next;
-    GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing",
-                     "Developer forgot to cancel connect request %p!\n", cc);
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         "Developer forgot to cancel connect request %p!\n",
+         cc);
     GNUNET_TRANSPORT_TESTING_connect_peers_cancel (tth, cc);
     cc = ct;
   }
@@ -557,8 +570,8 @@ GNUNET_TRANSPORT_TESTING_done (struct GNUNET_TRANSPORT_TESTING_handle *tth)
   while (p != NULL)
   {
     t = p->next;
-    GNUNET_log_from (GNUNET_ERROR_TYPE_ERROR, "transport-testing",
-                     "Developer forgot to stop peer!\n");
+    LOG (GNUNET_ERROR_TYPE_ERROR,
+         "Developer forgot to stop peer!\n");
     GNUNET_TRANSPORT_TESTING_stop_peer (tth, p);
     p = t;
   }
@@ -580,10 +593,11 @@ GNUNET_TRANSPORT_TESTING_init ()
   struct GNUNET_TRANSPORT_TESTING_handle *tth;
 
   /* prepare hostkeys */
-  tth = GNUNET_malloc (sizeof (struct GNUNET_TRANSPORT_TESTING_handle));
+  tth = GNUNET_new (struct GNUNET_TRANSPORT_TESTING_handle);
 
   /* Init testing the testing lib */
-  tth->tl_system = GNUNET_TESTING_system_create ("transport-testing", NULL);
+  tth->tl_system = GNUNET_TESTING_system_create ("transport-testing", NULL,
+                                                 NULL, NULL);
   if (NULL == tth->tl_system)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Failed to initialize testing library!\n"));
@@ -611,7 +625,25 @@ extract_filename (const char *file)
   char *backup = pch;
   char *filename = NULL;
   char *res;
-
+#if WINDOWS
+  if ((strlen (pch) >= 3) && pch[1] == ':')
+  {
+    if (NULL != strstr (pch, "\\"))
+    {
+      pch = strtok (pch, "\\");
+      while (pch != NULL)
+      {
+        pch = strtok (NULL, "\\");
+        if (pch != NULL)
+          filename = pch;
+      }
+    }
+  }
+  if (filename != NULL)
+    pch = filename; /* If we miss the next condition, filename = pch will
+                     * not harm us.
+                     */
+#endif
   if (NULL != strstr (pch, "/"))
   {
     pch = strtok (pch, "/");
@@ -769,5 +801,4 @@ fail:
 }
 
 
-
 /* end of transport-testing.c */