From 1cc43d608117c035c4986cf6b306b876e84a700e Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Fri, 30 Apr 2010 11:25:58 +0000 Subject: [PATCH] initial preparations before implementing http transport plugin --- src/transport/Makefile.am | 26 +- .../test_plugin_transport_data_http.conf | 24 ++ src/transport/test_plugin_transport_http.c | 287 ++++++++++++++++++ src/transport/test_transport_api.c | 11 + .../test_transport_api_http_peer1.conf | 122 ++++++++ .../test_transport_api_http_peer2.conf | 123 ++++++++ 6 files changed, 590 insertions(+), 3 deletions(-) create mode 100644 src/transport/test_plugin_transport_data_http.conf create mode 100644 src/transport/test_plugin_transport_http.c create mode 100644 src/transport/test_transport_api_http_peer1.conf create mode 100644 src/transport/test_transport_api_http_peer2.conf diff --git a/src/transport/Makefile.am b/src/transport/Makefile.am index 71e6470e3..c7482f4a8 100644 --- a/src/transport/Makefile.am +++ b/src/transport/Makefile.am @@ -69,7 +69,8 @@ plugin_LTLIBRARIES = \ libgnunet_plugin_transport_tcp.la \ libgnunet_plugin_transport_udp.la \ libgnunet_plugin_transport_udp_nat.la \ - libgnunet_plugin_transport_template.la + libgnunet_plugin_transport_template.la +# libgnunet_plugin_transport_http.la # TODO: add http, nat, etc. libgnunet_plugin_transport_tcp_la_SOURCES = \ @@ -109,11 +110,22 @@ libgnunet_plugin_transport_udp_nat_la_LIBADD = \ libgnunet_plugin_transport_udp_nat_la_LDFLAGS = \ $(GN_PLUGIN_LDFLAGS) +#libgnunet_plugin_transport_http_la_SOURCES = \ +# plugin_transport_http.c +#libgnunet_plugin_transport_http_la_LIBADD = \ +# $(top_builddir)/src/hello/libgnunethello.la \ +# $(top_builddir)/src/statistics/libgnunetstatistics.la \ +# $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \ +# $(top_builddir)/src/util/libgnunetutil.la +#libgnunet_plugin_transport_http_la_LDFLAGS = \ +# $(GN_PLUGIN_LDFLAGS) + check_PROGRAMS = \ test_transport_api_tcp \ test_transport_api_udp \ - test_transport_api_udp_nat + test_transport_api_udp_nat \ + test_transport_api_http # TODO: add tests for http, nat, etc. TESTS = $(check_PROGRAMS) @@ -135,6 +147,13 @@ test_transport_api_udp_nat_SOURCES = \ test_transport_api_udp_nat_LDADD = \ $(top_builddir)/src/transport/libgnunettransport.la \ $(top_builddir)/src/util/libgnunetutil.la + +test_transport_api_http_SOURCES = \ + test_transport_api.c +test_transport_api_http_LDADD = \ + $(top_builddir)/src/transport/libgnunettransport.la \ + $(top_builddir)/src/util/libgnunetutil.la + EXTRA_DIST = \ test_transport_api_data.conf \ @@ -144,4 +163,5 @@ EXTRA_DIST = \ test_transport_api_udp_peer2.conf \ test_transport_api_udp_nat_peer1.conf \ test_transport_api_udp_nat_peer2.conf \ - test_plugin_transport_data.conf + test_plugin_transport_data.conf \ + test_plugin_transport_data_http.conf diff --git a/src/transport/test_plugin_transport_data_http.conf b/src/transport/test_plugin_transport_data_http.conf new file mode 100644 index 000000000..f794c8f87 --- /dev/null +++ b/src/transport/test_plugin_transport_data_http.conf @@ -0,0 +1,24 @@ +[PATHS] +SERVICEHOME = /tmp/test-gnunetd-plugin-transport_http/ + +[resolver] +PORT = 2364 + +[transport] +PORT = 2365 +PLUGINS = http + +[arm] +PORT = 2366 + +[statistics] +PORT = 2367 + +[transport-udp] +PORT = 2368 + +[peerinfo] +PORT = 2369 + +[testing] +WEAKRANDOM = YES diff --git a/src/transport/test_plugin_transport_http.c b/src/transport/test_plugin_transport_http.c new file mode 100644 index 000000000..9095e14c5 --- /dev/null +++ b/src/transport/test_plugin_transport_http.c @@ -0,0 +1,287 @@ +/* + This file is part of GNUnet. + (C) 2010 Christian Grothoff (and other contributing authors) + + 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 + option) any later version. + + GNUnet is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with GNUnet; see the file COPYING. If not, write to the + Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ +/** + * @file transport/test_transport_api.c + * @brief testcase for transport_api.c + * @author Sailor Siraj + * @author Christian Grothoff + * @author Nathan Evans + */ + +#include "platform.h" +#include "gnunet_constants.h" +#include "gnunet_getopt_lib.h" +#include "gnunet_hello_lib.h" +#include "gnunet_os_lib.h" +#include "gnunet_peerinfo_service.h" +#include "gnunet_plugin_lib.h" +#include "gnunet_protocols.h" +#include "gnunet_program_lib.h" +#include "gnunet_signatures.h" +#include "plugin_transport.h" +#include "transport.h" + +#define VERBOSE GNUNET_NO + +/** + * How long until we give up on transmitting the message? + */ +#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 30) + +/** + * Our public key. + */ +static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded my_public_key; + +/** + * Our identity. + */ +static struct GNUNET_PeerIdentity my_identity; + +/** + * Our private key. + */ +static struct GNUNET_CRYPTO_RsaPrivateKey *my_private_key; + +/** + * Our scheduler. + */ +struct GNUNET_SCHEDULER_Handle *sched; + +/** + * Our configuration. + */ +const struct GNUNET_CONFIGURATION_Handle *cfg; + +/** + * Number of neighbours we'd like to have. + */ +static uint32_t max_connect_per_transport; + +/** + * Environment for this plugin. + */ +struct GNUNET_TRANSPORT_PluginEnvironment env; + +/** + *handle for the api provided by this plugin + */ +struct GNUNET_TRANSPORT_PluginFunctions *api; + +/** + * Did the test pass or fail? + */ +static int ok; + +/** + * Initialize Environment for this plugin + */ +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) +{ + /* do nothing */ +} + +void +notify_address (void *cls, + const char *name, + const void *addr, + size_t addrlen, struct GNUNET_TIME_Relative expires) +{ +} + +/** + * Function called when the service shuts + * down. Unloads our plugins. + * + * @param cls closure + * @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_udp", + api)); + if (my_private_key != NULL) + GNUNET_CRYPTO_rsa_key_free (my_private_key); + + ok = 0; +} + +/** + * Simple example test that invokes + * the check_address function of the plugin. + */ +/* FIXME: won't work on IPv6 enabled systems where IPv4 mapping + * isn't enabled (eg. FreeBSD > 4) + */ +static void +test_validation () +{ + struct sockaddr_in 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_port = htons (2368 /* FIXME: get from config! */ ); + soaddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK); + + api->check_address(api->cls, + &soaddr, sizeof (soaddr)); + + unload_plugins(env.cls, env.cfg); +} + + +static void +setup_plugin_environment () +{ + env.cfg = cfg; + env.sched = sched; + env.my_identity = &my_identity; + 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, const struct GNUNET_CONFIGURATION_Handle *c) +{ + unsigned long long tneigh; + char *keyfile; + char *libname; + + sched = s; + cfg = c; + /* parse configuration */ + if ((GNUNET_OK != + GNUNET_CONFIGURATION_get_value_number (c, + "TRANSPORT", + "NEIGHBOUR_LIMIT", + &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; + } + 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 udp transport plugin\n")); + GNUNET_asprintf (&libname, "libgnunet_plugin_transport_udp"); + + api = GNUNET_PLUGIN_load (libname, &env); + GNUNET_free (libname); + if (api == NULL) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Failed to load transport plugin for udp\n")); + /* FIXME: set some error code for main */ + return; + } + test_validation (); +} + + +/** + * The main function for the transport service. + * + * @param argc number of arguments from the command line + * @param argv command line arguments + * @return 0 ok, 1 on error + */ +int +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", + "test_plugin_transport_data_udp.conf", + "-L", +#if VERBOSE + "DEBUG", +#else + "WARNING", +#endif + NULL + }; + 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; + GNUNET_DISK_directory_remove ("/tmp/test-gnunetd-plugin-transport"); + /* FIXME: return correct value */ + /* return ret; */ + return GNUNET_NO; +} + +/* end of test_plugin_transport_udp.c */ diff --git a/src/transport/test_transport_api.c b/src/transport/test_transport_api.c index e159b054e..768e514a1 100644 --- a/src/transport/test_transport_api.c +++ b/src/transport/test_transport_api.c @@ -73,6 +73,8 @@ static int is_udp; static int is_udp_nat; +static int is_http; + GNUNET_SCHEDULER_TaskIdentifier die_task; #if VERBOSE @@ -296,6 +298,11 @@ run (void *cls, setup_peer (&p1, "test_transport_api_udp_nat_peer1.conf"); setup_peer (&p2, "test_transport_api_udp_nat_peer2.conf"); } + if (is_http) + { + setup_peer (&p1, "test_transport_api_http_peer1.conf"); + setup_peer (&p2, "test_transport_api_http_peer2.conf"); + } GNUNET_assert(p1.th != NULL); GNUNET_assert(p2.th != NULL); @@ -420,6 +427,10 @@ main (int argc, char *argv[]) { is_udp = GNUNET_YES; } + else if (strstr(argv[0], "http") != NULL) + { + is_http = GNUNET_YES; + } GNUNET_log_setup ("test-transport-api", diff --git a/src/transport/test_transport_api_http_peer1.conf b/src/transport/test_transport_api_http_peer1.conf new file mode 100644 index 000000000..b0f491187 --- /dev/null +++ b/src/transport/test_transport_api_http_peer1.conf @@ -0,0 +1,122 @@ +[transport-http] +PORT = 12368 + +[fs] +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +BINARY = gnunet-service-fs +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 2094 +INDEXDB = $SERVICEHOME/idxinfo.lst + +[datastore-sqlite] +FILENAME = $SERVICEHOME/datastore/sqlite.db + +[datastore] +DATABASE = sqlite +BLOOMFILTER = $SERVICEHOME/fs/bloomfilter +QUOTA = 100000000 +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +BINARY = gnunet-service-datastore +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 2093 + +[hostlist] +HTTP-PROXY = +SERVERS = http://gnunet.org:8080/ +OPTIONS = -b +BINARY = gnunet-daemon-hostlist +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +HTTPPORT = 8080 + +[topology] +BINARY = gnunet-daemon-topology +CONFIG = $DEFAULTCONFIG +FRIENDS = $SERVICEHOME/friends +TARGET-CONNECTION-COUNT = 16 +AUTOCONNECT = YES +FRIENDS-ONLY = NO +MINIMUM-FRIENDS = 0 + +[transport] +PLUGINS = http +#DEBUG = YES +#PREFIX = xterm -T transport2 -e gdb --command=cmd --args +#PREFIX = valgrind --leak-check=full +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +NEIGHBOUR_LIMIT = 50 +BINARY = gnunet-service-transport +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 12365 + +[peerinfo] +TRUST = $SERVICEHOME/data/credit/ +HOSTS = $SERVICEHOME/data/hosts/ +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +BINARY = gnunet-service-peerinfo +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 12369 + +[resolver] +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +BINARY = gnunet-service-resolver +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 12364 + +[statistics] +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +BINARY = gnunet-service-statistics +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 12367 + +[arm] +DEFAULTSERVICES = +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +BINARY = gnunet-service-arm +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 12366 + +[transport-tcp] +ALLOW_SHUTDOWN = NO +TIMEOUT = 300000 +PORT = 12368 + +[TESTING] +WEAKRANDOM = YES + +[gnunetd] +HOSTKEY = $SERVICEHOME/.hostkey + +[PATHS] +DEFAULTCONFIG = test_transport_api_tcp_peer1.conf +SERVICEHOME = /tmp/test-gnunetd-transport-peer-1/ + diff --git a/src/transport/test_transport_api_http_peer2.conf b/src/transport/test_transport_api_http_peer2.conf new file mode 100644 index 000000000..72348f529 --- /dev/null +++ b/src/transport/test_transport_api_http_peer2.conf @@ -0,0 +1,123 @@ +[transport-http] +PORT = 22368 + +[fs] +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +BINARY = gnunet-service-fs +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 2094 +INDEXDB = $SERVICEHOME/idxinfo.lst + +[datastore-sqlite] +FILENAME = $SERVICEHOME/datastore/sqlite.db + +[datastore] +DATABASE = sqlite +BLOOMFILTER = $SERVICEHOME/fs/bloomfilter +QUOTA = 100000000 +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +BINARY = gnunet-service-datastore +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 2093 + +[hostlist] +HTTP-PROXY = +SERVERS = http://gnunet.org:8080/ +OPTIONS = -b +BINARY = gnunet-daemon-hostlist +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +HTTPPORT = 8080 + +[topology] +BINARY = gnunet-daemon-topology +CONFIG = $DEFAULTCONFIG +FRIENDS = $SERVICEHOME/friends +TARGET-CONNECTION-COUNT = 16 +AUTOCONNECT = YES +FRIENDS-ONLY = NO +MINIMUM-FRIENDS = 0 + +[transport] +PLUGINS = http +#DEBUG = YES +# PREFIX = +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +NEIGHBOUR_LIMIT = 50 +BINARY = gnunet-service-transport +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 22365 +#PREFIX = xterm -T transport1 -e gdb --command=cmd --args +#PREFIX = valgrind --leak-check=full + +[peerinfo] +TRUST = $SERVICEHOME/data/credit/ +HOSTS = $SERVICEHOME/data/hosts/ +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +BINARY = gnunet-service-peerinfo +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 22369 + +[resolver] +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +BINARY = gnunet-service-resolver +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 22364 + +[statistics] +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +BINARY = gnunet-service-statistics +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 22367 + +[arm] +DEFAULTSERVICES = +ALLOW_SHUTDOWN = YES +ACCEPT_FROM6 = ::1; +ACCEPT_FROM = 127.0.0.1; +BINARY = gnunet-service-arm +CONFIG = $DEFAULTCONFIG +HOME = $SERVICEHOME +HOSTNAME = localhost +PORT = 22366 + +[transport-tcp] +ALLOW_SHUTDOWN = NO +TIMEOUT = 300000 +PORT = 22368 + +[TESTING] +WEAKRANDOM = YES + +[gnunetd] +HOSTKEY = $SERVICEHOME/.hostkey + +[PATHS] +DEFAULTCONFIG = test_transport_api_tcp_peer2.conf +SERVICEHOME = /tmp/test-gnunetd-transport-peer-2/ + -- 2.25.1