-simplify logic
[oweals/gnunet.git] / src / transport / test_transport_address_switch.c
index b5e42352e64ebfcbd2e3c951b4ed0d7e4ee4099f..73047f89c22926d103fc40be3d4f1af3e41a5bee 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
  * @file transport/test_transport_address_switch.c
  * @brief base test case for transport implementations
  *
- * This test case tests if peers can successfully switch address when connected
- * connected by monitoring statistic values
+ * This test case tests if peers can successfully switch addresses when
+ * connected for plugins supporting multiple addresses by monitoring transport's
+ * statistic values.
+ *
+ * This test starts 2 peers and connects them. When connected test messages
+ * are transmitted from peer 2 to peer 1. The test monitors transport's
+ * statistics values for information about address switch attempts.
+ *
+ * The test passes with success if one of the peers could successfully switch
+ * addresses in connected state and a test message was successfully transmitted
+ * after this switch.
+ *
+ * Since it is not possible to trigger an address switch from
+ * outside, the test still passes when no address switching attempt takes
+ * place. It fails if an address switch attempt fails.
  */
 #include "platform.h"
 #include "gnunet_transport_service.h"
@@ -38,7 +51,7 @@ GNUNET_NETWORK_STRUCT_BEGIN
 struct TestMessage
 {
   struct GNUNET_MessageHeader header;
-  uint32_t num;
+  uint32_t num GNUNET_PACKED;
 };
 GNUNET_NETWORK_STRUCT_END
 
@@ -63,7 +76,7 @@ GNUNET_NETWORK_STRUCT_END
 #define TIMEOUT_TRANSMIT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 60)
 
 #define DURATION GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30)
-#define DELAY GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5)
+
 
 /**
  * Timeout task to send messages
@@ -79,21 +92,21 @@ static struct GNUNET_SCHEDULER_Task *delayed_end_task;
 static struct GNUNET_SCHEDULER_Task *measure_task;
 
 
-struct PeerContext *p1;
-char *cfg_file_p1;
-struct GNUNET_STATISTICS_Handle *p1_stat;
+static struct PeerContext *p1;
+static char *cfg_file_p1;
+static struct GNUNET_STATISTICS_Handle *p1_stat;
 
-struct PeerContext *p2;
-char *cfg_file_p2;
-struct GNUNET_STATISTICS_Handle *p2_stat;
+static struct PeerContext *p2;
+static char *cfg_file_p2;
+static struct GNUNET_STATISTICS_Handle *p2_stat;
 
-struct PeerContext *sender;
+static struct PeerContext *sender;
 
-struct PeerContext *receiver;
+static struct PeerContext *receiver;
 
-struct GNUNET_TRANSPORT_TransmitHandle *th;
+static struct GNUNET_TRANSPORT_TransmitHandle *th;
 
-struct GNUNET_TRANSPORT_TESTING_handle *tth;
+static struct GNUNET_TRANSPORT_TESTING_handle *tth;
 
 static GNUNET_TRANSPORT_TESTING_ConnectRequest cc;
 
@@ -127,9 +140,6 @@ static unsigned int p2_addresses_avail;
 static unsigned long long bytes_sent_after_switch;
 static unsigned long long bytes_recv_after_switch;
 
-/*
- * END Testcase specific declarations
- */
 
 #if VERBOSE
 #define OKPP do { ok++; FPRINTF (stderr, "Now at stage %u at %s:%u\n", ok, __FILE__, __LINE__); } while (0)
@@ -137,21 +147,23 @@ static unsigned long long bytes_recv_after_switch;
 #define OKPP do { ok++; } while (0)
 #endif
 
-static void end ();
 
 static int
-stat_start_attempt_cb (void *cls, const char *subsystem, const char *name,
-    uint64_t value, int is_persistent)
+stat_start_attempt_cb (void *cls,
+                       const char *subsystem,
+                       const char *name,
+                       uint64_t value,
+                       int is_persistent)
 {
   if (cls == p1)
   {
     p1_switch_attempts++;
-    FPRINTF (stderr, "(1:s)");
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "(1:s)");
   }
   else if (cls == p2)
   {
     p2_switch_attempts++;
-    FPRINTF (stderr, "(2:s)");
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "(2:s)");
   }
 
   bytes_recv_after_switch = 0;
@@ -162,18 +174,21 @@ stat_start_attempt_cb (void *cls, const char *subsystem, const char *name,
 
 
 static int
-stat_success_attempt_cb (void *cls, const char *subsystem, const char *name,
-    uint64_t value, int is_persistent)
+stat_success_attempt_cb (void *cls,
+                         const char *subsystem,
+                         const char *name,
+                         uint64_t value,
+                         int is_persistent)
 {
   if (cls == p1)
   {
     p1_switch_success++;
-    FPRINTF (stderr, "(1:+)");
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "(1:+)");
   }
   if (cls == p2)
   {
     p2_switch_success++;
-    FPRINTF (stderr, "(2:+)");
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "(2:+)");
   }
 
   return GNUNET_OK;
@@ -181,8 +196,11 @@ stat_success_attempt_cb (void *cls, const char *subsystem, const char *name,
 
 
 static int
-stat_fail_attempt_cb (void *cls, const char *subsystem, const char *name,
-    uint64_t value, int is_persistent)
+stat_fail_attempt_cb (void *cls,
+                      const char *subsystem,
+                      const char *name,
+                      uint64_t value,
+                      int is_persistent)
 {
   if (value == 0)
     return GNUNET_OK;
@@ -190,20 +208,24 @@ stat_fail_attempt_cb (void *cls, const char *subsystem, const char *name,
   if (cls == p1)
   {
     p1_switch_fail++;
-    FPRINTF (stderr, "(1:-)");
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "(1:-)");
   }
   if (cls == p2)
   {
     p2_switch_fail++;
-    FPRINTF (stderr, "(2:-)");
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "(2:-)");
   }
 
   return GNUNET_OK;
 }
 
+
 static int
-stat_addresses_available (void *cls, const char *subsystem, const char *name,
-    uint64_t value, int is_persistent)
+stat_addresses_available (void *cls,
+                          const char *subsystem,
+                          const char *name,
+                          uint64_t value,
+                          int is_persistent)
 {
   if (cls == p1)
   {
@@ -213,26 +235,26 @@ stat_addresses_available (void *cls, const char *subsystem, const char *name,
   {
     p2_addresses_avail++;
   }
-
   return GNUNET_OK;
 }
 
+
 static void
 clean_up ()
 {
-  if (measure_task != NULL )
+  if (measure_task != NULL)
   {
     GNUNET_SCHEDULER_cancel (measure_task);
     measure_task = NULL;
   }
 
-  if (delayed_end_task != NULL )
+  if (delayed_end_task != NULL)
   {
     GNUNET_SCHEDULER_cancel (delayed_end_task);
     delayed_end_task = NULL;
   }
 
-  if (die_task != NULL )
+  if (die_task != NULL)
   {
     GNUNET_SCHEDULER_cancel (die_task);
     die_task = NULL;
@@ -283,27 +305,26 @@ clean_up ()
     p2_stat = NULL;
   }
 
-  if (th != NULL )
+  if (th != NULL)
   {
     GNUNET_TRANSPORT_notify_transmit_ready_cancel (th);
     th = NULL;
   }
-  if (cc != NULL )
+  if (cc != NULL)
   {
     GNUNET_TRANSPORT_TESTING_connect_peers_cancel (tth, cc);
     cc = NULL;
   }
-  if (p1 != NULL )
+  if (p1 != NULL)
   {
     GNUNET_TRANSPORT_TESTING_stop_peer (tth, p1);
     p1 = NULL;
   }
-  if (p2 != NULL )
+  if (p2 != NULL)
   {
     GNUNET_TRANSPORT_TESTING_stop_peer (tth, p2);
     p2 = NULL;
   }
-
 }
 
 
@@ -311,14 +332,19 @@ static void
 end ()
 {
   int result = 0;
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Stopping peers\n");
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Stopping peers\n");
 
   delayed_end_task = NULL;
   FPRINTF (stderr, "\n");
   if (p1_switch_attempts > 0)
   {
-    FPRINTF (stderr, "Peer 1 tried %u times to switch and succeeded %u times, failed %u times\n",
-        p1_switch_attempts, p1_switch_success, p1_switch_fail);
+    FPRINTF (stderr,
+             "Peer 1 tried %u times to switch and succeeded %u times, failed %u times\n",
+             p1_switch_attempts,
+             p1_switch_success,
+             p1_switch_fail);
     if (p1_switch_success != p1_switch_attempts)
     {
       GNUNET_break (0);
@@ -327,23 +353,28 @@ end ()
   }
   else if (p1_addresses_avail > 1)
   {
-    FPRINTF (stderr, "Peer 1 had %u addresses available, but did not try to switch\n",
-        p1_addresses_avail);
+    FPRINTF (stderr,
+             "Peer 1 had %u addresses available, but did not try to switch\n",
+             p1_addresses_avail);
   }
   if (p2_switch_attempts > 0)
   {
-    FPRINTF (stderr, "Peer 2 tried %u times to switch and succeeded %u times, failed %u times\n",
-        p2_switch_attempts, p2_switch_success, p2_switch_fail);
+    FPRINTF (stderr,
+             "Peer 2 tried %u times to switch and succeeded %u times, failed %u times\n",
+             p2_switch_attempts,
+             p2_switch_success,
+             p2_switch_fail);
     if (p2_switch_success != p2_switch_attempts)
     {
       GNUNET_break (0);
-      result ++;
+      result++;
     }
   }
   else if (p2_addresses_avail > 1)
   {
-    FPRINTF (stderr, "Peer 2 had %u addresses available, but did not try to switch\n",
-        p2_addresses_avail);
+    FPRINTF (stderr,
+             "Peer 2 had %u addresses available, but did not try to switch\n",
+             p2_addresses_avail);
   }
 
   if ( ((p1_switch_attempts > 0) || (p2_switch_attempts > 0)) &&
@@ -351,14 +382,14 @@ end ()
   {
     FPRINTF (stderr, "No data sent after switching!\n");
     GNUNET_break (0);
-    res ++;
+    res++;
   }
   if ( ((p1_switch_attempts > 0) || (p2_switch_attempts > 0)) &&
        (bytes_recv_after_switch == 0) )
   {
     FPRINTF (stderr, "No data received after switching!\n");
     GNUNET_break (0);
-    res ++;
+    res++;
   }
 
   clean_up();
@@ -371,22 +402,32 @@ static void
 end_badly ()
 {
   die_task = NULL;
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Fail! Stopping peers\n");
-
+  clean_up();
+  if (0 == p1_switch_attempts + p2_switch_attempts)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Test did not work, as peers didn't switch (flawed testcase)!\n");
+    res = 0;
+  }
+  else
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+              "Fail (timeout)! No transmission after switch! Stopping peers\n");
+    res = GNUNET_YES;
+  }
   if (test_connected == GNUNET_YES)
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Peers got connected\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Peers got connected\n");
   else
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Peers got NOT connected\n");
-
-  clean_up();
-
-  res = GNUNET_YES;
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Peers got NOT EVEN connected\n");
 }
 
 
 static void
-notify_receive (void *cls, const struct GNUNET_PeerIdentity *peer,
-    const struct GNUNET_MessageHeader *message)
+notify_receive (void *cls,
+                const struct GNUNET_PeerIdentity *peer,
+                const struct GNUNET_MessageHeader *message)
 {
   const struct TestMessage *hdr;
 
@@ -397,24 +438,24 @@ notify_receive (void *cls, const struct GNUNET_PeerIdentity *peer,
   struct PeerContext *p = cls;
   char *ps = GNUNET_strdup (GNUNET_i2s (&p->id));
 
-  GNUNET_log(GNUNET_ERROR_TYPE_INFO,
-      "Peer %u (`%s') got message %u of size %u from peer (`%s')\n", p->no, ps,
-      ntohl (hdr->num), ntohs (message->size), GNUNET_i2s (peer));
-
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Peer %u (`%s') got message %u of size %u from peer (`%s')\n", p->no, ps,
+              ntohl (hdr->num),
+              ntohs (message->size),
+              GNUNET_i2s (peer));
   if ( ((p1_switch_attempts >= 1) || (p2_switch_attempts >= 1)) &&
         (p1_switch_attempts == p1_switch_fail + p1_switch_success) &&
         (p2_switch_attempts == p2_switch_fail + p2_switch_success) )
   {
-      bytes_recv_after_switch += ntohs(hdr->header.size);
-      if ((bytes_sent_after_switch > 0) && (bytes_recv_after_switch > 0))
-      {
-        /* A peer switched addresses and sent and received data after the
-         * switch operations */
-        end ();
-      }
+    bytes_recv_after_switch += ntohs(hdr->header.size);
+    if ((bytes_sent_after_switch > 0) && (bytes_recv_after_switch > 0))
+    {
+      /* A peer switched addresses and sent and received data after the
+       * switch operations */
+      end ();
+    }
   }
 
-
   GNUNET_free(ps);
 }
 
@@ -422,18 +463,18 @@ notify_receive (void *cls, const struct GNUNET_PeerIdentity *peer,
 static size_t
 notify_ready (void *cls, size_t size, void *buf)
 {
+  static uint32_t counter;
   char *cbuf = buf;
   struct TestMessage hdr;
-  unsigned int ret;
 
   th = NULL;
-  if (buf == NULL )
+  if (buf == NULL)
   {
-    GNUNET_log(GNUNET_ERROR_TYPE_ERROR,
-        "Timeout occurred while waiting for transmit_ready for message\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+               "Timeout occurred while waiting for transmit_ready for message\n");
     if (NULL != die_task)
       GNUNET_SCHEDULER_cancel (die_task);
-    die_task = GNUNET_SCHEDULER_add_now (&end_badly, NULL );
+    die_task = GNUNET_SCHEDULER_add_now (&end_badly, NULL);
     res = 1;
     return 0;
   }
@@ -444,69 +485,90 @@ notify_ready (void *cls, size_t size, void *buf)
 
   hdr.header.size = htons (MSIZE);
   hdr.header.type = htons (MTYPE);
-  hdr.num = htonl (0);
+  hdr.num = htonl (counter++);
   memcpy (&cbuf[0], &hdr, sizeof(struct TestMessage));
-  ret += sizeof(struct TestMessage);
   memset (&cbuf[sizeof(struct TestMessage)], '0', MSIZE - sizeof(struct TestMessage));
-  ret = MSIZE;
 
-#if VERBOSE
   char *receiver_s = GNUNET_strdup (GNUNET_i2s (&receiver->id));
-  GNUNET_log(GNUNET_ERROR_TYPE_INFO,
-      "Sending message %u of size %u from peer %u (`%4s') -> peer %u (`%s') !\n",
-      n, s, sender->no, GNUNET_i2s (&sender->id), receiver->no, receiver_s);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Sending message %u of size %u from peer %u (`%4s') -> peer %u (`%s') !\n",
+              (unsigned int) (counter - 1),
+              MSIZE,
+              sender->no,
+              GNUNET_i2s (&sender->id),
+              receiver->no,
+              receiver_s);
   GNUNET_free(receiver_s);
-#endif
 
-  if (th == NULL )
-    th = GNUNET_TRANSPORT_notify_transmit_ready (p2->th, &p1->id, MSIZE,
-        TIMEOUT_TRANSMIT, &notify_ready, NULL );
+  if (th == NULL)
+    th = GNUNET_TRANSPORT_notify_transmit_ready (p2->th,
+                                                 &p1->id,
+                                                 MSIZE,
+                                                 TIMEOUT_TRANSMIT,
+                                                 &notify_ready, NULL);
 
   if ( ((p1_switch_attempts >= 1) || (p2_switch_attempts >= 1)) &&
         (p1_switch_attempts == p1_switch_fail + p1_switch_success) &&
         (p2_switch_attempts == p2_switch_fail + p2_switch_success) )
   {
-    bytes_sent_after_switch += ret;
+    bytes_sent_after_switch += MSIZE;
   }
-
-  return ret;
+  return MSIZE;
 }
 
 
 static void
-notify_connect (void *cls, const struct GNUNET_PeerIdentity *peer)
+notify_connect (void *cls,
+                const struct GNUNET_PeerIdentity *peer)
 {
   struct PeerContext *p = cls;
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Peer %u (`%4s') connected to us!\n",
-      p->no, GNUNET_i2s (peer));
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Peer %u (`%4s') connected to us!\n",
+              p->no,
+              GNUNET_i2s (peer));
 }
 
 
 static void
-notify_disconnect (void *cls, const struct GNUNET_PeerIdentity *peer)
+notify_disconnect (void *cls,
+                   const struct GNUNET_PeerIdentity *peer)
 {
   struct PeerContext *p = cls;
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Peer %u (`%4s') disconnected!\n", p->no,
-      GNUNET_i2s (peer));
-  if (th != NULL )
-    GNUNET_TRANSPORT_notify_transmit_ready_cancel (th);
-  th = NULL;
 
+  if (NULL != p1)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Peer %u (`%4s') disconnected early!\n",
+                p->no,
+                GNUNET_i2s (peer));
+    GNUNET_SCHEDULER_shutdown ();
+  }
+  if (NULL != th)
+  {
+    GNUNET_TRANSPORT_notify_transmit_ready_cancel (th);
+    th = NULL;
+  }
 }
 
 
 static void
 sendtask ()
 {
-  th = GNUNET_TRANSPORT_notify_transmit_ready (p2->th, &p1->id, MSIZE,
-      TIMEOUT_TRANSMIT, &notify_ready, NULL );
+  /* Transmit test messages */
+  th = GNUNET_TRANSPORT_notify_transmit_ready (p2->th,
+                                               &p1->id, MSIZE,
+                                               TIMEOUT_TRANSMIT,
+                                               &notify_ready, NULL);
 }
 
 
 static void
-progress_indicator (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
+progress_indicator (void *cls,
+                    const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
   static int counter;
+
   measure_task = NULL;
   counter++;
   if ((DURATION.rel_value_us / 1000 / 1000LL) < counter)
@@ -517,28 +579,36 @@ progress_indicator (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
   {
     FPRINTF (stderr, "%s", ".");
     measure_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
-        &progress_indicator, NULL );
+                                                 &progress_indicator, NULL);
   }
 }
 
 
 static void
-testing_connect_cb (struct PeerContext *p1, struct PeerContext *p2, void *cls)
+testing_connect_cb (struct PeerContext *p1,
+                    struct PeerContext *p2,
+                    void *cls)
 {
   char *p1_c = GNUNET_strdup (GNUNET_i2s (&p1->id));
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Peers connected: %u (%s) <-> %u (%s)\n",
-      p1->no, p1_c, p2->no, GNUNET_i2s (&p2->id));
-  GNUNET_free(p1_c);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Peers connected: %u (%s) <-> %u (%s)\n",
+              p1->no, p1_c, p2->no,
+              GNUNET_i2s (&p2->id));
+  GNUNET_free (p1_c);
 
   cc = NULL;
   test_connected = GNUNET_YES;
 
-  FPRINTF (stderr, "(i:s/+/-) \t i == peer 1/2, s/+/- : switch attempt/switch ok/switch fail\n");
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "(i:s/+/-) \t i == peer 1/2, s/+/- : switch attempt/switch ok/switch fail\n");
 
+  /* Show progress */
   measure_task = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_UNIT_SECONDS,
-      &progress_indicator, NULL );
- GNUNET_SCHEDULER_add_now (&sendtask, NULL );
+                                               &progress_indicator,
+                                               NULL);
+  /* Peers are connected, start transmit test messages */
+  GNUNET_SCHEDULER_add_now (&sendtask, NULL);
 }
 
 
@@ -548,8 +618,10 @@ start_cb (struct PeerContext *p, void *cls)
   static int started;
   started++;
 
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Peer %u (`%s') started\n", p->no,
-      GNUNET_i2s (&p->id));
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Peer %u (`%s') started\n",
+              p->no,
+              GNUNET_i2s (&p->id));
   if (started != 2)
     return;
 
@@ -558,33 +630,39 @@ start_cb (struct PeerContext *p, void *cls)
   receiver = p1;
 
   char *sender_c = GNUNET_strdup (GNUNET_i2s (&sender->id));
-  GNUNET_log(GNUNET_ERROR_TYPE_DEBUG,
-      "Test tries to send from %u (%s) -> peer %u (%s)\n", sender->no, sender_c,
-      receiver->no, GNUNET_i2s (&receiver->id));
-  GNUNET_free(sender_c);
-  cc = GNUNET_TRANSPORT_TESTING_connect_peers (tth, p1, p2, &testing_connect_cb,
-      NULL );
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Test tries to send from %u (%s) -> peer %u (%s)\n",
+              sender->no,
+              sender_c,
+              receiver->no,
+              GNUNET_i2s (&receiver->id));
+  GNUNET_free (sender_c);
+
+  /* Connect the peers */
+  cc = GNUNET_TRANSPORT_TESTING_connect_peers (tth, p1, p2,
+                                               &testing_connect_cb,
+                                               NULL);
 }
 
 
 static void
-run (void *cls, char * const *args, const char *cfgfile,
-    const struct GNUNET_CONFIGURATION_Handle *cfg)
+run (void *cls,
+     char * const *args,
+     const char *cfgfile,
+     const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
-  die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL );
+  die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL);
 
   p1 = GNUNET_TRANSPORT_TESTING_start_peer (tth, cfg_file_p1, 1,
-      &notify_receive, &notify_connect, &notify_disconnect, &start_cb, NULL );
+      &notify_receive, &notify_connect, &notify_disconnect, &start_cb, NULL);
 
   p2 = GNUNET_TRANSPORT_TESTING_start_peer (tth, cfg_file_p2, 2,
-      &notify_receive, &notify_connect, &notify_disconnect, &start_cb, NULL );
+      &notify_receive, &notify_connect, &notify_disconnect, &start_cb, NULL);
 
   if ((p1 == NULL )|| (p2 == NULL))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Fail! Could not start peers!\n");
-    if (die_task != NULL)
-    GNUNET_SCHEDULER_cancel (die_task);
-    die_task = GNUNET_SCHEDULER_add_now (&end_badly, NULL);
+    GNUNET_SCHEDULER_shutdown ();
     return;
   }
 
@@ -632,10 +710,9 @@ run (void *cls, char * const *args, const char *cfgfile,
 
   if ((p1_stat == NULL )|| (p2_stat == NULL))
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Fail! Could not create statistics for peers!\n");
-    if (die_task != NULL)
-    GNUNET_SCHEDULER_cancel (die_task);
-    die_task = GNUNET_SCHEDULER_add_now (&end_badly, NULL);
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Fail! Could not create statistics for peers!\n");
+    GNUNET_SCHEDULER_shutdown ();
     return;
   }
 }