1/*	$NetBSD: resolver_test.c,v 1.2 2024/02/21 22:52:50 christos Exp $	*/
2
3/*
4 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5 *
6 * SPDX-License-Identifier: MPL-2.0
7 *
8 * This Source Code Form is subject to the terms of the Mozilla Public
9 * License, v. 2.0. If a copy of the MPL was not distributed with this
10 * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11 *
12 * See the COPYRIGHT file distributed with this work for additional
13 * information regarding copyright ownership.
14 */
15
16#include <inttypes.h>
17#include <sched.h> /* IWYU pragma: keep */
18#include <setjmp.h>
19#include <stdarg.h>
20#include <stddef.h>
21#include <stdlib.h>
22#include <unistd.h>
23
24#define UNIT_TESTING
25#include <cmocka.h>
26
27#include <isc/app.h>
28#include <isc/buffer.h>
29#include <isc/net.h>
30#include <isc/print.h>
31#include <isc/task.h>
32#include <isc/timer.h>
33#include <isc/util.h>
34
35#include <dns/dispatch.h>
36#include <dns/name.h>
37#include <dns/resolver.h>
38#include <dns/view.h>
39
40#include <tests/dns.h>
41
42static dns_dispatchmgr_t *dispatchmgr = NULL;
43static dns_dispatch_t *dispatch = NULL;
44static dns_view_t *view = NULL;
45
46static int
47_setup(void **state) {
48	isc_result_t result;
49	isc_sockaddr_t local;
50
51	setup_managers(state);
52
53	result = dns_dispatchmgr_create(mctx, netmgr, &dispatchmgr);
54	assert_int_equal(result, ISC_R_SUCCESS);
55
56	result = dns_test_makeview("view", true, &view);
57	assert_int_equal(result, ISC_R_SUCCESS);
58
59	isc_sockaddr_any(&local);
60	result = dns_dispatch_createudp(dispatchmgr, &local, &dispatch);
61	assert_int_equal(result, ISC_R_SUCCESS);
62
63	return (0);
64}
65
66static int
67_teardown(void **state) {
68	dns_dispatch_detach(&dispatch);
69	dns_view_detach(&view);
70	dns_dispatchmgr_detach(&dispatchmgr);
71
72	teardown_managers(state);
73
74	return (0);
75}
76
77static void
78mkres(dns_resolver_t **resolverp) {
79	isc_result_t result;
80
81	result = dns_resolver_create(view, taskmgr, 1, 1, netmgr, timermgr, 0,
82				     dispatchmgr, dispatch, NULL, resolverp);
83	assert_int_equal(result, ISC_R_SUCCESS);
84}
85
86static void
87destroy_resolver(dns_resolver_t **resolverp) {
88	dns_resolver_shutdown(*resolverp);
89	dns_resolver_detach(resolverp);
90}
91
92/* dns_resolver_create */
93ISC_RUN_TEST_IMPL(dns_resolver_create) {
94	dns_resolver_t *resolver = NULL;
95
96	UNUSED(state);
97
98	mkres(&resolver);
99	destroy_resolver(&resolver);
100}
101
102/* dns_resolver_gettimeout */
103ISC_RUN_TEST_IMPL(dns_resolver_gettimeout) {
104	dns_resolver_t *resolver = NULL;
105	unsigned int timeout;
106
107	UNUSED(state);
108
109	mkres(&resolver);
110
111	timeout = dns_resolver_gettimeout(resolver);
112	assert_true(timeout > 0);
113
114	destroy_resolver(&resolver);
115}
116
117/* dns_resolver_settimeout */
118ISC_RUN_TEST_IMPL(dns_resolver_settimeout) {
119	dns_resolver_t *resolver = NULL;
120	unsigned int default_timeout, timeout;
121
122	UNUSED(state);
123
124	mkres(&resolver);
125
126	default_timeout = dns_resolver_gettimeout(resolver);
127	dns_resolver_settimeout(resolver, default_timeout + 1);
128	timeout = dns_resolver_gettimeout(resolver);
129	assert_true(timeout == default_timeout + 1);
130
131	destroy_resolver(&resolver);
132}
133
134/* dns_resolver_settimeout */
135ISC_RUN_TEST_IMPL(dns_resolver_settimeout_default) {
136	dns_resolver_t *resolver = NULL;
137	unsigned int default_timeout, timeout;
138
139	UNUSED(state);
140
141	mkres(&resolver);
142
143	default_timeout = dns_resolver_gettimeout(resolver);
144	dns_resolver_settimeout(resolver, default_timeout + 100);
145
146	timeout = dns_resolver_gettimeout(resolver);
147	assert_int_equal(timeout, default_timeout + 100);
148
149	dns_resolver_settimeout(resolver, 0);
150	timeout = dns_resolver_gettimeout(resolver);
151	assert_int_equal(timeout, default_timeout);
152
153	destroy_resolver(&resolver);
154}
155
156/* dns_resolver_settimeout below minimum */
157ISC_RUN_TEST_IMPL(dns_resolver_settimeout_belowmin) {
158	dns_resolver_t *resolver = NULL;
159	unsigned int default_timeout, timeout;
160
161	UNUSED(state);
162
163	mkres(&resolver);
164
165	default_timeout = dns_resolver_gettimeout(resolver);
166	dns_resolver_settimeout(resolver, 9000);
167
168	timeout = dns_resolver_gettimeout(resolver);
169	assert_int_equal(timeout, default_timeout);
170
171	destroy_resolver(&resolver);
172}
173
174/* dns_resolver_settimeout over maximum */
175ISC_RUN_TEST_IMPL(dns_resolver_settimeout_overmax) {
176	dns_resolver_t *resolver = NULL;
177	unsigned int timeout;
178
179	UNUSED(state);
180
181	mkres(&resolver);
182
183	dns_resolver_settimeout(resolver, 4000000);
184	timeout = dns_resolver_gettimeout(resolver);
185	assert_in_range(timeout, 0, 3999999);
186	destroy_resolver(&resolver);
187}
188
189ISC_TEST_LIST_START
190
191ISC_TEST_ENTRY_CUSTOM(dns_resolver_create, _setup, _teardown)
192ISC_TEST_ENTRY_CUSTOM(dns_resolver_gettimeout, _setup, _teardown)
193ISC_TEST_ENTRY_CUSTOM(dns_resolver_settimeout, _setup, _teardown)
194ISC_TEST_ENTRY_CUSTOM(dns_resolver_settimeout_default, _setup, _teardown)
195ISC_TEST_ENTRY_CUSTOM(dns_resolver_settimeout_belowmin, _setup, _teardown)
196ISC_TEST_ENTRY_CUSTOM(dns_resolver_settimeout_overmax, _setup, _teardown)
197
198ISC_TEST_LIST_END
199
200ISC_TEST_MAIN
201