it seems once a connection fails a few times, it will never work
[oweals/gnunet.git] / src / testing / test_testing_group_remote.c
index 6bcdb475d2a5d36286b8e6da6124eaec012b431f..5156007a65e911158e4c6baffa7c8813bde7899c 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
@@ -40,13 +40,35 @@ static int ok;
 
 static int peers_left;
 
-static struct GNUNET_TESTING_PeerGroup *pg;
+static int peers_failed;
 
-static struct GNUNET_SCHEDULER_Handle *sched;
+static struct GNUNET_TESTING_PeerGroup *pg;
 
 static unsigned long long num_peers;
 
-static char *hostnames;
+
+/**
+ * Check whether peers successfully shut down.
+ */
+void
+shutdown_callback (void *cls, const char *emsg)
+{
+  if (emsg != NULL)
+    {
+#if VERBOSE
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Shutdown of peers failed!\n");
+#endif
+      if (ok == 0)
+        ok = 666;
+    }
+  else
+    {
+#if VERBOSE
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "All peers successfully shut down!\n");
+#endif
+    }
+}
 
 
 static void
@@ -55,23 +77,40 @@ my_cb (void *cls,
        const struct GNUNET_CONFIGURATION_Handle *cfg,
        struct GNUNET_TESTING_Daemon *d, const char *emsg)
 {
-  GNUNET_assert (id != NULL);
+  if (emsg != NULL)
+    {
+      peers_failed++;
+    }
+
   peers_left--;
   if (peers_left == 0)
     {
-      GNUNET_TESTING_daemons_stop (pg, TIMEOUT);
+      GNUNET_TESTING_daemons_stop (pg, TIMEOUT, &shutdown_callback, NULL);
       ok = 0;
     }
+  else if (peers_failed == peers_left)
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                  "Too many peers failed, ending test!\n");
+      GNUNET_TESTING_daemons_stop (pg, TIMEOUT, &shutdown_callback, NULL);
+    }
 }
 
 
 static void
 run (void *cls,
-     struct GNUNET_SCHEDULER_Handle *s,
      char *const *args,
      const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg)
 {
-  sched = s;
+  struct GNUNET_TESTING_Host *hosts;
+  struct GNUNET_TESTING_Host *hostpos;
+  struct GNUNET_TESTING_Host *temphost;
+  char *hostfile;
+  struct stat frstat;
+  char *buf;
+  char *data;
+  int count;
+  int ret;
   ok = 1;
 #if VERBOSE
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting daemons.\n");
@@ -82,15 +121,103 @@ run (void *cls,
                                              &num_peers))
     num_peers = DEFAULT_NUM_PEERS;
 
-  GNUNET_CONFIGURATION_get_value_string (cfg, "testing", "hosts",
-                                         &hostnames);
+  GNUNET_assert (num_peers > 0 && num_peers < (unsigned long long) -1);
+  if (GNUNET_OK !=
+      GNUNET_CONFIGURATION_get_value_string (cfg, "testing", "hostfile",
+                                             &hostfile))
+    hostfile = NULL;
+
+  hosts = NULL;
+  data = NULL;
+  if (hostfile != NULL)
+    {
+      if (GNUNET_OK != GNUNET_DISK_file_test (hostfile))
+        GNUNET_DISK_fn_write (hostfile, NULL, 0, GNUNET_DISK_PERM_USER_READ
+                              | GNUNET_DISK_PERM_USER_WRITE);
+      if ((0 != STAT (hostfile, &frstat)) || (frstat.st_size == 0))
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Could not open file specified for host list, ending test!");
+          ok = 1119;
+          GNUNET_free (hostfile);
+          return;
+        }
+
+      data = GNUNET_malloc_large (frstat.st_size);
+      GNUNET_assert (data != NULL);
+      if (frstat.st_size !=
+          GNUNET_DISK_fn_read (hostfile, data, frstat.st_size))
+        {
+          GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                      "Could not read file %s specified for host list, ending test!",
+                      hostfile);
+          GNUNET_free (hostfile);
+          GNUNET_free (data);
+          return;
+        }
+
+      GNUNET_free_non_null (hostfile);
+
+      buf = data;
+      count = 0;
+      while (count < frstat.st_size)
+        {
+          count++;
+          if (count >= frstat.st_size)
+            break;
+
+          /* if (((data[count] == '\n') || (data[count] == '\0')) && (buf != &data[count])) */
+          if (((data[count] == '\n')) && (buf != &data[count]))
+            {
+              data[count] = '\0';
+              temphost = GNUNET_malloc (sizeof (struct GNUNET_TESTING_Host));
+              ret =
+                sscanf (buf, "%a[a-zA-Z0-9]@%a[a-zA-Z0-9.]:%hd",
+                        &temphost->username, &temphost->hostname,
+                        &temphost->port);
+              if (3 == ret)
+                {
+                  GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                              "Successfully read host %s, port %d and user %s from file\n",
+                              temphost->hostname, temphost->port,
+                              temphost->username);
+                }
+              else
+                {
+                  GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                              "Error reading line `%s' in hostfile\n", buf);
+                  GNUNET_free (temphost);
+                  buf = &data[count + 1];
+                  continue;
+                }
+              /* temphost->hostname = buf; */
+              temphost->next = hosts;
+              hosts = temphost;
+              buf = &data[count + 1];
+            }
+          else if ((data[count] == '\n') || (data[count] == '\0'))
+            buf = &data[count + 1];
+        }
+    }
 
   peers_left = num_peers;
-  pg = GNUNET_TESTING_daemons_start (sched, cfg,
+  pg = GNUNET_TESTING_daemons_start (cfg,
                                      peers_left,
                                      TIMEOUT,
-                                     &my_cb, NULL, NULL, NULL, hostnames);
+                                     NULL,
+                                     NULL, &my_cb, NULL, NULL, NULL, hosts);
+  hostpos = hosts;
+  while (hostpos != NULL)
+    {
+      temphost = hostpos->next;
+      GNUNET_free (hostpos->hostname);
+      GNUNET_free (hostpos->username);
+      GNUNET_free (hostpos);
+      hostpos = temphost;
+    }
+  GNUNET_free_non_null (data);
   GNUNET_assert (pg != NULL);
+
 }
 
 static int