1 1.1 christos /* $NetBSD: doh_test.c,v 1.4 2025/05/21 14:48:08 christos Exp $ */ 2 1.1 christos 3 1.1 christos /* 4 1.1 christos * Copyright (C) Internet Systems Consortium, Inc. ("ISC") 5 1.1 christos * 6 1.1 christos * SPDX-License-Identifier: MPL-2.0 7 1.1 christos * 8 1.1 christos * This Source Code Form is subject to the terms of the Mozilla Public 9 1.1 christos * License, v. 2.0. If a copy of the MPL was not distributed with this 10 1.1 christos * file, you can obtain one at https://mozilla.org/MPL/2.0/. 11 1.1 christos * 12 1.1 christos * See the COPYRIGHT file distributed with this work for additional 13 1.1 christos * information regarding copyright ownership. 14 1.1 christos */ 15 1.1 christos 16 1.1 christos #include <inttypes.h> 17 1.1 christos #include <sched.h> /* IWYU pragma: keep */ 18 1.1 christos #include <setjmp.h> 19 1.1 christos #include <stdarg.h> 20 1.1 christos #include <stdbool.h> 21 1.1 christos #include <stddef.h> 22 1.1 christos #include <stdlib.h> 23 1.1 christos #include <time.h> 24 1.1 christos #include <unistd.h> 25 1.1 christos 26 1.1 christos /* 27 1.1 christos * As a workaround, include an OpenSSL header file before including cmocka.h, 28 1.1 christos * because OpenSSL 3.1.0 uses __attribute__(malloc), conflicting with a 29 1.1 christos * redefined malloc in cmocka.h. 30 1.1 christos */ 31 1.1 christos #include <openssl/err.h> 32 1.1 christos 33 1.1 christos #define UNIT_TESTING 34 1.1 christos #include <cmocka.h> 35 1.1 christos 36 1.3 christos #include <isc/async.h> 37 1.1 christos #include <isc/atomic.h> 38 1.1 christos #include <isc/buffer.h> 39 1.1 christos #include <isc/condition.h> 40 1.1 christos #include <isc/mutex.h> 41 1.1 christos #include <isc/netmgr.h> 42 1.1 christos #include <isc/nonce.h> 43 1.1 christos #include <isc/os.h> 44 1.1 christos #include <isc/refcount.h> 45 1.1 christos #include <isc/sockaddr.h> 46 1.1 christos #include <isc/thread.h> 47 1.3 christos #include <isc/util.h> 48 1.3 christos #include <isc/uv.h> 49 1.1 christos 50 1.1 christos #include "uv_wrap.h" 51 1.1 christos #define KEEP_BEFORE 52 1.1 christos 53 1.1 christos #include "netmgr/http.c" 54 1.1 christos #include "netmgr/netmgr-int.h" 55 1.3 christos #include "netmgr/socket.c" 56 1.1 christos 57 1.1 christos #include <tests/isc.h> 58 1.1 christos 59 1.1 christos #define MAX_NM 2 60 1.1 christos 61 1.1 christos static isc_sockaddr_t tcp_listen_addr; 62 1.1 christos 63 1.1 christos static uint64_t send_magic = 0; 64 1.1 christos static uint64_t stop_magic = 0; 65 1.1 christos 66 1.1 christos static uv_buf_t send_msg = { .base = (char *)&send_magic, 67 1.1 christos .len = sizeof(send_magic) }; 68 1.1 christos 69 1.1 christos static atomic_int_fast64_t active_cconnects = 0; 70 1.1 christos static atomic_int_fast64_t nsends = 0; 71 1.1 christos static atomic_int_fast64_t ssends = 0; 72 1.1 christos static atomic_int_fast64_t sreads = 0; 73 1.1 christos static atomic_int_fast64_t csends = 0; 74 1.1 christos static atomic_int_fast64_t creads = 0; 75 1.1 christos static atomic_int_fast64_t ctimeouts = 0; 76 1.1 christos static atomic_int_fast64_t total_sends = 0; 77 1.1 christos 78 1.3 christos static int expected_ssends; 79 1.3 christos static int expected_sreads; 80 1.3 christos static int expected_csends; 81 1.3 christos static int expected_cconnects; 82 1.3 christos static int expected_creads; 83 1.3 christos static int expected_ctimeouts; 84 1.3 christos 85 1.3 christos #define have_expected_ssends(v) ((v) >= expected_ssends && expected_ssends >= 0) 86 1.3 christos #define have_expected_sreads(v) ((v) >= expected_sreads && expected_sreads >= 0) 87 1.3 christos #define have_expected_csends(v) ((v) >= expected_csends && expected_csends >= 0) 88 1.3 christos #define have_expected_cconnects(v) \ 89 1.3 christos ((v) >= expected_cconnects && expected_cconnects >= 0) 90 1.3 christos #define have_expected_creads(v) ((v) >= expected_creads && expected_creads >= 0) 91 1.3 christos #define have_expected_ctimeouts(v) \ 92 1.3 christos ((v) >= expected_ctimeouts && expected_ctimeouts >= 0) 93 1.1 christos 94 1.1 christos static bool noanswer = false; 95 1.1 christos 96 1.1 christos static atomic_bool POST = true; 97 1.1 christos 98 1.1 christos static atomic_bool use_TLS = false; 99 1.1 christos static isc_tlsctx_t *server_tlsctx = NULL; 100 1.1 christos static isc_tlsctx_t *client_tlsctx = NULL; 101 1.1 christos static isc_tlsctx_client_session_cache_t *client_sess_cache = NULL; 102 1.1 christos 103 1.1 christos static isc_quota_t listener_quota; 104 1.1 christos static atomic_bool check_listener_quota = false; 105 1.1 christos 106 1.1 christos static isc_nm_http_endpoints_t *endpoints = NULL; 107 1.1 christos 108 1.3 christos static atomic_bool use_PROXY = false; 109 1.3 christos static atomic_bool use_PROXY_over_TLS = false; 110 1.3 christos 111 1.3 christos static isc_nm_t **nm = NULL; 112 1.1 christos 113 1.1 christos /* Timeout for soft-timeout tests (0.05 seconds) */ 114 1.3 christos #define T_SOFT 50 115 1.3 christos #define T_CONNECT 30 * 1000 116 1.1 christos 117 1.1 christos #define NSENDS 100 118 1.1 christos #define NWRITES 10 119 1.1 christos 120 1.1 christos #define CHECK_RANGE_FULL(v) \ 121 1.1 christos { \ 122 1.1 christos int __v = atomic_load(&v); \ 123 1.1 christos assert_true(__v >= atomic_load(&total_sends)); \ 124 1.1 christos } 125 1.1 christos 126 1.1 christos #define CHECK_RANGE_HALF(v) \ 127 1.1 christos { \ 128 1.1 christos int __v = atomic_load(&v); \ 129 1.1 christos assert_true(__v >= atomic_load(&total_sends) / 2); \ 130 1.1 christos } 131 1.1 christos 132 1.1 christos /* Enable this to print values while running tests */ 133 1.1 christos #undef PRINT_DEBUG 134 1.1 christos #ifdef PRINT_DEBUG 135 1.1 christos #define X(v) fprintf(stderr, #v " = %" PRIu64 "\n", atomic_load(&v)) 136 1.1 christos #else 137 1.1 christos #define X(v) 138 1.1 christos #endif 139 1.1 christos 140 1.3 christos static isc_nm_proxy_type_t 141 1.3 christos get_proxy_type(void) { 142 1.3 christos if (!atomic_load(&use_PROXY)) { 143 1.3 christos return ISC_NM_PROXY_NONE; 144 1.3 christos } else if (atomic_load(&use_TLS) && atomic_load(&use_PROXY_over_TLS)) { 145 1.3 christos return ISC_NM_PROXY_ENCRYPTED; 146 1.1 christos } 147 1.1 christos 148 1.3 christos return ISC_NM_PROXY_PLAIN; 149 1.3 christos } 150 1.3 christos 151 1.3 christos static void 152 1.3 christos proxy_verify_unspec_endpoint(isc_nmhandle_t *handle) { 153 1.3 christos isc_sockaddr_t real_local, real_peer, local, peer; 154 1.3 christos 155 1.3 christos if (isc_nm_is_proxy_unspec(handle)) { 156 1.3 christos peer = isc_nmhandle_peeraddr(handle); 157 1.3 christos local = isc_nmhandle_localaddr(handle); 158 1.3 christos real_peer = isc_nmhandle_real_peeraddr(handle); 159 1.3 christos real_local = isc_nmhandle_real_localaddr(handle); 160 1.3 christos 161 1.3 christos assert_true(isc_sockaddr_equal(&peer, &real_peer)); 162 1.3 christos assert_true(isc_sockaddr_equal(&local, &real_local)); 163 1.3 christos } 164 1.3 christos } 165 1.3 christos 166 1.1 christos typedef struct csdata { 167 1.3 christos isc_mem_t *mctx; 168 1.1 christos isc_nm_recv_cb_t reply_cb; 169 1.1 christos void *cb_arg; 170 1.1 christos isc_region_t region; 171 1.1 christos } csdata_t; 172 1.1 christos 173 1.1 christos static void 174 1.1 christos connect_send_cb(isc_nmhandle_t *handle, isc_result_t result, void *arg) { 175 1.1 christos csdata_t data; 176 1.1 christos 177 1.1 christos (void)atomic_fetch_sub(&active_cconnects, 1); 178 1.1 christos memmove(&data, arg, sizeof(data)); 179 1.3 christos isc_mem_put(data.mctx, arg, sizeof(data)); 180 1.1 christos if (result != ISC_R_SUCCESS) { 181 1.1 christos goto error; 182 1.1 christos } 183 1.1 christos 184 1.1 christos REQUIRE(VALID_NMHANDLE(handle)); 185 1.1 christos 186 1.1 christos result = isc__nm_http_request(handle, &data.region, data.reply_cb, 187 1.1 christos data.cb_arg); 188 1.1 christos if (result != ISC_R_SUCCESS) { 189 1.1 christos goto error; 190 1.1 christos } 191 1.1 christos 192 1.3 christos isc_mem_putanddetach(&data.mctx, data.region.base, data.region.length); 193 1.1 christos return; 194 1.1 christos error: 195 1.1 christos data.reply_cb(handle, result, NULL, data.cb_arg); 196 1.3 christos isc_mem_putanddetach(&data.mctx, data.region.base, data.region.length); 197 1.1 christos } 198 1.1 christos 199 1.1 christos static void 200 1.1 christos connect_send_request(isc_nm_t *mgr, const char *uri, bool post, 201 1.1 christos isc_region_t *region, isc_nm_recv_cb_t cb, void *cbarg, 202 1.1 christos bool tls, unsigned int timeout) { 203 1.1 christos isc_region_t copy; 204 1.1 christos csdata_t *data = NULL; 205 1.1 christos isc_tlsctx_t *ctx = NULL; 206 1.1 christos 207 1.1 christos copy = (isc_region_t){ .base = isc_mem_get(mgr->mctx, region->length), 208 1.1 christos .length = region->length }; 209 1.1 christos memmove(copy.base, region->base, region->length); 210 1.1 christos data = isc_mem_get(mgr->mctx, sizeof(*data)); 211 1.1 christos *data = (csdata_t){ .reply_cb = cb, .cb_arg = cbarg, .region = copy }; 212 1.3 christos isc_mem_attach(mgr->mctx, &data->mctx); 213 1.1 christos if (tls) { 214 1.1 christos ctx = client_tlsctx; 215 1.1 christos } 216 1.1 christos 217 1.1 christos isc_nm_httpconnect(mgr, NULL, &tcp_listen_addr, uri, post, 218 1.4 christos connect_send_cb, data, ctx, NULL, client_sess_cache, 219 1.3 christos timeout, get_proxy_type(), NULL); 220 1.1 christos } 221 1.1 christos 222 1.1 christos static int 223 1.1 christos setup_ephemeral_port(isc_sockaddr_t *addr, sa_family_t family) { 224 1.1 christos isc_result_t result; 225 1.1 christos socklen_t addrlen = sizeof(*addr); 226 1.1 christos int fd; 227 1.1 christos int r; 228 1.1 christos 229 1.1 christos isc_sockaddr_fromin6(addr, &in6addr_loopback, 0); 230 1.1 christos 231 1.1 christos fd = socket(AF_INET6, family, 0); 232 1.1 christos if (fd < 0) { 233 1.1 christos perror("setup_ephemeral_port: socket()"); 234 1.3 christos return -1; 235 1.1 christos } 236 1.1 christos 237 1.1 christos r = bind(fd, (const struct sockaddr *)&addr->type.sa, 238 1.1 christos sizeof(addr->type.sin6)); 239 1.1 christos if (r != 0) { 240 1.1 christos perror("setup_ephemeral_port: bind()"); 241 1.1 christos isc__nm_closesocket(fd); 242 1.3 christos return r; 243 1.1 christos } 244 1.1 christos 245 1.1 christos r = getsockname(fd, (struct sockaddr *)&addr->type.sa, &addrlen); 246 1.1 christos if (r != 0) { 247 1.1 christos perror("setup_ephemeral_port: getsockname()"); 248 1.1 christos isc__nm_closesocket(fd); 249 1.3 christos return r; 250 1.1 christos } 251 1.1 christos 252 1.3 christos result = isc__nm_socket_reuse(fd, 1); 253 1.1 christos if (result != ISC_R_SUCCESS && result != ISC_R_NOTIMPLEMENTED) { 254 1.1 christos fprintf(stderr, 255 1.1 christos "setup_ephemeral_port: isc__nm_socket_reuse(): %s", 256 1.1 christos isc_result_totext(result)); 257 1.1 christos close(fd); 258 1.3 christos return -1; 259 1.1 christos } 260 1.1 christos 261 1.1 christos result = isc__nm_socket_reuse_lb(fd); 262 1.1 christos if (result != ISC_R_SUCCESS && result != ISC_R_NOTIMPLEMENTED) { 263 1.1 christos fprintf(stderr, 264 1.1 christos "setup_ephemeral_port: isc__nm_socket_reuse_lb(): %s", 265 1.1 christos isc_result_totext(result)); 266 1.1 christos close(fd); 267 1.3 christos return -1; 268 1.1 christos } 269 1.1 christos 270 1.1 christos #if IPV6_RECVERR 271 1.1 christos #define setsockopt_on(socket, level, name) \ 272 1.1 christos setsockopt(socket, level, name, &(int){ 1 }, sizeof(int)) 273 1.1 christos 274 1.1 christos r = setsockopt_on(fd, IPPROTO_IPV6, IPV6_RECVERR); 275 1.1 christos if (r != 0) { 276 1.1 christos perror("setup_ephemeral_port"); 277 1.1 christos close(fd); 278 1.3 christos return r; 279 1.1 christos } 280 1.1 christos #endif 281 1.1 christos 282 1.3 christos return fd; 283 1.1 christos } 284 1.1 christos 285 1.1 christos /* Generic */ 286 1.1 christos 287 1.1 christos static void 288 1.1 christos noop_read_cb(isc_nmhandle_t *handle, isc_result_t result, isc_region_t *region, 289 1.1 christos void *cbarg) { 290 1.1 christos UNUSED(handle); 291 1.1 christos UNUSED(result); 292 1.1 christos UNUSED(region); 293 1.1 christos UNUSED(cbarg); 294 1.1 christos } 295 1.1 christos 296 1.1 christos thread_local uint8_t tcp_buffer_storage[4096]; 297 1.1 christos thread_local size_t tcp_buffer_length = 0; 298 1.1 christos 299 1.1 christos static int 300 1.1 christos setup_test(void **state) { 301 1.1 christos char *env_workers = getenv("ISC_TASK_WORKERS"); 302 1.1 christos uv_os_sock_t tcp_listen_sock = -1; 303 1.1 christos 304 1.1 christos tcp_listen_addr = (isc_sockaddr_t){ .length = 0 }; 305 1.1 christos tcp_listen_sock = setup_ephemeral_port(&tcp_listen_addr, SOCK_STREAM); 306 1.1 christos if (tcp_listen_sock < 0) { 307 1.3 christos return -1; 308 1.1 christos } 309 1.1 christos close(tcp_listen_sock); 310 1.1 christos tcp_listen_sock = -1; 311 1.1 christos 312 1.1 christos if (env_workers != NULL) { 313 1.1 christos workers = atoi(env_workers); 314 1.1 christos } else { 315 1.1 christos workers = isc_os_ncpus(); 316 1.1 christos } 317 1.1 christos INSIST(workers > 0); 318 1.1 christos 319 1.1 christos atomic_store(&total_sends, NSENDS * NWRITES); 320 1.1 christos atomic_store(&nsends, atomic_load(&total_sends)); 321 1.1 christos 322 1.1 christos atomic_store(&csends, 0); 323 1.1 christos atomic_store(&creads, 0); 324 1.1 christos atomic_store(&sreads, 0); 325 1.1 christos atomic_store(&ssends, 0); 326 1.1 christos atomic_store(&ctimeouts, 0); 327 1.1 christos atomic_store(&active_cconnects, 0); 328 1.1 christos 329 1.3 christos expected_cconnects = -1; 330 1.3 christos expected_csends = -1; 331 1.3 christos expected_creads = -1; 332 1.3 christos expected_sreads = -1; 333 1.3 christos expected_ssends = -1; 334 1.3 christos expected_ctimeouts = -1; 335 1.1 christos 336 1.1 christos atomic_store(&POST, false); 337 1.1 christos atomic_store(&use_TLS, false); 338 1.3 christos atomic_store(&use_PROXY, false); 339 1.3 christos atomic_store(&use_PROXY_over_TLS, false); 340 1.1 christos 341 1.1 christos noanswer = false; 342 1.1 christos 343 1.1 christos isc_nonce_buf(&send_magic, sizeof(send_magic)); 344 1.1 christos isc_nonce_buf(&stop_magic, sizeof(stop_magic)); 345 1.1 christos if (send_magic == stop_magic) { 346 1.3 christos return -1; 347 1.1 christos } 348 1.1 christos 349 1.3 christos setup_loopmgr(state); 350 1.3 christos 351 1.3 christos nm = isc_mem_cget(mctx, MAX_NM, sizeof(nm[0])); 352 1.1 christos for (size_t i = 0; i < MAX_NM; i++) { 353 1.3 christos isc_netmgr_create(mctx, loopmgr, &nm[i]); 354 1.1 christos assert_non_null(nm[i]); 355 1.1 christos } 356 1.1 christos 357 1.1 christos server_tlsctx = NULL; 358 1.1 christos isc_tlsctx_createserver(NULL, NULL, &server_tlsctx); 359 1.1 christos isc_tlsctx_enable_http2server_alpn(server_tlsctx); 360 1.1 christos client_tlsctx = NULL; 361 1.1 christos isc_tlsctx_createclient(&client_tlsctx); 362 1.1 christos isc_tlsctx_enable_http2client_alpn(client_tlsctx); 363 1.1 christos isc_tlsctx_client_session_cache_create( 364 1.1 christos mctx, client_tlsctx, 365 1.1 christos ISC_TLSCTX_CLIENT_SESSION_CACHE_DEFAULT_SIZE, 366 1.1 christos &client_sess_cache); 367 1.1 christos 368 1.1 christos isc_quota_init(&listener_quota, 0); 369 1.1 christos atomic_store(&check_listener_quota, false); 370 1.1 christos 371 1.1 christos INSIST(endpoints == NULL); 372 1.1 christos endpoints = isc_nm_http_endpoints_new(mctx); 373 1.1 christos 374 1.1 christos *state = nm; 375 1.1 christos 376 1.3 christos return 0; 377 1.1 christos } 378 1.1 christos 379 1.1 christos static int 380 1.3 christos teardown_test(void **state ISC_ATTR_UNUSED) { 381 1.1 christos for (size_t i = 0; i < MAX_NM; i++) { 382 1.3 christos isc_netmgr_destroy(&nm[i]); 383 1.1 christos assert_null(nm[i]); 384 1.1 christos } 385 1.3 christos isc_mem_cput(mctx, nm, MAX_NM, sizeof(nm[0])); 386 1.3 christos 387 1.3 christos teardown_loopmgr(state); 388 1.1 christos 389 1.1 christos if (server_tlsctx != NULL) { 390 1.1 christos isc_tlsctx_free(&server_tlsctx); 391 1.1 christos } 392 1.1 christos if (client_tlsctx != NULL) { 393 1.1 christos isc_tlsctx_free(&client_tlsctx); 394 1.1 christos } 395 1.1 christos 396 1.1 christos isc_tlsctx_client_session_cache_detach(&client_sess_cache); 397 1.1 christos 398 1.1 christos isc_quota_destroy(&listener_quota); 399 1.1 christos 400 1.1 christos isc_nm_http_endpoints_detach(&endpoints); 401 1.1 christos 402 1.3 christos return 0; 403 1.1 christos } 404 1.1 christos 405 1.1 christos thread_local size_t nwrites = NWRITES; 406 1.1 christos 407 1.1 christos static void 408 1.1 christos sockaddr_to_url(isc_sockaddr_t *sa, const bool https, char *outbuf, 409 1.1 christos size_t outbuf_len, const char *append) { 410 1.1 christos isc_nm_http_makeuri(https, sa, NULL, 0, append, outbuf, outbuf_len); 411 1.1 christos } 412 1.1 christos 413 1.1 christos static isc_quota_t * 414 1.1 christos init_listener_quota(size_t nthreads) { 415 1.1 christos isc_quota_t *quotap = NULL; 416 1.1 christos if (atomic_load(&check_listener_quota)) { 417 1.3 christos unsigned int max_quota = ISC_MAX(nthreads / 2, 1); 418 1.1 christos isc_quota_max(&listener_quota, max_quota); 419 1.1 christos quotap = &listener_quota; 420 1.1 christos } 421 1.3 christos return quotap; 422 1.1 christos } 423 1.1 christos 424 1.1 christos static void 425 1.1 christos doh_receive_reply_cb(isc_nmhandle_t *handle, isc_result_t eresult, 426 1.1 christos isc_region_t *region, void *cbarg) { 427 1.1 christos assert_non_null(handle); 428 1.1 christos UNUSED(cbarg); 429 1.1 christos UNUSED(region); 430 1.1 christos 431 1.1 christos if (eresult == ISC_R_SUCCESS) { 432 1.3 christos if (atomic_load(&use_PROXY)) { 433 1.3 christos assert_true(isc_nm_is_proxy_handle(handle)); 434 1.3 christos } 435 1.1 christos (void)atomic_fetch_sub(&nsends, 1); 436 1.3 christos if (have_expected_csends(atomic_fetch_add(&csends, 1) + 1) || 437 1.3 christos have_expected_creads(atomic_fetch_add(&creads, 1) + 1)) 438 1.3 christos { 439 1.3 christos isc_loopmgr_shutdown(loopmgr); 440 1.3 christos } 441 1.1 christos } else { 442 1.3 christos isc_loopmgr_shutdown(loopmgr); 443 1.1 christos } 444 1.1 christos } 445 1.1 christos 446 1.1 christos static void 447 1.1 christos doh_reply_sent_cb(isc_nmhandle_t *handle, isc_result_t eresult, void *cbarg) { 448 1.1 christos UNUSED(eresult); 449 1.1 christos UNUSED(cbarg); 450 1.1 christos 451 1.1 christos assert_non_null(handle); 452 1.1 christos 453 1.1 christos if (eresult == ISC_R_SUCCESS) { 454 1.1 christos atomic_fetch_add(&ssends, 1); 455 1.1 christos } 456 1.1 christos } 457 1.1 christos 458 1.1 christos static void 459 1.1 christos doh_receive_request_cb(isc_nmhandle_t *handle, isc_result_t eresult, 460 1.1 christos isc_region_t *region, void *cbarg) { 461 1.1 christos uint64_t magic = 0; 462 1.1 christos 463 1.1 christos UNUSED(cbarg); 464 1.1 christos assert_non_null(handle); 465 1.1 christos 466 1.1 christos if (eresult != ISC_R_SUCCESS) { 467 1.1 christos return; 468 1.1 christos } 469 1.1 christos 470 1.3 christos if (atomic_load(&use_PROXY)) { 471 1.3 christos assert_true(isc_nm_is_proxy_handle(handle)); 472 1.3 christos proxy_verify_unspec_endpoint(handle); 473 1.3 christos } 474 1.3 christos 475 1.1 christos atomic_fetch_add(&sreads, 1); 476 1.1 christos 477 1.1 christos memmove(tcp_buffer_storage + tcp_buffer_length, region->base, 478 1.1 christos region->length); 479 1.1 christos tcp_buffer_length += region->length; 480 1.1 christos 481 1.1 christos while (tcp_buffer_length >= sizeof(magic)) { 482 1.1 christos magic = *(uint64_t *)tcp_buffer_storage; 483 1.1 christos assert_true(magic == stop_magic || magic == send_magic); 484 1.1 christos 485 1.1 christos tcp_buffer_length -= sizeof(magic); 486 1.1 christos memmove(tcp_buffer_storage, tcp_buffer_storage + sizeof(magic), 487 1.1 christos tcp_buffer_length); 488 1.1 christos 489 1.1 christos if (magic == send_magic) { 490 1.1 christos if (!noanswer) { 491 1.1 christos isc_nm_send(handle, region, doh_reply_sent_cb, 492 1.1 christos NULL); 493 1.1 christos } 494 1.1 christos return; 495 1.1 christos } else if (magic == stop_magic) { 496 1.1 christos /* 497 1.1 christos * We are done, so we don't send anything back. 498 1.1 christos * There should be no more packets in the buffer. 499 1.1 christos */ 500 1.1 christos assert_int_equal(tcp_buffer_length, 0); 501 1.1 christos } 502 1.1 christos } 503 1.1 christos } 504 1.1 christos 505 1.3 christos ISC_LOOP_TEST_IMPL(mock_doh_uv_tcp_bind) { 506 1.1 christos isc_nm_t *listen_nm = nm[0]; 507 1.1 christos isc_result_t result = ISC_R_SUCCESS; 508 1.1 christos isc_nmsocket_t *listen_sock = NULL; 509 1.1 christos 510 1.1 christos WILL_RETURN(uv_tcp_bind, UV_EADDRINUSE); 511 1.1 christos 512 1.1 christos result = isc_nm_http_endpoints_add(endpoints, ISC_NM_HTTP_DEFAULT_PATH, 513 1.3 christos noop_read_cb, NULL); 514 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 515 1.3 christos result = isc_nm_listenhttp(listen_nm, ISC_NM_LISTEN_ALL, 516 1.3 christos &tcp_listen_addr, 0, NULL, NULL, endpoints, 517 1.3 christos 0, false, &listen_sock); 518 1.1 christos assert_int_not_equal(result, ISC_R_SUCCESS); 519 1.1 christos assert_null(listen_sock); 520 1.1 christos 521 1.1 christos RESET_RETURN; 522 1.3 christos 523 1.3 christos isc_loopmgr_shutdown(loopmgr); 524 1.1 christos } 525 1.1 christos 526 1.1 christos static void 527 1.3 christos listen_sock_close(void *arg) { 528 1.3 christos isc_nmsocket_t *listen_sock = arg; 529 1.3 christos 530 1.3 christos isc_nm_stoplistening(listen_sock); 531 1.3 christos isc_nmsocket_close(&listen_sock); 532 1.3 christos assert_null(listen_sock); 533 1.3 christos } 534 1.3 christos 535 1.3 christos static void 536 1.3 christos doh_noop(void *arg ISC_ATTR_UNUSED) { 537 1.1 christos isc_nm_t *listen_nm = nm[0]; 538 1.1 christos isc_nm_t *connect_nm = nm[1]; 539 1.1 christos isc_result_t result = ISC_R_SUCCESS; 540 1.1 christos isc_nmsocket_t *listen_sock = NULL; 541 1.1 christos char req_url[256]; 542 1.1 christos 543 1.1 christos result = isc_nm_http_endpoints_add(endpoints, ISC_NM_HTTP_DEFAULT_PATH, 544 1.3 christos noop_read_cb, NULL); 545 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 546 1.1 christos 547 1.3 christos result = isc_nm_listenhttp(listen_nm, ISC_NM_LISTEN_ALL, 548 1.3 christos &tcp_listen_addr, 0, NULL, NULL, endpoints, 549 1.3 christos 0, get_proxy_type(), &listen_sock); 550 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 551 1.3 christos isc_loop_teardown(mainloop, listen_sock_close, listen_sock); 552 1.1 christos 553 1.1 christos sockaddr_to_url(&tcp_listen_addr, false, req_url, sizeof(req_url), 554 1.1 christos ISC_NM_HTTP_DEFAULT_PATH); 555 1.1 christos connect_send_request(connect_nm, req_url, atomic_load(&POST), 556 1.1 christos &(isc_region_t){ .base = (uint8_t *)send_msg.base, 557 1.1 christos .length = send_msg.len }, 558 1.1 christos noop_read_cb, NULL, atomic_load(&use_TLS), 30000); 559 1.1 christos 560 1.3 christos isc_loopmgr_shutdown(loopmgr); 561 1.1 christos 562 1.1 christos assert_int_equal(0, atomic_load(&csends)); 563 1.1 christos assert_int_equal(0, atomic_load(&creads)); 564 1.1 christos assert_int_equal(0, atomic_load(&sreads)); 565 1.1 christos assert_int_equal(0, atomic_load(&ssends)); 566 1.1 christos } 567 1.1 christos 568 1.3 christos ISC_LOOP_TEST_IMPL(doh_noop_POST) { 569 1.1 christos atomic_store(&POST, true); 570 1.3 christos doh_noop(arg); 571 1.1 christos } 572 1.1 christos 573 1.3 christos ISC_LOOP_TEST_IMPL(doh_noop_GET) { 574 1.1 christos atomic_store(&POST, false); 575 1.3 christos doh_noop(arg); 576 1.1 christos } 577 1.1 christos 578 1.1 christos static void 579 1.3 christos doh_noresponse(void *arg ISC_ATTR_UNUSED) { 580 1.1 christos isc_nm_t *listen_nm = nm[0]; 581 1.1 christos isc_nm_t *connect_nm = nm[1]; 582 1.1 christos isc_result_t result = ISC_R_SUCCESS; 583 1.1 christos isc_nmsocket_t *listen_sock = NULL; 584 1.1 christos char req_url[256]; 585 1.1 christos 586 1.1 christos result = isc_nm_http_endpoints_add(endpoints, ISC_NM_HTTP_DEFAULT_PATH, 587 1.3 christos noop_read_cb, NULL); 588 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 589 1.1 christos 590 1.3 christos result = isc_nm_listenhttp(listen_nm, ISC_NM_LISTEN_ALL, 591 1.3 christos &tcp_listen_addr, 0, NULL, NULL, endpoints, 592 1.3 christos 0, get_proxy_type(), &listen_sock); 593 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 594 1.3 christos isc_loop_teardown(mainloop, listen_sock_close, listen_sock); 595 1.1 christos 596 1.1 christos sockaddr_to_url(&tcp_listen_addr, false, req_url, sizeof(req_url), 597 1.1 christos ISC_NM_HTTP_DEFAULT_PATH); 598 1.1 christos connect_send_request(connect_nm, req_url, atomic_load(&POST), 599 1.1 christos &(isc_region_t){ .base = (uint8_t *)send_msg.base, 600 1.1 christos .length = send_msg.len }, 601 1.1 christos noop_read_cb, NULL, atomic_load(&use_TLS), 30000); 602 1.1 christos 603 1.3 christos isc_loopmgr_shutdown(loopmgr); 604 1.1 christos } 605 1.1 christos 606 1.3 christos ISC_LOOP_TEST_IMPL(doh_noresponse_POST) { 607 1.1 christos atomic_store(&POST, true); 608 1.3 christos doh_noresponse(arg); 609 1.1 christos } 610 1.1 christos 611 1.3 christos ISC_LOOP_TEST_IMPL(doh_noresponse_GET) { 612 1.1 christos atomic_store(&POST, false); 613 1.3 christos doh_noresponse(arg); 614 1.1 christos } 615 1.1 christos 616 1.1 christos static void 617 1.1 christos timeout_query_sent_cb(isc_nmhandle_t *handle, isc_result_t eresult, 618 1.1 christos void *cbarg) { 619 1.1 christos UNUSED(eresult); 620 1.1 christos UNUSED(cbarg); 621 1.1 christos 622 1.1 christos assert_non_null(handle); 623 1.1 christos 624 1.1 christos if (eresult == ISC_R_SUCCESS) { 625 1.1 christos atomic_fetch_add(&csends, 1); 626 1.1 christos } 627 1.1 christos 628 1.1 christos isc_nmhandle_detach(&handle); 629 1.1 christos } 630 1.1 christos 631 1.1 christos static void 632 1.1 christos timeout_retry_cb(isc_nmhandle_t *handle, isc_result_t eresult, 633 1.3 christos isc_region_t *region ISC_ATTR_UNUSED, 634 1.3 christos void *arg ISC_ATTR_UNUSED) { 635 1.1 christos assert_non_null(handle); 636 1.1 christos 637 1.1 christos atomic_fetch_add(&ctimeouts, 1); 638 1.1 christos 639 1.1 christos if (eresult == ISC_R_TIMEDOUT && atomic_load(&ctimeouts) < 5) { 640 1.1 christos isc_nmhandle_settimeout(handle, T_SOFT); 641 1.1 christos return; 642 1.1 christos } 643 1.1 christos 644 1.1 christos isc_nmhandle_detach(&handle); 645 1.3 christos isc_loopmgr_shutdown(loopmgr); 646 1.1 christos } 647 1.1 christos 648 1.1 christos static void 649 1.1 christos timeout_request_cb(isc_nmhandle_t *handle, isc_result_t result, void *arg) { 650 1.1 christos isc_nmhandle_t *sendhandle = NULL; 651 1.1 christos isc_nmhandle_t *readhandle = NULL; 652 1.1 christos 653 1.1 christos REQUIRE(VALID_NMHANDLE(handle)); 654 1.1 christos 655 1.1 christos if (result != ISC_R_SUCCESS) { 656 1.3 christos return; 657 1.1 christos } 658 1.1 christos 659 1.1 christos isc_nmhandle_attach(handle, &sendhandle); 660 1.1 christos isc_nm_send(handle, 661 1.1 christos &(isc_region_t){ .base = (uint8_t *)send_msg.base, 662 1.1 christos .length = send_msg.len }, 663 1.1 christos timeout_query_sent_cb, arg); 664 1.1 christos 665 1.1 christos isc_nmhandle_attach(handle, &readhandle); 666 1.1 christos isc_nm_read(handle, timeout_retry_cb, NULL); 667 1.1 christos } 668 1.1 christos 669 1.1 christos static void 670 1.3 christos doh_timeout_recovery(void *arg ISC_ATTR_UNUSED) { 671 1.1 christos isc_nm_t *listen_nm = nm[0]; 672 1.3 christos isc_nmsocket_t *listen_sock = NULL; 673 1.1 christos isc_nm_t *connect_nm = nm[1]; 674 1.1 christos isc_result_t result = ISC_R_SUCCESS; 675 1.1 christos isc_tlsctx_t *ctx = atomic_load(&use_TLS) ? server_tlsctx : NULL; 676 1.1 christos char req_url[256]; 677 1.1 christos 678 1.1 christos result = isc_nm_http_endpoints_add(endpoints, ISC_NM_HTTP_DEFAULT_PATH, 679 1.3 christos doh_receive_request_cb, NULL); 680 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 681 1.1 christos 682 1.3 christos result = isc_nm_listenhttp(listen_nm, ISC_NM_LISTEN_ALL, 683 1.3 christos &tcp_listen_addr, 0, NULL, NULL, endpoints, 684 1.3 christos 0, get_proxy_type(), &listen_sock); 685 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 686 1.3 christos isc_loop_teardown(mainloop, listen_sock_close, listen_sock); 687 1.1 christos 688 1.1 christos /* 689 1.1 christos * Accept connections but don't send responses, forcing client 690 1.1 christos * reads to time out. 691 1.1 christos */ 692 1.1 christos noanswer = true; 693 1.1 christos 694 1.1 christos /* 695 1.1 christos * Shorten all the TCP client timeouts to 0.05 seconds. 696 1.1 christos * timeout_retry_cb() will give up after five timeouts. 697 1.1 christos */ 698 1.1 christos isc_nm_settimeouts(connect_nm, T_SOFT, T_SOFT, T_SOFT, T_SOFT); 699 1.1 christos sockaddr_to_url(&tcp_listen_addr, false, req_url, sizeof(req_url), 700 1.1 christos ISC_NM_HTTP_DEFAULT_PATH); 701 1.1 christos isc_nm_httpconnect(connect_nm, NULL, &tcp_listen_addr, req_url, 702 1.1 christos atomic_load(&POST), timeout_request_cb, NULL, ctx, 703 1.4 christos NULL, client_sess_cache, T_CONNECT, get_proxy_type(), 704 1.3 christos NULL); 705 1.3 christos } 706 1.1 christos 707 1.3 christos static int 708 1.3 christos doh_timeout_recovery_teardown(void **state) { 709 1.1 christos assert_true(atomic_load(&ctimeouts) == 5); 710 1.3 christos return teardown_test(state); 711 1.1 christos } 712 1.1 christos 713 1.3 christos ISC_LOOP_TEST_IMPL(doh_timeout_recovery_POST) { 714 1.1 christos atomic_store(&POST, true); 715 1.3 christos doh_timeout_recovery(arg); 716 1.1 christos } 717 1.1 christos 718 1.3 christos ISC_LOOP_TEST_IMPL(doh_timeout_recovery_GET) { 719 1.1 christos atomic_store(&POST, false); 720 1.3 christos doh_timeout_recovery(arg); 721 1.1 christos } 722 1.1 christos 723 1.1 christos static void 724 1.3 christos doh_connect_thread(void *arg); 725 1.3 christos 726 1.3 christos static void 727 1.1 christos doh_receive_send_reply_cb(isc_nmhandle_t *handle, isc_result_t eresult, 728 1.1 christos isc_region_t *region, void *cbarg) { 729 1.3 christos isc_nm_t *connect_nm = (isc_nm_t *)cbarg; 730 1.1 christos 731 1.1 christos if (eresult != ISC_R_SUCCESS) { 732 1.1 christos return; 733 1.1 christos } 734 1.1 christos 735 1.1 christos assert_non_null(handle); 736 1.3 christos UNUSED(region); 737 1.1 christos 738 1.1 christos int_fast64_t sends = atomic_fetch_sub(&nsends, 1); 739 1.1 christos atomic_fetch_add(&csends, 1); 740 1.1 christos atomic_fetch_add(&creads, 1); 741 1.3 christos if (sends > 0 && connect_nm != NULL) { 742 1.1 christos size_t i; 743 1.1 christos for (i = 0; i < NWRITES / 2; i++) { 744 1.1 christos eresult = isc__nm_http_request( 745 1.1 christos handle, 746 1.1 christos &(isc_region_t){ 747 1.1 christos .base = (uint8_t *)send_msg.base, 748 1.1 christos .length = send_msg.len }, 749 1.3 christos doh_receive_send_reply_cb, NULL); 750 1.1 christos if (eresult == ISC_R_CANCELED) { 751 1.1 christos break; 752 1.1 christos } 753 1.1 christos assert_true(eresult == ISC_R_SUCCESS); 754 1.1 christos } 755 1.3 christos 756 1.3 christos isc_async_current(doh_connect_thread, connect_nm); 757 1.3 christos } 758 1.3 christos if (sends <= 0) { 759 1.3 christos isc_loopmgr_shutdown(loopmgr); 760 1.1 christos } 761 1.1 christos } 762 1.1 christos 763 1.3 christos static void 764 1.3 christos doh_connect_thread(void *arg) { 765 1.1 christos isc_nm_t *connect_nm = (isc_nm_t *)arg; 766 1.1 christos char req_url[256]; 767 1.1 christos int64_t sends = atomic_load(&nsends); 768 1.1 christos 769 1.1 christos sockaddr_to_url(&tcp_listen_addr, atomic_load(&use_TLS), req_url, 770 1.1 christos sizeof(req_url), ISC_NM_HTTP_DEFAULT_PATH); 771 1.1 christos 772 1.3 christos /* 773 1.3 christos * We need to back off and slow down if we start getting 774 1.3 christos * errors, to prevent a thundering herd problem. 775 1.3 christos */ 776 1.3 christos int_fast64_t active = atomic_fetch_add(&active_cconnects, 1); 777 1.3 christos if (active > workers) { 778 1.3 christos atomic_fetch_sub(&active_cconnects, 1); 779 1.3 christos return; 780 1.1 christos } 781 1.3 christos connect_send_request(connect_nm, req_url, atomic_load(&POST), 782 1.3 christos &(isc_region_t){ .base = (uint8_t *)send_msg.base, 783 1.3 christos .length = send_msg.len }, 784 1.3 christos doh_receive_send_reply_cb, connect_nm, 785 1.3 christos atomic_load(&use_TLS), 30000); 786 1.1 christos 787 1.3 christos if (sends <= 0) { 788 1.3 christos isc_loopmgr_shutdown(loopmgr); 789 1.3 christos } 790 1.1 christos } 791 1.1 christos 792 1.1 christos static void 793 1.3 christos doh_recv_one(void *arg ISC_ATTR_UNUSED) { 794 1.1 christos isc_nm_t *listen_nm = nm[0]; 795 1.1 christos isc_nm_t *connect_nm = nm[1]; 796 1.1 christos isc_result_t result = ISC_R_SUCCESS; 797 1.1 christos isc_nmsocket_t *listen_sock = NULL; 798 1.1 christos char req_url[256]; 799 1.1 christos isc_quota_t *quotap = init_listener_quota(workers); 800 1.1 christos 801 1.1 christos atomic_store(&total_sends, 1); 802 1.3 christos expected_creads = 1; 803 1.1 christos 804 1.1 christos atomic_store(&nsends, atomic_load(&total_sends)); 805 1.1 christos 806 1.1 christos result = isc_nm_http_endpoints_add(endpoints, ISC_NM_HTTP_DEFAULT_PATH, 807 1.3 christos doh_receive_request_cb, NULL); 808 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 809 1.1 christos 810 1.3 christos result = isc_nm_listenhttp( 811 1.3 christos listen_nm, ISC_NM_LISTEN_ALL, &tcp_listen_addr, 0, quotap, 812 1.3 christos atomic_load(&use_TLS) ? server_tlsctx : NULL, endpoints, 0, 813 1.3 christos get_proxy_type(), &listen_sock); 814 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 815 1.1 christos 816 1.1 christos sockaddr_to_url(&tcp_listen_addr, atomic_load(&use_TLS), req_url, 817 1.1 christos sizeof(req_url), ISC_NM_HTTP_DEFAULT_PATH); 818 1.1 christos connect_send_request(connect_nm, req_url, atomic_load(&POST), 819 1.1 christos &(isc_region_t){ .base = (uint8_t *)send_msg.base, 820 1.1 christos .length = send_msg.len }, 821 1.1 christos doh_receive_reply_cb, NULL, atomic_load(&use_TLS), 822 1.1 christos 30000); 823 1.1 christos 824 1.3 christos isc_loop_teardown(mainloop, listen_sock_close, listen_sock); 825 1.3 christos } 826 1.1 christos 827 1.3 christos static int 828 1.3 christos doh_recv_one_teardown(void **state) { 829 1.1 christos X(total_sends); 830 1.1 christos X(csends); 831 1.1 christos X(creads); 832 1.1 christos X(sreads); 833 1.1 christos X(ssends); 834 1.1 christos 835 1.1 christos assert_int_equal(atomic_load(&csends), 1); 836 1.1 christos assert_int_equal(atomic_load(&creads), 1); 837 1.1 christos assert_int_equal(atomic_load(&sreads), 1); 838 1.1 christos assert_int_equal(atomic_load(&ssends), 1); 839 1.3 christos 840 1.3 christos return teardown_test(state); 841 1.1 christos } 842 1.1 christos 843 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_one_POST) { 844 1.1 christos atomic_store(&POST, true); 845 1.3 christos doh_recv_one(arg); 846 1.1 christos } 847 1.1 christos 848 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_one_GET) { 849 1.1 christos atomic_store(&POST, false); 850 1.3 christos doh_recv_one(arg); 851 1.1 christos } 852 1.1 christos 853 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_one_POST_TLS) { 854 1.1 christos atomic_store(&use_TLS, true); 855 1.1 christos atomic_store(&POST, true); 856 1.3 christos doh_recv_one(arg); 857 1.1 christos } 858 1.1 christos 859 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_one_GET_TLS) { 860 1.1 christos atomic_store(&use_TLS, true); 861 1.1 christos atomic_store(&POST, false); 862 1.3 christos doh_recv_one(arg); 863 1.1 christos } 864 1.1 christos 865 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_one_POST_quota) { 866 1.1 christos atomic_store(&POST, true); 867 1.1 christos atomic_store(&check_listener_quota, true); 868 1.3 christos doh_recv_one(arg); 869 1.1 christos } 870 1.1 christos 871 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_one_GET_quota) { 872 1.1 christos atomic_store(&POST, false); 873 1.1 christos atomic_store(&check_listener_quota, true); 874 1.3 christos doh_recv_one(arg); 875 1.1 christos } 876 1.1 christos 877 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_one_POST_TLS_quota) { 878 1.1 christos atomic_store(&use_TLS, true); 879 1.1 christos atomic_store(&POST, true); 880 1.1 christos atomic_store(&check_listener_quota, true); 881 1.3 christos doh_recv_one(arg); 882 1.1 christos } 883 1.1 christos 884 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_one_GET_TLS_quota) { 885 1.1 christos atomic_store(&use_TLS, true); 886 1.1 christos atomic_store(&POST, false); 887 1.1 christos atomic_store(&check_listener_quota, true); 888 1.3 christos doh_recv_one(arg); 889 1.1 christos } 890 1.1 christos 891 1.1 christos static void 892 1.1 christos doh_connect_send_two_requests_cb(isc_nmhandle_t *handle, isc_result_t result, 893 1.1 christos void *arg) { 894 1.1 christos REQUIRE(VALID_NMHANDLE(handle)); 895 1.1 christos if (result != ISC_R_SUCCESS) { 896 1.3 christos return; 897 1.1 christos } 898 1.1 christos 899 1.1 christos result = isc__nm_http_request( 900 1.1 christos handle, 901 1.1 christos &(isc_region_t){ .base = (uint8_t *)send_msg.base, 902 1.1 christos .length = send_msg.len }, 903 1.1 christos doh_receive_reply_cb, arg); 904 1.1 christos if (result != ISC_R_SUCCESS) { 905 1.3 christos return; 906 1.1 christos } 907 1.1 christos 908 1.1 christos result = isc__nm_http_request( 909 1.1 christos handle, 910 1.1 christos &(isc_region_t){ .base = (uint8_t *)send_msg.base, 911 1.1 christos .length = send_msg.len }, 912 1.1 christos doh_receive_reply_cb, arg); 913 1.1 christos if (result != ISC_R_SUCCESS) { 914 1.3 christos return; 915 1.1 christos } 916 1.1 christos } 917 1.1 christos 918 1.1 christos static void 919 1.3 christos doh_recv_two(void *arg ISC_ATTR_UNUSED) { 920 1.1 christos isc_nm_t *listen_nm = nm[0]; 921 1.1 christos isc_nm_t *connect_nm = nm[1]; 922 1.1 christos isc_result_t result = ISC_R_SUCCESS; 923 1.1 christos isc_nmsocket_t *listen_sock = NULL; 924 1.3 christos char req_url[256]; 925 1.3 christos isc_tlsctx_t *ctx = NULL; 926 1.1 christos isc_quota_t *quotap = init_listener_quota(workers); 927 1.1 christos 928 1.3 christos atomic_store(&total_sends, 2); 929 1.3 christos expected_creads = 2; 930 1.1 christos 931 1.1 christos atomic_store(&nsends, atomic_load(&total_sends)); 932 1.1 christos 933 1.1 christos result = isc_nm_http_endpoints_add(endpoints, ISC_NM_HTTP_DEFAULT_PATH, 934 1.3 christos doh_receive_request_cb, NULL); 935 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 936 1.1 christos 937 1.3 christos result = isc_nm_listenhttp( 938 1.3 christos listen_nm, ISC_NM_LISTEN_ALL, &tcp_listen_addr, 0, quotap, 939 1.3 christos atomic_load(&use_TLS) ? server_tlsctx : NULL, endpoints, 0, 940 1.3 christos get_proxy_type(), &listen_sock); 941 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 942 1.1 christos 943 1.3 christos sockaddr_to_url(&tcp_listen_addr, atomic_load(&use_TLS), req_url, 944 1.3 christos sizeof(req_url), ISC_NM_HTTP_DEFAULT_PATH); 945 1.1 christos 946 1.3 christos if (atomic_load(&use_TLS)) { 947 1.3 christos ctx = client_tlsctx; 948 1.1 christos } 949 1.1 christos 950 1.3 christos isc_nm_httpconnect(connect_nm, NULL, &tcp_listen_addr, req_url, 951 1.3 christos atomic_load(&POST), doh_connect_send_two_requests_cb, 952 1.4 christos NULL, ctx, NULL, client_sess_cache, 5000, 953 1.4 christos get_proxy_type(), NULL); 954 1.1 christos 955 1.3 christos isc_loop_teardown(mainloop, listen_sock_close, listen_sock); 956 1.3 christos } 957 1.1 christos 958 1.3 christos static int 959 1.3 christos doh_recv_two_teardown(void **state) { 960 1.1 christos X(total_sends); 961 1.1 christos X(csends); 962 1.1 christos X(creads); 963 1.1 christos X(sreads); 964 1.1 christos X(ssends); 965 1.1 christos 966 1.3 christos assert_int_equal(atomic_load(&csends), 2); 967 1.3 christos assert_int_equal(atomic_load(&creads), 2); 968 1.3 christos assert_int_equal(atomic_load(&sreads), 2); 969 1.3 christos assert_int_equal(atomic_load(&ssends), 2); 970 1.3 christos 971 1.3 christos return teardown_test(state); 972 1.1 christos } 973 1.1 christos 974 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_two_POST) { 975 1.1 christos atomic_store(&POST, true); 976 1.3 christos doh_recv_two(arg); 977 1.1 christos } 978 1.1 christos 979 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_two_GET) { 980 1.1 christos atomic_store(&POST, false); 981 1.3 christos doh_recv_two(arg); 982 1.1 christos } 983 1.1 christos 984 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_two_POST_TLS) { 985 1.1 christos atomic_store(&use_TLS, true); 986 1.1 christos atomic_store(&POST, true); 987 1.3 christos doh_recv_two(arg); 988 1.1 christos } 989 1.1 christos 990 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_two_GET_TLS) { 991 1.1 christos atomic_store(&use_TLS, true); 992 1.1 christos atomic_store(&POST, false); 993 1.3 christos doh_recv_two(arg); 994 1.1 christos } 995 1.1 christos 996 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_two_POST_quota) { 997 1.1 christos atomic_store(&POST, true); 998 1.1 christos atomic_store(&check_listener_quota, true); 999 1.3 christos doh_recv_two(arg); 1000 1.1 christos } 1001 1.1 christos 1002 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_two_GET_quota) { 1003 1.1 christos atomic_store(&POST, false); 1004 1.1 christos atomic_store(&check_listener_quota, true); 1005 1.3 christos doh_recv_two(arg); 1006 1.1 christos } 1007 1.1 christos 1008 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_two_POST_TLS_quota) { 1009 1.1 christos atomic_store(&use_TLS, true); 1010 1.1 christos atomic_store(&POST, true); 1011 1.1 christos atomic_store(&check_listener_quota, true); 1012 1.3 christos doh_recv_two(arg); 1013 1.1 christos } 1014 1.1 christos 1015 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_two_GET_TLS_quota) { 1016 1.1 christos atomic_store(&use_TLS, true); 1017 1.1 christos atomic_store(&POST, false); 1018 1.1 christos atomic_store(&check_listener_quota, true); 1019 1.3 christos doh_recv_two(arg); 1020 1.1 christos } 1021 1.1 christos 1022 1.1 christos static void 1023 1.3 christos doh_recv_send(void *arg ISC_ATTR_UNUSED) { 1024 1.1 christos isc_nm_t *listen_nm = nm[0]; 1025 1.1 christos isc_nm_t *connect_nm = nm[1]; 1026 1.1 christos isc_result_t result = ISC_R_SUCCESS; 1027 1.1 christos isc_nmsocket_t *listen_sock = NULL; 1028 1.3 christos size_t nthreads = isc_loopmgr_nloops(loopmgr); 1029 1.1 christos isc_quota_t *quotap = init_listener_quota(workers); 1030 1.1 christos 1031 1.3 christos atomic_store(&total_sends, 1000); 1032 1.3 christos atomic_store(&nsends, 1000); 1033 1.1 christos 1034 1.1 christos result = isc_nm_http_endpoints_add(endpoints, ISC_NM_HTTP_DEFAULT_PATH, 1035 1.3 christos doh_receive_request_cb, NULL); 1036 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 1037 1.1 christos 1038 1.3 christos result = isc_nm_listenhttp( 1039 1.3 christos listen_nm, ISC_NM_LISTEN_ALL, &tcp_listen_addr, 0, quotap, 1040 1.3 christos atomic_load(&use_TLS) ? server_tlsctx : NULL, endpoints, 0, 1041 1.3 christos get_proxy_type(), &listen_sock); 1042 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 1043 1.1 christos 1044 1.1 christos for (size_t i = 0; i < nthreads; i++) { 1045 1.3 christos isc_async_run(isc_loop_get(loopmgr, i), doh_connect_thread, 1046 1.3 christos connect_nm); 1047 1.1 christos } 1048 1.1 christos 1049 1.3 christos isc_loop_teardown(mainloop, listen_sock_close, listen_sock); 1050 1.3 christos } 1051 1.1 christos 1052 1.3 christos static int 1053 1.3 christos doh_recv_send_teardown(void **state) { 1054 1.3 christos int res = teardown_test(state); 1055 1.1 christos 1056 1.1 christos X(total_sends); 1057 1.1 christos X(csends); 1058 1.1 christos X(creads); 1059 1.1 christos X(sreads); 1060 1.1 christos X(ssends); 1061 1.1 christos 1062 1.3 christos CHECK_RANGE_FULL(csends); 1063 1.3 christos CHECK_RANGE_FULL(creads); 1064 1.3 christos CHECK_RANGE_FULL(sreads); 1065 1.3 christos CHECK_RANGE_FULL(ssends); 1066 1.3 christos 1067 1.3 christos return res; 1068 1.1 christos } 1069 1.1 christos 1070 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_send_POST) { 1071 1.1 christos atomic_store(&POST, true); 1072 1.3 christos doh_recv_send(arg); 1073 1.1 christos } 1074 1.1 christos 1075 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_send_GET) { 1076 1.1 christos atomic_store(&POST, false); 1077 1.3 christos doh_recv_send(arg); 1078 1.1 christos } 1079 1.1 christos 1080 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_send_POST_TLS) { 1081 1.3 christos atomic_store(&POST, true); 1082 1.1 christos atomic_store(&use_TLS, true); 1083 1.3 christos doh_recv_send(arg); 1084 1.1 christos } 1085 1.1 christos 1086 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_send_GET_TLS) { 1087 1.3 christos atomic_store(&POST, false); 1088 1.1 christos atomic_store(&use_TLS, true); 1089 1.3 christos doh_recv_send(arg); 1090 1.1 christos } 1091 1.1 christos 1092 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_send_POST_quota) { 1093 1.1 christos atomic_store(&POST, true); 1094 1.1 christos atomic_store(&check_listener_quota, true); 1095 1.3 christos doh_recv_send(arg); 1096 1.1 christos } 1097 1.1 christos 1098 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_send_GET_quota) { 1099 1.1 christos atomic_store(&POST, false); 1100 1.1 christos atomic_store(&check_listener_quota, true); 1101 1.3 christos doh_recv_send(arg); 1102 1.1 christos } 1103 1.1 christos 1104 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_send_POST_TLS_quota) { 1105 1.3 christos atomic_store(&POST, true); 1106 1.3 christos atomic_store(&use_TLS, true); 1107 1.3 christos atomic_store(&check_listener_quota, true); 1108 1.3 christos doh_recv_send(arg); 1109 1.3 christos } 1110 1.1 christos 1111 1.3 christos ISC_LOOP_TEST_IMPL(doh_recv_send_GET_TLS_quota) { 1112 1.3 christos atomic_store(&POST, false); 1113 1.1 christos atomic_store(&use_TLS, true); 1114 1.1 christos atomic_store(&check_listener_quota, true); 1115 1.3 christos doh_recv_send(arg); 1116 1.1 christos } 1117 1.1 christos 1118 1.3 christos static int 1119 1.3 christos doh_bad_connect_uri_teardown(void **state) { 1120 1.3 christos X(total_sends); 1121 1.3 christos X(csends); 1122 1.3 christos X(creads); 1123 1.3 christos X(sreads); 1124 1.3 christos X(ssends); 1125 1.3 christos 1126 1.3 christos /* As we used an ill-formed URI, there ought to be an error. */ 1127 1.3 christos assert_int_equal(atomic_load(&csends), 0); 1128 1.3 christos assert_int_equal(atomic_load(&creads), 0); 1129 1.3 christos assert_int_equal(atomic_load(&sreads), 0); 1130 1.3 christos assert_int_equal(atomic_load(&ssends), 0); 1131 1.1 christos 1132 1.3 christos return teardown_test(state); 1133 1.1 christos } 1134 1.1 christos 1135 1.1 christos /* See: GL #2858, !5319 */ 1136 1.3 christos ISC_LOOP_TEST_IMPL(doh_bad_connect_uri) { 1137 1.1 christos isc_nm_t *listen_nm = nm[0]; 1138 1.1 christos isc_nm_t *connect_nm = nm[1]; 1139 1.1 christos isc_result_t result = ISC_R_SUCCESS; 1140 1.1 christos isc_nmsocket_t *listen_sock = NULL; 1141 1.1 christos char req_url[256]; 1142 1.1 christos isc_quota_t *quotap = init_listener_quota(workers); 1143 1.1 christos 1144 1.1 christos atomic_store(&total_sends, 1); 1145 1.1 christos 1146 1.1 christos atomic_store(&nsends, atomic_load(&total_sends)); 1147 1.1 christos 1148 1.1 christos result = isc_nm_http_endpoints_add(endpoints, ISC_NM_HTTP_DEFAULT_PATH, 1149 1.3 christos doh_receive_request_cb, NULL); 1150 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 1151 1.1 christos 1152 1.3 christos result = isc_nm_listenhttp( 1153 1.3 christos listen_nm, ISC_NM_LISTEN_ALL, &tcp_listen_addr, 0, quotap, 1154 1.3 christos server_tlsctx, endpoints, 0, get_proxy_type(), &listen_sock); 1155 1.1 christos assert_int_equal(result, ISC_R_SUCCESS); 1156 1.1 christos 1157 1.1 christos /* 1158 1.1 christos * "https://::1:XXXX/dns-query" is a bad URI, it should be 1159 1.1 christos * "https://[::1]:XXXX/dns-query" 1160 1.1 christos */ 1161 1.1 christos (void)snprintf(req_url, sizeof(req_url), "https://::1:%u/%s", 1162 1.1 christos isc_sockaddr_getport(&tcp_listen_addr), 1163 1.1 christos ISC_NM_HTTP_DEFAULT_PATH); 1164 1.1 christos connect_send_request(connect_nm, req_url, atomic_load(&POST), 1165 1.1 christos &(isc_region_t){ .base = (uint8_t *)send_msg.base, 1166 1.1 christos .length = send_msg.len }, 1167 1.1 christos doh_receive_reply_cb, NULL, true, 30000); 1168 1.1 christos 1169 1.3 christos isc_loop_teardown(mainloop, listen_sock_close, listen_sock); 1170 1.1 christos } 1171 1.1 christos 1172 1.1 christos ISC_RUN_TEST_IMPL(doh_parse_GET_query_string) { 1173 1.1 christos /* valid */ 1174 1.1 christos { 1175 1.1 christos bool ret; 1176 1.1 christos const char *queryp = NULL; 1177 1.1 christos size_t len = 0; 1178 1.1 christos char str[] = 1179 1.1 christos "dns=AAABAAABAAAAAAAAAWE-" 1180 1.1 christos "NjJjaGFyYWN0ZXJsYWJlbC1tYWtlcy1iYXNlNjR1cmwtZGlzdGluY3" 1181 1.1 christos "QtZnJvbS1zdGFuZGFyZC1iYXNlNjQHZXhhbXBsZQNjb20AAAEAAQ"; 1182 1.1 christos 1183 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1184 1.1 christos assert_true(ret); 1185 1.1 christos assert_non_null(queryp); 1186 1.1 christos assert_true(len > 0); 1187 1.1 christos assert_true(len == strlen(str) - 4); 1188 1.1 christos assert_true(memcmp(queryp, str + 4, len) == 0); 1189 1.1 christos } 1190 1.1 christos /* valid */ 1191 1.1 christos { 1192 1.1 christos bool ret; 1193 1.1 christos const char *queryp = NULL; 1194 1.1 christos size_t len = 0; 1195 1.1 christos char str[] = 1196 1.1 christos "?dns=AAABAAABAAAAAAAAAWE-" 1197 1.1 christos "NjJjaGFyYWN0ZXJsYWJlbC1tYWtlcy1iYXNlNjR1cmwtZGlzdGluY3" 1198 1.1 christos "QtZnJvbS1zdGFuZGFyZC1iYXNlNjQHZXhhbXBsZQNjb20AAAEAAQ&"; 1199 1.1 christos 1200 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1201 1.1 christos assert_true(ret); 1202 1.1 christos assert_non_null(queryp); 1203 1.1 christos assert_true(len > 0); 1204 1.1 christos assert_true(len == strlen(str) - 6); 1205 1.1 christos assert_true(memcmp(queryp, str + 5, len) == 0); 1206 1.1 christos } 1207 1.1 christos /* valid */ 1208 1.1 christos { 1209 1.1 christos bool ret; 1210 1.1 christos const char *queryp = NULL; 1211 1.1 christos size_t len = 0; 1212 1.1 christos char str[] = "?dns=123&dns=567"; 1213 1.1 christos 1214 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1215 1.1 christos assert_true(ret); 1216 1.1 christos assert_non_null(queryp); 1217 1.1 christos assert_true(len > 0); 1218 1.1 christos assert_true(len == 3); 1219 1.1 christos assert_true(memcmp(queryp, "567", 3) == 0); 1220 1.1 christos } 1221 1.1 christos /* valid */ 1222 1.1 christos { 1223 1.1 christos bool ret; 1224 1.1 christos const char *queryp = NULL; 1225 1.1 christos size_t len = 0; 1226 1.1 christos char str[] = "?name1=123&dns=567&name2=123&"; 1227 1.1 christos 1228 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1229 1.1 christos assert_true(ret); 1230 1.1 christos assert_non_null(queryp); 1231 1.1 christos assert_true(len > 0); 1232 1.1 christos assert_true(len == 3); 1233 1.1 christos assert_true(memcmp(queryp, "567", 3) == 0); 1234 1.1 christos } 1235 1.1 christos /* complex, but still valid */ 1236 1.1 christos { 1237 1.1 christos bool ret; 1238 1.1 christos const char *queryp = NULL; 1239 1.1 christos size_t len = 0; 1240 1.1 christos char str[] = 1241 1.1 christos "?title=%D0%92%D1%96%D0%B4%D1%81%D0%BE%D1%82%D0%BA%D0%" 1242 1.1 christos "BE%D0%B2%D0%B5_%D0%BA%D0%BE%D0%B4%D1%83%D0%B2%D0%B0%" 1243 1.1 christos "D0%BD%D0%BD%D1%8F&dns=123&veaction=edit§ion=0"; 1244 1.1 christos 1245 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1246 1.1 christos assert_true(ret); 1247 1.1 christos assert_non_null(queryp); 1248 1.1 christos assert_true(len > 0); 1249 1.1 christos assert_true(len == 3); 1250 1.1 christos assert_true(memcmp(queryp, "123", 3) == 0); 1251 1.1 christos } 1252 1.1 christos /* invalid */ 1253 1.1 christos { 1254 1.1 christos bool ret; 1255 1.1 christos const char *queryp = NULL; 1256 1.1 christos size_t len = 0; 1257 1.1 christos char str[] = 1258 1.1 christos "?title=%D0%92%D1%96%D0%B4%D1%81%D0%BE%D1%82%D0%BA%D0%" 1259 1.1 christos "BE%D0%B2%D0%B5_%D0%BA%D0%BE%D0%B4%D1%83%D0%B2%D0%B0%" 1260 1.1 christos "D0%BD%D0%BD%D1%8F&veaction=edit§ion=0"; 1261 1.1 christos 1262 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1263 1.1 christos assert_false(ret); 1264 1.1 christos assert_null(queryp); 1265 1.1 christos assert_true(len == 0); 1266 1.1 christos } 1267 1.1 christos /* invalid */ 1268 1.1 christos { 1269 1.1 christos bool ret; 1270 1.1 christos const char *queryp = NULL; 1271 1.1 christos size_t len = 0; 1272 1.1 christos char str[] = ""; 1273 1.1 christos 1274 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1275 1.1 christos assert_false(ret); 1276 1.1 christos assert_null(queryp); 1277 1.1 christos assert_true(len == 0); 1278 1.1 christos } 1279 1.1 christos /* invalid */ 1280 1.1 christos { 1281 1.1 christos bool ret; 1282 1.1 christos const char *queryp = NULL; 1283 1.1 christos size_t len = 0; 1284 1.1 christos char str[] = "?&"; 1285 1.1 christos 1286 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1287 1.1 christos assert_false(ret); 1288 1.1 christos assert_null(queryp); 1289 1.1 christos assert_true(len == 0); 1290 1.1 christos } 1291 1.1 christos /* invalid */ 1292 1.1 christos { 1293 1.1 christos bool ret; 1294 1.1 christos const char *queryp = NULL; 1295 1.1 christos size_t len = 0; 1296 1.1 christos char str[] = "?dns&"; 1297 1.1 christos 1298 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1299 1.1 christos assert_false(ret); 1300 1.1 christos assert_null(queryp); 1301 1.1 christos assert_true(len == 0); 1302 1.1 christos } 1303 1.1 christos /* invalid */ 1304 1.1 christos { 1305 1.1 christos bool ret; 1306 1.1 christos const char *queryp = NULL; 1307 1.1 christos size_t len = 0; 1308 1.1 christos char str[] = "?dns=&"; 1309 1.1 christos 1310 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1311 1.1 christos assert_false(ret); 1312 1.1 christos assert_null(queryp); 1313 1.1 christos assert_true(len == 0); 1314 1.1 christos } 1315 1.1 christos /* invalid */ 1316 1.1 christos { 1317 1.1 christos bool ret; 1318 1.1 christos const char *queryp = NULL; 1319 1.1 christos size_t len = 0; 1320 1.1 christos char str[] = "?dns=123&&"; 1321 1.1 christos 1322 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1323 1.1 christos assert_false(ret); 1324 1.1 christos assert_null(queryp); 1325 1.1 christos assert_true(len == 0); 1326 1.1 christos } 1327 1.1 christos /* valid */ 1328 1.1 christos { 1329 1.1 christos bool ret; 1330 1.1 christos const char *queryp = NULL; 1331 1.1 christos size_t len = 0; 1332 1.1 christos char str[] = "?dns=123%12&"; 1333 1.1 christos 1334 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1335 1.1 christos assert_true(ret); 1336 1.1 christos assert_non_null(queryp); 1337 1.1 christos assert_true(len > 0); 1338 1.1 christos assert_true(len == 6); 1339 1.1 christos assert_true(memcmp(queryp, "123%12", 6) == 0); 1340 1.1 christos } 1341 1.1 christos /* invalid */ 1342 1.1 christos { 1343 1.1 christos bool ret; 1344 1.1 christos const char *queryp = NULL; 1345 1.1 christos size_t len = 0; 1346 1.1 christos char str[] = "?dns=123%ZZ&"; 1347 1.1 christos 1348 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1349 1.1 christos assert_false(ret); 1350 1.1 christos assert_null(queryp); 1351 1.1 christos assert_true(len == 0); 1352 1.1 christos } 1353 1.1 christos /* invalid */ 1354 1.1 christos { 1355 1.1 christos bool ret; 1356 1.1 christos const char *queryp = NULL; 1357 1.1 christos size_t len = 0; 1358 1.1 christos char str[] = "?dns=123%%&"; 1359 1.1 christos 1360 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1361 1.1 christos assert_false(ret); 1362 1.1 christos assert_null(queryp); 1363 1.1 christos assert_true(len == 0); 1364 1.1 christos } 1365 1.1 christos /* invalid */ 1366 1.1 christos { 1367 1.1 christos bool ret; 1368 1.1 christos const char *queryp = NULL; 1369 1.1 christos size_t len = 0; 1370 1.1 christos char str[] = "?dns=123%AZ&"; 1371 1.1 christos 1372 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1373 1.1 christos assert_false(ret); 1374 1.1 christos assert_null(queryp); 1375 1.1 christos assert_true(len == 0); 1376 1.1 christos } 1377 1.1 christos /* valid */ 1378 1.1 christos { 1379 1.1 christos bool ret; 1380 1.1 christos const char *queryp = NULL; 1381 1.1 christos size_t len = 0; 1382 1.1 christos char str[] = "?dns=123%0AZ&"; 1383 1.1 christos 1384 1.1 christos ret = isc__nm_parse_httpquery(str, &queryp, &len); 1385 1.1 christos assert_true(ret); 1386 1.1 christos assert_non_null(queryp); 1387 1.1 christos assert_true(len > 0); 1388 1.1 christos assert_true(len == 7); 1389 1.1 christos assert_true(memcmp(queryp, "123%0AZ", 7) == 0); 1390 1.1 christos } 1391 1.1 christos } 1392 1.1 christos 1393 1.1 christos ISC_RUN_TEST_IMPL(doh_base64url_to_base64) { 1394 1.1 christos char *res; 1395 1.1 christos size_t res_len = 0; 1396 1.1 christos /* valid */ 1397 1.1 christos { 1398 1.1 christos char test[] = "YW55IGNhcm5hbCBwbGVhc3VyZS4"; 1399 1.1 christos char res_test[] = "YW55IGNhcm5hbCBwbGVhc3VyZS4="; 1400 1.1 christos 1401 1.1 christos res = isc__nm_base64url_to_base64(mctx, test, strlen(test), 1402 1.1 christos &res_len); 1403 1.1 christos assert_non_null(res); 1404 1.1 christos assert_true(res_len == strlen(res_test)); 1405 1.1 christos assert_true(strcmp(res, res_test) == 0); 1406 1.1 christos isc_mem_free(mctx, res); 1407 1.1 christos } 1408 1.1 christos /* valid */ 1409 1.1 christos { 1410 1.1 christos char test[] = "YW55IGNhcm5hbCBwbGVhcw"; 1411 1.1 christos char res_test[] = "YW55IGNhcm5hbCBwbGVhcw=="; 1412 1.1 christos 1413 1.1 christos res = isc__nm_base64url_to_base64(mctx, test, strlen(test), 1414 1.1 christos &res_len); 1415 1.1 christos assert_non_null(res); 1416 1.1 christos assert_true(res_len == strlen(res_test)); 1417 1.1 christos assert_true(strcmp(res, res_test) == 0); 1418 1.1 christos isc_mem_free(mctx, res); 1419 1.1 christos } 1420 1.1 christos /* valid */ 1421 1.1 christos { 1422 1.1 christos char test[] = "YW55IGNhcm5hbCBwbGVhc3Vy"; 1423 1.1 christos char res_test[] = "YW55IGNhcm5hbCBwbGVhc3Vy"; 1424 1.1 christos 1425 1.1 christos res = isc__nm_base64url_to_base64(mctx, test, strlen(test), 1426 1.1 christos &res_len); 1427 1.1 christos assert_non_null(res); 1428 1.1 christos assert_true(res_len == strlen(res_test)); 1429 1.1 christos assert_true(strcmp(res, res_test) == 0); 1430 1.1 christos isc_mem_free(mctx, res); 1431 1.1 christos } 1432 1.1 christos /* valid */ 1433 1.1 christos { 1434 1.1 christos char test[] = "YW55IGNhcm5hbCBwbGVhc3U"; 1435 1.1 christos char res_test[] = "YW55IGNhcm5hbCBwbGVhc3U="; 1436 1.1 christos 1437 1.1 christos res = isc__nm_base64url_to_base64(mctx, test, strlen(test), 1438 1.1 christos &res_len); 1439 1.1 christos assert_non_null(res); 1440 1.1 christos assert_true(res_len == strlen(res_test)); 1441 1.1 christos assert_true(strcmp(res, res_test) == 0); 1442 1.1 christos isc_mem_free(mctx, res); 1443 1.1 christos } 1444 1.1 christos /* valid */ 1445 1.1 christos { 1446 1.1 christos char test[] = "YW55IGNhcm5hbCBwbGVhcw"; 1447 1.1 christos char res_test[] = "YW55IGNhcm5hbCBwbGVhcw=="; 1448 1.1 christos 1449 1.1 christos res = isc__nm_base64url_to_base64(mctx, test, strlen(test), 1450 1.1 christos &res_len); 1451 1.1 christos assert_non_null(res); 1452 1.1 christos assert_true(res_len == strlen(res_test)); 1453 1.1 christos assert_true(strcmp(res, res_test) == 0); 1454 1.1 christos isc_mem_free(mctx, res); 1455 1.1 christos } 1456 1.1 christos /* valid */ 1457 1.1 christos { 1458 1.1 christos char test[] = "PDw_Pz8-Pg"; 1459 1.1 christos char res_test[] = "PDw/Pz8+Pg=="; 1460 1.1 christos 1461 1.1 christos res = isc__nm_base64url_to_base64(mctx, test, strlen(test), 1462 1.1 christos &res_len); 1463 1.1 christos assert_non_null(res); 1464 1.1 christos assert_true(res_len == strlen(res_test)); 1465 1.1 christos assert_true(strcmp(res, res_test) == 0); 1466 1.1 christos isc_mem_free(mctx, res); 1467 1.1 christos } 1468 1.1 christos /* valid */ 1469 1.1 christos { 1470 1.1 christos char test[] = "PDw_Pz8-Pg"; 1471 1.1 christos char res_test[] = "PDw/Pz8+Pg=="; 1472 1.1 christos 1473 1.1 christos res = isc__nm_base64url_to_base64(mctx, test, strlen(test), 1474 1.1 christos NULL); 1475 1.1 christos assert_non_null(res); 1476 1.1 christos assert_true(strcmp(res, res_test) == 0); 1477 1.1 christos isc_mem_free(mctx, res); 1478 1.1 christos } 1479 1.1 christos /* invalid */ 1480 1.1 christos { 1481 1.1 christos char test[] = "YW55IGNhcm5hbCBwbGVhcw"; 1482 1.1 christos res_len = 0; 1483 1.1 christos 1484 1.1 christos res = isc__nm_base64url_to_base64(mctx, test, 0, &res_len); 1485 1.1 christos assert_null(res); 1486 1.1 christos assert_true(res_len == 0); 1487 1.1 christos } 1488 1.1 christos /* invalid */ 1489 1.1 christos { 1490 1.1 christos char test[] = ""; 1491 1.1 christos res_len = 0; 1492 1.1 christos 1493 1.1 christos res = isc__nm_base64url_to_base64(mctx, test, strlen(test), 1494 1.1 christos &res_len); 1495 1.1 christos assert_null(res); 1496 1.1 christos assert_true(res_len == 0); 1497 1.1 christos } 1498 1.1 christos /* invalid */ 1499 1.1 christos { 1500 1.1 christos char test[] = "PDw_Pz8-Pg=="; 1501 1.1 christos res_len = 0; 1502 1.1 christos 1503 1.1 christos res = isc__nm_base64url_to_base64(mctx, test, strlen(test), 1504 1.1 christos &res_len); 1505 1.1 christos assert_null(res); 1506 1.1 christos assert_true(res_len == 0); 1507 1.1 christos } 1508 1.1 christos /* invalid */ 1509 1.1 christos { 1510 1.1 christos char test[] = "PDw_Pz8-Pg%3D%3D"; /* percent encoded "==" at the 1511 1.1 christos end */ 1512 1.1 christos res_len = 0; 1513 1.1 christos 1514 1.1 christos res = isc__nm_base64url_to_base64(mctx, test, strlen(test), 1515 1.1 christos &res_len); 1516 1.1 christos assert_null(res); 1517 1.1 christos assert_true(res_len == 0); 1518 1.1 christos } 1519 1.1 christos /* invalid */ 1520 1.1 christos { 1521 1.1 christos res_len = 0; 1522 1.1 christos 1523 1.1 christos res = isc__nm_base64url_to_base64(mctx, NULL, 31231, &res_len); 1524 1.1 christos assert_null(res); 1525 1.1 christos assert_true(res_len == 0); 1526 1.1 christos } 1527 1.1 christos } 1528 1.1 christos 1529 1.1 christos ISC_RUN_TEST_IMPL(doh_base64_to_base64url) { 1530 1.1 christos char *res; 1531 1.1 christos size_t res_len = 0; 1532 1.1 christos /* valid */ 1533 1.1 christos { 1534 1.1 christos char res_test[] = "YW55IGNhcm5hbCBwbGVhc3VyZS4"; 1535 1.1 christos char test[] = "YW55IGNhcm5hbCBwbGVhc3VyZS4="; 1536 1.1 christos 1537 1.1 christos res = isc__nm_base64_to_base64url(mctx, test, strlen(test), 1538 1.1 christos &res_len); 1539 1.1 christos assert_non_null(res); 1540 1.1 christos assert_true(res_len == strlen(res_test)); 1541 1.1 christos assert_true(strcmp(res, res_test) == 0); 1542 1.1 christos isc_mem_free(mctx, res); 1543 1.1 christos } 1544 1.1 christos /* valid */ 1545 1.1 christos { 1546 1.1 christos char res_test[] = "YW55IGNhcm5hbCBwbGVhcw"; 1547 1.1 christos char test[] = "YW55IGNhcm5hbCBwbGVhcw=="; 1548 1.1 christos 1549 1.1 christos res = isc__nm_base64_to_base64url(mctx, test, strlen(test), 1550 1.1 christos &res_len); 1551 1.1 christos assert_non_null(res); 1552 1.1 christos assert_true(res_len == strlen(res_test)); 1553 1.1 christos assert_true(strcmp(res, res_test) == 0); 1554 1.1 christos isc_mem_free(mctx, res); 1555 1.1 christos } 1556 1.1 christos /* valid */ 1557 1.1 christos { 1558 1.1 christos char res_test[] = "YW55IGNhcm5hbCBwbGVhc3Vy"; 1559 1.1 christos char test[] = "YW55IGNhcm5hbCBwbGVhc3Vy"; 1560 1.1 christos 1561 1.1 christos res = isc__nm_base64_to_base64url(mctx, test, strlen(test), 1562 1.1 christos &res_len); 1563 1.1 christos assert_non_null(res); 1564 1.1 christos assert_true(res_len == strlen(res_test)); 1565 1.1 christos assert_true(strcmp(res, res_test) == 0); 1566 1.1 christos isc_mem_free(mctx, res); 1567 1.1 christos } 1568 1.1 christos /* valid */ 1569 1.1 christos { 1570 1.1 christos char res_test[] = "YW55IGNhcm5hbCBwbGVhc3U"; 1571 1.1 christos char test[] = "YW55IGNhcm5hbCBwbGVhc3U="; 1572 1.1 christos 1573 1.1 christos res = isc__nm_base64_to_base64url(mctx, test, strlen(test), 1574 1.1 christos &res_len); 1575 1.1 christos assert_non_null(res); 1576 1.1 christos assert_true(res_len == strlen(res_test)); 1577 1.1 christos assert_true(strcmp(res, res_test) == 0); 1578 1.1 christos isc_mem_free(mctx, res); 1579 1.1 christos } 1580 1.1 christos /* valid */ 1581 1.1 christos { 1582 1.1 christos char res_test[] = "YW55IGNhcm5hbCBwbGVhcw"; 1583 1.1 christos char test[] = "YW55IGNhcm5hbCBwbGVhcw=="; 1584 1.1 christos 1585 1.1 christos res = isc__nm_base64_to_base64url(mctx, test, strlen(test), 1586 1.1 christos &res_len); 1587 1.1 christos assert_non_null(res); 1588 1.1 christos assert_true(res_len == strlen(res_test)); 1589 1.1 christos assert_true(strcmp(res, res_test) == 0); 1590 1.1 christos isc_mem_free(mctx, res); 1591 1.1 christos } 1592 1.1 christos /* valid */ 1593 1.1 christos { 1594 1.1 christos char res_test[] = "PDw_Pz8-Pg"; 1595 1.1 christos char test[] = "PDw/Pz8+Pg=="; 1596 1.1 christos 1597 1.1 christos res = isc__nm_base64_to_base64url(mctx, test, strlen(test), 1598 1.1 christos &res_len); 1599 1.1 christos assert_non_null(res); 1600 1.1 christos assert_true(res_len == strlen(res_test)); 1601 1.1 christos assert_true(strcmp(res, res_test) == 0); 1602 1.1 christos isc_mem_free(mctx, res); 1603 1.1 christos } 1604 1.1 christos /* valid */ 1605 1.1 christos { 1606 1.1 christos char res_test[] = "PDw_Pz8-Pg"; 1607 1.1 christos char test[] = "PDw/Pz8+Pg=="; 1608 1.1 christos 1609 1.1 christos res = isc__nm_base64_to_base64url(mctx, test, strlen(test), 1610 1.1 christos NULL); 1611 1.1 christos assert_non_null(res); 1612 1.1 christos assert_true(strcmp(res, res_test) == 0); 1613 1.1 christos isc_mem_free(mctx, res); 1614 1.1 christos } 1615 1.1 christos /* invalid */ 1616 1.1 christos { 1617 1.1 christos char test[] = "YW55IGNhcm5hbCBwbGVhcw"; 1618 1.1 christos res_len = 0; 1619 1.1 christos 1620 1.1 christos res = isc__nm_base64_to_base64url(mctx, test, 0, &res_len); 1621 1.1 christos assert_null(res); 1622 1.1 christos assert_true(res_len == 0); 1623 1.1 christos } 1624 1.1 christos /* invalid */ 1625 1.1 christos { 1626 1.1 christos char test[] = ""; 1627 1.1 christos res_len = 0; 1628 1.1 christos 1629 1.1 christos res = isc__nm_base64_to_base64url(mctx, test, strlen(test), 1630 1.1 christos &res_len); 1631 1.1 christos assert_null(res); 1632 1.1 christos assert_true(res_len == 0); 1633 1.1 christos } 1634 1.1 christos /* invalid */ 1635 1.1 christos { 1636 1.1 christos char test[] = "PDw_Pz8-Pg=="; 1637 1.1 christos res_len = 0; 1638 1.1 christos 1639 1.1 christos res = isc__nm_base64_to_base64url(mctx, test, strlen(test), 1640 1.1 christos &res_len); 1641 1.1 christos assert_null(res); 1642 1.1 christos assert_true(res_len == 0); 1643 1.1 christos } 1644 1.1 christos /* invalid */ 1645 1.1 christos { 1646 1.1 christos char test[] = "PDw_Pz8-Pg%3D%3D"; /* percent encoded "==" at the 1647 1.1 christos end */ 1648 1.1 christos res_len = 0; 1649 1.1 christos 1650 1.1 christos res = isc__nm_base64_to_base64url(mctx, test, strlen(test), 1651 1.1 christos &res_len); 1652 1.1 christos assert_null(res); 1653 1.1 christos assert_true(res_len == 0); 1654 1.1 christos } 1655 1.1 christos /* invalid */ 1656 1.1 christos { 1657 1.1 christos res_len = 0; 1658 1.1 christos 1659 1.1 christos res = isc__nm_base64_to_base64url(mctx, NULL, 31231, &res_len); 1660 1.1 christos assert_null(res); 1661 1.1 christos assert_true(res_len == 0); 1662 1.1 christos } 1663 1.1 christos } 1664 1.1 christos 1665 1.1 christos ISC_RUN_TEST_IMPL(doh_path_validation) { 1666 1.1 christos assert_true(isc_nm_http_path_isvalid("/")); 1667 1.1 christos assert_true(isc_nm_http_path_isvalid(ISC_NM_HTTP_DEFAULT_PATH)); 1668 1.1 christos assert_false(isc_nm_http_path_isvalid("laaaa")); 1669 1.1 christos assert_false(isc_nm_http_path_isvalid("")); 1670 1.1 christos assert_false(isc_nm_http_path_isvalid("//")); 1671 1.1 christos assert_true(isc_nm_http_path_isvalid("/lala///")); 1672 1.1 christos assert_true(isc_nm_http_path_isvalid("/lalaaaaaa")); 1673 1.1 christos assert_true(isc_nm_http_path_isvalid("/lalaaa/la/la/la")); 1674 1.1 christos assert_true(isc_nm_http_path_isvalid("/la/a")); 1675 1.1 christos assert_true(isc_nm_http_path_isvalid("/la+la")); 1676 1.1 christos assert_true(isc_nm_http_path_isvalid("/la&la/la*la/l-a_/la!/la\'")); 1677 1.1 christos assert_true(isc_nm_http_path_isvalid("/la/(la)/la")); 1678 1.1 christos assert_true(isc_nm_http_path_isvalid("/la,la,la")); 1679 1.1 christos assert_true(isc_nm_http_path_isvalid("/la-'la'-la")); 1680 1.1 christos assert_true(isc_nm_http_path_isvalid("/la:la=la")); 1681 1.1 christos assert_true(isc_nm_http_path_isvalid("/l@l@l@")); 1682 1.1 christos assert_false(isc_nm_http_path_isvalid("/#lala")); 1683 1.1 christos assert_true(isc_nm_http_path_isvalid("/lala;la")); 1684 1.1 christos assert_false( 1685 1.1 christos isc_nm_http_path_isvalid("la&la/laalaala*lala/l-al_a/lal!/")); 1686 1.1 christos assert_true(isc_nm_http_path_isvalid("/Lal/lAla.jpg")); 1687 1.1 christos 1688 1.1 christos /* had to replace ? with ! because it does not verify a query string */ 1689 1.1 christos assert_true(isc_nm_http_path_isvalid("/watch!v=oavMtUWDBTM")); 1690 1.1 christos assert_false(isc_nm_http_path_isvalid("/watch?v=dQw4w9WgXcQ")); 1691 1.1 christos assert_true(isc_nm_http_path_isvalid("/datatracker.ietf.org/doc/html/" 1692 1.1 christos "rfc2616")); 1693 1.1 christos assert_true(isc_nm_http_path_isvalid("/doc/html/rfc8484")); 1694 1.1 christos assert_true(isc_nm_http_path_isvalid("/123")); 1695 1.1 christos } 1696 1.1 christos 1697 1.1 christos ISC_RUN_TEST_IMPL(doh_connect_makeuri) { 1698 1.1 christos struct in_addr localhostv4 = { .s_addr = ntohl(INADDR_LOOPBACK) }; 1699 1.1 christos isc_sockaddr_t sa; 1700 1.1 christos char uri[256]; 1701 1.1 christos 1702 1.1 christos /* Firstly, test URI generation using isc_sockaddr_t */ 1703 1.1 christos isc_sockaddr_fromin(&sa, &localhostv4, 0); 1704 1.1 christos uri[0] = '\0'; 1705 1.1 christos isc_nm_http_makeuri(true, &sa, NULL, 0, ISC_NM_HTTP_DEFAULT_PATH, uri, 1706 1.1 christos sizeof(uri)); 1707 1.1 christos assert_true(strcmp("https://127.0.0.1:443/dns-query", uri) == 0); 1708 1.1 christos 1709 1.1 christos uri[0] = '\0'; 1710 1.1 christos isc_nm_http_makeuri(false, &sa, NULL, 0, ISC_NM_HTTP_DEFAULT_PATH, uri, 1711 1.1 christos sizeof(uri)); 1712 1.1 christos assert_true(strcmp("http://127.0.0.1:80/dns-query", uri) == 0); 1713 1.1 christos 1714 1.1 christos /* 1715 1.1 christos * The port value should be ignored, because we can get one from 1716 1.1 christos * the isc_sockaddr_t object. 1717 1.1 christos */ 1718 1.1 christos uri[0] = '\0'; 1719 1.1 christos isc_nm_http_makeuri(true, &sa, NULL, 44343, ISC_NM_HTTP_DEFAULT_PATH, 1720 1.1 christos uri, sizeof(uri)); 1721 1.1 christos assert_true(strcmp("https://127.0.0.1:443/dns-query", uri) == 0); 1722 1.1 christos 1723 1.1 christos uri[0] = '\0'; 1724 1.1 christos isc_nm_http_makeuri(false, &sa, NULL, 8080, ISC_NM_HTTP_DEFAULT_PATH, 1725 1.1 christos uri, sizeof(uri)); 1726 1.1 christos assert_true(strcmp("http://127.0.0.1:80/dns-query", uri) == 0); 1727 1.1 christos 1728 1.1 christos /* IPv6 */ 1729 1.1 christos isc_sockaddr_fromin6(&sa, &in6addr_loopback, 0); 1730 1.1 christos uri[0] = '\0'; 1731 1.1 christos isc_nm_http_makeuri(true, &sa, NULL, 0, ISC_NM_HTTP_DEFAULT_PATH, uri, 1732 1.1 christos sizeof(uri)); 1733 1.1 christos assert_true(strcmp("https://[::1]:443/dns-query", uri) == 0); 1734 1.1 christos 1735 1.1 christos uri[0] = '\0'; 1736 1.1 christos isc_nm_http_makeuri(false, &sa, NULL, 0, ISC_NM_HTTP_DEFAULT_PATH, uri, 1737 1.1 christos sizeof(uri)); 1738 1.1 christos assert_true(strcmp("http://[::1]:80/dns-query", uri) == 0); 1739 1.1 christos 1740 1.1 christos /* 1741 1.1 christos * The port value should be ignored, because we can get one from 1742 1.1 christos * the isc_sockaddr_t object. 1743 1.1 christos */ 1744 1.1 christos uri[0] = '\0'; 1745 1.1 christos isc_nm_http_makeuri(true, &sa, NULL, 44343, ISC_NM_HTTP_DEFAULT_PATH, 1746 1.1 christos uri, sizeof(uri)); 1747 1.1 christos assert_true(strcmp("https://[::1]:443/dns-query", uri) == 0); 1748 1.1 christos 1749 1.1 christos uri[0] = '\0'; 1750 1.1 christos isc_nm_http_makeuri(false, &sa, NULL, 8080, ISC_NM_HTTP_DEFAULT_PATH, 1751 1.1 christos uri, sizeof(uri)); 1752 1.1 christos assert_true(strcmp("http://[::1]:80/dns-query", uri) == 0); 1753 1.1 christos 1754 1.1 christos /* Try to set the port numbers. */ 1755 1.1 christos isc_sockaddr_setport(&sa, 44343); 1756 1.1 christos uri[0] = '\0'; 1757 1.1 christos isc_nm_http_makeuri(true, &sa, NULL, 0, ISC_NM_HTTP_DEFAULT_PATH, uri, 1758 1.1 christos sizeof(uri)); 1759 1.1 christos assert_true(strcmp("https://[::1]:44343/dns-query", uri) == 0); 1760 1.1 christos 1761 1.1 christos isc_sockaddr_setport(&sa, 8080); 1762 1.1 christos uri[0] = '\0'; 1763 1.1 christos isc_nm_http_makeuri(false, &sa, NULL, 0, ISC_NM_HTTP_DEFAULT_PATH, uri, 1764 1.1 christos sizeof(uri)); 1765 1.1 christos assert_true(strcmp("http://[::1]:8080/dns-query", uri) == 0); 1766 1.1 christos 1767 1.1 christos /* 1768 1.1 christos * Try to make a URI using a hostname and a port number. The 1769 1.1 christos * isc_sockaddr_t object will be ignored. 1770 1.1 christos */ 1771 1.1 christos isc_sockaddr_any(&sa); 1772 1.1 christos uri[0] = '\0'; 1773 1.1 christos isc_nm_http_makeuri(true, &sa, "example.com", 0, 1774 1.1 christos ISC_NM_HTTP_DEFAULT_PATH, uri, sizeof(uri)); 1775 1.1 christos assert_true(strcmp("https://example.com:443/dns-query", uri) == 0); 1776 1.1 christos 1777 1.1 christos uri[0] = '\0'; 1778 1.1 christos isc_nm_http_makeuri(false, &sa, "example.com", 0, 1779 1.1 christos ISC_NM_HTTP_DEFAULT_PATH, uri, sizeof(uri)); 1780 1.1 christos assert_true(strcmp("http://example.com:80/dns-query", uri) == 0); 1781 1.1 christos 1782 1.1 christos /* Try to set the port numbers. */ 1783 1.1 christos isc_sockaddr_setport(&sa, 443); 1784 1.1 christos uri[0] = '\0'; 1785 1.1 christos isc_nm_http_makeuri(true, &sa, "example.com", 44343, 1786 1.1 christos ISC_NM_HTTP_DEFAULT_PATH, uri, sizeof(uri)); 1787 1.1 christos assert_true(strcmp("https://example.com:44343/dns-query", uri) == 0); 1788 1.1 christos 1789 1.1 christos isc_sockaddr_setport(&sa, 80); 1790 1.1 christos uri[0] = '\0'; 1791 1.1 christos isc_nm_http_makeuri(false, &sa, "example.com", 8080, 1792 1.1 christos ISC_NM_HTTP_DEFAULT_PATH, uri, sizeof(uri)); 1793 1.1 christos assert_true(strcmp("http://example.com:8080/dns-query", uri) == 0); 1794 1.1 christos 1795 1.1 christos /* IPv4 as the hostname - nothing fancy here */ 1796 1.1 christos uri[0] = '\0'; 1797 1.1 christos isc_nm_http_makeuri(false, NULL, "127.0.0.1", 8080, 1798 1.1 christos ISC_NM_HTTP_DEFAULT_PATH, uri, sizeof(uri)); 1799 1.1 christos assert_true(strcmp("http://127.0.0.1:8080/dns-query", uri) == 0); 1800 1.1 christos 1801 1.1 christos uri[0] = '\0'; 1802 1.1 christos isc_nm_http_makeuri(true, NULL, "127.0.0.1", 44343, 1803 1.1 christos ISC_NM_HTTP_DEFAULT_PATH, uri, sizeof(uri)); 1804 1.1 christos assert_true(strcmp("https://127.0.0.1:44343/dns-query", uri) == 0); 1805 1.1 christos 1806 1.1 christos /* 1807 1.1 christos * A peculiar edge case: IPv6 given as the hostname (notice 1808 1.1 christos * the brackets) 1809 1.1 christos */ 1810 1.1 christos uri[0] = '\0'; 1811 1.1 christos isc_nm_http_makeuri(false, NULL, "::1", 8080, ISC_NM_HTTP_DEFAULT_PATH, 1812 1.1 christos uri, sizeof(uri)); 1813 1.1 christos assert_true(strcmp("http://[::1]:8080/dns-query", uri) == 0); 1814 1.1 christos 1815 1.1 christos uri[0] = '\0'; 1816 1.1 christos isc_nm_http_makeuri(true, NULL, "[::1]", 44343, 1817 1.1 christos ISC_NM_HTTP_DEFAULT_PATH, uri, sizeof(uri)); 1818 1.1 christos assert_true(strcmp("https://[::1]:44343/dns-query", uri) == 0); 1819 1.1 christos } 1820 1.1 christos 1821 1.3 christos /* PROXY */ 1822 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_noop_POST) { 1823 1.3 christos atomic_store(&POST, true); 1824 1.3 christos atomic_store(&use_PROXY, true); 1825 1.3 christos doh_noop(arg); 1826 1.3 christos } 1827 1.3 christos 1828 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_noop_GET) { 1829 1.3 christos atomic_store(&use_PROXY, true); 1830 1.3 christos doh_noop(arg); 1831 1.3 christos } 1832 1.3 christos 1833 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_noresponse_POST) { 1834 1.3 christos atomic_store(&POST, true); 1835 1.3 christos atomic_store(&use_PROXY, true); 1836 1.3 christos doh_noresponse(arg); 1837 1.3 christos } 1838 1.3 christos 1839 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_noresponse_GET) { 1840 1.3 christos atomic_store(&use_PROXY, true); 1841 1.3 christos doh_noresponse(arg); 1842 1.3 christos } 1843 1.3 christos 1844 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_timeout_recovery_POST) { 1845 1.3 christos atomic_store(&POST, true); 1846 1.3 christos atomic_store(&use_PROXY, true); 1847 1.3 christos doh_timeout_recovery(arg); 1848 1.3 christos } 1849 1.3 christos 1850 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_timeout_recovery_GET) { 1851 1.3 christos atomic_store(&use_PROXY, true); 1852 1.3 christos doh_timeout_recovery(arg); 1853 1.3 christos } 1854 1.3 christos 1855 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_one_POST) { 1856 1.3 christos atomic_store(&POST, true); 1857 1.3 christos atomic_store(&use_PROXY, true); 1858 1.3 christos doh_recv_one(arg); 1859 1.3 christos } 1860 1.3 christos 1861 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_one_GET) { 1862 1.3 christos atomic_store(&use_PROXY, true); 1863 1.3 christos doh_recv_one(arg); 1864 1.3 christos } 1865 1.3 christos 1866 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_one_POST_TLS) { 1867 1.3 christos atomic_store(&POST, true); 1868 1.3 christos atomic_store(&use_TLS, true); 1869 1.3 christos atomic_store(&use_PROXY, true); 1870 1.3 christos doh_recv_one(arg); 1871 1.3 christos } 1872 1.3 christos 1873 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_one_GET_TLS) { 1874 1.3 christos atomic_store(&use_TLS, true); 1875 1.3 christos atomic_store(&use_PROXY, true); 1876 1.3 christos doh_recv_one(arg); 1877 1.3 christos } 1878 1.3 christos 1879 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_one_POST_quota) { 1880 1.3 christos atomic_store(&POST, true); 1881 1.3 christos atomic_store(&use_PROXY, true); 1882 1.3 christos atomic_store(&check_listener_quota, true); 1883 1.3 christos doh_recv_one(arg); 1884 1.3 christos } 1885 1.3 christos 1886 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_one_GET_quota) { 1887 1.3 christos atomic_store(&use_PROXY, true); 1888 1.3 christos atomic_store(&check_listener_quota, true); 1889 1.3 christos doh_recv_one(arg); 1890 1.3 christos } 1891 1.3 christos 1892 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_one_GET_TLS_quota) { 1893 1.3 christos atomic_store(&use_TLS, true); 1894 1.3 christos atomic_store(&use_PROXY, true); 1895 1.3 christos atomic_store(&check_listener_quota, true); 1896 1.3 christos doh_recv_one(arg); 1897 1.3 christos } 1898 1.3 christos 1899 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_one_POST_TLS_quota) { 1900 1.3 christos atomic_store(&POST, true); 1901 1.3 christos atomic_store(&use_TLS, true); 1902 1.3 christos atomic_store(&use_PROXY, true); 1903 1.3 christos atomic_store(&check_listener_quota, true); 1904 1.3 christos doh_recv_one(arg); 1905 1.3 christos } 1906 1.3 christos 1907 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_two_POST) { 1908 1.3 christos atomic_store(&POST, true); 1909 1.3 christos atomic_store(&use_PROXY, true); 1910 1.3 christos doh_recv_two(arg); 1911 1.3 christos } 1912 1.3 christos 1913 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_two_GET) { 1914 1.3 christos ; 1915 1.3 christos atomic_store(&use_PROXY, true); 1916 1.3 christos doh_recv_two(arg); 1917 1.3 christos } 1918 1.3 christos 1919 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_two_POST_TLS) { 1920 1.3 christos atomic_store(&POST, true); 1921 1.3 christos atomic_store(&use_TLS, true); 1922 1.3 christos atomic_store(&use_PROXY, true); 1923 1.3 christos doh_recv_two(arg); 1924 1.3 christos } 1925 1.3 christos 1926 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_two_GET_TLS) { 1927 1.3 christos atomic_store(&use_TLS, true); 1928 1.3 christos atomic_store(&use_PROXY, true); 1929 1.3 christos doh_recv_two(arg); 1930 1.3 christos } 1931 1.3 christos 1932 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_two_POST_quota) { 1933 1.3 christos atomic_store(&POST, true); 1934 1.3 christos atomic_store(&use_PROXY, true); 1935 1.3 christos atomic_store(&check_listener_quota, true); 1936 1.3 christos doh_recv_two(arg); 1937 1.3 christos } 1938 1.3 christos 1939 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_two_GET_quota) { 1940 1.3 christos atomic_store(&use_PROXY, true); 1941 1.3 christos atomic_store(&check_listener_quota, true); 1942 1.3 christos doh_recv_two(arg); 1943 1.3 christos } 1944 1.3 christos 1945 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_two_POST_TLS_quota) { 1946 1.3 christos atomic_store(&POST, true); 1947 1.3 christos atomic_store(&use_TLS, true); 1948 1.3 christos atomic_store(&use_PROXY, true); 1949 1.3 christos atomic_store(&check_listener_quota, true); 1950 1.3 christos doh_recv_two(arg); 1951 1.3 christos } 1952 1.3 christos 1953 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_two_GET_TLS_quota) { 1954 1.3 christos atomic_store(&use_TLS, true); 1955 1.3 christos atomic_store(&use_PROXY, true); 1956 1.3 christos atomic_store(&check_listener_quota, true); 1957 1.3 christos doh_recv_two(arg); 1958 1.3 christos } 1959 1.3 christos 1960 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_send_POST) { 1961 1.3 christos atomic_store(&POST, true); 1962 1.3 christos atomic_store(&use_PROXY, true); 1963 1.3 christos doh_recv_send(arg); 1964 1.3 christos } 1965 1.3 christos 1966 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_send_GET) { 1967 1.3 christos atomic_store(&use_PROXY, true); 1968 1.3 christos doh_recv_send(arg); 1969 1.3 christos } 1970 1.3 christos 1971 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_send_POST_TLS) { 1972 1.3 christos atomic_store(&POST, true); 1973 1.3 christos atomic_store(&use_TLS, true); 1974 1.3 christos atomic_store(&use_PROXY, true); 1975 1.3 christos doh_recv_send(arg); 1976 1.3 christos } 1977 1.3 christos 1978 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_send_GET_TLS) { 1979 1.3 christos atomic_store(&use_TLS, true); 1980 1.3 christos atomic_store(&use_PROXY, true); 1981 1.3 christos doh_recv_send(arg); 1982 1.3 christos } 1983 1.3 christos 1984 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_send_POST_quota) { 1985 1.3 christos atomic_store(&POST, true); 1986 1.3 christos atomic_store(&use_PROXY, true); 1987 1.3 christos atomic_store(&check_listener_quota, true); 1988 1.3 christos doh_recv_send(arg); 1989 1.3 christos } 1990 1.3 christos 1991 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_send_GET_quota) { 1992 1.3 christos atomic_store(&use_PROXY, true); 1993 1.3 christos atomic_store(&check_listener_quota, true); 1994 1.3 christos doh_recv_send(arg); 1995 1.3 christos } 1996 1.3 christos 1997 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_send_POST_TLS_quota) { 1998 1.3 christos atomic_store(&POST, true); 1999 1.3 christos atomic_store(&use_TLS, true); 2000 1.3 christos atomic_store(&use_PROXY, true); 2001 1.3 christos atomic_store(&check_listener_quota, true); 2002 1.3 christos doh_recv_send(arg); 2003 1.3 christos } 2004 1.3 christos 2005 1.3 christos ISC_LOOP_TEST_IMPL(proxy_doh_recv_send_GET_TLS_quota) { 2006 1.3 christos atomic_store(&use_TLS, true); 2007 1.3 christos atomic_store(&use_PROXY, true); 2008 1.3 christos atomic_store(&check_listener_quota, true); 2009 1.3 christos doh_recv_send(arg); 2010 1.3 christos } 2011 1.3 christos 2012 1.3 christos /* PROXY over TLS */ 2013 1.3 christos 2014 1.3 christos ISC_LOOP_TEST_IMPL(proxytls_doh_recv_one_POST_TLS) { 2015 1.3 christos atomic_store(&POST, true); 2016 1.3 christos atomic_store(&use_TLS, true); 2017 1.3 christos atomic_store(&use_PROXY, true); 2018 1.3 christos atomic_store(&use_PROXY_over_TLS, true); 2019 1.3 christos doh_recv_one(arg); 2020 1.3 christos } 2021 1.3 christos 2022 1.3 christos ISC_LOOP_TEST_IMPL(proxytls_doh_recv_one_GET_TLS) { 2023 1.3 christos atomic_store(&use_TLS, true); 2024 1.3 christos atomic_store(&use_PROXY, true); 2025 1.3 christos atomic_store(&use_PROXY_over_TLS, true); 2026 1.3 christos doh_recv_one(arg); 2027 1.3 christos } 2028 1.3 christos 2029 1.3 christos ISC_LOOP_TEST_IMPL(proxytls_doh_recv_one_GET_TLS_quota) { 2030 1.3 christos atomic_store(&use_TLS, true); 2031 1.3 christos atomic_store(&use_PROXY, true); 2032 1.3 christos atomic_store(&use_PROXY_over_TLS, true); 2033 1.3 christos atomic_store(&check_listener_quota, true); 2034 1.3 christos doh_recv_one(arg); 2035 1.3 christos } 2036 1.3 christos 2037 1.3 christos ISC_LOOP_TEST_IMPL(proxytls_doh_recv_one_POST_TLS_quota) { 2038 1.3 christos atomic_store(&POST, true); 2039 1.3 christos atomic_store(&use_TLS, true); 2040 1.3 christos atomic_store(&use_PROXY, true); 2041 1.3 christos atomic_store(&use_PROXY_over_TLS, true); 2042 1.3 christos atomic_store(&check_listener_quota, true); 2043 1.3 christos doh_recv_one(arg); 2044 1.3 christos } 2045 1.3 christos 2046 1.3 christos ISC_LOOP_TEST_IMPL(proxytls_doh_recv_two_POST_TLS) { 2047 1.3 christos atomic_store(&POST, true); 2048 1.3 christos atomic_store(&use_TLS, true); 2049 1.3 christos atomic_store(&use_PROXY, true); 2050 1.3 christos atomic_store(&use_PROXY_over_TLS, true); 2051 1.3 christos doh_recv_two(arg); 2052 1.3 christos } 2053 1.3 christos 2054 1.3 christos ISC_LOOP_TEST_IMPL(proxytls_doh_recv_two_GET_TLS) { 2055 1.3 christos atomic_store(&use_TLS, true); 2056 1.3 christos atomic_store(&use_PROXY, true); 2057 1.3 christos atomic_store(&use_PROXY_over_TLS, true); 2058 1.3 christos doh_recv_two(arg); 2059 1.3 christos } 2060 1.3 christos 2061 1.3 christos ISC_LOOP_TEST_IMPL(proxytls_doh_recv_two_POST_TLS_quota) { 2062 1.3 christos atomic_store(&POST, true); 2063 1.3 christos atomic_store(&use_TLS, true); 2064 1.3 christos atomic_store(&use_PROXY, true); 2065 1.3 christos atomic_store(&use_PROXY_over_TLS, true); 2066 1.3 christos atomic_store(&check_listener_quota, true); 2067 1.3 christos doh_recv_two(arg); 2068 1.3 christos } 2069 1.3 christos 2070 1.3 christos ISC_LOOP_TEST_IMPL(proxytls_doh_recv_two_GET_TLS_quota) { 2071 1.3 christos atomic_store(&use_TLS, true); 2072 1.3 christos atomic_store(&use_PROXY, true); 2073 1.3 christos atomic_store(&use_PROXY_over_TLS, true); 2074 1.3 christos atomic_store(&check_listener_quota, true); 2075 1.3 christos doh_recv_two(arg); 2076 1.3 christos } 2077 1.3 christos 2078 1.3 christos ISC_LOOP_TEST_IMPL(proxytls_doh_recv_send_POST_TLS) { 2079 1.3 christos atomic_store(&POST, true); 2080 1.3 christos atomic_store(&use_TLS, true); 2081 1.3 christos atomic_store(&use_PROXY, true); 2082 1.3 christos atomic_store(&use_PROXY_over_TLS, true); 2083 1.3 christos doh_recv_send(arg); 2084 1.3 christos } 2085 1.3 christos 2086 1.3 christos ISC_LOOP_TEST_IMPL(proxytls_doh_recv_send_GET_TLS) { 2087 1.3 christos atomic_store(&use_TLS, true); 2088 1.3 christos atomic_store(&use_PROXY, true); 2089 1.3 christos atomic_store(&use_PROXY_over_TLS, true); 2090 1.3 christos doh_recv_send(arg); 2091 1.3 christos } 2092 1.3 christos 2093 1.3 christos ISC_LOOP_TEST_IMPL(proxytls_doh_recv_send_POST_TLS_quota) { 2094 1.3 christos atomic_store(&POST, true); 2095 1.3 christos atomic_store(&use_TLS, true); 2096 1.3 christos atomic_store(&use_PROXY, true); 2097 1.3 christos atomic_store(&use_PROXY_over_TLS, true); 2098 1.3 christos atomic_store(&check_listener_quota, true); 2099 1.3 christos doh_recv_send(arg); 2100 1.3 christos } 2101 1.3 christos 2102 1.3 christos ISC_LOOP_TEST_IMPL(proxytls_doh_recv_send_GET_TLS_quota) { 2103 1.3 christos atomic_store(&use_TLS, true); 2104 1.3 christos atomic_store(&use_PROXY, true); 2105 1.3 christos atomic_store(&use_PROXY_over_TLS, true); 2106 1.3 christos atomic_store(&check_listener_quota, true); 2107 1.3 christos doh_recv_send(arg); 2108 1.3 christos } 2109 1.3 christos 2110 1.1 christos ISC_TEST_LIST_START 2111 1.3 christos 2112 1.1 christos ISC_TEST_ENTRY_CUSTOM(mock_doh_uv_tcp_bind, setup_test, teardown_test) 2113 1.1 christos ISC_TEST_ENTRY(doh_parse_GET_query_string) 2114 1.1 christos ISC_TEST_ENTRY(doh_base64url_to_base64) 2115 1.1 christos ISC_TEST_ENTRY(doh_base64_to_base64url) 2116 1.1 christos ISC_TEST_ENTRY(doh_path_validation) 2117 1.1 christos ISC_TEST_ENTRY(doh_connect_makeuri) 2118 1.1 christos ISC_TEST_ENTRY_CUSTOM(doh_noop_POST, setup_test, teardown_test) 2119 1.1 christos ISC_TEST_ENTRY_CUSTOM(doh_noop_GET, setup_test, teardown_test) 2120 1.1 christos ISC_TEST_ENTRY_CUSTOM(doh_noresponse_POST, setup_test, teardown_test) 2121 1.1 christos ISC_TEST_ENTRY_CUSTOM(doh_noresponse_GET, setup_test, teardown_test) 2122 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_timeout_recovery_POST, setup_test, 2123 1.3 christos doh_timeout_recovery_teardown) 2124 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_timeout_recovery_GET, setup_test, 2125 1.3 christos doh_timeout_recovery_teardown) 2126 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_one_POST, setup_test, doh_recv_one_teardown) 2127 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_one_GET, setup_test, doh_recv_one_teardown) 2128 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_one_POST_TLS, setup_test, doh_recv_one_teardown) 2129 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_one_GET_TLS, setup_test, doh_recv_one_teardown) 2130 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_one_POST_quota, setup_test, 2131 1.3 christos doh_recv_one_teardown) 2132 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_one_GET_quota, setup_test, doh_recv_one_teardown) 2133 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_one_POST_TLS_quota, setup_test, 2134 1.3 christos doh_recv_one_teardown) 2135 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_one_GET_TLS_quota, setup_test, 2136 1.3 christos doh_recv_one_teardown) 2137 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_two_POST, setup_test, doh_recv_two_teardown) 2138 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_two_GET, setup_test, doh_recv_two_teardown) 2139 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_two_POST_TLS, setup_test, doh_recv_two_teardown) 2140 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_two_GET_TLS, setup_test, doh_recv_two_teardown) 2141 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_two_POST_quota, setup_test, 2142 1.3 christos doh_recv_two_teardown) 2143 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_two_GET_quota, setup_test, doh_recv_two_teardown) 2144 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_two_POST_TLS_quota, setup_test, 2145 1.3 christos doh_recv_two_teardown) 2146 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_two_GET_TLS_quota, setup_test, 2147 1.3 christos doh_recv_two_teardown) 2148 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_send_GET, setup_test, doh_recv_send_teardown) 2149 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_send_POST, setup_test, doh_recv_send_teardown) 2150 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_send_GET_TLS, setup_test, doh_recv_send_teardown) 2151 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_send_POST_TLS, setup_test, 2152 1.3 christos doh_recv_send_teardown) 2153 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_send_GET_quota, setup_test, 2154 1.3 christos doh_recv_send_teardown) 2155 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_send_POST_quota, setup_test, 2156 1.3 christos doh_recv_send_teardown) 2157 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_send_GET_TLS_quota, setup_test, 2158 1.3 christos doh_recv_send_teardown) 2159 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_recv_send_POST_TLS_quota, setup_test, 2160 1.3 christos doh_recv_send_teardown) 2161 1.3 christos ISC_TEST_ENTRY_CUSTOM(doh_bad_connect_uri, setup_test, 2162 1.3 christos doh_bad_connect_uri_teardown) 2163 1.3 christos /* PROXY */ 2164 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_noop_POST, setup_test, teardown_test) 2165 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_noop_GET, setup_test, teardown_test) 2166 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_noresponse_POST, setup_test, teardown_test) 2167 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_noresponse_GET, setup_test, teardown_test) 2168 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_timeout_recovery_POST, setup_test, 2169 1.3 christos doh_timeout_recovery_teardown) 2170 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_timeout_recovery_GET, setup_test, 2171 1.3 christos doh_timeout_recovery_teardown) 2172 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_one_POST, setup_test, 2173 1.3 christos doh_recv_one_teardown) 2174 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_one_GET, setup_test, doh_recv_one_teardown) 2175 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_one_POST_TLS, setup_test, 2176 1.3 christos doh_recv_one_teardown) 2177 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_one_GET_TLS, setup_test, 2178 1.3 christos doh_recv_one_teardown) 2179 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_one_POST_quota, setup_test, 2180 1.3 christos doh_recv_one_teardown) 2181 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_one_GET_quota, setup_test, 2182 1.3 christos doh_recv_one_teardown) 2183 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_one_POST_TLS_quota, setup_test, 2184 1.3 christos doh_recv_one_teardown) 2185 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_one_GET_TLS_quota, setup_test, 2186 1.3 christos doh_recv_one_teardown) 2187 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_two_POST, setup_test, 2188 1.3 christos doh_recv_two_teardown) 2189 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_two_GET, setup_test, doh_recv_two_teardown) 2190 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_two_POST_TLS, setup_test, 2191 1.3 christos doh_recv_two_teardown) 2192 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_two_GET_TLS, setup_test, 2193 1.3 christos doh_recv_two_teardown) 2194 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_two_POST_quota, setup_test, 2195 1.3 christos doh_recv_two_teardown) 2196 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_two_GET_quota, setup_test, 2197 1.3 christos doh_recv_two_teardown) 2198 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_two_POST_TLS_quota, setup_test, 2199 1.3 christos doh_recv_two_teardown) 2200 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_two_GET_TLS_quota, setup_test, 2201 1.3 christos doh_recv_two_teardown) 2202 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_send_GET, setup_test, 2203 1.3 christos doh_recv_send_teardown) 2204 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_send_POST, setup_test, 2205 1.3 christos doh_recv_send_teardown) 2206 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_send_GET_TLS, setup_test, 2207 1.3 christos doh_recv_send_teardown) 2208 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_send_POST_TLS, setup_test, 2209 1.3 christos doh_recv_send_teardown) 2210 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_send_GET_quota, setup_test, 2211 1.3 christos doh_recv_send_teardown) 2212 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_send_POST_quota, setup_test, 2213 1.3 christos doh_recv_send_teardown) 2214 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_send_GET_TLS_quota, setup_test, 2215 1.3 christos doh_recv_send_teardown) 2216 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxy_doh_recv_send_POST_TLS_quota, setup_test, 2217 1.3 christos doh_recv_send_teardown) 2218 1.3 christos /* PROXY over TLS */ 2219 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxytls_doh_recv_one_POST_TLS, setup_test, 2220 1.3 christos doh_recv_one_teardown) 2221 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxytls_doh_recv_one_GET_TLS, setup_test, 2222 1.3 christos doh_recv_one_teardown) 2223 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxytls_doh_recv_one_POST_TLS_quota, setup_test, 2224 1.3 christos doh_recv_one_teardown) 2225 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxytls_doh_recv_one_GET_TLS_quota, setup_test, 2226 1.3 christos doh_recv_one_teardown) 2227 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxytls_doh_recv_two_POST_TLS, setup_test, 2228 1.3 christos doh_recv_two_teardown) 2229 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxytls_doh_recv_two_GET_TLS, setup_test, 2230 1.3 christos doh_recv_two_teardown) 2231 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxytls_doh_recv_two_POST_TLS_quota, setup_test, 2232 1.3 christos doh_recv_two_teardown) 2233 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxytls_doh_recv_two_GET_TLS_quota, setup_test, 2234 1.3 christos doh_recv_two_teardown) 2235 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxytls_doh_recv_send_GET_TLS, setup_test, 2236 1.3 christos doh_recv_send_teardown) 2237 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxytls_doh_recv_send_POST_TLS, setup_test, 2238 1.3 christos doh_recv_send_teardown) 2239 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxytls_doh_recv_send_GET_TLS_quota, setup_test, 2240 1.3 christos doh_recv_send_teardown) 2241 1.3 christos ISC_TEST_ENTRY_CUSTOM(proxytls_doh_recv_send_POST_TLS_quota, setup_test, 2242 1.3 christos doh_recv_send_teardown) 2243 1.1 christos ISC_TEST_LIST_END 2244 1.1 christos 2245 1.1 christos ISC_TEST_MAIN 2246