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