xref: /minix3/external/bsd/bind/dist/bin/tests/resolver/t_resolver.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: t_resolver.c,v 1.11 2014/12/10 04:37:53 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2011-2014  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek  */
18*00b67f09SDavid van Moolenbroek 
19*00b67f09SDavid van Moolenbroek /* Id: t_resolver.c,v 1.3 2011/02/03 12:18:11 tbox Exp  */
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek #include <config.h>
22*00b67f09SDavid van Moolenbroek 
23*00b67f09SDavid van Moolenbroek #include <ctype.h>
24*00b67f09SDavid van Moolenbroek #include <stdlib.h>
25*00b67f09SDavid van Moolenbroek 
26*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
27*00b67f09SDavid van Moolenbroek #include <isc/util.h>
28*00b67f09SDavid van Moolenbroek #include <isc/string.h>
29*00b67f09SDavid van Moolenbroek #include <isc/timer.h>
30*00b67f09SDavid van Moolenbroek #include <isc/task.h>
31*00b67f09SDavid van Moolenbroek 
32*00b67f09SDavid van Moolenbroek #include <dns/dispatch.h>
33*00b67f09SDavid van Moolenbroek #include <dns/resolver.h>
34*00b67f09SDavid van Moolenbroek #include <dns/result.h>
35*00b67f09SDavid van Moolenbroek #include <dns/view.h>
36*00b67f09SDavid van Moolenbroek 
37*00b67f09SDavid van Moolenbroek #include <tests/t_api.h>
38*00b67f09SDavid van Moolenbroek 
39*00b67f09SDavid van Moolenbroek char *progname;
40*00b67f09SDavid van Moolenbroek 
41*00b67f09SDavid van Moolenbroek #define CHECK(x) RUNTIME_CHECK(ISC_R_SUCCESS == (x))
42*00b67f09SDavid van Moolenbroek 
43*00b67f09SDavid van Moolenbroek 
44*00b67f09SDavid van Moolenbroek isc_mem_t *mctx = NULL;
45*00b67f09SDavid van Moolenbroek isc_timermgr_t *timer_manager = NULL;
46*00b67f09SDavid van Moolenbroek isc_socketmgr_t *socket_manager = NULL;
47*00b67f09SDavid van Moolenbroek isc_taskmgr_t *task_manager = NULL;
48*00b67f09SDavid van Moolenbroek dns_dispatchmgr_t *dispatch_manager = NULL;
49*00b67f09SDavid van Moolenbroek dns_view_t *view = NULL;
50*00b67f09SDavid van Moolenbroek dns_dispatch_t *dispatch_v4 = NULL;
51*00b67f09SDavid van Moolenbroek 
52*00b67f09SDavid van Moolenbroek static void
setup_create_dispatch_v4(void)53*00b67f09SDavid van Moolenbroek setup_create_dispatch_v4(void)
54*00b67f09SDavid van Moolenbroek {
55*00b67f09SDavid van Moolenbroek 	isc_sockaddr_t local_address;
56*00b67f09SDavid van Moolenbroek 	isc_sockaddr_any(&local_address);
57*00b67f09SDavid van Moolenbroek 
58*00b67f09SDavid van Moolenbroek 	CHECK(dns_dispatch_getudp(dispatch_manager, socket_manager,
59*00b67f09SDavid van Moolenbroek 				  task_manager, &local_address,
60*00b67f09SDavid van Moolenbroek 				  4096, 100, 100, 100, 500, 0, 0,
61*00b67f09SDavid van Moolenbroek 				  &dispatch_v4));
62*00b67f09SDavid van Moolenbroek }
63*00b67f09SDavid van Moolenbroek static void
setup(void)64*00b67f09SDavid van Moolenbroek setup(void) {
65*00b67f09SDavid van Moolenbroek 	/* 1 */ CHECK(isc_mem_create(0, 0, &mctx));
66*00b67f09SDavid van Moolenbroek 	/* 2 */ CHECK(isc_timermgr_create(mctx, &timer_manager));
67*00b67f09SDavid van Moolenbroek 	/* 3 */ CHECK(isc_taskmgr_create(mctx, 1, 0, &task_manager));
68*00b67f09SDavid van Moolenbroek 	/* 4 */ CHECK(isc_socketmgr_create(mctx, &socket_manager));
69*00b67f09SDavid van Moolenbroek 	/* 5 */ CHECK(dns_dispatchmgr_create(mctx, NULL, &dispatch_manager));
70*00b67f09SDavid van Moolenbroek 	/* 6 */ CHECK(dns_view_create(mctx, dns_rdataclass_in, "testview", &view));
71*00b67f09SDavid van Moolenbroek 	/* 7 */ setup_create_dispatch_v4();
72*00b67f09SDavid van Moolenbroek }
73*00b67f09SDavid van Moolenbroek 
74*00b67f09SDavid van Moolenbroek static void
teardown(void)75*00b67f09SDavid van Moolenbroek teardown(void) {
76*00b67f09SDavid van Moolenbroek 	/* 7 */ dns_dispatch_detach(&dispatch_v4);
77*00b67f09SDavid van Moolenbroek 	/* 6 */ dns_view_detach(&view);
78*00b67f09SDavid van Moolenbroek 	/* 5 */ dns_dispatchmgr_destroy(&dispatch_manager);
79*00b67f09SDavid van Moolenbroek 	/* 4 */ isc_socketmgr_destroy(&socket_manager);
80*00b67f09SDavid van Moolenbroek 	/* 3 */ isc_taskmgr_destroy(&task_manager);
81*00b67f09SDavid van Moolenbroek 	/* 2 */ isc_timermgr_destroy(&timer_manager);
82*00b67f09SDavid van Moolenbroek 	/* 1 */ isc_mem_destroy(&mctx);
83*00b67f09SDavid van Moolenbroek }
84*00b67f09SDavid van Moolenbroek 
85*00b67f09SDavid van Moolenbroek static isc_result_t
make_resolver(dns_resolver_t ** resolverp)86*00b67f09SDavid van Moolenbroek make_resolver(dns_resolver_t **resolverp) {
87*00b67f09SDavid van Moolenbroek 	isc_result_t result;
88*00b67f09SDavid van Moolenbroek 
89*00b67f09SDavid van Moolenbroek 	result = dns_resolver_create(view,
90*00b67f09SDavid van Moolenbroek 			    task_manager, 1, 1,
91*00b67f09SDavid van Moolenbroek 			    socket_manager,
92*00b67f09SDavid van Moolenbroek 			    timer_manager,
93*00b67f09SDavid van Moolenbroek 			    0, /* unsigned int options, */
94*00b67f09SDavid van Moolenbroek 			    dispatch_manager,
95*00b67f09SDavid van Moolenbroek 			    dispatch_v4,
96*00b67f09SDavid van Moolenbroek 			    NULL, /* dns_dispatch_t *dispatchv6, */
97*00b67f09SDavid van Moolenbroek 			    resolverp);
98*00b67f09SDavid van Moolenbroek 
99*00b67f09SDavid van Moolenbroek 	return (result);
100*00b67f09SDavid van Moolenbroek }
101*00b67f09SDavid van Moolenbroek 
102*00b67f09SDavid van Moolenbroek static void
destroy_resolver(dns_resolver_t ** resolverp)103*00b67f09SDavid van Moolenbroek destroy_resolver(dns_resolver_t **resolverp) {
104*00b67f09SDavid van Moolenbroek 	dns_resolver_shutdown(*resolverp);
105*00b67f09SDavid van Moolenbroek 	dns_resolver_detach(resolverp);
106*00b67f09SDavid van Moolenbroek }
107*00b67f09SDavid van Moolenbroek 
108*00b67f09SDavid van Moolenbroek static void
test_dns_resolver_create(void)109*00b67f09SDavid van Moolenbroek test_dns_resolver_create(void) {
110*00b67f09SDavid van Moolenbroek 	dns_resolver_t *resolver = NULL;
111*00b67f09SDavid van Moolenbroek 
112*00b67f09SDavid van Moolenbroek 	t_assert("test_dns_resolver_create", 1, T_REQUIRED, "%s",
113*00b67f09SDavid van Moolenbroek 		 "a resolver can be created successfully");
114*00b67f09SDavid van Moolenbroek 	setup();
115*00b67f09SDavid van Moolenbroek 	CHECK(make_resolver(&resolver));
116*00b67f09SDavid van Moolenbroek 
117*00b67f09SDavid van Moolenbroek 	destroy_resolver(&resolver);
118*00b67f09SDavid van Moolenbroek 	teardown();
119*00b67f09SDavid van Moolenbroek 
120*00b67f09SDavid van Moolenbroek 	t_result(T_PASS);
121*00b67f09SDavid van Moolenbroek }
122*00b67f09SDavid van Moolenbroek 
123*00b67f09SDavid van Moolenbroek static void
test_dns_resolver_gettimeout(void)124*00b67f09SDavid van Moolenbroek test_dns_resolver_gettimeout(void) {
125*00b67f09SDavid van Moolenbroek 	dns_resolver_t *resolver = NULL;
126*00b67f09SDavid van Moolenbroek 	int test_result;
127*00b67f09SDavid van Moolenbroek 	unsigned int timeout;
128*00b67f09SDavid van Moolenbroek 
129*00b67f09SDavid van Moolenbroek 	t_assert("test_dns_resolver_gettimeout", 1, T_REQUIRED, "%s",
130*00b67f09SDavid van Moolenbroek 		 "The default timeout is returned from _gettimeout()");
131*00b67f09SDavid van Moolenbroek 	setup();
132*00b67f09SDavid van Moolenbroek 	CHECK(make_resolver(&resolver));
133*00b67f09SDavid van Moolenbroek 
134*00b67f09SDavid van Moolenbroek 	timeout = dns_resolver_gettimeout(resolver);
135*00b67f09SDavid van Moolenbroek 	t_info("The default timeout is %d second%s\n", timeout, (timeout == 1 ? "" : "s"));
136*00b67f09SDavid van Moolenbroek 	test_result = (timeout > 0) ? T_PASS : T_FAIL;
137*00b67f09SDavid van Moolenbroek 
138*00b67f09SDavid van Moolenbroek 	destroy_resolver(&resolver);
139*00b67f09SDavid van Moolenbroek 	teardown();
140*00b67f09SDavid van Moolenbroek 
141*00b67f09SDavid van Moolenbroek 	t_result(test_result);
142*00b67f09SDavid van Moolenbroek }
143*00b67f09SDavid van Moolenbroek 
144*00b67f09SDavid van Moolenbroek static void
test_dns_resolver_settimeout(void)145*00b67f09SDavid van Moolenbroek test_dns_resolver_settimeout(void) {
146*00b67f09SDavid van Moolenbroek 	dns_resolver_t *resolver = NULL;
147*00b67f09SDavid van Moolenbroek 	int test_result;
148*00b67f09SDavid van Moolenbroek 	unsigned int default_timeout, timeout;
149*00b67f09SDavid van Moolenbroek 
150*00b67f09SDavid van Moolenbroek 	t_assert("test_dns_resolver_settimeout", 1, T_REQUIRED, "%s",
151*00b67f09SDavid van Moolenbroek 		 "_settimeout() can change the timeout to a non-default");
152*00b67f09SDavid van Moolenbroek 	setup();
153*00b67f09SDavid van Moolenbroek 	CHECK(make_resolver(&resolver));
154*00b67f09SDavid van Moolenbroek 
155*00b67f09SDavid van Moolenbroek 	default_timeout = dns_resolver_gettimeout(resolver);
156*00b67f09SDavid van Moolenbroek 	t_info("The default timeout is %d second%s\n", default_timeout,
157*00b67f09SDavid van Moolenbroek 	       (default_timeout == 1 ? "" : "s"));
158*00b67f09SDavid van Moolenbroek 
159*00b67f09SDavid van Moolenbroek 	dns_resolver_settimeout(resolver, default_timeout + 1);
160*00b67f09SDavid van Moolenbroek 	timeout = dns_resolver_gettimeout(resolver);
161*00b67f09SDavid van Moolenbroek 	t_info("The new timeout is %d second%s\n", timeout,
162*00b67f09SDavid van Moolenbroek 	       (timeout == 1 ? "" : "s"));
163*00b67f09SDavid van Moolenbroek 	test_result = (timeout == default_timeout + 1) ? T_PASS : T_FAIL;
164*00b67f09SDavid van Moolenbroek 
165*00b67f09SDavid van Moolenbroek 	destroy_resolver(&resolver);
166*00b67f09SDavid van Moolenbroek 	teardown();
167*00b67f09SDavid van Moolenbroek 
168*00b67f09SDavid van Moolenbroek 	t_result(test_result);
169*00b67f09SDavid van Moolenbroek }
170*00b67f09SDavid van Moolenbroek 
171*00b67f09SDavid van Moolenbroek static void
test_dns_resolver_settimeout_to_default(void)172*00b67f09SDavid van Moolenbroek test_dns_resolver_settimeout_to_default(void) {
173*00b67f09SDavid van Moolenbroek 	dns_resolver_t *resolver = NULL;
174*00b67f09SDavid van Moolenbroek 	int test_result;
175*00b67f09SDavid van Moolenbroek 	unsigned int default_timeout, timeout;
176*00b67f09SDavid van Moolenbroek 
177*00b67f09SDavid van Moolenbroek 	t_assert("test_dns_resolver_settimeout_to_default", 1, T_REQUIRED, "%s",
178*00b67f09SDavid van Moolenbroek 		 "_settimeout() can change the timeout back to a default value"
179*00b67f09SDavid van Moolenbroek 		 " by specifying 0 as the timeout.");
180*00b67f09SDavid van Moolenbroek 	setup();
181*00b67f09SDavid van Moolenbroek 	CHECK(make_resolver(&resolver));
182*00b67f09SDavid van Moolenbroek 
183*00b67f09SDavid van Moolenbroek 	default_timeout = dns_resolver_gettimeout(resolver);
184*00b67f09SDavid van Moolenbroek 	t_info("The default timeout is %d second%s\n", default_timeout,
185*00b67f09SDavid van Moolenbroek 	       (default_timeout == 1 ? "" : "s"));
186*00b67f09SDavid van Moolenbroek 
187*00b67f09SDavid van Moolenbroek 	dns_resolver_settimeout(resolver, default_timeout - 1);
188*00b67f09SDavid van Moolenbroek 	timeout = dns_resolver_gettimeout(resolver);
189*00b67f09SDavid van Moolenbroek 	t_info("The new timeout is %d second%s\n", timeout,
190*00b67f09SDavid van Moolenbroek 	       (timeout == 1 ? "" : "s"));
191*00b67f09SDavid van Moolenbroek 
192*00b67f09SDavid van Moolenbroek 	dns_resolver_settimeout(resolver, 0);
193*00b67f09SDavid van Moolenbroek 	timeout = dns_resolver_gettimeout(resolver);
194*00b67f09SDavid van Moolenbroek 	test_result = (timeout == default_timeout) ? T_PASS : T_FAIL;
195*00b67f09SDavid van Moolenbroek 
196*00b67f09SDavid van Moolenbroek 	destroy_resolver(&resolver);
197*00b67f09SDavid van Moolenbroek 	teardown();
198*00b67f09SDavid van Moolenbroek 
199*00b67f09SDavid van Moolenbroek 	t_result(test_result);
200*00b67f09SDavid van Moolenbroek }
201*00b67f09SDavid van Moolenbroek 
202*00b67f09SDavid van Moolenbroek static void
test_dns_resolver_settimeout_over_maximum(void)203*00b67f09SDavid van Moolenbroek test_dns_resolver_settimeout_over_maximum(void) {
204*00b67f09SDavid van Moolenbroek 	dns_resolver_t *resolver = NULL;
205*00b67f09SDavid van Moolenbroek 	int test_result;
206*00b67f09SDavid van Moolenbroek 	unsigned int timeout;
207*00b67f09SDavid van Moolenbroek 
208*00b67f09SDavid van Moolenbroek 	t_assert("test_dns_resolver_settimeout_over_maximum", 1, T_REQUIRED, "%s",
209*00b67f09SDavid van Moolenbroek 		 "_settimeout() cannot set the value larger than the maximum.");
210*00b67f09SDavid van Moolenbroek 	setup();
211*00b67f09SDavid van Moolenbroek 	CHECK(make_resolver(&resolver));
212*00b67f09SDavid van Moolenbroek 
213*00b67f09SDavid van Moolenbroek 	dns_resolver_settimeout(resolver, 4000000);
214*00b67f09SDavid van Moolenbroek 	timeout = dns_resolver_gettimeout(resolver);
215*00b67f09SDavid van Moolenbroek 	t_info("The new timeout is %d second%s\n", timeout,
216*00b67f09SDavid van Moolenbroek 	       (timeout == 1 ? "" : "s"));
217*00b67f09SDavid van Moolenbroek 
218*00b67f09SDavid van Moolenbroek 	test_result = (timeout < 4000000 && timeout > 0) ? T_PASS : T_FAIL;
219*00b67f09SDavid van Moolenbroek 
220*00b67f09SDavid van Moolenbroek 	destroy_resolver(&resolver);
221*00b67f09SDavid van Moolenbroek 	teardown();
222*00b67f09SDavid van Moolenbroek 
223*00b67f09SDavid van Moolenbroek 	t_result(test_result);
224*00b67f09SDavid van Moolenbroek }
225*00b67f09SDavid van Moolenbroek 
226*00b67f09SDavid van Moolenbroek 
227*00b67f09SDavid van Moolenbroek testspec_t T_testlist[] = {
228*00b67f09SDavid van Moolenbroek 	{ (PFV) test_dns_resolver_create,	"dns_resolver_create"		},
229*00b67f09SDavid van Moolenbroek 	{ (PFV) test_dns_resolver_settimeout,	"dns_resolver_settimeout"	},
230*00b67f09SDavid van Moolenbroek 	{ (PFV) test_dns_resolver_gettimeout,	"dns_resolver_gettimeout"	},
231*00b67f09SDavid van Moolenbroek 	{ (PFV) test_dns_resolver_settimeout_to_default, "test_dns_resolver_settimeout_to_default" },
232*00b67f09SDavid van Moolenbroek 	{ (PFV) test_dns_resolver_settimeout_over_maximum, "test_dns_resolver_settimeout_over_maximum" },
233*00b67f09SDavid van Moolenbroek 	{ (PFV) 0,	NULL }
234*00b67f09SDavid van Moolenbroek };
235*00b67f09SDavid van Moolenbroek 
236*00b67f09SDavid van Moolenbroek #ifdef WIN32
237*00b67f09SDavid van Moolenbroek int
main(int argc,char ** argv)238*00b67f09SDavid van Moolenbroek main(int argc, char **argv) {
239*00b67f09SDavid van Moolenbroek 	t_settests(T_testlist);
240*00b67f09SDavid van Moolenbroek 	return (t_main(argc, argv));
241*00b67f09SDavid van Moolenbroek }
242*00b67f09SDavid van Moolenbroek #endif
243