ede_test.c revision 1.2.4.2 1 1.2.4.2 perseant /* $NetBSD: ede_test.c,v 1.2.4.2 2025/08/02 05:54:11 perseant Exp $ */
2 1.2.4.2 perseant
3 1.2.4.2 perseant /*
4 1.2.4.2 perseant * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5 1.2.4.2 perseant *
6 1.2.4.2 perseant * SPDX-License-Identifier: MPL-2.0
7 1.2.4.2 perseant *
8 1.2.4.2 perseant * This Source Code Form is subject to the terms of the Mozilla Public
9 1.2.4.2 perseant * License, v. 2.0. If a copy of the MPL was not distributed with this
10 1.2.4.2 perseant * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11 1.2.4.2 perseant *
12 1.2.4.2 perseant * See the COPYRIGHT file distributed with this work for additional
13 1.2.4.2 perseant * information regarding copyright ownership.
14 1.2.4.2 perseant */
15 1.2.4.2 perseant
16 1.2.4.2 perseant #include <inttypes.h>
17 1.2.4.2 perseant #include <sched.h> /* IWYU pragma: keep */
18 1.2.4.2 perseant #include <setjmp.h>
19 1.2.4.2 perseant #include <stdarg.h>
20 1.2.4.2 perseant #include <stdbool.h>
21 1.2.4.2 perseant #include <stddef.h>
22 1.2.4.2 perseant #include <stdio.h>
23 1.2.4.2 perseant #include <stdlib.h>
24 1.2.4.2 perseant #include <unistd.h>
25 1.2.4.2 perseant
26 1.2.4.2 perseant #define UNIT_TESTING
27 1.2.4.2 perseant #include <cmocka.h>
28 1.2.4.2 perseant
29 1.2.4.2 perseant #include <isc/list.h>
30 1.2.4.2 perseant
31 1.2.4.2 perseant #include <dns/ede.h>
32 1.2.4.2 perseant
33 1.2.4.2 perseant #include "../../lib/dns/ede.c"
34 1.2.4.2 perseant
35 1.2.4.2 perseant #include <tests/isc.h>
36 1.2.4.2 perseant
37 1.2.4.2 perseant typedef struct {
38 1.2.4.2 perseant uint16_t code;
39 1.2.4.2 perseant const char *txt;
40 1.2.4.2 perseant } ede_test_expected_t;
41 1.2.4.2 perseant
42 1.2.4.2 perseant static void
43 1.2.4.2 perseant dns_ede_test_equals(const ede_test_expected_t *expected, size_t expected_count,
44 1.2.4.2 perseant dns_edectx_t *edectx) {
45 1.2.4.2 perseant size_t count = 0;
46 1.2.4.2 perseant
47 1.2.4.2 perseant for (size_t i = 0; i < DNS_EDE_MAX_ERRORS; i++) {
48 1.2.4.2 perseant dns_ednsopt_t *edns = edectx->ede[i];
49 1.2.4.2 perseant
50 1.2.4.2 perseant if (edns == NULL) {
51 1.2.4.2 perseant break;
52 1.2.4.2 perseant }
53 1.2.4.2 perseant
54 1.2.4.2 perseant uint16_t code;
55 1.2.4.2 perseant const unsigned char *txt;
56 1.2.4.2 perseant
57 1.2.4.2 perseant assert_in_range(count, 0, expected_count);
58 1.2.4.2 perseant assert_int_equal(edns->code, DNS_OPT_EDE);
59 1.2.4.2 perseant
60 1.2.4.2 perseant code = ISC_U8TO16_BE(edns->value);
61 1.2.4.2 perseant assert_int_equal(code, expected[count].code);
62 1.2.4.2 perseant
63 1.2.4.2 perseant if (edns->length > sizeof(code)) {
64 1.2.4.2 perseant assert_non_null(expected[count].txt);
65 1.2.4.2 perseant txt = edns->value + sizeof(code);
66 1.2.4.2 perseant assert_memory_equal(expected[count].txt, txt,
67 1.2.4.2 perseant edns->length - sizeof(code));
68 1.2.4.2 perseant } else {
69 1.2.4.2 perseant assert_null(expected[count].txt);
70 1.2.4.2 perseant }
71 1.2.4.2 perseant
72 1.2.4.2 perseant count++;
73 1.2.4.2 perseant }
74 1.2.4.2 perseant assert_int_equal(count, expected_count);
75 1.2.4.2 perseant }
76 1.2.4.2 perseant
77 1.2.4.2 perseant ISC_RUN_TEST_IMPL(dns_ede_test_text_max_count) {
78 1.2.4.2 perseant dns_edectx_t edectx;
79 1.2.4.2 perseant
80 1.2.4.2 perseant dns_ede_init(mctx, &edectx);
81 1.2.4.2 perseant
82 1.2.4.2 perseant const char *txt1 = "foobar";
83 1.2.4.2 perseant const char *txt2 = "It's been a long time since I rock-and-rolled"
84 1.2.4.2 perseant "Ooh, let me get it back, let me get it back";
85 1.2.4.2 perseant
86 1.2.4.2 perseant dns_ede_add(&edectx, 2, txt1);
87 1.2.4.2 perseant dns_ede_add(&edectx, 22, NULL);
88 1.2.4.2 perseant dns_ede_add(&edectx, 3, txt2);
89 1.2.4.2 perseant
90 1.2.4.2 perseant const ede_test_expected_t expected[3] = {
91 1.2.4.2 perseant { .code = 2, .txt = "foobar" },
92 1.2.4.2 perseant { .code = 22, .txt = NULL },
93 1.2.4.2 perseant { .code = 3,
94 1.2.4.2 perseant .txt = "It's been a long time since I rock-and-rolledOoh, "
95 1.2.4.2 perseant "let me get it " }
96 1.2.4.2 perseant };
97 1.2.4.2 perseant
98 1.2.4.2 perseant dns_ede_test_equals(expected, 3, &edectx);
99 1.2.4.2 perseant
100 1.2.4.2 perseant dns_ede_reset(&edectx);
101 1.2.4.2 perseant }
102 1.2.4.2 perseant
103 1.2.4.2 perseant ISC_RUN_TEST_IMPL(dns_ede_test_max_count) {
104 1.2.4.2 perseant dns_edectx_t edectx;
105 1.2.4.2 perseant
106 1.2.4.2 perseant dns_ede_init(mctx, &edectx);
107 1.2.4.2 perseant
108 1.2.4.2 perseant dns_ede_add(&edectx, 1, NULL);
109 1.2.4.2 perseant dns_ede_add(&edectx, 22, "two");
110 1.2.4.2 perseant dns_ede_add(&edectx, 3, "three");
111 1.2.4.2 perseant dns_ede_add(&edectx, 4, "four");
112 1.2.4.2 perseant dns_ede_add(&edectx, 5, "five");
113 1.2.4.2 perseant
114 1.2.4.2 perseant const ede_test_expected_t expected[3] = {
115 1.2.4.2 perseant { .code = 1, .txt = NULL },
116 1.2.4.2 perseant { .code = 22, .txt = "two" },
117 1.2.4.2 perseant { .code = 3, .txt = "three" },
118 1.2.4.2 perseant };
119 1.2.4.2 perseant
120 1.2.4.2 perseant dns_ede_test_equals(expected, 3, &edectx);
121 1.2.4.2 perseant
122 1.2.4.2 perseant dns_ede_reset(&edectx);
123 1.2.4.2 perseant }
124 1.2.4.2 perseant
125 1.2.4.2 perseant ISC_RUN_TEST_IMPL(dns_ede_test_duplicates) {
126 1.2.4.2 perseant dns_edectx_t edectx;
127 1.2.4.2 perseant
128 1.2.4.2 perseant dns_ede_init(mctx, &edectx);
129 1.2.4.2 perseant
130 1.2.4.2 perseant dns_ede_add(&edectx, 1, NULL);
131 1.2.4.2 perseant dns_ede_add(&edectx, 1, "two");
132 1.2.4.2 perseant dns_ede_add(&edectx, 1, "three");
133 1.2.4.2 perseant
134 1.2.4.2 perseant const ede_test_expected_t expected[] = {
135 1.2.4.2 perseant { .code = 1, .txt = NULL },
136 1.2.4.2 perseant };
137 1.2.4.2 perseant dns_ede_test_equals(expected, 1, &edectx);
138 1.2.4.2 perseant
139 1.2.4.2 perseant dns_ede_reset(&edectx);
140 1.2.4.2 perseant
141 1.2.4.2 perseant const ede_test_expected_t expectedempty[] = {};
142 1.2.4.2 perseant dns_ede_test_equals(expectedempty, 0, &edectx);
143 1.2.4.2 perseant }
144 1.2.4.2 perseant
145 1.2.4.2 perseant ISC_RUN_TEST_IMPL(dns_ede_test_infocode_range) {
146 1.2.4.2 perseant dns_edectx_t edectx;
147 1.2.4.2 perseant
148 1.2.4.2 perseant dns_ede_init(mctx, &edectx);
149 1.2.4.2 perseant
150 1.2.4.2 perseant dns_ede_add(&edectx, 1, NULL);
151 1.2.4.2 perseant expect_assert_failure(dns_ede_add(&edectx, 32, NULL));
152 1.2.4.2 perseant
153 1.2.4.2 perseant const ede_test_expected_t expected[] = {
154 1.2.4.2 perseant { .code = 1, .txt = NULL },
155 1.2.4.2 perseant };
156 1.2.4.2 perseant dns_ede_test_equals(expected, 1, &edectx);
157 1.2.4.2 perseant
158 1.2.4.2 perseant dns_ede_reset(&edectx);
159 1.2.4.2 perseant }
160 1.2.4.2 perseant
161 1.2.4.2 perseant ISC_RUN_TEST_IMPL(dns_ede_test_copy) {
162 1.2.4.2 perseant dns_edectx_t edectx1;
163 1.2.4.2 perseant dns_edectx_t edectx2;
164 1.2.4.2 perseant dns_edectx_t edectx3;
165 1.2.4.2 perseant
166 1.2.4.2 perseant dns_ede_init(mctx, &edectx1);
167 1.2.4.2 perseant dns_ede_init(mctx, &edectx2);
168 1.2.4.2 perseant
169 1.2.4.2 perseant dns_ede_add(&edectx1, 1, NULL);
170 1.2.4.2 perseant dns_ede_add(&edectx1, 2, "two-the-first");
171 1.2.4.2 perseant dns_ede_add(&edectx1, 3, "three");
172 1.2.4.2 perseant
173 1.2.4.2 perseant const ede_test_expected_t expected[] = {
174 1.2.4.2 perseant { .code = 1, .txt = NULL },
175 1.2.4.2 perseant { .code = 2, .txt = "two-the-first" },
176 1.2.4.2 perseant { .code = 3, .txt = "three" },
177 1.2.4.2 perseant };
178 1.2.4.2 perseant
179 1.2.4.2 perseant dns_ede_test_equals(expected, 3, &edectx1);
180 1.2.4.2 perseant dns_ede_copy(&edectx2, &edectx1);
181 1.2.4.2 perseant dns_ede_test_equals(expected, 3, &edectx2);
182 1.2.4.2 perseant dns_ede_test_equals(expected, 3, &edectx1);
183 1.2.4.2 perseant
184 1.2.4.2 perseant dns_ede_reset(&edectx2);
185 1.2.4.2 perseant dns_ede_add(&edectx2, 1, "one-the-first-with-txt");
186 1.2.4.2 perseant dns_ede_add(&edectx2, 2, "two-the-second");
187 1.2.4.2 perseant
188 1.2.4.2 perseant const ede_test_expected_t expected2[] = {
189 1.2.4.2 perseant { .code = 1, .txt = "one-the-first-with-txt" },
190 1.2.4.2 perseant { .code = 2, .txt = "two-the-second" },
191 1.2.4.2 perseant { .code = 3, .txt = "three" }
192 1.2.4.2 perseant };
193 1.2.4.2 perseant
194 1.2.4.2 perseant dns_ede_copy(&edectx2, &edectx1);
195 1.2.4.2 perseant dns_ede_test_equals(expected2, 3, &edectx2);
196 1.2.4.2 perseant dns_ede_test_equals(expected, 3, &edectx1);
197 1.2.4.2 perseant
198 1.2.4.2 perseant dns_ede_init(mctx, &edectx3);
199 1.2.4.2 perseant dns_ede_add(&edectx3, 2, "two-the-third");
200 1.2.4.2 perseant dns_ede_copy(&edectx3, &edectx2);
201 1.2.4.2 perseant
202 1.2.4.2 perseant const ede_test_expected_t expected3[] = {
203 1.2.4.2 perseant { .code = 2, .txt = "two-the-third" },
204 1.2.4.2 perseant { .code = 1, .txt = "one-the-first-with-txt" },
205 1.2.4.2 perseant { .code = 3, .txt = "three" }
206 1.2.4.2 perseant };
207 1.2.4.2 perseant dns_ede_test_equals(expected3, 3, &edectx3);
208 1.2.4.2 perseant
209 1.2.4.2 perseant dns_ede_reset(&edectx1);
210 1.2.4.2 perseant dns_ede_reset(&edectx2);
211 1.2.4.2 perseant dns_ede_reset(&edectx3);
212 1.2.4.2 perseant }
213 1.2.4.2 perseant
214 1.2.4.2 perseant ISC_TEST_LIST_START
215 1.2.4.2 perseant
216 1.2.4.2 perseant ISC_TEST_ENTRY(dns_ede_test_text_max_count)
217 1.2.4.2 perseant ISC_TEST_ENTRY(dns_ede_test_max_count)
218 1.2.4.2 perseant ISC_TEST_ENTRY(dns_ede_test_duplicates)
219 1.2.4.2 perseant ISC_TEST_ENTRY(dns_ede_test_infocode_range)
220 1.2.4.2 perseant ISC_TEST_ENTRY(dns_ede_test_copy)
221 1.2.4.2 perseant
222 1.2.4.2 perseant ISC_TEST_LIST_END
223 1.2.4.2 perseant
224 1.2.4.2 perseant ISC_TEST_MAIN
225