From 232ce99558a8b67f43a8415110eaf08271cb8bfa Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Mon, 27 Jan 2014 10:51:27 +0100 Subject: [PATCH] Add dnssec test +rename dnssec_return_supporting_responses to dnssec_return_validation_chain --- .gitignore | 1 + src/test/Makefile.in | 6 +- src/test/tests_dnssec.c | 127 ++++++++++++++++++++++++++++++++++++++++ src/util-internal.c | 2 +- 4 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 src/test/tests_dnssec.c diff --git a/.gitignore b/.gitignore index d53a4dba..35748d59 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,7 @@ tests_dict tests_list tests_stub_async tests_stub_sync +src/test/tests_dnssec src/example/example-reverse src/test/check_getdns.log check_getdns diff --git a/src/test/Makefile.in b/src/test/Makefile.in index 9dbdbe55..c5d8f0f7 100644 --- a/src/test/Makefile.in +++ b/src/test/Makefile.in @@ -19,7 +19,7 @@ CC=gcc CFLAGS=@CFLAGS@ -Wall -I$(srcdir)/ -I$(srcdir)/../ -I/usr/local/include -std=c99 $(cflags) LDFLAGS=@LDFLAGS@ -L. -L.. -L/usr/local/lib LDLIBS=-lgetdns @LIBS@ -lcheck -PROGRAMS=tests_dict tests_list tests_stub_async tests_stub_sync check_getdns +PROGRAMS=tests_dict tests_list tests_stub_async tests_stub_sync check_getdns tests_dnssec .SUFFIXES: .c .o .a .lo .h @@ -48,6 +48,10 @@ check_getdns_common: check_getdns_common.o check_getdns: check_getdns.o check_getdns_common.o $(LIBTOOL) --tag=CC --mode=link $(CC) $(CFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ $^ +tests_dnssec: tests_dnssec.o testmessages.o + $(LIBTOOL) --tag=CC --mode=link $(CC) $(CFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ tests_dnssec.o testmessages.o + + test: all ./testscript.sh @echo "All tests OK" diff --git a/src/test/tests_dnssec.c b/src/test/tests_dnssec.c new file mode 100644 index 00000000..b66c6c9d --- /dev/null +++ b/src/test/tests_dnssec.c @@ -0,0 +1,127 @@ +/** + * \file + * unit tests for getdns_dict helper routines, these should be used to + * perform regression tests, output must be unchanged from canonical output + * stored with the sources + */ +/* The MIT License (MIT) + * Copyright (c) 2013 Verisign, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include "config.h" +#ifdef HAVE_EVENT2_EVENT_H +# include +#else +# include +#endif +#include +#include +#include +#include "testmessages.h" +#include + +/* Set up the callback function, which will also do the processing of the results */ +void +this_callbackfn(struct getdns_context *this_context, + uint16_t this_callback_type, + struct getdns_dict *this_response, + void *this_userarg, getdns_transaction_t this_transaction_id) +{ + if (this_callback_type == GETDNS_CALLBACK_COMPLETE) { /* This is a callback with data */ + char *res = getdns_pretty_print_dict(this_response); + fprintf(stdout, "%s\n", res); + free(res); + + } else if (this_callback_type == GETDNS_CALLBACK_CANCEL) + fprintf(stderr, + "The callback with ID %llu was cancelled. Exiting.", + (unsigned long long)this_transaction_id); + else + fprintf(stderr, + "The callback got a callback_type of %d. Exiting.", + this_callback_type); + getdns_dict_destroy(this_response); +} + +int +main(int argc, char** argv) +{ + /* Create the DNS context for this call */ + struct getdns_context *this_context = NULL; + getdns_return_t context_create_return = + getdns_context_create(&this_context, 1); + if (context_create_return != GETDNS_RETURN_GOOD) { + fprintf(stderr, "Trying to create the context failed: %d", + context_create_return); + return (GETDNS_RETURN_GENERIC_ERROR); + } + getdns_context_set_timeout(this_context, 5000); + + struct getdns_dict * this_extensions = getdns_dict_create(); + getdns_return_t this_ret = getdns_dict_set_int(this_extensions, + "dnssec_return_validation_chain", GETDNS_EXTENSION_TRUE); + if (this_ret != GETDNS_RETURN_GOOD) { + fprintf(stderr, "Setting extension " + "\"dnssec_return_validation_chain\" failed: %d\n", this_ret); + getdns_dict_destroy(this_extensions); + getdns_context_destroy(this_context); + return (GETDNS_RETURN_GENERIC_ERROR); + } + + /* Create an event base and put it in the context using the unknown function name */ + struct event_base *this_event_base; + this_event_base = event_base_new(); + if (this_event_base == NULL) { + fprintf(stderr, "Trying to create the event base failed."); + getdns_context_destroy(this_context); + return (GETDNS_RETURN_GENERIC_ERROR); + } + (void) getdns_extension_set_libevent_base(this_context, + this_event_base); + /* Set up the getdns call */ + const char *this_name = argc > 1 ? argv[1] : "www.example.com"; + char *this_userarg = "somestring"; // Could add things here to help identify this call + getdns_transaction_t this_transaction_id = 0; + + /* Make the call */ + getdns_return_t dns_request_return = + getdns_address(this_context, this_name, + this_extensions, this_userarg, &this_transaction_id, this_callbackfn); + if (dns_request_return == GETDNS_RETURN_BAD_DOMAIN_NAME) { + fprintf(stderr, "A bad domain name was used: %s. Exiting.", + this_name); + event_base_free(this_event_base); + getdns_context_destroy(this_context); + return (GETDNS_RETURN_GENERIC_ERROR); + } + else { + /* Call the event loop */ + event_base_dispatch(this_event_base); + // TODO: check the return value above + } + /* Clean up */ + event_base_free(this_event_base); + getdns_context_destroy(this_context); + /* Assuming we get here, leave gracefully */ + exit(EXIT_SUCCESS); +} /* main */ + +/* example-simple-answers.c */ diff --git a/src/util-internal.c b/src/util-internal.c index e71e559c..ec468a70 100644 --- a/src/util-internal.c +++ b/src/util-internal.c @@ -53,7 +53,7 @@ static getdns_extension_format extformats[] = { {"add_warning_for_bad_dns", t_int}, {"dnssec_return_only_secure", t_int}, {"dnssec_return_status", t_int}, - {"dnssec_return_supporting_responses", t_int}, + {"dnssec_return_validation_chain", t_int}, {"return_api_information", t_int}, {"return_both_v4_and_v6", t_int}, {"return_call_debugging", t_int},