gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r26770 - gnunet/src/peerinfo


From: gnunet
Subject: [GNUnet-SVN] r26770 - gnunet/src/peerinfo
Date: Fri, 5 Apr 2013 11:26:21 +0200

Author: wachs
Date: 2013-04-05 11:26:21 +0200 (Fri, 05 Apr 2013)
New Revision: 26770

Added:
   gnunet/src/peerinfo/test_peerinfo_api_notify_friend_only.c
Modified:
   gnunet/src/peerinfo/Makefile.am
Log:
 test


Modified: gnunet/src/peerinfo/Makefile.am
===================================================================
--- gnunet/src/peerinfo/Makefile.am     2013-04-05 08:52:52 UTC (rev 26769)
+++ gnunet/src/peerinfo/Makefile.am     2013-04-05 09:26:21 UTC (rev 26770)
@@ -49,6 +49,7 @@
 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 @@
  $(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 = \

Added: gnunet/src/peerinfo/test_peerinfo_api_notify_friend_only.c
===================================================================
--- gnunet/src/peerinfo/test_peerinfo_api_notify_friend_only.c                  
        (rev 0)
+++ gnunet/src/peerinfo/test_peerinfo_api_notify_friend_only.c  2013-04-05 
09:26:21 UTC (rev 26770)
@@ -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 */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]