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