- fix logging to remove error messages
[oweals/gnunet.git] / src / transport / test_plugin_transport.c
index 60a33c65acc67decbbf99aa61b40355672c86f72..56abe2cd364ee086e071c0a2fca3f6da3dd9a955 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_protocols.h"
 #include "gnunet_program_lib.h"
 #include "gnunet_signatures.h"
 #include "gnunet_protocols.h"
 #include "gnunet_program_lib.h"
 #include "gnunet_signatures.h"
-#include "plugin_transport.h"
+#include "gnunet_transport_plugin.h"
 #include "transport.h"
 
 #include "transport.h"
 
-#define VERBOSE GNUNET_NO
+#define VERBOSE GNUNET_EXTRA_LOGGING
 
 /**
  * How long until we give up on transmitting the message?
 
 /**
  * How long until we give up on transmitting the message?
@@ -59,11 +59,6 @@ static struct GNUNET_PeerIdentity my_identity;
  */
 static struct GNUNET_CRYPTO_RsaPrivateKey *my_private_key;
 
  */
 static struct GNUNET_CRYPTO_RsaPrivateKey *my_private_key;
 
-/**
- * Our scheduler.
- */
-struct GNUNET_SCHEDULER_Handle *sched;
-
 /**
  * Our configuration.
  */
 /**
  * Our configuration.
  */
@@ -90,43 +85,21 @@ struct GNUNET_TRANSPORT_PluginFunctions *api;
 static int ok;
 
 /**
 static int ok;
 
 /**
- * Initialize Environment for this plugin
  */
  */
-struct ReadyList * 
-receive(void *cls,void *plugin_context,
-       struct ReadyList *
-       service_context,
-       struct GNUNET_TIME_Relative
-       latency,
-       const struct GNUNET_PeerIdentity
-       * peer,
-       const struct GNUNET_MessageHeader
-       * message)
+static void
+receive (void *cls, const struct GNUNET_PeerIdentity *peer,
+         const struct GNUNET_MessageHeader *message, uint32_t distance,
+         const char *sender_address, size_t sender_address_len)
 {
 {
-  return NULL;
+  /* do nothing */
 }
 
 }
 
-void notify_address(void *cls,
-                   const char *name,
-                   const void *addr,
-                   size_t addrlen,
-                   struct
-                   GNUNET_TIME_Relative
-                   expires)
+void
+notify_address (void *cls, const char *name, const void *addr, size_t addrlen,
+                struct GNUNET_TIME_Relative expires)
 {
 }
 
 {
 }
 
-void lookup (void *cls,
-            struct GNUNET_TIME_Relative
-            timeout,
-            const struct
-            GNUNET_PeerIdentity * target,
-            GNUNET_TRANSPORT_AddressCallback
-            iter, void *iter_cls)
-{      
-}
-
-
 /**
  * Function called when the service shuts
  * down.  Unloads our plugins.
 /**
  * Function called when the service shuts
  * down.  Unloads our plugins.
@@ -135,53 +108,21 @@ void lookup (void *cls,
  * @param cfg configuration to use
  */
 static void
  * @param cfg configuration to use
  */
 static void
-unload_plugins (void *cls, 
-               const struct GNUNET_CONFIGURATION_Handle *cfg)
-{  
-  GNUNET_assert (NULL == GNUNET_PLUGIN_unload ("libgnunet_plugin_transport_tcp",api));
+unload_plugins (void *cls, const struct GNUNET_CONFIGURATION_Handle *cfg)
+{
+  GNUNET_assert (NULL ==
+                 GNUNET_PLUGIN_unload ("libgnunet_plugin_transport_tcp", api));
   if (my_private_key != NULL)
     GNUNET_CRYPTO_rsa_key_free (my_private_key);
   if (my_private_key != NULL)
     GNUNET_CRYPTO_rsa_key_free (my_private_key);
-  
-}
-
-
-static GNUNET_SCHEDULER_TaskIdentifier validation_timeout_task;
-
 
 
-static void 
-validation_notification (void *cls,
-                        const char *name,
-                        const struct GNUNET_PeerIdentity *peer,
-                        uint32_t challenge,
-                        const char *sender_addr)
-{
-  /* Sailor: 'test_validation' should get here
-     if the validation worked; so we cancel the
-     "delayed" task that will cause failure */
-  if (validation_timeout_task != GNUNET_SCHEDULER_NO_TASK)
-    {
-      GNUNET_SCHEDULER_cancel (sched, validation_timeout_task);
-      validation_timeout_task = GNUNET_SCHEDULER_NO_TASK;
-    }
-
-  GNUNET_assert (challenge == 42);
-  
-  /* Sailor: if this is the last test, calling this function
-     here will end the process. */
-  ok = 0; /* if the last test succeeded, report success */
-  unload_plugins (NULL, cfg);
 }
 
 
 static void
 }
 
 
 static void
-validation_failed (void *cls,
-                  const struct GNUNET_SCHEDULER_TaskContext *tc)
+unload_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
 {
-  validation_timeout_task = GNUNET_SCHEDULER_NO_TASK;
-  GNUNET_break (0); /* output error */
-  /* the "validation_notification" was not called
-     in a timely fashion; we should set an error
-     code for main and shut down */  
+  struct GNUNET_CONFIGURATION_Handle *cfg = cls;
+
   unload_plugins (NULL, cfg);
 }
 
   unload_plugins (NULL, cfg);
 }
 
@@ -197,137 +138,102 @@ validation_failed (void *cls,
  *  work for other plugins; we should ask
  *  the plugin about its address instead...).
  */
  *  work for other plugins; we should ask
  *  the plugin about its address instead...).
  */
+/* FIXME: this is TCP/UDP-specific and won't work
+   for HTTP/SMTP/DV; we should instead use an
+   address that we get from the plugin itself
+   (if it is willing/able to give us one...) */
 static void
 test_validation ()
 {
   struct sockaddr_in soaddr;
 static void
 test_validation ()
 {
   struct sockaddr_in soaddr;
-  
-  memset (&soaddr, 0, sizeof(soaddr));
+
+  memset (&soaddr, 0, sizeof (soaddr));
 #if HAVE_SOCKADDR_IN_SIN_LEN
   soaddr.sin_len = sizeof (soaddr);
 #endif
   soaddr.sin_family = AF_INET;
 #if HAVE_SOCKADDR_IN_SIN_LEN
   soaddr.sin_len = sizeof (soaddr);
 #endif
   soaddr.sin_family = AF_INET;
-  /* Sailor: set this port to 2367 to see the
-     testcase fail after 30s (because validation
-     fails); obviously the test should be
-     modified to test both successful and
-     unsuccessful validation in the end... */
-  soaddr.sin_port = htons(2368 /* FIXME: get from config! */);
+  soaddr.sin_port = htons (2368 /* FIXME: get from config! */ );
   soaddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
   soaddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
-  api->validate (api->cls,
-                &my_identity,
-                42,
-                TIMEOUT,
-                &soaddr,
-                sizeof(soaddr));                
-  /* add job to catch failure (timeout) */
-  validation_timeout_task =
-    GNUNET_SCHEDULER_add_delayed (sched,
-                                 GNUNET_NO,
-                                 GNUNET_SCHEDULER_PRIORITY_KEEP,
-                                 GNUNET_SCHEDULER_NO_TASK,
-                                 TIMEOUT,
-                                 &validation_failed,
-                                 NULL);
+  GNUNET_assert (GNUNET_OK ==
+                 api->check_address (api->cls, &soaddr, sizeof (soaddr)));
+  ok = 0;
+  GNUNET_SCHEDULER_add_continuation (&unload_task, (void *) cfg,
+                                     GNUNET_SCHEDULER_REASON_PREREQ_DONE);
 }
 
 
 }
 
 
-static void setup_plugin_environment()
+static void
+setup_plugin_environment ()
 {
 {
-  env.cfg  = cfg;
-  env.sched = sched;
-  env.my_public_key = &my_public_key;
-  env.my_private_key = my_private_key;
+  env.cfg = cfg;
   env.my_identity = &my_identity;
   env.my_identity = &my_identity;
-  env.cls=&env;
-  env.receive=&receive;
-  env.lookup=&lookup;
-  env.notify_address=&notify_address;
-  env.notify_validation = &validation_notification;
-  env.max_connections = max_connect_per_transport;       
-}      
+  env.cls = &env;
+  env.receive = &receive;
+  env.notify_address = &notify_address;
+  env.max_connections = max_connect_per_transport;
+}
 
 
 /**
  * Runs the test.
  *
  * @param cls closure
 
 
 /**
  * Runs the test.
  *
  * @param cls closure
- * @param s scheduler to use
  * @param c configuration to use
  */
 static void
  * @param c configuration to use
  */
 static void
-run (void *cls,
-     struct GNUNET_SCHEDULER_Handle *s,
-     char *const *args,
-     const char *cfgfile,
+run (void *cls, char *const *args, const char *cfgfile,
      const struct GNUNET_CONFIGURATION_Handle *c)
      const struct GNUNET_CONFIGURATION_Handle *c)
-{ 
+{
   unsigned long long tneigh;
   char *keyfile;
   char *libname;
 
   unsigned long long tneigh;
   char *keyfile;
   char *libname;
 
-  sched = s;
   cfg = c;
   /* parse configuration */
   if ((GNUNET_OK !=
   cfg = c;
   /* parse configuration */
   if ((GNUNET_OK !=
-       GNUNET_CONFIGURATION_get_value_number (c,
-                                              "TRANSPORT",
-                                              "NEIGHBOUR_LIMIT",
+       GNUNET_CONFIGURATION_get_value_number (c, "TRANSPORT", "NEIGHBOUR_LIMIT",
                                               &tneigh)) ||
       (GNUNET_OK !=
                                               &tneigh)) ||
       (GNUNET_OK !=
-       GNUNET_CONFIGURATION_get_value_filename (c,
-                                                "GNUNETD",
-                                                "HOSTKEY", &keyfile)))
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  _("Transport service is lacking key configuration settings.  Exiting.\n"));
-      GNUNET_SCHEDULER_shutdown (s);
-      return;
-    }
+       GNUNET_CONFIGURATION_get_value_filename (c, "GNUNETD", "HOSTKEY",
+                                                &keyfile)))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _
+                ("Transport service is lacking key configuration settings.  Exiting.\n"));
+    GNUNET_SCHEDULER_shutdown (s);
+    return;
+  }
   max_connect_per_transport = (uint32_t) tneigh;
   my_private_key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile);
   GNUNET_free (keyfile);
   if (my_private_key == NULL)
   max_connect_per_transport = (uint32_t) tneigh;
   my_private_key = GNUNET_CRYPTO_rsa_key_create_from_file (keyfile);
   GNUNET_free (keyfile);
   if (my_private_key == NULL)
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  _("Transport service could not access hostkey.  Exiting.\n"));
-      GNUNET_SCHEDULER_shutdown (s);
-      return;
-    }
-  GNUNET_CRYPTO_rsa_key_get_public (my_private_key, 
-                                   &my_public_key);
-  GNUNET_CRYPTO_hash (&my_public_key,
-                      sizeof (my_public_key),
-                     &my_identity.hashPubKey);
-  
-
-  
-  /* load plugins... */  
-  setup_plugin_environment();
-  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-              _("Loading tcp transport plugin\n"));
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _("Transport service could not access hostkey.  Exiting.\n"));
+    GNUNET_SCHEDULER_shutdown (s);
+    return;
+  }
+  GNUNET_CRYPTO_rsa_key_get_public (my_private_key, &my_public_key);
+  GNUNET_CRYPTO_hash (&my_public_key, sizeof (my_public_key),
+                      &my_identity.hashPubKey);
+
+
+
+  /* load plugins... */
+  setup_plugin_environment ();
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO, _("Loading tcp transport plugin\n"));
   GNUNET_asprintf (&libname, "libgnunet_plugin_transport_tcp");
 
   GNUNET_asprintf (&libname, "libgnunet_plugin_transport_tcp");
 
-  api = GNUNET_PLUGIN_load(libname, &env);
+  api = GNUNET_PLUGIN_load (libname, &env);
+  GNUNET_free (libname);
   if (api == NULL)
   if (api == NULL)
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  _("Failed to load transport plugin for tcp\n"));
-      /* FIXME: set some error code for main */
-      return;
-    } 
-  /* Sailor: if we had no real tests, we
-     could call this function
-     here to end the process; instead, I'll
-     show how one could run a single test below. 
-     Note that the test is not particularly well-written,
-     it just serves to illustrate (also,
-     the "validation_notification" function above is
-     part of the test.*/
-  if (0)
-    unload_plugins (NULL, cfg);
-  else
-    test_validation ();
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _("Failed to load transport plugin for tcp\n"));
+    /* FIXME: set some error code for main */
+    return;
+  }
+  test_validation ();
 }
 
 
 }
 
 
@@ -345,6 +251,7 @@ main (int argc, char *const *argv)
     GNUNET_GETOPT_OPTION_END
   };
   int ret;
     GNUNET_GETOPT_OPTION_END
   };
   int ret;
+
   char *const argv_prog[] = {
     "test_plugin_transport",
     "-c",
   char *const argv_prog[] = {
     "test_plugin_transport",
     "-c",
@@ -356,22 +263,19 @@ main (int argc, char *const *argv)
     "WARNING",
 #endif
     NULL
     "WARNING",
 #endif
     NULL
-  };  
+  };
   GNUNET_log_setup ("test-plugin-transport",
 #if VERBOSE
                     "DEBUG",
 #else
                     "WARNING",
 #endif
   GNUNET_log_setup ("test-plugin-transport",
 #if VERBOSE
                     "DEBUG",
 #else
                     "WARNING",
 #endif
-                    NULL);       
-  ok = 1; /* set to fail */
-  ret = (GNUNET_OK ==
-          GNUNET_PROGRAM_run (5,
-                              argv_prog,
-                              "test-plugin-transport",
-                             "testcase",
-                             options,
-                              &run, NULL)) ? ok : 1;
+                    NULL);
+  ok = 1;                       /* set to fail */
+  ret =
+      (GNUNET_OK ==
+       GNUNET_PROGRAM_run (5, argv_prog, "test-plugin-transport", "testcase",
+                           options, &run, NULL)) ? ok : 1;
   GNUNET_DISK_directory_remove ("/tmp/test-gnunetd-plugin-transport");
   return ret;
 }
   GNUNET_DISK_directory_remove ("/tmp/test-gnunetd-plugin-transport");
   return ret;
 }