X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Ftransport%2Ftest_plugin_transport.c;h=ca69b760117205927ee7bc80958f6e8da730dcd2;hb=311e9e5636fdd21172f9bca63cc8746c654ae526;hp=ef6c8a76a97511334404108230d30745a2beaf9b;hpb=70e6847205a9f9b9b660be2a173d5bc309eaa58d;p=oweals%2Fgnunet.git diff --git a/src/transport/test_plugin_transport.c b/src/transport/test_plugin_transport.c index ef6c8a76a..ca69b7601 100644 --- a/src/transport/test_plugin_transport.c +++ b/src/transport/test_plugin_transport.c @@ -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 @@ -34,10 +34,10 @@ #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" -#define VERBOSE GNUNET_YES +#define VERBOSE GNUNET_NO /** * 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; -/** - * Our scheduler. - */ -struct GNUNET_SCHEDULER_Handle *sched; - /** * Our configuration. */ -struct GNUNET_CONFIGURATION_Handle *cfg; +const struct GNUNET_CONFIGURATION_Handle *cfg; /** * Number of neighbours we'd like to have. @@ -90,43 +85,26 @@ struct GNUNET_TRANSPORT_PluginFunctions *api; 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. @@ -135,52 +113,21 @@ void lookup (void *cls, * @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); - -} - - -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 -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); } @@ -196,73 +143,59 @@ validation_failed (void *cls, * 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; - - 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; - /* 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); - 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.cls=&env; - env.receive=&receive; - env.lookup=&lookup; - env.notify_address=¬ify_address; - env.notify_validation = &validation_notification; - env.max_connections = max_connect_per_transport; -} + env.cls = &env; + env.receive = &receive; + env.notify_address = ¬ify_address; + env.max_connections = max_connect_per_transport; +} /** * Runs the test. * * @param cls closure - * @param s scheduler to use * @param c configuration to use */ static void run (void *cls, - struct GNUNET_SCHEDULER_Handle *s, 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; - sched = s; cfg = c; /* parse configuration */ if ((GNUNET_OK != @@ -276,7 +209,8 @@ run (void *cls, "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; } @@ -286,44 +220,32 @@ run (void *cls, 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_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, - 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"); - 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; - } - /* 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 }; + int ret; char *const argv_prog[] = { "test_plugin_transport", "-c", @@ -351,22 +274,22 @@ main (int argc, char *const *argv) "WARNING", #endif NULL - }; + }; 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 */