doxygen
[oweals/gnunet.git] / src / transport / test_plugin_transport.c
index ef6c8a76a97511334404108230d30745a2beaf9b..ca69b760117205927ee7bc80958f6e8da730dcd2 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_YES
+#define VERBOSE GNUNET_NO
 
 /**
  * How long until we give up on transmitting the message?
 
 /**
  * How long until we give up on transmitting the message?
@@ -59,15 +59,10 @@ 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.
  */
-struct GNUNET_CONFIGURATION_Handle *cfg;
+const struct GNUNET_CONFIGURATION_Handle *cfg;
 
 /**
  * Number of neighbours we'd like to have.
 
 /**
  * Number of neighbours we'd like to have.
@@ -90,43 +85,26 @@ 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,52 +113,21 @@ void lookup (void *cls,
  * @param cfg configuration to use
  */
 static void
  * @param cfg configuration to use
  */
 static void
-unload_plugins (void *cls, 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);
 }
 
@@ -196,73 +143,59 @@ 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;
   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
 run (void *cls,
  * @param c configuration to use
  */
 static void
 run (void *cls,
-     struct GNUNET_SCHEDULER_Handle *s,
      char *const *args,
      char *const *args,
-     const char *cfgfile,
-     struct GNUNET_CONFIGURATION_Handle *c)
-{ 
+     const char *cfgfile, 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 !=
@@ -276,7 +209,8 @@ run (void *cls,
                                                 "HOSTKEY", &keyfile)))
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                                                 "HOSTKEY", &keyfile)))
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  _("Transport service is lacking key configuration settings.  Exiting.\n"));
+                  _
+                  ("Transport service is lacking key configuration settings.  Exiting.\n"));
       GNUNET_SCHEDULER_shutdown (s);
       return;
     }
       GNUNET_SCHEDULER_shutdown (s);
       return;
     }
@@ -286,44 +220,32 @@ run (void *cls,
   if (my_private_key == NULL)
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
   if (my_private_key == NULL)
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  _("Transport service could not access hostkey.  Exiting.\n"));
+                  _
+                  ("Transport service could not access hostkey.  Exiting.\n"));
       GNUNET_SCHEDULER_shutdown (s);
       return;
     }
       GNUNET_SCHEDULER_shutdown (s);
       return;
     }
-  GNUNET_CRYPTO_rsa_key_get_public (my_private_key, 
-                                   &my_public_key);
+  GNUNET_CRYPTO_rsa_key_get_public (my_private_key, &my_public_key);
   GNUNET_CRYPTO_hash (&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"));
+                      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)
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                   _("Failed to load transport plugin for tcp\n"));
       /* FIXME: set some error code for main */
       return;
   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 ();
+    }
+  test_validation ();
 }
 
 
 }
 
 
@@ -340,6 +262,7 @@ main (int argc, char *const *argv)
   static struct GNUNET_GETOPT_CommandLineOption options[] = {
     GNUNET_GETOPT_OPTION_END
   };
   static struct GNUNET_GETOPT_CommandLineOption options[] = {
     GNUNET_GETOPT_OPTION_END
   };
+  int ret;
   char *const argv_prog[] = {
     "test_plugin_transport",
     "-c",
   char *const argv_prog[] = {
     "test_plugin_transport",
     "-c",
@@ -351,22 +274,22 @@ 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 */
-  return (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;
 }
 
 /* end of test_plugin_transport.c */
 }
 
 /* end of test_plugin_transport.c */