gnunet

Main GNUnet Logic
Log | Files | Refs | Submodules | README | LICENSE

commit 543886fab7ccbd556060041785558f671fed1010
parent 4bc86b2b4eae5183f0436016e1e68ef4d50eda62
Author: Martin Schanzenbach <mschanzenbach@posteo.de>
Date:   Fri, 27 Sep 2013 15:01:56 +0000

-more tests

Diffstat:
Msrc/gns/Makefile.am | 1+
Dsrc/gns/test_gns_cname_lookup.c | 449-------------------------------------------------------------------------------
Asrc/gns/test_gns_ns_lookup.sh | 47+++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/gns/test_gns_simple_lookup.c | 286-------------------------------------------------------------------------------
Dsrc/gns/test_gns_simple_mx_lookup.c | 301-------------------------------------------------------------------------------
5 files changed, 48 insertions(+), 1036 deletions(-)

diff --git a/src/gns/Makefile.am b/src/gns/Makefile.am @@ -201,6 +201,7 @@ check_SCRIPTS = \ test_gns_ipv6_lookup.sh\ test_gns_txt_lookup.sh\ test_gns_mx_lookup.sh \ + test_gns_ns_lookup.sh \ test_gns_cname_lookup.sh if ENABLE_TEST_RUN diff --git a/src/gns/test_gns_cname_lookup.c b/src/gns/test_gns_cname_lookup.c @@ -1,449 +0,0 @@ -/* - This file is part of GNUnet. - (C) 2012 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 gns/test_gns_cname_lookup.c - * @brief base testcase for testing a local GNS record lookup - * @author Martin Schanzenbach - */ -#include "platform.h" -#include "gnunet_testing_lib.h" -#include "gnunet_core_service.h" -#include "block_dns.h" -#include "gnunet_signatures.h" -#include "gnunet_namestore_service.h" -#include "gnunet_dnsparser_lib.h" -#include "gnunet_gns_service.h" - - -/** - * Timeout for entire testcase - */ -#define TIMEOUT GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 20) - -/* test records to resolve */ -#define TEST_DOMAIN_PLUS "www.gnu" -#define TEST_DOMAIN_ZKEY "www2.gnu" -#define TEST_DOMAIN_DNS "www3.gnu" -#define TEST_IP_PLUS "127.0.0.1" -#define TEST_IP_ZKEY "127.0.0.2" -#define TEST_IP_DNS "131.159.74.67" -#define TEST_RECORD_CNAME_SERVER "server.gnu" -#define TEST_RECORD_CNAME_PLUS "server.+" -#define TEST_RECORD_CNAME_ZKEY "www.J7POEUT41A8PBFS7KVVDRF88GBOU4HK8PSU5QKVLVE3R9T91E99G.zkey" -#define TEST_RECORD_CNAME_DNS "gnunet.org" -#define TEST_RECORD_NAME_SERVER "server" -#define TEST_RECORD_NAME_PLUS "www" -#define TEST_RECORD_NAME_ZKEY "www2" -#define TEST_RECORD_NAME_DNS "www3" - -#define KEYFILE_BOB "zonefiles/J7POEUT41A8PBFS7KVVDRF88GBOU4HK8PSU5QKVLVE3R9T91E99G.zkey" - - -/* Task handle to use to schedule test failure */ -static GNUNET_SCHEDULER_TaskIdentifier die_task; - -/* Global return value (0 for success, anything else for failure) */ -static int ok; - -static struct GNUNET_NAMESTORE_Handle *namestore_handle; - -static struct GNUNET_GNS_Handle *gns_handle; - -static const struct GNUNET_CONFIGURATION_Handle *cfg; - - -/** - * Check if the get_handle is being used, if so stop the request. Either - * way, schedule the end_badly_cont function which actually shuts down the - * test. - */ -static void -end_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) -{ - die_task = GNUNET_SCHEDULER_NO_TASK; - if (NULL != gns_handle) - { - GNUNET_GNS_disconnect (gns_handle); - gns_handle = NULL; - } - if (NULL != namestore_handle) - { - GNUNET_NAMESTORE_disconnect (namestore_handle); - namestore_handle = NULL; - } - GNUNET_break (0); - GNUNET_SCHEDULER_shutdown (); - ok = 1; -} - - -static void -shutdown_task (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) -{ - GNUNET_GNS_disconnect (gns_handle); - gns_handle = NULL; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Shutting down peer!\n"); - GNUNET_SCHEDULER_shutdown (); -} - - -static void -on_lookup_result_cname (void *cls, - uint32_t rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd) -{ - uint32_t i; - - if (GNUNET_SCHEDULER_NO_TASK != die_task) - { - GNUNET_SCHEDULER_cancel (die_task); - die_task = GNUNET_SCHEDULER_NO_TASK; - } - GNUNET_NAMESTORE_disconnect (namestore_handle); - namestore_handle = NULL; - if (rd_count == 0) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Lookup failed, rp_filtering?\n"); - ok = 2; - } - else - { - ok = 1; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "name: %s\n", (char*)cls); - for (i=0; i<rd_count; i++) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "type: %d\n", rd[i].record_type); - if (rd[i].record_type == GNUNET_DNSPARSER_TYPE_CNAME) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "CNAME: %s\n", rd[i].data); - if (0 == strcmp(rd[i].data, TEST_RECORD_CNAME_SERVER)) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "%s correctly resolved to %s!\n", TEST_DOMAIN_PLUS, rd[i].data); - ok = 0; - } - } - else - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No resolution!\n"); - } - } - } - GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); -} - - -static void -on_lookup_result_dns (void *cls, - uint32_t rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd) -{ - struct in_addr a; - uint32_t i; - char* addr; - - if (rd_count == 0) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "CNAME to DNS delegation failed. System offline?\n"); - } - else - { - ok = 1; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "name: %s\n", (char*)cls); - for (i=0; i<rd_count; i++) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "type: %d\n", rd[i].record_type); - if (rd[i].record_type == GNUNET_DNSPARSER_TYPE_A) - { - memcpy(&a, rd[i].data, sizeof(a)); - addr = inet_ntoa(a); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "address: %s\n", addr); - if (0 == strcmp(addr, TEST_IP_DNS)) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "%s correctly resolved to %s!\n", TEST_DOMAIN_DNS, addr); - ok = 0; - } - } - else - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No resolution!\n"); - } - } - } - GNUNET_GNS_lookup (gns_handle, TEST_DOMAIN_PLUS, GNUNET_DNSPARSER_TYPE_CNAME, - GNUNET_YES, - NULL, - &on_lookup_result_cname, TEST_DOMAIN_PLUS); -} - - -static void -on_lookup_result_zkey (void *cls, uint32_t rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd) -{ - struct in_addr a; - uint32_t i; - char* addr; - - if (rd_count == 0) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Lookup failed, rp_filtering?\n"); - ok = 2; - GNUNET_SCHEDULER_shutdown (); - return; - } - ok = 1; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "name: %s\n", (char*)cls); - for (i=0; i<rd_count; i++) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "type: %d\n", rd[i].record_type); - if (rd[i].record_type == GNUNET_DNSPARSER_TYPE_A) - { - memcpy (&a, rd[i].data, sizeof(a)); - addr = inet_ntoa(a); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "address: %s\n", addr); - if (0 == strcmp (addr, TEST_IP_ZKEY)) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "%s correctly resolved to %s!\n", - TEST_DOMAIN_ZKEY, addr); - ok = 0; - } - } - else - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "No resolution!\n"); - } - } - GNUNET_GNS_lookup (gns_handle, TEST_DOMAIN_DNS, GNUNET_DNSPARSER_TYPE_A, - GNUNET_YES, - NULL, - &on_lookup_result_dns, TEST_DOMAIN_DNS); -} - - -static void -on_lookup_result_plus (void *cls, uint32_t rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd) -{ - struct in_addr a; - uint32_t i; - char* addr; - - if (rd_count == 0) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Lookup failed, rp_filtering?\n"); - ok = 2; - GNUNET_SCHEDULER_shutdown (); - return; - } - ok = 1; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "name: %s\n", (char*)cls); - for (i=0; i<rd_count; i++) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "type: %d\n", rd[i].record_type); - if (rd[i].record_type == GNUNET_DNSPARSER_TYPE_A) - { - memcpy(&a, rd[i].data, sizeof(a)); - addr = inet_ntoa(a); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "address: %s\n", addr); - if (0 == strcmp(addr, TEST_IP_PLUS)) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "%s correctly resolved to %s!\n", TEST_DOMAIN_PLUS, addr); - ok = 0; - } - } - else - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No resolution!\n"); - } - } - GNUNET_GNS_lookup (gns_handle, TEST_DOMAIN_ZKEY, GNUNET_DNSPARSER_TYPE_A, - GNUNET_YES, - NULL, - &on_lookup_result_zkey, TEST_DOMAIN_ZKEY); -} - - -/** - * Function scheduled to be run on the successful start of services - * tries to look up the dns record for TEST_DOMAIN - * - * @param cls closure - * @param success GNUNET_SYSERR on failure (including timeout/queue drop/failure to validate) - * GNUNET_NO if content was already there or not found - * GNUNET_YES (or other positive value) on success - * @param emsg NULL on success, otherwise an error message - */ -static void -commence_testing (void *cls, int32_t success, const char *emsg) -{ - if (NULL != emsg) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to store record in namestore: %s\n", - emsg); - GNUNET_SCHEDULER_shutdown (); - return; - } - gns_handle = GNUNET_GNS_connect(cfg); - if (NULL == gns_handle) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to connect to GNS!\n"); - GNUNET_SCHEDULER_shutdown (); - return; - } - GNUNET_GNS_lookup (gns_handle, TEST_DOMAIN_PLUS, GNUNET_DNSPARSER_TYPE_A, - GNUNET_YES, - NULL, - &on_lookup_result_plus, TEST_DOMAIN_PLUS); -} - - -static void -do_check (void *cls, - const struct GNUNET_CONFIGURATION_Handle *ccfg, - struct GNUNET_TESTING_Peer *peer) -{ - struct GNUNET_CRYPTO_EccPublicSignKey alice_pkey; - struct GNUNET_CRYPTO_EccPrivateKey *alice_key; - struct GNUNET_CRYPTO_EccPrivateKey *bob_key; - char* alice_keyfile; - struct GNUNET_NAMESTORE_RecordData rd; - const char* ip = TEST_IP_PLUS; - struct in_addr web; - - cfg = ccfg; - die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL); - - /* put records into namestore */ - namestore_handle = GNUNET_NAMESTORE_connect(cfg); - if (NULL == namestore_handle) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to connect to namestore\n"); - GNUNET_SCHEDULER_shutdown (); - return; - } - - if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "gns", - "ZONEKEY", - &alice_keyfile)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to get key from cfg\n"); - GNUNET_SCHEDULER_shutdown (); - return; - } - - alice_key = GNUNET_CRYPTO_ecc_key_create_from_file (alice_keyfile); - GNUNET_CRYPTO_ecc_key_get_public_for_signature (alice_key, &alice_pkey); - GNUNET_free(alice_keyfile); - - bob_key = GNUNET_CRYPTO_ecc_key_create_from_file (KEYFILE_BOB); - - rd.expiration_time = UINT64_MAX; - GNUNET_assert(1 == inet_pton (AF_INET, ip, &web)); - rd.data_size = sizeof(struct in_addr); - rd.data = &web; - rd.record_type = GNUNET_DNSPARSER_TYPE_A; - rd.flags = GNUNET_NAMESTORE_RF_NONE; - - GNUNET_NAMESTORE_record_put_by_authority (namestore_handle, - alice_key, - TEST_RECORD_NAME_SERVER, - 1, &rd, - NULL, - NULL); - - rd.data_size = strlen (TEST_RECORD_CNAME_PLUS); - rd.data = TEST_RECORD_CNAME_PLUS; - rd.record_type = GNUNET_DNSPARSER_TYPE_CNAME; - - GNUNET_NAMESTORE_record_put_by_authority (namestore_handle, - alice_key, - TEST_RECORD_NAME_PLUS, - 1, &rd, - NULL, - NULL); - - rd.data_size = strlen (TEST_RECORD_CNAME_ZKEY); - rd.data = TEST_RECORD_CNAME_ZKEY; - rd.record_type = GNUNET_DNSPARSER_TYPE_CNAME; - - GNUNET_NAMESTORE_record_put_by_authority (namestore_handle, - alice_key, - TEST_RECORD_NAME_ZKEY, - 1, &rd, - NULL, - NULL); - - rd.data_size = strlen (TEST_RECORD_CNAME_DNS); - rd.data = TEST_RECORD_CNAME_DNS; - rd.record_type = GNUNET_DNSPARSER_TYPE_CNAME; - - GNUNET_NAMESTORE_record_put_by_authority (namestore_handle, - alice_key, - TEST_RECORD_NAME_DNS, - 1, &rd, - NULL, - NULL); - - GNUNET_assert(1 == inet_pton (AF_INET, TEST_IP_ZKEY, &web)); - rd.data_size = sizeof(struct in_addr); - rd.data = &web; - rd.record_type = GNUNET_DNSPARSER_TYPE_A; - - GNUNET_NAMESTORE_record_put_by_authority (namestore_handle, - bob_key, - TEST_RECORD_NAME_PLUS, - 1, &rd, - &commence_testing, - NULL); - GNUNET_free(alice_key); - GNUNET_free(bob_key); -} - - -int -main (int argc, char *argv[]) -{ - ok = 1; - - GNUNET_log_setup ("test-gns-simple-cname-lookup", - "WARNING", - NULL); - GNUNET_TESTING_peer_run ("test-gns-simple-cname-lookup", "test_gns_simple_lookup.conf", &do_check, NULL); - return ok; -} - -/* end of test_gns_cname_lookup.c */ diff --git a/src/gns/test_gns_ns_lookup.sh b/src/gns/test_gns_ns_lookup.sh @@ -0,0 +1,47 @@ +#!/bin/bash +trap "gnunet-arm -e -c test_gns_lookup.conf" SIGINT +rm -r `gnunet-config -c test_gns_lookup.conf -s PATHS -o SERVICEHOME` +TEST_DOMAIN="www.homepage.gnu" +TEST_DOMAIN_ALT="homepage.gnu" +TEST_DOMAIN_ALT2="uk.homepage.gnu" +TEST_IP_ALT2="81.187.252.184" +TEST_IP="131.159.74.67" +TEST_IP_NS="184.172.157.218" +TEST_RECORD_NAME="homepage" +TEST_RECORD_NS="gnunet.org" +gnunet-arm -s -c test_gns_lookup.conf +gnunet-identity -C testego -c test_gns_lookup.conf +gnunet-namestore -p -z testego -a -n $TEST_RECORD_NAME -t A -V $TEST_IP_NS -e never -c test_gns_lookup.conf +gnunet-namestore -p -z testego -a -n $TEST_RECORD_NAME -t NS -V $TEST_RECORD_NS -e never -c test_gns_lookup.conf +RES_IP=$(timeout 5 gnunet-gns --raw -z testego -u $TEST_DOMAIN -t A -c test_gns_lookup.conf) +RES_IP_ALT=$(timeout 5 gnunet-gns --raw -z testego -u $TEST_DOMAIN_ALT -t A -c test_gns_lookup.conf) +RES_IP_ALT2=$(timeout 5 gnunet-gns --raw -z testego -u $TEST_DOMAIN_ALT2 -t A -c test_gns_lookup.conf) +gnunet-namestore -z testego -d -n www -t A -V $TEST_IP -e never -c test_gns_lookup.conf +gnunet-namestore -z testego -d -n $TEST_RECORD_NAME -t NS -V $TEST_RECORD_NS -e never -c test_gns_lookup.conf +gnunet-identity -D testego -c test_gns_lookup.conf +gnunet-arm -e -c test_gns_lookup.conf + +if [ "$RES_IP" == "$TEST_IP" ] +then + echo "PASS: Resolved $TEST_DOMAIN to $RES_IP." +else + echo "Failed to resolve to proper IP for $TEST_DOMAIN, got $RES_IP." + exit 1 +fi + +if [ "$RES_IP_ALT" == "$TEST_IP" ] +then + echo "PASS: Resolved $TEST_DOMAIN_ALT to $RES_IP_ALT." +else + echo "Failed to resolve to proper IP for $TEST_DOMAIN_ALT, got $RES_IP_ALT." + exit 1 +fi + +if [ "$RES_IP_ALT2" == "$TEST_IP_ALT2" ] +then + echo "PASS: Resolved $TEST_DOMAIN_ALT2 to $RES_IP_ALT2." + exit 0 +else + echo "Failed to resolve to proper IP for $TEST_DOMAIN_ALT2, got $RES_IP_ALT2." + exit 1 +fi diff --git a/src/gns/test_gns_simple_lookup.c b/src/gns/test_gns_simple_lookup.c @@ -1,286 +0,0 @@ -/* - This file is part of GNUnet. - (C) 2012 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 gns/test_gns_simple_lookup.c - * @brief base testcase for testing a local GNS record lookup - * @author Martin Schanzenbach - */ -#include "platform.h" -#include "gnunet_testing_lib.h" -#include "gnunet_core_service.h" -#include "block_dns.h" -#include "gnunet_signatures.h" -#include "gnunet_namestore_service.h" -#include "gnunet_dnsparser_lib.h" -#include "gnunet_gns_service.h" - - -/** - * Timeout for entire testcase - */ -#define TIMEOUT GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 120) - -/* test records to resolve */ -#define TEST_DOMAIN "www.gnu" -#define TEST_IP "127.0.0.1" -#define TEST_RECORD_NAME "www" - -/** - * Task handle to use to schedule test failure - */ -static GNUNET_SCHEDULER_TaskIdentifier die_task; - -/** - * Global return value (0 for success, anything else for failure) - */ -static int ok; - -static struct GNUNET_NAMESTORE_Handle *namestore_handle; - -static struct GNUNET_GNS_Handle *gns_handle; - -static const struct GNUNET_CONFIGURATION_Handle *cfg; - -static struct GNUNET_GNS_LookupRequest *lr; - -static struct GNUNET_NAMESTORE_QueueEntry *nsqe; - - -/** - * Check if the get_handle is being used, if so stop the request. Either - * way, schedule the end_badly_cont function which actually shuts down the - * test. - */ -static void -end_badly (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) -{ - if (NULL != nsqe) - { - GNUNET_NAMESTORE_cancel (nsqe); - nsqe = NULL; - } - if (NULL != lr) - { - GNUNET_GNS_cancel_lookup_request (lr); - lr = NULL; - } - if (NULL != gns_handle) - { - GNUNET_GNS_disconnect (gns_handle); - gns_handle = NULL; - } - - if (NULL != namestore_handle) - { - GNUNET_NAMESTORE_disconnect (namestore_handle); - namestore_handle = NULL; - } - GNUNET_break (0); - GNUNET_SCHEDULER_shutdown (); - ok = 1; -} - - -static void -end_badly_now () -{ - GNUNET_SCHEDULER_cancel (die_task); - die_task = GNUNET_SCHEDULER_add_now (&end_badly, NULL); -} - - -static void -shutdown_task (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) -{ - GNUNET_GNS_disconnect (gns_handle); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Shutting down peer!\n"); - GNUNET_SCHEDULER_shutdown (); -} - - -/** - * Function called on result for a GNS lookup - * - * @param cls closure, unused - * @param rd_count number of records - * @param rd the records in reply - */ -static void -on_lookup_result(void *cls, uint32_t rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd) -{ - struct in_addr a; - uint32_t i; - char* addr; - - lr = NULL; - if (GNUNET_SCHEDULER_NO_TASK != die_task) - { - GNUNET_SCHEDULER_cancel (die_task); - die_task = GNUNET_SCHEDULER_NO_TASK; - } - GNUNET_NAMESTORE_disconnect (namestore_handle); - namestore_handle = NULL; - if (rd_count == 0) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Lookup failed, rp_filtering?\n"); - ok = 2; - } - else - { - ok = 1; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "name: %s\n", (char*)cls); - for (i=0; i<rd_count; i++) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "type: %d\n", rd[i].record_type); - if (rd[i].record_type == GNUNET_DNSPARSER_TYPE_A) - { - memcpy (&a, rd[i].data, sizeof(a)); - addr = inet_ntoa(a); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "address: %s\n", addr); - if (0 == strcmp (addr, TEST_IP)) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "%s correctly resolved to %s!\n", - TEST_DOMAIN, addr); - ok = 0; - } - } - else - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "No resolution!\n"); - } - } - } - GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); -} - - -/** - * Function scheduled to be run on the successful start of services - * tries to look up the dns record for TEST_DOMAIN - * - * @param cls closure - * @param success GNUNET_SYSERR on failure (including timeout/queue drop/failure to validate) - * GNUNET_NO if content was already there or not found - * GNUNET_YES (or other positive value) on success - * @param emsg NULL on success, otherwise an error message - */ -static void -commence_testing (void *cls, - int32_t success, - const char *emsg) -{ - nsqe = NULL; - if (NULL != emsg) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to store record in namestore: %s\n", - emsg); - end_badly_now (); - return; - } - gns_handle = GNUNET_GNS_connect (cfg); - if (NULL == gns_handle) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to connect to GNS!\n"); - end_badly_now (); - return; - } - lr = GNUNET_GNS_lookup (gns_handle, TEST_DOMAIN, GNUNET_DNSPARSER_TYPE_A, - GNUNET_YES, - NULL, - &on_lookup_result, TEST_DOMAIN); -} - - -static void -do_check (void *cls, - const struct GNUNET_CONFIGURATION_Handle *ccfg, - struct GNUNET_TESTING_Peer *peer) -{ - struct GNUNET_CRYPTO_EccPublicSignKey alice_pkey; - struct GNUNET_CRYPTO_EccPrivateKey *alice_key; - struct GNUNET_NAMESTORE_RecordData rd; - char* alice_keyfile; - char* ip = TEST_IP; - struct in_addr web; - - cfg = ccfg; - die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL); - - /* put records into namestore */ - namestore_handle = GNUNET_NAMESTORE_connect(cfg); - if (NULL == namestore_handle) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to connect to namestore\n"); - end_badly_now (); - return; - } - if (GNUNET_OK != - GNUNET_CONFIGURATION_get_value_filename (cfg, "gns", - "ZONEKEY", - &alice_keyfile)) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to get key from cfg\n"); - end_badly_now (); - return; - } - - alice_key = GNUNET_CRYPTO_ecc_key_create_from_file (alice_keyfile); - GNUNET_CRYPTO_ecc_key_get_public_for_signature (alice_key, &alice_pkey); - GNUNET_free (alice_keyfile); - rd.expiration_time = UINT64_MAX; - GNUNET_assert (1 == inet_pton (AF_INET, ip, &web)); - rd.data_size = sizeof(struct in_addr); - rd.data = &web; - rd.record_type = GNUNET_DNSPARSER_TYPE_A; - rd.flags = GNUNET_NAMESTORE_RF_NONE; - nsqe = GNUNET_NAMESTORE_record_put_by_authority (namestore_handle, - alice_key, - TEST_RECORD_NAME, - 1, &rd, - &commence_testing, - NULL); - GNUNET_free (alice_key); -} - - -int -main (int argc, char *argv[]) -{ - ok = 1; - GNUNET_log_setup ("test-gns-simple-lookup", - "WARNING", - NULL); - GNUNET_TESTING_peer_run ("test-gns-simple-lookup", - "test_gns_simple_lookup.conf", - &do_check, NULL); - return ok; -} - -/* end of test_gns_simple_lookup.c */ diff --git a/src/gns/test_gns_simple_mx_lookup.c b/src/gns/test_gns_simple_mx_lookup.c @@ -1,301 +0,0 @@ -/* - 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 gns/test_gns_simple_mx_lookup.c - * @brief base testcase for testing GNS MX lookups - * - */ -#include "platform.h" -#include "gnunet_testing_lib.h" -#include "gnunet_core_service.h" -#include "block_dns.h" -#include "gnunet_signatures.h" -#include "gnunet_namestore_service.h" -#include "../namestore/namestore.h" -#include "gnunet_dnsparser_lib.h" -#include "gnunet_gns_service.h" - -/* Timeout for entire testcase */ -#define TIMEOUT GNUNET_TIME_relative_multiply(GNUNET_TIME_UNIT_SECONDS, 20) - -/* test records to resolve */ -#define TEST_DOMAIN "bob.gnu" -#define TEST_IP "127.0.0.1" -#define TEST_RECORD_NAME "mail" -#define TEST_MX_NAME "mail.+" -#define TEST_EXPECTED_MX "mail.bob.gnu" - -#define TEST_AUTHORITY_NAME "bob" - -#define KEYFILE_BOB "../namestore/zonefiles/HGU0A0VCU334DN7F2I9UIUMVQMM7JMSD142LIMNUGTTV9R0CF4EG.zkey" - -/* Task handle to use to schedule test failure */ -static GNUNET_SCHEDULER_TaskIdentifier die_task; - -/* Global return value (0 for success, anything else for failure) */ -static int ok; - -static struct GNUNET_NAMESTORE_Handle *namestore_handle; - -static struct GNUNET_GNS_Handle *gns_handle; - -static const struct GNUNET_CONFIGURATION_Handle *cfg; - - -/** - * Check if the get_handle is being used, if so stop the request. Either - * way, schedule the end_badly_cont function which actually shuts down the - * test. - */ -static void -end_badly (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) -{ - die_task = GNUNET_SCHEDULER_NO_TASK; - if (NULL != gns_handle) - { - GNUNET_GNS_disconnect(gns_handle); - gns_handle = NULL; - } - - if (NULL != namestore_handle) - { - GNUNET_NAMESTORE_disconnect (namestore_handle); - namestore_handle = NULL; - } - GNUNET_break (0); - GNUNET_SCHEDULER_shutdown (); - ok = 1; -} - - -static void -end_badly_now () -{ - GNUNET_SCHEDULER_cancel (die_task); - die_task = GNUNET_SCHEDULER_add_now (&end_badly, NULL); -} - - -static void -shutdown_task (void *cls, - const struct GNUNET_SCHEDULER_TaskContext *tc) -{ - GNUNET_GNS_disconnect(gns_handle); - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Shutting down peer!\n"); - GNUNET_SCHEDULER_shutdown (); -} - - -static void -on_lookup_result(void *cls, uint32_t rd_count, - const struct GNUNET_NAMESTORE_RecordData *rd) -{ - int i; - uint16_t mx_preference; - char* mx; - - if (GNUNET_SCHEDULER_NO_TASK != die_task) - { - GNUNET_SCHEDULER_cancel (die_task); - die_task = GNUNET_SCHEDULER_NO_TASK; - } - - GNUNET_NAMESTORE_disconnect (namestore_handle); - if (rd_count == 0) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Lookup failed, rp_filtering?\n"); - ok = 2; - } - else - { - ok = 1; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "name: %s\n", (char*)cls); - for (i=0; i<rd_count; i++) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, "type: %d\n", rd[i].record_type); - if (rd[i].record_type == GNUNET_DNSPARSER_TYPE_MX) - { - mx = (char*)rd[i].data+sizeof(uint16_t); - mx_preference = *(uint16_t*)rd[i].data; - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Got MX %s with preference %d\n", mx, mx_preference); - if (0 == strcmp(mx, TEST_EXPECTED_MX)) - { - GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "%s correctly resolved to %s!\n", TEST_DOMAIN, - TEST_EXPECTED_MX); - ok = 0; - } - } - } - } - - GNUNET_SCHEDULER_add_now (&shutdown_task, NULL); - -} - - -/** - * Function scheduled to be run on the successful start of services - * tries to look up the dns record for TEST_DOMAIN - */ -static void -commence_testing (void *cls, int32_t success, const char *emsg) -{ - gns_handle = GNUNET_GNS_connect(cfg); - if (NULL == gns_handle) - { - GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Failed to connect to GNS!\n"); - end_badly_now(); - return; - } - GNUNET_GNS_lookup(gns_handle, TEST_DOMAIN, GNUNET_DNSPARSER_TYPE_MX, - GNUNET_NO, - NULL, - &on_lookup_result, TEST_DOMAIN); -} - - -static void -do_check (void *cls, - const struct GNUNET_CONFIGURATION_Handle *ccfg, - struct GNUNET_TESTING_Peer *peer) -{ - struct GNUNET_CRYPTO_EccPublicSignKey alice_pkey; - struct GNUNET_CRYPTO_EccPublicSignKey bob_pkey; - struct GNUNET_CRYPTO_EccPrivateKey *alice_key; - struct GNUNET_CRYPTO_EccPrivateKey *bob_key; - struct GNUNET_CRYPTO_ShortHashCode bob_hash; - struct GNUNET_CRYPTO_EccSignature *sig; - char* alice_keyfile; - struct GNUNET_TIME_Absolute et; - - cfg = ccfg; - die_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT, &end_badly, NULL); - - /* put records into namestore */ - namestore_handle = GNUNET_NAMESTORE_connect(cfg); - if (NULL == namestore_handle) - { - GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Failed to connect to namestore\n"); - end_badly_now(); - return; - } - - if (GNUNET_OK != GNUNET_CONFIGURATION_get_value_filename (cfg, "gns", - "ZONEKEY", - &alice_keyfile)) - { - GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Failed to get key from cfg\n"); - end_badly_now(); - return; - } - - alice_key = GNUNET_CRYPTO_ecc_key_create_from_file (alice_keyfile); - bob_key = GNUNET_CRYPTO_ecc_key_create_from_file (KEYFILE_BOB); - - GNUNET_CRYPTO_ecc_key_get_public_for_signature (alice_key, &alice_pkey); - GNUNET_CRYPTO_ecc_key_get_public_for_signature (bob_key, &bob_pkey); - - struct GNUNET_NAMESTORE_RecordData rd; - char* ip = TEST_IP; - struct in_addr *mail = GNUNET_malloc(sizeof(struct in_addr)); - char *mx_record; - uint16_t mx_preference = 1; - rd.expiration_time = UINT64_MAX; - GNUNET_assert(1 == inet_pton (AF_INET, ip, mail)); - - GNUNET_CRYPTO_short_hash(&bob_pkey, sizeof(bob_pkey), &bob_hash); - - rd.data_size = sizeof(struct GNUNET_CRYPTO_ShortHashCode); - rd.data = &bob_hash; - rd.record_type = GNUNET_NAMESTORE_TYPE_PKEY; - rd.flags = GNUNET_NAMESTORE_RF_NONE; - - GNUNET_NAMESTORE_record_put_by_authority (namestore_handle, - alice_key, - TEST_AUTHORITY_NAME, - 1, &rd, - NULL, - NULL); - - rd.data_size = sizeof(struct in_addr); - rd.data = mail; - rd.record_type = GNUNET_DNSPARSER_TYPE_A; - sig = GNUNET_NAMESTORE_create_signature(bob_key, - GNUNET_TIME_UNIT_FOREVER_ABS, - TEST_RECORD_NAME, - &rd, 1); - et.abs_value_us = rd.expiration_time; - GNUNET_NAMESTORE_record_put (namestore_handle, - &bob_pkey, - TEST_RECORD_NAME, - et, - 1, - &rd, - sig, - NULL, - NULL); - GNUNET_free (sig); - - rd.data_size = sizeof(struct GNUNET_DNSPARSER_MxRecord)+strlen(TEST_MX_NAME)+1; - mx_record = GNUNET_malloc(sizeof(struct GNUNET_DNSPARSER_MxRecord)+strlen(TEST_MX_NAME)+1); - memcpy(mx_record, &mx_preference, sizeof(uint16_t)); - strcpy(mx_record+sizeof(uint16_t), TEST_MX_NAME); - rd.data = mx_record; - rd.record_type = GNUNET_DNSPARSER_TYPE_MX; - sig = GNUNET_NAMESTORE_create_signature(bob_key, - GNUNET_TIME_UNIT_FOREVER_ABS, - GNUNET_GNS_MASTERZONE_STR, - &rd, 1); - et.abs_value_us = rd.expiration_time; - GNUNET_NAMESTORE_record_put (namestore_handle, - &bob_pkey, - GNUNET_GNS_MASTERZONE_STR, - et, - 1, - &rd, - sig, - &commence_testing, - NULL); - - GNUNET_free (alice_keyfile); - GNUNET_free (mx_record); - GNUNET_free (mail); - GNUNET_free (sig); - GNUNET_free (bob_key); - GNUNET_free (alice_key); -} - - -int -main (int argc, char *argv[]) -{ - ok = 1; - GNUNET_log_setup ("test-gns-simple-mx-lookup", - "WARNING", - NULL); - GNUNET_TESTING_peer_run ("test-gns-simple-mx-lookup", "test_gns_simple_lookup.conf", &do_check, NULL); - return ok; -} - -/* end of test_gns_simple_mx_lookup.c */