From 18d7b243b873410c7101d97bd8c9fabb36bdb404 Mon Sep 17 00:00:00 2001 From: Matthias Wachs Date: Wed, 7 Mar 2012 10:34:07 +0000 Subject: - final zone iteration code --- src/namestore/Makefile.am | 7 + src/namestore/gnunet-service-namestore.c | 35 +- src/namestore/namestore_api.c | 15 +- src/namestore/test_namestore_api_zone_iteration.c | 119 ++++- ...st_namestore_api_zone_iteration_specific_zone.c | 47 +- .../test_namestore_api_zone_iteration_stop.c | 482 +++++++++++++++++++++ 6 files changed, 668 insertions(+), 37 deletions(-) create mode 100644 src/namestore/test_namestore_api_zone_iteration_stop.c (limited to 'src') diff --git a/src/namestore/Makefile.am b/src/namestore/Makefile.am index c52051082..3c91198f0 100644 --- a/src/namestore/Makefile.am +++ b/src/namestore/Makefile.am @@ -37,6 +37,7 @@ check_PROGRAMS = \ test_namestore_api_zone_to_name \ test_namestore_api_zone_iteration \ test_namestore_api_zone_iteration_specific_zone \ + test_namestore_api_zone_iteration_stop \ test_namestore_record_serialization if ENABLE_TEST_RUN @@ -176,6 +177,12 @@ test_namestore_api_zone_iteration_specific_zone_SOURCES = \ test_namestore_api_zone_iteration_specific_zone_LDADD = \ $(top_builddir)/src/util/libgnunetutil.la \ $(top_builddir)/src/namestore/libgnunetnamestore.la + +test_namestore_api_zone_iteration_stop_SOURCES = \ + test_namestore_api_zone_iteration_stop.c +test_namestore_api_zone_iteration_stop_LDADD = \ + $(top_builddir)/src/util/libgnunetutil.la \ + $(top_builddir)/src/namestore/libgnunetnamestore.la test_namestore_record_serialization_SOURCES = \ test_namestore_record_serialization.c diff --git a/src/namestore/gnunet-service-namestore.c b/src/namestore/gnunet-service-namestore.c index 59059d84e..c92f39a59 100644 --- a/src/namestore/gnunet-service-namestore.c +++ b/src/namestore/gnunet-service-namestore.c @@ -43,11 +43,15 @@ struct GNUNET_NAMESTORE_ZoneIteration struct GNUNET_NAMESTORE_Client * client; + int has_zone; + GNUNET_HashCode zone; uint64_t request_id; uint32_t offset; + + }; @@ -1174,7 +1178,11 @@ void zone_iteration_proc (void *cls, if ((zone_key == NULL) && (name == NULL)) { struct ZoneIterationResponseMessage zir_msg; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "No more results for zone `%s'\n", GNUNET_h2s(&zi->zone)); + if (zi->has_zone == GNUNET_YES) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "No more results for zone `%s'\n", GNUNET_h2s(&zi->zone)); + else + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "No more results for all zones\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending empty `%s' message\n", "ZONE_ITERATION_RESPONSE"); zir_msg.gns_header.header.type = htons (GNUNET_MESSAGE_TYPE_NAMESTORE_ZONE_ITERATION_RESPONSE); zir_msg.gns_header.header.size = htons (sizeof (struct ZoneIterationResponseMessage)); @@ -1196,7 +1204,13 @@ void zone_iteration_proc (void *cls, else { struct ZoneIterationResponseMessage *zir_msg; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending name `%s' for iterating zone `%s'\n", name, GNUNET_h2s(&zi->zone)); + if (zi->has_zone == GNUNET_YES) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending name `%s' for iteration over zone `%s'\n", + name, GNUNET_h2s(&zi->zone)); + if (zi->has_zone == GNUNET_NO) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending name `%s' for iteration over all zones\n", + name); + size_t name_len; size_t rd_ser_len; size_t msg_size; @@ -1263,11 +1277,13 @@ static void handle_iteration_start (void *cls, if (0 == memcmp (&dummy, &zis_msg->zone, sizeof (dummy))) { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting to iterate over all zones\n"); + zi->has_zone = GNUNET_NO; zone_tmp = NULL; } else { GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Starting to iterate over zone `%s'\n", GNUNET_h2s (&zis_msg->zone)); + zi->has_zone = GNUNET_YES; zone_tmp = &zis_msg->zone; } @@ -1311,7 +1327,10 @@ static void handle_iteration_stop (void *cls, } GNUNET_CONTAINER_DLL_remove(nc->op_head, nc->op_tail, zi); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopped zone iteration for zone `%s'\n", GNUNET_h2s (&zi->zone)); + if (GNUNET_YES == zi->has_zone) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopped zone iteration for zone `%s'\n", GNUNET_h2s (&zi->zone)); + else + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopped zone iteration all zones\n"); GNUNET_free (zi); GNUNET_SERVER_receive_done (client, GNUNET_OK); @@ -1325,6 +1344,7 @@ static void handle_iteration_next (void *cls, struct GNUNET_NAMESTORE_Client *nc; struct GNUNET_NAMESTORE_ZoneIteration *zi; + GNUNET_HashCode *zone_tmp; struct ZoneIterationStopMessage * zis_msg = (struct ZoneIterationStopMessage *) message; uint32_t rid; @@ -1348,9 +1368,14 @@ static void handle_iteration_next (void *cls, GNUNET_SERVER_receive_done (client, GNUNET_OK); return; } - zi->offset++; - GSN_database->iterate_records (GSN_database->cls, &zi->zone, NULL, zi->offset , &zone_iteration_proc, zi); + if (GNUNET_YES == zi->has_zone) + zone_tmp = &zi->zone; + else + zone_tmp = NULL; + + zi->offset++; + GSN_database->iterate_records (GSN_database->cls, zone_tmp, NULL, zi->offset , &zone_iteration_proc, zi); GNUNET_SERVER_receive_done (client, GNUNET_OK); } diff --git a/src/namestore/namestore_api.c b/src/namestore/namestore_api.c index 64db49375..87894cee3 100644 --- a/src/namestore/namestore_api.c +++ b/src/namestore/namestore_api.c @@ -1477,13 +1477,19 @@ GNUNET_NAMESTORE_zone_iteration_start (struct GNUNET_NAMESTORE_Handle *h, msg->gns_header.header.size = htons (msg_size); msg->gns_header.r_id = htonl (rid); if (NULL != zone) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for zone `%s'\n", "ZONE_ITERATION_START", GNUNET_h2s(zone)); msg->zone = *zone; + } else + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for all zones\n", "ZONE_ITERATION_START"); memset (&msg->zone, '\0', sizeof (msg->zone)); + } msg->must_have_flags = ntohs (must_have_flags); msg->must_not_have_flags = ntohs (must_not_have_flags); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for zone `%s'\n", "ZONE_ITERATION_START", GNUNET_h2s(zone)); + /* transmit message */ GNUNET_CONTAINER_DLL_insert_tail (h->pending_head, h->pending_tail, pe); @@ -1522,7 +1528,7 @@ GNUNET_NAMESTORE_zone_iterator_next (struct GNUNET_NAMESTORE_ZoneIterator *it) msg->gns_header.header.size = htons (msg_size); msg->gns_header.r_id = htonl (it->op_id); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for name `%s'\n", "ZONE_ITERATION_NEXT", GNUNET_h2s(&it->zone)); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message\n", "ZONE_ITERATION_NEXT"); /* transmit message */ GNUNET_CONTAINER_DLL_insert_tail (h->pending_head, h->pending_tail, pe); @@ -1556,7 +1562,10 @@ GNUNET_NAMESTORE_zone_iteration_stop (struct GNUNET_NAMESTORE_ZoneIterator *it) msg->gns_header.header.size = htons (msg_size); msg->gns_header.r_id = htonl (it->op_id); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for name `%s'\n", "ZONE_ITERATION_STOP", GNUNET_h2s(&it->zone)); + if (GNUNET_YES == it->has_zone) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for zone `%s'\n", "ZONE_ITERATION_STOP", GNUNET_h2s(&it->zone)); + else + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending `%s' message for all zones\n", "ZONE_ITERATION_STOP"); /* transmit message */ GNUNET_CONTAINER_DLL_insert_tail (h->pending_head, h->pending_tail, pe); diff --git a/src/namestore/test_namestore_api_zone_iteration.c b/src/namestore/test_namestore_api_zone_iteration.c index e70a3baf0..92e8e7988 100644 --- a/src/namestore/test_namestore_api_zone_iteration.c +++ b/src/namestore/test_namestore_api_zone_iteration.c @@ -19,7 +19,7 @@ */ /** * @file namestore/test_namestore_api_zone_iteration.c - * @brief testcase for namestore_api.c zone iteration functionality + * @brief testcase for zone iteration functionality: iterate of a specific zone */ #include "platform.h" #include "gnunet_common.h" @@ -40,8 +40,13 @@ static struct GNUNET_CRYPTO_RsaPrivateKey * privkey; static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pubkey; static GNUNET_HashCode zone; +static struct GNUNET_CRYPTO_RsaPrivateKey * privkey2; +static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pubkey2; +static GNUNET_HashCode zone2; + static struct GNUNET_NAMESTORE_ZoneIterator *zi; static int res; +static int returned_records; struct GNUNET_CRYPTO_RsaSignature *sig_1; char * s_name_1; @@ -51,6 +56,10 @@ struct GNUNET_CRYPTO_RsaSignature *sig_2; char * s_name_2; struct GNUNET_NAMESTORE_RecordData *s_rd_2; +struct GNUNET_CRYPTO_RsaSignature *sig_3; +char * s_name_3; +struct GNUNET_NAMESTORE_RecordData *s_rd_3; + static void start_arm (const char *cfgname) { @@ -98,8 +107,11 @@ endbadly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) GNUNET_free_non_null(sig_1); GNUNET_free_non_null(sig_2); + GNUNET_free_non_null(sig_3); GNUNET_free_non_null(s_name_1); GNUNET_free_non_null(s_name_2); + GNUNET_free_non_null(s_name_3); + if (s_rd_1 != NULL) { GNUNET_free ((void *)s_rd_1->data); @@ -110,11 +122,20 @@ endbadly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) GNUNET_free ((void *)s_rd_2->data); GNUNET_free (s_rd_2); } + if (s_rd_3 != NULL) + { + GNUNET_free ((void *)s_rd_3->data); + GNUNET_free (s_rd_3); + } if (privkey != NULL) GNUNET_CRYPTO_rsa_key_free (privkey); privkey = NULL; + if (privkey2 != NULL) + GNUNET_CRYPTO_rsa_key_free (privkey2); + privkey2 = NULL; + if (NULL != arm) stop_arm(); @@ -137,15 +158,20 @@ end (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) endbadly_task = GNUNET_SCHEDULER_NO_TASK; } - if (privkey != NULL) GNUNET_CRYPTO_rsa_key_free (privkey); privkey = NULL; - GNUNET_free_non_null(sig_1); - GNUNET_free_non_null(sig_2); - GNUNET_free_non_null(s_name_1); - GNUNET_free_non_null(s_name_2); + if (privkey2 != NULL) + GNUNET_CRYPTO_rsa_key_free (privkey2); + privkey2 = NULL; + + GNUNET_free (sig_1); + GNUNET_free (sig_2); + GNUNET_free (sig_3); + GNUNET_free (s_name_1); + GNUNET_free (s_name_2); + GNUNET_free (s_name_3); if (s_rd_1 != NULL) { GNUNET_free ((void *)s_rd_1->data); @@ -156,6 +182,11 @@ end (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) GNUNET_free ((void *)s_rd_2->data); GNUNET_free (s_rd_2); } + if (s_rd_3 != NULL) + { + GNUNET_free ((void *)s_rd_3->data); + GNUNET_free (s_rd_3); + } if (nsh != NULL) GNUNET_NAMESTORE_disconnect (nsh, GNUNET_YES); @@ -164,8 +195,6 @@ end (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) if (NULL != arm) stop_arm(); - - res = 0; } void zone_proc (void *cls, @@ -177,10 +206,15 @@ void zone_proc (void *cls, const struct GNUNET_CRYPTO_RsaSignature *signature) { int failed = GNUNET_NO; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Callback for zone `%s'\n", GNUNET_h2s (&zone)); if ((zone_key == NULL) && (name == NULL)) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received last result, iteration done\n"); + GNUNET_break (3 == returned_records); + if (3 == returned_records) + res = 0; + else + res = 1; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received last result, iteration done after receing %u results\n",returned_records ); GNUNET_SCHEDULER_add_now (&end, NULL); } else @@ -227,17 +261,39 @@ void zone_proc (void *cls, failed = GNUNET_YES; GNUNET_break (0); } - + } + else if (0 == strcmp (name, s_name_3)) + { + if (rd_count == 1) + { + if (GNUNET_YES != GNUNET_NAMESTORE_records_cmp(rd, s_rd_3)) + { + failed = GNUNET_YES; + GNUNET_break (0); + } + } + else + { + failed = GNUNET_YES; + GNUNET_break (0); + } + if (0 != memcmp (signature, sig_3, sizeof (struct GNUNET_CRYPTO_RsaSignature))) + { + failed = GNUNET_YES; + GNUNET_break (0); + } } else { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Comparing result `%s'\n", name); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Comparing result failed: got name `%s'\n", name); + res = 1; GNUNET_break (0); GNUNET_SCHEDULER_add_now (&end, NULL); } if (failed == GNUNET_NO) { + returned_records ++; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Telling namestore to send the next result\n"); GNUNET_NAMESTORE_zone_iterator_next (zi); } @@ -276,11 +332,20 @@ put_cont (void *cls, int32_t success, const char *emsg) { c++; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record %u \n", c); - + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to created records\n"); + GNUNET_break (0); + GNUNET_SCHEDULER_cancel (endbadly_task); + endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL); } - if (c == 2) + if (c == 3) { + res = 1; + returned_records = 0; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "All records created, starting iteration over all zones \n"); zi = GNUNET_NAMESTORE_zone_iteration_start(nsh, NULL, GNUNET_NAMESTORE_RF_NONE, @@ -289,6 +354,7 @@ put_cont (void *cls, int32_t success, const char *emsg) &zone); if (zi == NULL) { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to create zone iterator\n"); GNUNET_break (0); GNUNET_SCHEDULER_cancel (endbadly_task); endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL); @@ -305,11 +371,11 @@ create_record (int count) for (c = 0; c < count; c++) { - rd[c].expiration = GNUNET_TIME_absolute_get(); - rd[c].record_type = 1111; - rd[c].data_size = 50; - rd[c].data = GNUNET_malloc(50); - memset ((char *) rd[c].data, 'a', 50); + rd[c].expiration = GNUNET_TIME_absolute_get(); + rd[c].record_type = 1111; + rd[c].data_size = 50; + rd[c].data = GNUNET_malloc(50); + memset ((char *) rd[c].data, 'a', 50); } return rd; } @@ -326,6 +392,12 @@ run (void *cls, char *const *args, const char *cfgfile, GNUNET_CRYPTO_rsa_key_get_public(privkey, &pubkey); GNUNET_CRYPTO_hash(&pubkey, sizeof (pubkey), &zone); + privkey2 = GNUNET_CRYPTO_rsa_key_create_from_file("hostkey2"); + GNUNET_assert (privkey2 != NULL); + GNUNET_CRYPTO_rsa_key_get_public(privkey2, &pubkey2); + GNUNET_CRYPTO_hash(&pubkey2, sizeof (pubkey), &zone2); + + start_arm (cfgfile); GNUNET_assert (arm != NULL); @@ -334,8 +406,6 @@ run (void *cls, char *const *args, const char *cfgfile, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 1\n"); - - GNUNET_asprintf(&s_name_1, "dummy1"); s_rd_1 = create_record(1); sig_1 = GNUNET_NAMESTORE_create_signature(privkey, s_name_1, s_rd_1, 1); @@ -348,6 +418,13 @@ run (void *cls, char *const *args, const char *cfgfile, sig_2 = GNUNET_NAMESTORE_create_signature(privkey, s_name_2, s_rd_2, 1); GNUNET_NAMESTORE_record_create(nsh, privkey, s_name_2, s_rd_2, &put_cont, NULL); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 3\n"); + /* name in different zone */ + GNUNET_asprintf(&s_name_3, "dummy3"); + s_rd_3 = create_record(1); + sig_3 = GNUNET_NAMESTORE_create_signature(privkey, s_name_3, s_rd_3, 1); + GNUNET_NAMESTORE_record_put (nsh, &pubkey2, s_name_3, GNUNET_TIME_absolute_get_forever(), 1, s_rd_3, sig_3, &put_cont, NULL); } static int diff --git a/src/namestore/test_namestore_api_zone_iteration_specific_zone.c b/src/namestore/test_namestore_api_zone_iteration_specific_zone.c index 7d98eefb0..7cdcea42a 100644 --- a/src/namestore/test_namestore_api_zone_iteration_specific_zone.c +++ b/src/namestore/test_namestore_api_zone_iteration_specific_zone.c @@ -18,8 +18,8 @@ Boston, MA 02111-1307, USA. */ /** - * @file namestore/test_namestore_api_zone_iteration.c - * @brief testcase for namestore_api.c zone iteration functionality + * @file namestore/test_namestore_api_zone_iteration_specific_zone.c + * @brief testcase for zone iteration functionality: iterate of a specific zone */ #include "platform.h" #include "gnunet_common.h" @@ -46,6 +46,7 @@ static GNUNET_HashCode zone2; static struct GNUNET_NAMESTORE_ZoneIterator *zi; static int res; +static int returned_records; struct GNUNET_CRYPTO_RsaSignature *sig_1; char * s_name_1; @@ -106,8 +107,10 @@ endbadly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) GNUNET_free_non_null(sig_1); GNUNET_free_non_null(sig_2); + GNUNET_free_non_null(sig_3); GNUNET_free_non_null(s_name_1); GNUNET_free_non_null(s_name_2); + GNUNET_free_non_null(s_name_3); if (s_rd_1 != NULL) { @@ -119,11 +122,20 @@ endbadly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) GNUNET_free ((void *)s_rd_2->data); GNUNET_free (s_rd_2); } + if (s_rd_3 != NULL) + { + GNUNET_free ((void *)s_rd_3->data); + GNUNET_free (s_rd_3); + } if (privkey != NULL) GNUNET_CRYPTO_rsa_key_free (privkey); privkey = NULL; + if (privkey2 != NULL) + GNUNET_CRYPTO_rsa_key_free (privkey2); + privkey2 = NULL; + if (NULL != arm) stop_arm(); @@ -150,10 +162,16 @@ end (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) GNUNET_CRYPTO_rsa_key_free (privkey); privkey = NULL; + if (privkey2 != NULL) + GNUNET_CRYPTO_rsa_key_free (privkey2); + privkey2 = NULL; + GNUNET_free (sig_1); GNUNET_free (sig_2); + GNUNET_free (sig_3); GNUNET_free (s_name_1); GNUNET_free (s_name_2); + GNUNET_free (s_name_3); if (s_rd_1 != NULL) { GNUNET_free ((void *)s_rd_1->data); @@ -164,6 +182,11 @@ end (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) GNUNET_free ((void *)s_rd_2->data); GNUNET_free (s_rd_2); } + if (s_rd_3 != NULL) + { + GNUNET_free ((void *)s_rd_3->data); + GNUNET_free (s_rd_3); + } if (nsh != NULL) GNUNET_NAMESTORE_disconnect (nsh, GNUNET_YES); @@ -186,7 +209,13 @@ void zone_proc (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Callback for zone `%s'\n", GNUNET_h2s (&zone)); if ((zone_key == NULL) && (name == NULL)) { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received last result, iteration done\n"); + GNUNET_break (2 == returned_records); + if (2 == returned_records) + res = 0; + else + res = 1; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received last result, iteration done after %u records\n", returned_records); GNUNET_SCHEDULER_add_now (&end, NULL); } else @@ -236,14 +265,15 @@ void zone_proc (void *cls, } else { - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Comparing result `%s'\n", name); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Comparing result failed: got name `%s'\n", name); + res = 1; GNUNET_break (0); GNUNET_SCHEDULER_add_now (&end, NULL); } if (failed == GNUNET_NO) { - res --; + returned_records ++; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Telling namestore to send the next result\n"); GNUNET_NAMESTORE_zone_iterator_next (zi); } @@ -291,9 +321,10 @@ put_cont (void *cls, int32_t success, const char *emsg) endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL); } - if (c == 2) + if (c == 3) { - res = 2; + res = 1; + returned_records = 0; GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "All records created, starting iteration over zone `%s'\n", GNUNET_h2s(&zone)); zi = GNUNET_NAMESTORE_zone_iteration_start(nsh, @@ -408,4 +439,4 @@ main (int argc, char *argv[]) return ret; } -/* end of test_namestore_api_zone_iteration.c */ +/* end of test_namestore_api_zone_iteration_specific_zone.c */ diff --git a/src/namestore/test_namestore_api_zone_iteration_stop.c b/src/namestore/test_namestore_api_zone_iteration_stop.c new file mode 100644 index 000000000..36a08d7db --- /dev/null +++ b/src/namestore/test_namestore_api_zone_iteration_stop.c @@ -0,0 +1,482 @@ +/* + This file is part of GNUnet. + (C) 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 namestore/test_namestore_api_zone_iteration.c + * @brief testcase for zone iteration functionality: iterate of a specific zone + */ +#include "platform.h" +#include "gnunet_common.h" +#include "gnunet_namestore_service.h" +#include "namestore.h" + +#define VERBOSE GNUNET_NO + +#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 5) + +static struct GNUNET_NAMESTORE_Handle * nsh; + +static GNUNET_SCHEDULER_TaskIdentifier endbadly_task; +static GNUNET_SCHEDULER_TaskIdentifier stopiteration_task; +static struct GNUNET_OS_Process *arm; + +static struct GNUNET_CRYPTO_RsaPrivateKey * privkey; +static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pubkey; +static GNUNET_HashCode zone; + +static struct GNUNET_CRYPTO_RsaPrivateKey * privkey2; +static struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pubkey2; +static GNUNET_HashCode zone2; + +static struct GNUNET_NAMESTORE_ZoneIterator *zi; +static int res; +static int returned_records; + +struct GNUNET_CRYPTO_RsaSignature *sig_1; +char * s_name_1; +struct GNUNET_NAMESTORE_RecordData *s_rd_1; + +struct GNUNET_CRYPTO_RsaSignature *sig_2; +char * s_name_2; +struct GNUNET_NAMESTORE_RecordData *s_rd_2; + +struct GNUNET_CRYPTO_RsaSignature *sig_3; +char * s_name_3; +struct GNUNET_NAMESTORE_RecordData *s_rd_3; + +static void +start_arm (const char *cfgname) +{ + arm = GNUNET_OS_start_process (GNUNET_YES, NULL, NULL, "gnunet-service-arm", + "gnunet-service-arm", "-c", cfgname, +#if VERBOSE_PEERS + "-L", "DEBUG", +#else + "-L", "ERROR", +#endif + NULL); +} + +static void +stop_arm () +{ + if (NULL != arm) + { + if (0 != GNUNET_OS_process_kill (arm, SIGTERM)) + GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "kill"); + GNUNET_OS_process_wait (arm); + GNUNET_OS_process_close (arm); + arm = NULL; + } +} + +/** + * Re-establish the connection to the service. + * + * @param cls handle to use to re-connect. + * @param tc scheduler context + */ +static void +endbadly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + if (stopiteration_task != GNUNET_SCHEDULER_NO_TASK) + { + GNUNET_SCHEDULER_cancel (stopiteration_task); + stopiteration_task = GNUNET_SCHEDULER_NO_TASK; + } + + if (nsh != NULL) + GNUNET_NAMESTORE_disconnect (nsh, GNUNET_YES); + nsh = NULL; + + GNUNET_free_non_null(sig_1); + GNUNET_free_non_null(sig_2); + GNUNET_free_non_null(sig_3); + GNUNET_free_non_null(s_name_1); + GNUNET_free_non_null(s_name_2); + GNUNET_free_non_null(s_name_3); + + if (s_rd_1 != NULL) + { + GNUNET_free ((void *)s_rd_1->data); + GNUNET_free (s_rd_1); + } + if (s_rd_2 != NULL) + { + GNUNET_free ((void *)s_rd_2->data); + GNUNET_free (s_rd_2); + } + if (s_rd_3 != NULL) + { + GNUNET_free ((void *)s_rd_3->data); + GNUNET_free (s_rd_3); + } + + if (privkey != NULL) + GNUNET_CRYPTO_rsa_key_free (privkey); + privkey = NULL; + + if (privkey2 != NULL) + GNUNET_CRYPTO_rsa_key_free (privkey2); + privkey2 = NULL; + + if (NULL != arm) + stop_arm(); + + res = 1; +} + + +static void +end (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) +{ + if (stopiteration_task != GNUNET_SCHEDULER_NO_TASK) + { + GNUNET_SCHEDULER_cancel (stopiteration_task); + stopiteration_task = GNUNET_SCHEDULER_NO_TASK; + } + + if (endbadly_task != GNUNET_SCHEDULER_NO_TASK) + { + GNUNET_SCHEDULER_cancel (endbadly_task); + endbadly_task = GNUNET_SCHEDULER_NO_TASK; + } + + if (privkey != NULL) + GNUNET_CRYPTO_rsa_key_free (privkey); + privkey = NULL; + + if (privkey2 != NULL) + GNUNET_CRYPTO_rsa_key_free (privkey2); + privkey2 = NULL; + + GNUNET_free (sig_1); + GNUNET_free (sig_2); + GNUNET_free (sig_3); + GNUNET_free (s_name_1); + GNUNET_free (s_name_2); + GNUNET_free (s_name_3); + if (s_rd_1 != NULL) + { + GNUNET_free ((void *)s_rd_1->data); + GNUNET_free (s_rd_1); + } + if (s_rd_2 != NULL) + { + GNUNET_free ((void *)s_rd_2->data); + GNUNET_free (s_rd_2); + } + if (s_rd_3 != NULL) + { + GNUNET_free ((void *)s_rd_3->data); + GNUNET_free (s_rd_3); + } + + if (nsh != NULL) + GNUNET_NAMESTORE_disconnect (nsh, GNUNET_YES); + nsh = NULL; + + if (NULL != arm) + stop_arm(); + if (returned_records == 1) + res = 0; + else + res = 1; + +} + +void zone_proc (void *cls, + const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded *zone_key, + struct GNUNET_TIME_Absolute expire, + const char *name, + unsigned int rd_count, + const struct GNUNET_NAMESTORE_RecordData *rd, + const struct GNUNET_CRYPTO_RsaSignature *signature) +{ + int failed = GNUNET_NO; + + if ((zone_key == NULL) && (name == NULL)) + { + GNUNET_break (3 == returned_records); + if (3 == returned_records) + res = 0; + else + res = 1; + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Received last result, iteration done after receing %u results\n",returned_records ); + GNUNET_SCHEDULER_add_now (&end, NULL); + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Comparing results name %s \n", name); + if (0 == strcmp (name, s_name_1)) + { + if (rd_count == 1) + { + if (GNUNET_YES != GNUNET_NAMESTORE_records_cmp(rd, s_rd_1)) + { + failed = GNUNET_YES; + GNUNET_break (0); + } + } + else + { + failed = GNUNET_YES; + GNUNET_break (0); + } + if (0 != memcmp (signature, sig_1, sizeof (struct GNUNET_CRYPTO_RsaSignature))) + { + failed = GNUNET_YES; + GNUNET_break (0); + } + } + else if (0 == strcmp (name, s_name_2)) + { + if (rd_count == 1) + { + if (GNUNET_YES != GNUNET_NAMESTORE_records_cmp(rd, s_rd_2)) + { + failed = GNUNET_YES; + GNUNET_break (0); + } + } + else + { + failed = GNUNET_YES; + GNUNET_break (0); + } + if (0 != memcmp (signature, sig_2, sizeof (struct GNUNET_CRYPTO_RsaSignature))) + { + failed = GNUNET_YES; + GNUNET_break (0); + } + } + else if (0 == strcmp (name, s_name_3)) + { + if (rd_count == 1) + { + if (GNUNET_YES != GNUNET_NAMESTORE_records_cmp(rd, s_rd_3)) + { + failed = GNUNET_YES; + GNUNET_break (0); + } + } + else + { + failed = GNUNET_YES; + GNUNET_break (0); + } + if (0 != memcmp (signature, sig_3, sizeof (struct GNUNET_CRYPTO_RsaSignature))) + { + failed = GNUNET_YES; + GNUNET_break (0); + } + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Comparing result failed: got name `%s'\n", name); + res = 1; + GNUNET_break (0); + GNUNET_SCHEDULER_add_now (&end, NULL); + } + + if (failed == GNUNET_NO) + { + returned_records ++; + + if (1 == returned_records) + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Stopping zone iteration after %u received record \n",returned_records ); + GNUNET_NAMESTORE_zone_iteration_stop (zi); + if (endbadly_task != GNUNET_SCHEDULER_NO_TASK) + { + GNUNET_SCHEDULER_cancel (endbadly_task); + endbadly_task = GNUNET_SCHEDULER_NO_TASK; + } + GNUNET_SCHEDULER_add_delayed (GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 3), &end , NULL); + return; + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Telling namestore to send the next result\n"); + GNUNET_NAMESTORE_zone_iterator_next (zi); + } + } + else + { + GNUNET_break (0); + GNUNET_SCHEDULER_add_now (&end, NULL); + } + } +} + +void +delete_existing_db (const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + char *afsdir; + + if (GNUNET_OK == + GNUNET_CONFIGURATION_get_value_filename (cfg, "namestore-sqlite", + "FILENAME", &afsdir)) + { + if (GNUNET_OK == GNUNET_DISK_file_test (afsdir)) + if (GNUNET_OK == GNUNET_DISK_file_test (afsdir)) + if (GNUNET_OK == GNUNET_DISK_directory_remove(afsdir)) + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Deleted existing database `%s' \n", afsdir); + GNUNET_free (afsdir); + } + +} + +void +put_cont (void *cls, int32_t success, const char *emsg) +{ + static int c = 0; + + if (success == GNUNET_OK) + { + c++; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record %u \n", c); + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to created records\n"); + GNUNET_break (0); + GNUNET_SCHEDULER_cancel (endbadly_task); + endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL); + } + + if (c == 3) + { + res = 1; + returned_records = 0; + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "All records created, starting iteration over all zones \n"); + zi = GNUNET_NAMESTORE_zone_iteration_start(nsh, + NULL, + GNUNET_NAMESTORE_RF_NONE, + GNUNET_NAMESTORE_RF_NONE, + zone_proc, + &zone); + if (zi == NULL) + { + GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to create zone iterator\n"); + GNUNET_break (0); + GNUNET_SCHEDULER_cancel (endbadly_task); + endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL); + } + } +} + +static struct GNUNET_NAMESTORE_RecordData * +create_record (int count) +{ + int c; + struct GNUNET_NAMESTORE_RecordData * rd; + rd = GNUNET_malloc (count * sizeof (struct GNUNET_NAMESTORE_RecordData)); + + for (c = 0; c < count; c++) + { + rd[c].expiration = GNUNET_TIME_absolute_get(); + rd[c].record_type = 1111; + rd[c].data_size = 50; + rd[c].data = GNUNET_malloc(50); + memset ((char *) rd[c].data, 'a', 50); + } + return rd; +} + +static void +run (void *cls, char *const *args, const char *cfgfile, + const struct GNUNET_CONFIGURATION_Handle *cfg) +{ + delete_existing_db(cfg); + endbadly_task = GNUNET_SCHEDULER_add_delayed(TIMEOUT,&endbadly, NULL); + + privkey = GNUNET_CRYPTO_rsa_key_create_from_file("hostkey"); + GNUNET_assert (privkey != NULL); + GNUNET_CRYPTO_rsa_key_get_public(privkey, &pubkey); + GNUNET_CRYPTO_hash(&pubkey, sizeof (pubkey), &zone); + + privkey2 = GNUNET_CRYPTO_rsa_key_create_from_file("hostkey2"); + GNUNET_assert (privkey2 != NULL); + GNUNET_CRYPTO_rsa_key_get_public(privkey2, &pubkey2); + GNUNET_CRYPTO_hash(&pubkey2, sizeof (pubkey), &zone2); + + + start_arm (cfgfile); + GNUNET_assert (arm != NULL); + + nsh = GNUNET_NAMESTORE_connect (cfg); + GNUNET_break (NULL != nsh); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 1\n"); + + GNUNET_asprintf(&s_name_1, "dummy1"); + s_rd_1 = create_record(1); + sig_1 = GNUNET_NAMESTORE_create_signature(privkey, s_name_1, s_rd_1, 1); + GNUNET_NAMESTORE_record_create(nsh, privkey, s_name_1, s_rd_1, &put_cont, NULL); + + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 2 \n"); + GNUNET_asprintf(&s_name_2, "dummy2"); + s_rd_2 = create_record(1); + + sig_2 = GNUNET_NAMESTORE_create_signature(privkey, s_name_2, s_rd_2, 1); + GNUNET_NAMESTORE_record_create(nsh, privkey, s_name_2, s_rd_2, &put_cont, NULL); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Created record 3\n"); + /* name in different zone */ + GNUNET_asprintf(&s_name_3, "dummy3"); + s_rd_3 = create_record(1); + sig_3 = GNUNET_NAMESTORE_create_signature(privkey, s_name_3, s_rd_3, 1); + GNUNET_NAMESTORE_record_put (nsh, &pubkey2, s_name_3, GNUNET_TIME_absolute_get_forever(), 1, s_rd_3, sig_3, &put_cont, NULL); +} + +static int +check () +{ + static char *const argv[] = { "test_namestore_api_zone_iteration", + "-c", + "test_namestore_api.conf", +#if VERBOSE + "-L", "DEBUG", +#endif + NULL + }; + static struct GNUNET_GETOPT_CommandLineOption options[] = { + GNUNET_GETOPT_OPTION_END + }; + + res = 1; + GNUNET_PROGRAM_run ((sizeof (argv) / sizeof (char *)) - 1, argv, "test_namestore_api_zone_iteration", + "nohelp", options, &run, &res); + return res; +} + +int +main (int argc, char *argv[]) +{ + int ret; + + ret = check (); + + return ret; +} + +/* end of test_namestore_api_zone_iteration.c */ -- cgit v1.2.3