diff_test.c revision 1.2 1 /* $NetBSD: diff_test.c,v 1.2 2025/01/26 16:25:47 christos Exp $ */
2
3 /*
4 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5 *
6 * SPDX-License-Identifier: MPL-2.0
7 *
8 * This Source Code Form is subject to the terms of the Mozilla Public
9 * License, v. 2.0. If a copy of the MPL was not distributed with this
10 * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11 *
12 * See the COPYRIGHT file distributed with this work for additional
13 * information regarding copyright ownership.
14 */
15
16 /* sched.h must be imported before cmocka to avoid redefinition errors */
17 #include <sched.h> /* IWYU pragma: keep */
18 #include <setjmp.h>
19 #include <stdarg.h>
20 #include <stddef.h>
21 #include <stdlib.h>
22 #include <unistd.h>
23
24 #include "isc/list.h"
25
26 #define UNIT_TESTING
27 #include <cmocka.h>
28
29 #include <dns/diff.h>
30
31 #include <tests/dns.h>
32
33 unsigned char data_1[] = "\006name_1";
34 unsigned char offsets_1[] = { 0, 7 };
35 dns_name_t name_1 = DNS_NAME_INITABSOLUTE(data_1, offsets_1);
36
37 unsigned char data_2[] = "\006name_2";
38 unsigned char offsets_2[] = { 0, 7 };
39 dns_name_t name_2 = DNS_NAME_INITABSOLUTE(data_2, offsets_2);
40
41 unsigned char data_3[] = "\006name_3";
42 unsigned char offsets_3[] = { 0, 7 };
43 dns_name_t name_3 = DNS_NAME_INITABSOLUTE(data_3, offsets_3);
44
45 unsigned char data_dup[] = "\006name_1";
46 unsigned char offsets_dup[] = { 0, 7 };
47 dns_name_t name_dup = DNS_NAME_INITABSOLUTE(data_dup, offsets_dup);
48
49 unsigned char data_nodup[] = "\006name_1";
50 unsigned char offsets_nodup[] = { 0, 7 };
51 dns_name_t name_nodup = DNS_NAME_INITABSOLUTE(data_nodup, offsets_nodup);
52
53 static size_t
54 count_elements(const dns_diff_t *diff) {
55 dns_difftuple_t *ot = NULL;
56 size_t count = 0;
57
58 for (ot = ISC_LIST_HEAD(diff->tuples); ot != NULL;
59 ot = ISC_LIST_NEXT(ot, link))
60 {
61 ++count;
62 }
63
64 return count;
65 }
66
67 static void
68 prepare_rdata(dns_rdata_t *rdata, unsigned char *dest, size_t dest_size) {
69 dns_rdataclass_t rdclass = dns_rdataclass_in;
70 dns_rdatatype_t type = dns_rdatatype_wallet;
71 const char text[] = "cid-example wid-example";
72
73 *rdata = (dns_rdata_t)DNS_RDATA_INIT;
74 isc_result_t result = dns_test_rdatafromstring(
75 rdata, rdclass, type, dest, dest_size, text, false);
76 INSIST(result == ISC_R_SUCCESS);
77 }
78
79 ISC_RUN_TEST_IMPL(dns_diff_size) {
80 dns_diff_t diff;
81 dns_diff_init(mctx, &diff);
82
83 assert_true(dns_diff_size(&diff) == 0);
84
85 dns_rdata_t rdatas[5] = { 0 };
86 unsigned char bufs[sizeof(rdatas) / sizeof(*rdatas)][128] = { 0 };
87 size_t buf_len = sizeof(bufs[0]);
88
89 for (size_t idx = 0; idx < sizeof(rdatas) / sizeof(*rdatas); ++idx) {
90 prepare_rdata(&rdatas[idx], bufs[idx], buf_len);
91 }
92
93 dns_difftuple_t *tup_1 = NULL, *tup_2 = NULL, *tup_3 = NULL;
94 dns_difftuple_create(mctx, DNS_DIFFOP_ADD, &name_1, 1, &rdatas[0],
95 &tup_1);
96 dns_difftuple_create(mctx, DNS_DIFFOP_DEL, &name_2, 1, &rdatas[1],
97 &tup_2);
98 dns_difftuple_create(mctx, DNS_DIFFOP_DEL, &name_3, 1, &rdatas[2],
99 &tup_3);
100
101 dns_difftuple_t *tup_dup = NULL, *tup_nodup = NULL;
102 dns_difftuple_create(mctx, DNS_DIFFOP_DEL, &name_dup, 1, &rdatas[3],
103 &tup_dup);
104 dns_difftuple_create(mctx, DNS_DIFFOP_ADD, &name_nodup, 1, &rdatas[4],
105 &tup_nodup);
106
107 dns_diff_append(&diff, &tup_1);
108 assert_true(dns_diff_size(&diff) == 1);
109 assert_true(dns_diff_size(&diff) == count_elements(&diff));
110
111 dns_diff_append(&diff, &tup_2);
112 assert_true(dns_diff_size(&diff) == 2);
113 assert_true(dns_diff_size(&diff) == count_elements(&diff));
114
115 dns_diff_appendminimal(&diff, &tup_dup);
116 assert_true(dns_diff_size(&diff) == 1);
117 assert_true(dns_diff_size(&diff) == count_elements(&diff));
118
119 dns_diff_append(&diff, &tup_3);
120 assert_true(dns_diff_size(&diff) == 2);
121 assert_true(dns_diff_size(&diff) == count_elements(&diff));
122
123 dns_diff_appendminimal(&diff, &tup_nodup);
124 assert_true(dns_diff_size(&diff) == 3);
125 assert_true(dns_diff_size(&diff) == count_elements(&diff));
126
127 dns_diff_clear(&diff);
128 assert_true(dns_diff_size(&diff) == 0);
129 assert_true(dns_diff_size(&diff) == count_elements(&diff));
130
131 dns_difftuple_t *to_clear[] = { tup_1, tup_2, tup_3, tup_dup,
132 tup_nodup };
133 size_t to_clear_size = sizeof(to_clear) / sizeof(*to_clear);
134
135 for (size_t idx = 0; idx < to_clear_size; ++idx) {
136 if (to_clear[idx] != NULL) {
137 dns_difftuple_free(&to_clear[idx]);
138 }
139 }
140 }
141
142 ISC_TEST_LIST_START
143 ISC_TEST_ENTRY(dns_diff_size)
144 ISC_TEST_LIST_END
145
146 ISC_TEST_MAIN
147