From 893acb679e80a7ad9c38885711139a9619fb4c6c Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Fri, 5 Apr 2013 09:26:21 +0000 Subject: test --- src/peerinfo/Makefile.am | 9 + .../test_peerinfo_api_notify_friend_only.c | 258 +++++++++++++++++++++ 2 files changed, 267 insertions(+) create mode 100644 src/peerinfo/test_peerinfo_api_notify_friend_only.c (limited to 'src') diff --git a/src/peerinfo/Makefile.am b/src/peerinfo/Makefile.am index 5a2558048..89ce66a26 100644 --- a/src/peerinfo/Makefile.am +++ b/src/peerinfo/Makefile.am @@ -49,6 +49,7 @@ endif check_PROGRAMS = \ test_peerinfo_api \ test_peerinfo_api_friend_only \ + test_peerinfo_api_notify_friend_only \ $(PEERINFO_BENCHMARKS) if ENABLE_TEST_RUN @@ -71,6 +72,14 @@ test_peerinfo_api_friend_only_LDADD = \ $(top_builddir)/src/testing/libgnunettesting.la \ $(top_builddir)/src/util/libgnunetutil.la +test_peerinfo_api_notify_friend_only_SOURCES = \ + test_peerinfo_api_notify_friend_only.c +test_peerinfo_api_notify_friend_only_LDADD = \ + $(top_builddir)/src/hello/libgnunethello.la \ + $(top_builddir)/src/peerinfo/libgnunetpeerinfo.la \ + $(top_builddir)/src/testing/libgnunettesting.la \ + $(top_builddir)/src/util/libgnunetutil.la + perf_peerinfo_api_SOURCES = \ perf_peerinfo_api.c perf_peerinfo_api_LDADD = \ diff --git a/src/peerinfo/test_peerinfo_api_notify_friend_only.c b/src/peerinfo/test_peerinfo_api_notify_friend_only.c new file mode 100644 index 000000000..3afd50e68 --- /dev/null +++ b/src/peerinfo/test_peerinfo_api_notify_friend_only.c @@ -0,0 +1,258 @@ +/* + This file is part of GNUnet. + (C) 2004, 2009 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 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 peerinfo/test_peerinfo_api_notify_friend_only.c + * @brief testcase friend only HELLO restrictions in for peerinfo + * @author Christian Grothoff + * @author Matthias Wachs + * + * TODO: + * - test merging of HELLOs (add same peer twice...) + */ +#include "platform.h" +#include "gnunet_hello_lib.h" +#include "gnunet_util_lib.h" +#include "gnunet_peerinfo_service.h" +#include "gnunet_testing_lib.h" +#include "peerinfo.h" + +#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5) + +static struct GNUNET_PEERINFO_Handle *h; +static struct GNUNET_PEERINFO_NotifyContext *pnc_w_fo; +static struct GNUNET_PEERINFO_NotifyContext *pnc_wo_fo; + +static const struct GNUNET_CONFIGURATION_Handle *mycfg; + + +static int global_ret; + +/** + * Did we get a HELLO callback for notification handle with friend HELLOS + * (expected) + */ +static int res_cb_w_fo; + +/** + * Did we get a HELLO callback for notification handle without friend HELLOS + * (not expected) + */ +static int res_cb_wo_fo; + +GNUNET_SCHEDULER_TaskIdentifier timeout_task; + + +static void +end_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + timeout_task = GNUNET_SCHEDULER_NO_TASK; + GNUNET_break (0); + if (NULL != pnc_wo_fo) + { + GNUNET_PEERINFO_notify_cancel (pnc_wo_fo); + pnc_wo_fo = NULL; + } + if (NULL != pnc_w_fo) + { + GNUNET_PEERINFO_notify_cancel (pnc_w_fo); + pnc_w_fo = NULL; + } + if (NULL != h) + { + GNUNET_PEERINFO_disconnect (h); + h = NULL; + } + global_ret = 255; +} + +static void +done (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + if (NULL != pnc_w_fo) + GNUNET_PEERINFO_notify_cancel (pnc_w_fo); + pnc_w_fo = NULL; + if (NULL != pnc_wo_fo) + GNUNET_PEERINFO_notify_cancel (pnc_wo_fo); + pnc_wo_fo = NULL; + GNUNET_PEERINFO_disconnect (h); + h = NULL; + + if (GNUNET_SCHEDULER_NO_TASK != timeout_task) + { + GNUNET_SCHEDULER_cancel (timeout_task); + timeout_task = GNUNET_SCHEDULER_NO_TASK; + } + + if ((GNUNET_YES == res_cb_w_fo) && (GNUNET_NO == res_cb_wo_fo)) + global_ret = 0; + else + GNUNET_break (0); +} + +static size_t +address_generator (void *cls, size_t max, void *buf) +{ + size_t *agc = cls; + size_t ret; + struct GNUNET_HELLO_Address address; + + if (0 == *agc) + return 0; + memset (&address.peer, 0, sizeof (struct GNUNET_PeerIdentity)); + address.address = "Address"; + address.transport_name = "peerinfotest"; + address.address_length = *agc; + ret = + GNUNET_HELLO_add_address (&address, + GNUNET_TIME_relative_to_absolute + (GNUNET_TIME_UNIT_HOURS), buf, max); + (*agc)--; + return ret; +} + +static void +process_w_fo (void *cls, const struct GNUNET_PeerIdentity *peer, + const struct GNUNET_HELLO_Message *hello, const char *err_msg) +{ + if (err_msg != NULL) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Error in communication with PEERINFO service\n")); + GNUNET_SCHEDULER_add_now(&done, NULL); + return; + } + + if (NULL != peer) + { + if (NULL == hello) + return; + + if (GNUNET_NO == GNUNET_HELLO_is_friend_only(hello)) + { + GNUNET_break (0); + return; + } + + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Received %s HELLO\n", + (GNUNET_YES == GNUNET_HELLO_is_friend_only (hello)) ? "friend only" : "public"); + res_cb_w_fo = GNUNET_YES; + GNUNET_SCHEDULER_add_now(&done, NULL); + return; + } +} + +static void +process_wo_fo (void *cls, const struct GNUNET_PeerIdentity *peer, + const struct GNUNET_HELLO_Message *hello, const char *err_msg) +{ + if (err_msg != NULL) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, + _("Error in communication with PEERINFO service\n")); + GNUNET_SCHEDULER_add_now(&done, NULL); + return; + } + + if (NULL != peer) + { + if (NULL == hello) + return; + + GNUNET_break (0); + + if (GNUNET_YES == GNUNET_HELLO_is_friend_only(hello)) + { + GNUNET_break (0); + return; + } + + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Received %s HELLO\n", + (GNUNET_YES == GNUNET_HELLO_is_friend_only (hello)) ? "friend only" : "public"); + res_cb_wo_fo = GNUNET_YES; + } +} + +static void +add_peer_done (void *cls, const char *emsg) +{ + if (NULL == emsg) + { + pnc_w_fo = GNUNET_PEERINFO_notify (mycfg, GNUNET_YES, &process_w_fo, NULL); + pnc_wo_fo = GNUNET_PEERINFO_notify (mycfg, GNUNET_NO, &process_wo_fo, NULL); + return; + } + else + { + GNUNET_break (0); + GNUNET_SCHEDULER_cancel (timeout_task); + timeout_task = GNUNET_SCHEDULER_add_now (&end_badly, NULL); + } +} + + + +static void +add_peer () +{ + struct GNUNET_CRYPTO_EccPublicKeyBinaryEncoded pkey; + struct GNUNET_PeerIdentity pid; + struct GNUNET_HELLO_Message *h2; + size_t agc; + + agc = 2; + memset (&pkey, 32, sizeof (pkey)); + GNUNET_CRYPTO_hash (&pkey, sizeof (pkey), &pid.hashPubKey); + h2 = GNUNET_HELLO_create (&pkey, &address_generator, &agc, GNUNET_YES); + GNUNET_PEERINFO_add_peer (h, h2, &add_peer_done, NULL); + GNUNET_free (h2); + +} + + + +static void +run (void *cls, + const struct GNUNET_CONFIGURATION_Handle *cfg, + struct GNUNET_TESTING_Peer *peer) +{ + timeout_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL); + mycfg = cfg; + h = GNUNET_PEERINFO_connect (cfg); + GNUNET_assert (NULL != h); + add_peer (); +} + + +int +main (int argc, char *argv[]) +{ + res_cb_w_fo = GNUNET_NO; + res_cb_wo_fo = GNUNET_NO; + global_ret = 3; + if (0 != GNUNET_TESTING_service_run ("test-peerinfo-api-friend-only", + "peerinfo", + "test_peerinfo_api_data.conf", + &run, NULL)) + return 1; + return global_ret; +} + +/* end of test_peerinfo_api_notify_friend_only.c */ -- cgit v1.2.3