From 1c930a3459ca5875bc9fc93cf4761f570e02c701 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Philipp=20T=C3=B6lke?= Date: Wed, 5 Jan 2011 15:37:07 +0000 Subject: [PATCH] test-case for cores send-to-self-feature --- src/core/Makefile.am | 12 +- src/core/test_core_api_send_to_self.c | 167 +++++++++++++++++++++++ src/core/test_core_api_send_to_self.conf | 64 +++++++++ 3 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 src/core/test_core_api_send_to_self.c create mode 100644 src/core/test_core_api_send_to_self.conf diff --git a/src/core/Makefile.am b/src/core/Makefile.am index f4844b8ee..e8d836717 100644 --- a/src/core/Makefile.am +++ b/src/core/Makefile.am @@ -25,7 +25,7 @@ libgnunetcore_la_LDFLAGS = \ bin_PROGRAMS = \ - gnunet-service-core + gnunet-service-core test_core_api_send_to_self gnunet_service_core_SOURCES = \ gnunet-service-core.c @@ -43,7 +43,8 @@ check_PROGRAMS = \ test_core_api_reliability \ test_core_quota_compliance_symmetric \ test_core_quota_compliance_asymmetric_send_limited \ - test_core_quota_compliance_asymmetric_recv_limited + test_core_quota_compliance_asymmetric_recv_limited \ + test_core_api_send_to_self if !DISABLE_TEST_RUN TESTS = $(check_PROGRAMS) @@ -63,6 +64,13 @@ test_core_api_reliability_LDADD = \ $(top_builddir)/src/transport/libgnunettransport.la \ $(top_builddir)/src/util/libgnunetutil.la +test_core_api_send_to_self_SOURCES = \ + test_core_api_send_to_self.c +test_core_api_send_to_self_LDADD = \ + $(top_builddir)/src/core/libgnunetcore.la \ + $(top_builddir)/src/transport/libgnunettransport.la \ + $(top_builddir)/src/util/libgnunetutil.la + test_core_api_start_only_SOURCES = \ test_core_api_start_only.c test_core_api_start_only_LDADD = \ diff --git a/src/core/test_core_api_send_to_self.c b/src/core/test_core_api_send_to_self.c new file mode 100644 index 000000000..bf2697eec --- /dev/null +++ b/src/core/test_core_api_send_to_self.c @@ -0,0 +1,167 @@ +/* + This file is part of GNUnet. + (C) 2010 Christian Grothoff + + 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 3, 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 core/test_core_api_send_to_self.c + * @brief + * @author Philipp Toelke + */ +#include +#include +#include +#include +#include +#include + +/** + * Final status code. + */ +static int ret; + +/** + * The handle to core + */ +static struct GNUNET_CORE_Handle *core_handle; + +/** + * Function scheduled as very last function, cleans up after us + */ +static void +cleanup (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tskctx) +{ + GNUNET_assert (0 != (tskctx->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)); + + if (core_handle != NULL) + { + GNUNET_CORE_disconnect (core_handle); + core_handle = NULL; + } +} + +static struct GNUNET_PeerIdentity myself; + +struct GNUNET_CORE_Handle *core; + +static int +receive(void* cls, const struct GNUNET_PeerIdentity* other, const struct GNUNET_MessageHeader* message, const struct GNUNET_TRANSPORT_ATS_Information* atsi) +{ + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Received message from peer %s\n", GNUNET_i2s(other)); + return GNUNET_OK; +} + +static size_t +send_message (void* cls, size_t size, void* buf) +{ + if (size == 0 || buf == NULL) + { + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Could not send; got 0 buffer\n"); + return 0; + } + GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Sending!\n"); + struct GNUNET_MessageHeader *hdr = buf; + hdr->size = htons(sizeof(struct GNUNET_MessageHeader)); + hdr->type = htons(GNUNET_MESSAGE_TYPE_SERVICE_UDP); + return ntohs(hdr->size); +} + +static void +init (void *cls, struct GNUNET_CORE_Handle *core, + const struct GNUNET_PeerIdentity *my_identity, + const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *pk) +{ + if (core == NULL) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Could NOT connect to CORE;\n"); + return; + } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Correctly connected to CORE; we are the peer %s.\n", + GNUNET_i2s (my_identity)); + memcpy (&myself, my_identity, sizeof (struct GNUNET_PeerIdentity)); +} + +static void +connect_cb (void *cls, const struct GNUNET_PeerIdentity *peer, + const struct GNUNET_TRANSPORT_ATS_Information *atsi) +{ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connected to peer %s.\n", + GNUNET_i2s (peer)); + if (0 == memcmp (peer, &myself, sizeof (struct GNUNET_PeerIdentity))) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Connected to myself; sending message!\n"); + GNUNET_CORE_notify_transmit_ready (core, + 0, GNUNET_TIME_UNIT_FOREVER_REL, + peer, + sizeof (struct GNUNET_MessageHeader), + send_message, NULL); + } +} + + +/** + * Main function that will be run by the scheduler. + * + * @param cls closure + * @param args remaining command-line arguments + * @param cfgfile name of the configuration file used (for saving, can be NULL!) + * @param cfg configuration + */ +static void +run (void *cls, + char *const *args, + const char *cfgfile, const struct GNUNET_CONFIGURATION_Handle *cfg_) +{ + const static struct GNUNET_CORE_MessageHandler handlers[] = { + {receive, GNUNET_MESSAGE_TYPE_SERVICE_UDP, 0}, + {NULL, 0, 0} + }; + core = GNUNET_CORE_connect (cfg_, + 42, + NULL, + init, + connect_cb, + NULL, NULL, NULL, 0, NULL, 0, handlers); + GNUNET_SCHEDULER_add_delayed(GNUNET_TIME_UNIT_FOREVER_REL, &cleanup, cls); +} + +/** + * The main function to obtain template from gnunetd. + * + * @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 const struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_OPTION_END + }; + + return (GNUNET_OK == + GNUNET_PROGRAM_run (argc, + argv, + "test_core_api_send_to_self", + gettext_noop ("help text"), + options, &run, NULL)) ? ret : 1; +} + +/* end of test_core_api_send_to_self.c */ diff --git a/src/core/test_core_api_send_to_self.conf b/src/core/test_core_api_send_to_self.conf new file mode 100644 index 000000000..7518456b8 --- /dev/null +++ b/src/core/test_core_api_send_to_self.conf @@ -0,0 +1,64 @@ +[PATHS] +SERVICEHOME = ~/.gnunet/ +# SERVICEHOME = /var/lib/gnunet/ +# DEFAULTCONFIG = /etc/gnunet.conf +# If 'DEFAULTCONFIG' is not defined, the current +# configuration file is assumed to be the default, +# which is what we want by default... + +[gnunetd] +HOSTKEY = $SERVICEHOME/.hostkey + +[TESTING] +WEAKRANDOM = NO + +[client] +HOME = $SERVICEHOME + +[arm] +PORT = 0 +HOSTNAME = localhost +HOME = $SERVICEHOME +CONFIG = $DEFAULTCONFIG +BINARY = gnunet-service-arm +ACCEPT_FROM = 127.0.0.1; +ACCEPT_FROM6 = ::1; +DEFAULTSERVICES = core test-sts +UNIXPATH = /tmp/gnunet-service-arm.sock + +[test-sts] +AUTOSTART = YES +PORT = 0 +HOSTNAME = localhost +HOME = $SERVICEHOME +CONFIG = $DEFAULTCONFIG +BINARY = test_core_api_send_to_self +ACCEPT_FROM = 127.0.0.1; +ACCEPT_FROM6 = ::1; +TOTAL_QUOTA_IN = 65536 +TOTAL_QUOTA_OUT = 65536 +UNIXPATH = /tmp/gnunet-service-sts.sock +DEBUG = YES + +[core] +AUTOSTART = YES +PORT = 0 +HOSTNAME = localhost +HOME = $SERVICEHOME +CONFIG = $DEFAULTCONFIG +BINARY = gnunet-service-core +ACCEPT_FROM = 127.0.0.1; +ACCEPT_FROM6 = ::1; +# quotas are in bytes per second now! +TOTAL_QUOTA_IN = 104857600 +TOTAL_QUOTA_OUT = 104757600 +UNIXPATH = /tmp/gnunet-service-core.sock +# DEBUG = YES +# USERNAME = +# MAXBUF = +# TIMEOUT = +# DISABLEV6 = +# BINDTO = +# REJECT_FROM = +# REJECT_FROM6 = +# PREFIX = -- 2.25.1