-fixfix
[oweals/gnunet.git] / src / peerinfo / test_peerinfo_api.c
index 3091a6491d54916ff991f405e6ddebac382ed557..e4eb7d4805de30a2a3adaa033679f46539ddc64e 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
 
      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
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
 #include "gnunet_peerinfo_service.h"
 #include "gnunet_program_lib.h"
 #include "gnunet_time_lib.h"
 #include "gnunet_peerinfo_service.h"
 #include "gnunet_program_lib.h"
 #include "gnunet_time_lib.h"
+#include "peerinfo.h"
 
 
+static const struct GNUNET_CONFIGURATION_Handle *cfg;
 
 
-static int
-check_it (void *cls,
-          const char *tname,
-          struct GNUNET_TIME_Absolute expiration,
-          const void *addr, size_t addrlen)
-{
-  unsigned int *agc = cls;
+static struct GNUNET_PEERINFO_IteratorContext *ic;
 
 
-  if (addrlen > 0)
-    {
-      GNUNET_assert (0 == strcmp ("peerinfotest", tname));
-      GNUNET_assert (0 == strncmp ("Address", addr, addrlen));
-      (*agc) -= (1 << (addrlen - 1));
-    }
-  return GNUNET_OK;
-}
+static struct GNUNET_PEERINFO_Handle *h;
 
 
+static unsigned int retries;
 
 
-static void
-process (void *cls,
-         const struct GNUNET_PeerIdentity *peer,
-         const struct GNUNET_HELLO_Message *hello, uint32_t trust)
+static int
+check_it (void *cls, const struct GNUNET_HELLO_Address *address,
+          struct GNUNET_TIME_Absolute expiration)
 {
 {
-  int *ok = cls;
-  unsigned int agc;
-
-  if (peer == NULL)
-    {
-      GNUNET_assert (peer == NULL);
-      GNUNET_assert (2 == *ok);
-      GNUNET_assert (trust == 0);
-      *ok = 0;
-      return;
-    }
+  unsigned int *agc = cls;
 
 
-  if (hello != NULL)
-    {
-      GNUNET_assert (3 == *ok);
-      agc = 3;
-      GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &check_it, &agc);
-      GNUNET_assert (agc == 0);
-      *ok = 2;
-    }
+  if (address != NULL)
+  {
+    GNUNET_assert (0 == strcmp ("peerinfotest", address->transport_name));
+    GNUNET_assert (0 ==
+                   strncmp ("Address", address->address,
+                            address->address_length));
+    (*agc) -= (1 << (address->address_length - 1));
+  }
+  return GNUNET_OK;
 }
 
 
 }
 
 
@@ -87,42 +67,97 @@ address_generator (void *cls, size_t max, void *buf)
 {
   size_t *agc = cls;
   size_t ret;
 {
   size_t *agc = cls;
   size_t ret;
+  struct GNUNET_HELLO_Address address;
 
   if (0 == *agc)
     return 0;
 
   if (0 == *agc)
     return 0;
-  ret = GNUNET_HELLO_add_address ("peerinfotest",
-                                  GNUNET_TIME_relative_to_absolute
-                                  (GNUNET_TIME_UNIT_HOURS), "Address", *agc,
-                                  buf, max);
+  memset (&address.peer, 0, sizeof (struct GNUNET_PeerIdentity));
+  address.address = "Address";
+  address.transport_name = "peerinfotest";
+  address.address_length = *agc;
+  ret =
+      GNUNET_HELLO_add_address (&address,
+                                GNUNET_TIME_relative_to_absolute
+                                (GNUNET_TIME_UNIT_HOURS), buf, max);
   (*agc)--;
   return ret;
 }
 
 
 static void
   (*agc)--;
   return ret;
 }
 
 
 static void
-run (void *cls,
-     struct GNUNET_SCHEDULER_Handle *sched,
-     char *const *args,
-     const char *cfgfile, struct GNUNET_CONFIGURATION_Handle *cfg)
+add_peer ()
 {
 {
-  struct GNUNET_HELLO_Message *hello;
   struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pkey;
   struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pkey;
-  size_t agc;
   struct GNUNET_PeerIdentity pid;
   struct GNUNET_PeerIdentity pid;
+  struct GNUNET_HELLO_Message *h2;
+  size_t agc;
 
 
+  agc = 2;
   memset (&pkey, 32, sizeof (pkey));
   GNUNET_CRYPTO_hash (&pkey, sizeof (pkey), &pid.hashPubKey);
   memset (&pkey, 32, sizeof (pkey));
   GNUNET_CRYPTO_hash (&pkey, sizeof (pkey), &pid.hashPubKey);
-  agc = 2;
-  hello = GNUNET_HELLO_create (&pkey, &address_generator, &agc);
-  GNUNET_assert (hello != NULL);
-  GNUNET_PEERINFO_add_peer (cfg, sched, &pid, hello);
-  GNUNET_PEERINFO_for_all (cfg,
-                           sched,
-                           NULL,
-                           0,
-                           GNUNET_TIME_relative_multiply
-                           (GNUNET_TIME_UNIT_SECONDS, 15), &process, cls);
-  GNUNET_free (hello);
+  h2 = GNUNET_HELLO_create (&pkey, &address_generator, &agc);
+  GNUNET_PEERINFO_add_peer (h, h2, NULL, NULL);
+  GNUNET_free (h2);
+
+}
+
+
+static void
+process (void *cls, const struct GNUNET_PeerIdentity *peer,
+         const struct GNUNET_HELLO_Message *hello, const char *err_msg)
+{
+  int *ok = cls;
+  unsigned int agc;
+
+  if (err_msg != NULL)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _("Error in communication with PEERINFO service\n"));
+  }
+
+  if (peer == NULL)
+  {
+    ic = NULL;
+    if ((3 == *ok) && (retries < 50))
+    {
+      /* try again */
+      retries++;
+      add_peer ();
+      ic = GNUNET_PEERINFO_iterate (h, NULL,
+                                    GNUNET_TIME_relative_multiply
+                                    (GNUNET_TIME_UNIT_SECONDS, 15), &process,
+                                    cls);
+      return;
+    }
+    GNUNET_assert (peer == NULL);
+    GNUNET_assert (2 == *ok);
+    GNUNET_PEERINFO_disconnect (h);
+    h = NULL;
+    *ok = 0;
+    return;
+  }
+  if (hello != NULL)
+  {
+    GNUNET_assert (3 == *ok);
+    agc = 3;
+    GNUNET_HELLO_iterate_addresses (hello, GNUNET_NO, &check_it, &agc);
+    GNUNET_assert (agc == 0);
+    *ok = 2;
+  }
+}
+
+
+static void
+run (void *cls, char *const *args, const char *cfgfile,
+     const struct GNUNET_CONFIGURATION_Handle *c)
+{
+  cfg = c;
+  h = GNUNET_PEERINFO_connect (cfg);
+  GNUNET_assert (h != NULL);
+  add_peer ();
+  ic = GNUNET_PEERINFO_iterate (h, NULL,
+                                GNUNET_TIME_relative_multiply
+                                (GNUNET_TIME_UNIT_SECONDS, 15), &process, cls);
 }
 
 
 }
 
 
@@ -130,7 +165,8 @@ static int
 check ()
 {
   int ok = 3;
 check ()
 {
   int ok = 3;
-  pid_t pid;
+  struct GNUNET_OS_Process *proc;
+
   char *const argv[] = { "test-peerinfo-api",
     "-c",
     "test_peerinfo_api_data.conf",
   char *const argv[] = { "test-peerinfo-api",
     "-c",
     "test_peerinfo_api_data.conf",
@@ -142,22 +178,24 @@ check ()
   struct GNUNET_GETOPT_CommandLineOption options[] = {
     GNUNET_GETOPT_OPTION_END
   };
   struct GNUNET_GETOPT_CommandLineOption options[] = {
     GNUNET_GETOPT_OPTION_END
   };
-  pid = GNUNET_OS_start_process ("gnunet-service-peerinfo",
-                                 "gnunet-service-peerinfo",
+  proc =
+    GNUNET_OS_start_process (GNUNET_YES, NULL, NULL, "gnunet-service-peerinfo",
+                               "gnunet-service-peerinfo",
 #if DEBUG_PEERINFO
 #if DEBUG_PEERINFO
-                                 "-L", "DEBUG",
+                               "-L", "DEBUG",
 #endif
 #endif
-                                 "-c", "test_peerinfo_api_data.conf", NULL);
-  sleep (1);
-  GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1,
-                      argv, "test-peerinfo-api", "nohelp",
-                      options, &run, &ok);
-  if (0 != PLIBC_KILL (pid, SIGTERM))
-    {
-      GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
-      ok = 1;
-    }
-  GNUNET_OS_process_wait(p->arm_pid);
+                               "-c", "test_peerinfo_api_data.conf", NULL);
+  GNUNET_assert (NULL != proc);
+  GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1, argv,
+                      "test-peerinfo-api", "nohelp", options, &run, &ok);
+  if (0 != GNUNET_OS_process_kill (proc, SIGTERM))
+  {
+    GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill");
+    ok = 1;
+  }
+  GNUNET_OS_process_wait (proc);
+  GNUNET_OS_process_close (proc);
+  proc = NULL;
   return ok;
 }
 
   return ok;
 }
 
@@ -167,8 +205,15 @@ main (int argc, char *argv[])
 {
   int ret = 0;
 
 {
   int ret = 0;
 
+  GNUNET_log_setup ("test_peerinfo_api",
+#if DEBUG_PEERINFO
+                    "DEBUG",
+#else
+                    "WARNING",
+#endif
+                    NULL);
   ret = check ();
   ret = check ();
-
+  GNUNET_DISK_directory_remove ("/tmp/test-gnunet-peerinfo");
   return ret;
 }
 
   return ret;
 }