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