From 4d607f2f2838431cc7a349441f8f018ab99633a2 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Tue, 18 Aug 2020 18:09:58 +0200 Subject: splitting of set intersection functionality from set service (not yet finished, FTBFS) --- src/seti/test_seti_api.c | 393 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 393 insertions(+) create mode 100644 src/seti/test_seti_api.c (limited to 'src/seti/test_seti_api.c') diff --git a/src/seti/test_seti_api.c b/src/seti/test_seti_api.c new file mode 100644 index 000000000..42dedb846 --- /dev/null +++ b/src/seti/test_seti_api.c @@ -0,0 +1,393 @@ +/* + This file is part of GNUnet. + Copyright (C) 2012-2014 GNUnet e.V. + + GNUnet is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, + 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 + Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + + SPDX-License-Identifier: AGPL3.0-or-later + */ + +/** + * @file set/test_set_intersection_result_full.c + * @brief testcase for full result mode of the intersection set operation + * @author Christian Fuchs + * @author Christian Grothoff + */ +#include "platform.h" +#include "gnunet_util_lib.h" +#include "gnunet_testing_lib.h" +#include "gnunet_set_service.h" + + +static int ret; + +static struct GNUNET_PeerIdentity local_id; + +static struct GNUNET_HashCode app_id; + +static struct GNUNET_SET_Handle *set1; + +static struct GNUNET_SET_Handle *set2; + +static struct GNUNET_SET_ListenHandle *listen_handle; + +static const struct GNUNET_CONFIGURATION_Handle *config; + +static int iter_count; + +static struct GNUNET_SCHEDULER_Task *tt; + +static struct GNUNET_SET_OperationHandle *oh1; + +static struct GNUNET_SET_OperationHandle *oh2; + + +static void +result_cb_set1 (void *cls, + const struct GNUNET_SET_Element *element, + uint64_t current_size, + enum GNUNET_SET_Status status) +{ + static int count; + + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Processing result set 1 (%d)\n", + status); + switch (status) + { + case GNUNET_SET_STATUS_OK: + count++; + break; + + case GNUNET_SET_STATUS_FAILURE: + oh1 = NULL; + ret = 1; + break; + + case GNUNET_SET_STATUS_DONE: + oh1 = NULL; + GNUNET_assert (1 == count); + GNUNET_SET_destroy (set1); + set1 = NULL; + if (NULL == set2) + GNUNET_SCHEDULER_shutdown (); + break; + + default: + GNUNET_assert (0); + } +} + + +static void +result_cb_set2 (void *cls, + const struct GNUNET_SET_Element *element, + uint64_t current_size, + enum GNUNET_SET_Status status) +{ + static int count; + + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Processing result set 2 (%d)\n", + status); + switch (status) + { + case GNUNET_SET_STATUS_OK: + count++; + break; + + case GNUNET_SET_STATUS_FAILURE: + oh2 = NULL; + ret = 1; + break; + + case GNUNET_SET_STATUS_DONE: + oh2 = NULL; + GNUNET_assert (1 == count); + GNUNET_SET_destroy (set2); + set2 = NULL; + if (NULL == set1) + GNUNET_SCHEDULER_shutdown (); + break; + + default: + GNUNET_assert (0); + } +} + + +static void +listen_cb (void *cls, + const struct GNUNET_PeerIdentity *other_peer, + const struct GNUNET_MessageHeader *context_msg, + struct GNUNET_SET_Request *request) +{ + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "starting intersection by accepting and committing\n"); + GNUNET_assert (NULL != context_msg); + GNUNET_assert (ntohs (context_msg->type) == GNUNET_MESSAGE_TYPE_DUMMY); + oh2 = GNUNET_SET_accept (request, + GNUNET_SET_RESULT_FULL, + (struct GNUNET_SET_Option[]) { 0 }, + &result_cb_set2, + NULL); + GNUNET_SET_commit (oh2, + set2); +} + + +/** + * Start the set operation. + * + * @param cls closure, unused + */ +static void +start (void *cls) +{ + struct GNUNET_MessageHeader context_msg; + + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "starting listener\n"); + context_msg.size = htons (sizeof context_msg); + context_msg.type = htons (GNUNET_MESSAGE_TYPE_DUMMY); + listen_handle = GNUNET_SET_listen (config, + GNUNET_SET_OPERATION_INTERSECTION, + &app_id, + &listen_cb, + NULL); + oh1 = GNUNET_SET_prepare (&local_id, + &app_id, + &context_msg, + GNUNET_SET_RESULT_FULL, + (struct GNUNET_SET_Option[]) { 0 }, + &result_cb_set1, + NULL); + GNUNET_SET_commit (oh1, + set1); +} + + +/** + * Initialize the second set, continue + * + * @param cls closure, unused + */ +static void +init_set2 (void *cls) +{ + struct GNUNET_SET_Element element; + + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "initializing set 2\n"); + element.element_type = 0; + element.data = "hello"; + element.size = strlen (element.data); + GNUNET_SET_add_element (set2, + &element, + NULL, + NULL); + element.data = "quux"; + element.size = strlen (element.data); + GNUNET_SET_add_element (set2, + &element, + NULL, + NULL); + element.data = "baz"; + element.size = strlen (element.data); + GNUNET_SET_add_element (set2, + &element, + &start, + NULL); +} + + +/** + * Initialize the first set, continue. + */ +static void +init_set1 (void) +{ + struct GNUNET_SET_Element element; + + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "initializing set 1\n"); + element.element_type = 0; + element.data = "hello"; + element.size = strlen (element.data); + GNUNET_SET_add_element (set1, + &element, + NULL, + NULL); + element.data = "bar"; + element.size = strlen (element.data); + GNUNET_SET_add_element (set1, + &element, + &init_set2, + NULL); +} + + +static int +iter_cb (void *cls, + const struct GNUNET_SET_Element *element) +{ + if (NULL == element) + { + GNUNET_assert (iter_count == 3); + GNUNET_SET_destroy (cls); + return GNUNET_YES; + } + iter_count++; + return GNUNET_YES; +} + + +static void +test_iter () +{ + struct GNUNET_SET_Element element; + struct GNUNET_SET_Handle *iter_set; + + iter_set = GNUNET_SET_create (config, + GNUNET_SET_OPERATION_INTERSECTION); + element.element_type = 0; + element.data = "hello"; + element.size = strlen (element.data); + GNUNET_SET_add_element (iter_set, + &element, + NULL, + NULL); + element.data = "bar"; + element.size = strlen (element.data); + GNUNET_SET_add_element (iter_set, + &element, + NULL, + NULL); + element.data = "quux"; + element.size = strlen (element.data); + GNUNET_SET_add_element (iter_set, + &element, + NULL, + NULL); + GNUNET_SET_iterate (iter_set, + &iter_cb, + iter_set); +} + + +/** + * Function run on shutdown. + * + * @param cls closure + */ +static void +do_shutdown (void *cls) +{ + if (NULL != tt) + { + GNUNET_SCHEDULER_cancel (tt); + tt = NULL; + } + if (NULL != oh1) + { + GNUNET_SET_operation_cancel (oh1); + oh1 = NULL; + } + if (NULL != oh2) + { + GNUNET_SET_operation_cancel (oh2); + oh2 = NULL; + } + if (NULL != set1) + { + GNUNET_SET_destroy (set1); + set1 = NULL; + } + if (NULL != set2) + { + GNUNET_SET_destroy (set2); + set2 = NULL; + } + if (NULL != listen_handle) + { + GNUNET_SET_listen_cancel (listen_handle); + listen_handle = NULL; + } +} + + +/** + * Function run on timeout. + * + * @param cls closure + */ +static void +timeout_fail (void *cls) +{ + tt = NULL; + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + "Testcase failed with timeout\n"); + GNUNET_SCHEDULER_shutdown (); + ret = 1; +} + + +/** + * Signature of the 'main' function for a (single-peer) testcase that + * is run using 'GNUNET_TESTING_peer_run'. + * + * @param cls closure + * @param cfg configuration of the peer that was started + * @param peer identity of the peer that was created + */ +static void +run (void *cls, + const struct GNUNET_CONFIGURATION_Handle *cfg, + struct GNUNET_TESTING_Peer *peer) +{ + config = cfg; + GNUNET_TESTING_peer_get_identity (peer, + &local_id); + if (0) + test_iter (); + + tt = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply ( + GNUNET_TIME_UNIT_SECONDS, 5), + &timeout_fail, + NULL); + GNUNET_SCHEDULER_add_shutdown (&do_shutdown, + NULL); + + set1 = GNUNET_SET_create (cfg, + GNUNET_SET_OPERATION_INTERSECTION); + set2 = GNUNET_SET_create (cfg, + GNUNET_SET_OPERATION_INTERSECTION); + GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, + &app_id); + + /* test the real set reconciliation */ + init_set1 (); +} + + +int +main (int argc, + char **argv) +{ + if (0 != GNUNET_TESTING_peer_run ("test_set_intersection_result_full", + "test_set.conf", + &run, NULL)) + return 1; + return ret; +} -- cgit v1.2.3 From 076acb9981bc141c7905e0dcf3f9fcda3497a8aa Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 19 Aug 2020 00:24:48 +0200 Subject: -fix test FTBFS --- src/seti/test_seti_api.c | 224 ++++++++++++++++++----------------------------- 1 file changed, 86 insertions(+), 138 deletions(-) (limited to 'src/seti/test_seti_api.c') diff --git a/src/seti/test_seti_api.c b/src/seti/test_seti_api.c index 42dedb846..22a3a06e5 100644 --- a/src/seti/test_seti_api.c +++ b/src/seti/test_seti_api.c @@ -19,7 +19,7 @@ */ /** - * @file set/test_set_intersection_result_full.c + * @file set/test_seti_api.c * @brief testcase for full result mode of the intersection set operation * @author Christian Fuchs * @author Christian Grothoff @@ -27,7 +27,7 @@ #include "platform.h" #include "gnunet_util_lib.h" #include "gnunet_testing_lib.h" -#include "gnunet_set_service.h" +#include "gnunet_seti_service.h" static int ret; @@ -36,28 +36,26 @@ static struct GNUNET_PeerIdentity local_id; static struct GNUNET_HashCode app_id; -static struct GNUNET_SET_Handle *set1; +static struct GNUNET_SETI_Handle *set1; -static struct GNUNET_SET_Handle *set2; +static struct GNUNET_SETI_Handle *set2; -static struct GNUNET_SET_ListenHandle *listen_handle; +static struct GNUNET_SETI_ListenHandle *listen_handle; static const struct GNUNET_CONFIGURATION_Handle *config; -static int iter_count; - static struct GNUNET_SCHEDULER_Task *tt; -static struct GNUNET_SET_OperationHandle *oh1; +static struct GNUNET_SETI_OperationHandle *oh1; -static struct GNUNET_SET_OperationHandle *oh2; +static struct GNUNET_SETI_OperationHandle *oh2; static void result_cb_set1 (void *cls, - const struct GNUNET_SET_Element *element, + const struct GNUNET_SETI_Element *element, uint64_t current_size, - enum GNUNET_SET_Status status) + enum GNUNET_SETI_Status status) { static int count; @@ -66,19 +64,17 @@ result_cb_set1 (void *cls, status); switch (status) { - case GNUNET_SET_STATUS_OK: + case GNUNET_SETI_STATUS_ADD_LOCAL: count++; break; - - case GNUNET_SET_STATUS_FAILURE: + case GNUNET_SETI_STATUS_FAILURE: oh1 = NULL; ret = 1; break; - - case GNUNET_SET_STATUS_DONE: + case GNUNET_SETI_STATUS_DONE: oh1 = NULL; GNUNET_assert (1 == count); - GNUNET_SET_destroy (set1); + GNUNET_SETI_destroy (set1); set1 = NULL; if (NULL == set2) GNUNET_SCHEDULER_shutdown (); @@ -92,9 +88,9 @@ result_cb_set1 (void *cls, static void result_cb_set2 (void *cls, - const struct GNUNET_SET_Element *element, + const struct GNUNET_SETI_Element *element, uint64_t current_size, - enum GNUNET_SET_Status status) + enum GNUNET_SETI_Status status) { static int count; @@ -103,24 +99,21 @@ result_cb_set2 (void *cls, status); switch (status) { - case GNUNET_SET_STATUS_OK: + case GNUNET_SETI_STATUS_ADD_LOCAL: count++; break; - - case GNUNET_SET_STATUS_FAILURE: + case GNUNET_SETI_STATUS_FAILURE: oh2 = NULL; ret = 1; break; - - case GNUNET_SET_STATUS_DONE: + case GNUNET_SETI_STATUS_DONE: oh2 = NULL; GNUNET_assert (1 == count); - GNUNET_SET_destroy (set2); + GNUNET_SETI_destroy (set2); set2 = NULL; if (NULL == set1) GNUNET_SCHEDULER_shutdown (); break; - default: GNUNET_assert (0); } @@ -131,19 +124,23 @@ static void listen_cb (void *cls, const struct GNUNET_PeerIdentity *other_peer, const struct GNUNET_MessageHeader *context_msg, - struct GNUNET_SET_Request *request) + struct GNUNET_SETI_Request *request) { + struct GNUNET_SETI_Option opts[] = { + { .type = GNUNET_SETI_OPTION_RETURN_INTERSECTION }, + { .type = GNUNET_SETI_OPTION_END } + }; + GNUNET_log (GNUNET_ERROR_TYPE_INFO, "starting intersection by accepting and committing\n"); GNUNET_assert (NULL != context_msg); GNUNET_assert (ntohs (context_msg->type) == GNUNET_MESSAGE_TYPE_DUMMY); - oh2 = GNUNET_SET_accept (request, - GNUNET_SET_RESULT_FULL, - (struct GNUNET_SET_Option[]) { 0 }, - &result_cb_set2, - NULL); - GNUNET_SET_commit (oh2, - set2); + oh2 = GNUNET_SETI_accept (request, + opts, + &result_cb_set2, + NULL); + GNUNET_SETI_commit (oh2, + set2); } @@ -156,25 +153,27 @@ static void start (void *cls) { struct GNUNET_MessageHeader context_msg; + struct GNUNET_SETI_Option opts[] = { + { .type = GNUNET_SETI_OPTION_RETURN_INTERSECTION }, + { .type = GNUNET_SETI_OPTION_END } + }; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "starting listener\n"); - context_msg.size = htons (sizeof context_msg); + context_msg.size = htons (sizeof (context_msg)); context_msg.type = htons (GNUNET_MESSAGE_TYPE_DUMMY); - listen_handle = GNUNET_SET_listen (config, - GNUNET_SET_OPERATION_INTERSECTION, - &app_id, - &listen_cb, - NULL); - oh1 = GNUNET_SET_prepare (&local_id, - &app_id, - &context_msg, - GNUNET_SET_RESULT_FULL, - (struct GNUNET_SET_Option[]) { 0 }, - &result_cb_set1, - NULL); - GNUNET_SET_commit (oh1, - set1); + listen_handle = GNUNET_SETI_listen (config, + &app_id, + &listen_cb, + NULL); + oh1 = GNUNET_SETI_prepare (&local_id, + &app_id, + &context_msg, + opts, + &result_cb_set1, + NULL); + GNUNET_SETI_commit (oh1, + set1); } @@ -186,29 +185,29 @@ start (void *cls) static void init_set2 (void *cls) { - struct GNUNET_SET_Element element; + struct GNUNET_SETI_Element element; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "initializing set 2\n"); element.element_type = 0; element.data = "hello"; element.size = strlen (element.data); - GNUNET_SET_add_element (set2, - &element, - NULL, - NULL); + GNUNET_SETI_add_element (set2, + &element, + NULL, + NULL); element.data = "quux"; element.size = strlen (element.data); - GNUNET_SET_add_element (set2, - &element, - NULL, - NULL); + GNUNET_SETI_add_element (set2, + &element, + NULL, + NULL); element.data = "baz"; element.size = strlen (element.data); - GNUNET_SET_add_element (set2, - &element, - &start, - NULL); + GNUNET_SETI_add_element (set2, + &element, + &start, + NULL); } @@ -218,71 +217,23 @@ init_set2 (void *cls) static void init_set1 (void) { - struct GNUNET_SET_Element element; + struct GNUNET_SETI_Element element; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "initializing set 1\n"); element.element_type = 0; element.data = "hello"; element.size = strlen (element.data); - GNUNET_SET_add_element (set1, - &element, - NULL, - NULL); - element.data = "bar"; - element.size = strlen (element.data); - GNUNET_SET_add_element (set1, - &element, - &init_set2, - NULL); -} - - -static int -iter_cb (void *cls, - const struct GNUNET_SET_Element *element) -{ - if (NULL == element) - { - GNUNET_assert (iter_count == 3); - GNUNET_SET_destroy (cls); - return GNUNET_YES; - } - iter_count++; - return GNUNET_YES; -} - - -static void -test_iter () -{ - struct GNUNET_SET_Element element; - struct GNUNET_SET_Handle *iter_set; - - iter_set = GNUNET_SET_create (config, - GNUNET_SET_OPERATION_INTERSECTION); - element.element_type = 0; - element.data = "hello"; - element.size = strlen (element.data); - GNUNET_SET_add_element (iter_set, - &element, - NULL, - NULL); + GNUNET_SETI_add_element (set1, + &element, + NULL, + NULL); element.data = "bar"; element.size = strlen (element.data); - GNUNET_SET_add_element (iter_set, - &element, - NULL, - NULL); - element.data = "quux"; - element.size = strlen (element.data); - GNUNET_SET_add_element (iter_set, - &element, - NULL, - NULL); - GNUNET_SET_iterate (iter_set, - &iter_cb, - iter_set); + GNUNET_SETI_add_element (set1, + &element, + &init_set2, + NULL); } @@ -301,27 +252,27 @@ do_shutdown (void *cls) } if (NULL != oh1) { - GNUNET_SET_operation_cancel (oh1); + GNUNET_SETI_operation_cancel (oh1); oh1 = NULL; } if (NULL != oh2) { - GNUNET_SET_operation_cancel (oh2); + GNUNET_SETI_operation_cancel (oh2); oh2 = NULL; } if (NULL != set1) { - GNUNET_SET_destroy (set1); + GNUNET_SETI_destroy (set1); set1 = NULL; } if (NULL != set2) { - GNUNET_SET_destroy (set2); + GNUNET_SETI_destroy (set2); set2 = NULL; } if (NULL != listen_handle) { - GNUNET_SET_listen_cancel (listen_handle); + GNUNET_SETI_listen_cancel (listen_handle); listen_handle = NULL; } } @@ -359,20 +310,16 @@ run (void *cls, config = cfg; GNUNET_TESTING_peer_get_identity (peer, &local_id); - if (0) - test_iter (); - - tt = GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply ( - GNUNET_TIME_UNIT_SECONDS, 5), - &timeout_fail, - NULL); + tt = GNUNET_SCHEDULER_add_delayed ( + GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, + 5), + &timeout_fail, + NULL); GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL); - set1 = GNUNET_SET_create (cfg, - GNUNET_SET_OPERATION_INTERSECTION); - set2 = GNUNET_SET_create (cfg, - GNUNET_SET_OPERATION_INTERSECTION); + set1 = GNUNET_SETI_create (cfg); + set2 = GNUNET_SETI_create (cfg); GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, &app_id); @@ -385,9 +332,10 @@ int main (int argc, char **argv) { - if (0 != GNUNET_TESTING_peer_run ("test_set_intersection_result_full", - "test_set.conf", - &run, NULL)) + if (0 != GNUNET_TESTING_peer_run ("test_seti_api", + "test_seti.conf", + &run, + NULL)) return 1; return ret; } -- cgit v1.2.3 From 5660868ce7523c4bda8e25954fda0ae2d28a9702 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 19 Aug 2020 10:55:36 +0200 Subject: fix seti testcase --- src/seti/gnunet-service-seti.c | 6 ++++++ src/seti/seti_api.c | 3 ++- src/seti/test_seti_api.c | 12 ++++++++---- 3 files changed, 16 insertions(+), 5 deletions(-) (limited to 'src/seti/test_seti_api.c') diff --git a/src/seti/gnunet-service-seti.c b/src/seti/gnunet-service-seti.c index 618d53128..af478233b 100644 --- a/src/seti/gnunet-service-seti.c +++ b/src/seti/gnunet-service-seti.c @@ -2200,6 +2200,9 @@ handle_client_evaluate (void *cls, UINT32_MAX); op->peer = msg->target_peer; op->return_intersection = htonl (msg->return_intersection); + fprintf (stderr, + "Return intersection for evaluate is %d\n", + op->return_intersection); op->client_request_id = ntohl (msg->request_id); context = GNUNET_MQ_extract_nested_mh (msg); @@ -2364,6 +2367,9 @@ handle_client_accept (void *cls, listener = op->listener; op->listener = NULL; op->return_intersection = htonl (msg->return_intersection); + fprintf (stderr, + "Return intersection for accept is %d\n", + op->return_intersection); GNUNET_CONTAINER_DLL_remove (listener->op_head, listener->op_tail, op); diff --git a/src/seti/seti_api.c b/src/seti/seti_api.c index 337b7b219..5b88b0469 100644 --- a/src/seti/seti_api.c +++ b/src/seti/seti_api.c @@ -806,7 +806,8 @@ GNUNET_SETI_accept (struct GNUNET_SETI_Request *request, switch (opt->type) { case GNUNET_SETI_OPTION_RETURN_INTERSECTION: - oh->return_intersection = htonl (GNUNET_YES); + oh->return_intersection = GNUNET_YES; + msg->return_intersection = htonl (GNUNET_YES); break; default: LOG (GNUNET_ERROR_TYPE_ERROR, diff --git a/src/seti/test_seti_api.c b/src/seti/test_seti_api.c index 22a3a06e5..9074fab41 100644 --- a/src/seti/test_seti_api.c +++ b/src/seti/test_seti_api.c @@ -1,6 +1,6 @@ /* This file is part of GNUnet. - Copyright (C) 2012-2014 GNUnet e.V. + Copyright (C) 2012-2014, 2020 GNUnet e.V. GNUnet is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published @@ -108,14 +108,18 @@ result_cb_set2 (void *cls, break; case GNUNET_SETI_STATUS_DONE: oh2 = NULL; - GNUNET_assert (1 == count); + GNUNET_break (1 == count); + if (1 != count) + ret |= 2; GNUNET_SETI_destroy (set2); set2 = NULL; if (NULL == set1) GNUNET_SCHEDULER_shutdown (); break; - default: - GNUNET_assert (0); + case GNUNET_SETI_STATUS_DEL_LOCAL: + /* unexpected! */ + ret = 1; + break; } } -- cgit v1.2.3