1 1.1 christos /* $NetBSD: diff_test.c,v 1.3 2026/01/29 18:37:56 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 /* sched.h must be imported before cmocka to avoid redefinition errors */ 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 <stddef.h> 21 1.1 christos #include <stdlib.h> 22 1.1 christos #include <unistd.h> 23 1.1 christos 24 1.1 christos #define UNIT_TESTING 25 1.1 christos #include <cmocka.h> 26 1.1 christos 27 1.1 christos #include <dns/diff.h> 28 1.1 christos 29 1.3 christos /* isc/list.h must be imported after cmocka to avoid redefinition errors */ 30 1.3 christos #include <isc/list.h> 31 1.3 christos 32 1.1 christos #include <tests/dns.h> 33 1.1 christos 34 1.1 christos unsigned char data_1[] = "\006name_1"; 35 1.1 christos unsigned char offsets_1[] = { 0, 7 }; 36 1.1 christos dns_name_t name_1 = DNS_NAME_INITABSOLUTE(data_1, offsets_1); 37 1.1 christos 38 1.1 christos unsigned char data_2[] = "\006name_2"; 39 1.1 christos unsigned char offsets_2[] = { 0, 7 }; 40 1.1 christos dns_name_t name_2 = DNS_NAME_INITABSOLUTE(data_2, offsets_2); 41 1.1 christos 42 1.1 christos unsigned char data_3[] = "\006name_3"; 43 1.1 christos unsigned char offsets_3[] = { 0, 7 }; 44 1.1 christos dns_name_t name_3 = DNS_NAME_INITABSOLUTE(data_3, offsets_3); 45 1.1 christos 46 1.1 christos unsigned char data_dup[] = "\006name_1"; 47 1.1 christos unsigned char offsets_dup[] = { 0, 7 }; 48 1.1 christos dns_name_t name_dup = DNS_NAME_INITABSOLUTE(data_dup, offsets_dup); 49 1.1 christos 50 1.1 christos unsigned char data_nodup[] = "\006name_1"; 51 1.1 christos unsigned char offsets_nodup[] = { 0, 7 }; 52 1.1 christos dns_name_t name_nodup = DNS_NAME_INITABSOLUTE(data_nodup, offsets_nodup); 53 1.1 christos 54 1.1 christos static size_t 55 1.1 christos count_elements(const dns_diff_t *diff) { 56 1.1 christos dns_difftuple_t *ot = NULL; 57 1.1 christos size_t count = 0; 58 1.1 christos 59 1.1 christos for (ot = ISC_LIST_HEAD(diff->tuples); ot != NULL; 60 1.1 christos ot = ISC_LIST_NEXT(ot, link)) 61 1.1 christos { 62 1.1 christos ++count; 63 1.1 christos } 64 1.1 christos 65 1.1 christos return count; 66 1.1 christos } 67 1.1 christos 68 1.1 christos static void 69 1.1 christos prepare_rdata(dns_rdata_t *rdata, unsigned char *dest, size_t dest_size) { 70 1.1 christos dns_rdataclass_t rdclass = dns_rdataclass_in; 71 1.1 christos dns_rdatatype_t type = dns_rdatatype_wallet; 72 1.1 christos const char text[] = "cid-example wid-example"; 73 1.1 christos 74 1.1 christos *rdata = (dns_rdata_t)DNS_RDATA_INIT; 75 1.1 christos isc_result_t result = dns_test_rdatafromstring( 76 1.1 christos rdata, rdclass, type, dest, dest_size, text, false); 77 1.1 christos INSIST(result == ISC_R_SUCCESS); 78 1.1 christos } 79 1.1 christos 80 1.1 christos ISC_RUN_TEST_IMPL(dns_diff_size) { 81 1.1 christos dns_diff_t diff; 82 1.1 christos dns_diff_init(mctx, &diff); 83 1.1 christos 84 1.1 christos assert_true(dns_diff_size(&diff) == 0); 85 1.1 christos 86 1.1 christos dns_rdata_t rdatas[5] = { 0 }; 87 1.1 christos unsigned char bufs[sizeof(rdatas) / sizeof(*rdatas)][128] = { 0 }; 88 1.1 christos size_t buf_len = sizeof(bufs[0]); 89 1.1 christos 90 1.1 christos for (size_t idx = 0; idx < sizeof(rdatas) / sizeof(*rdatas); ++idx) { 91 1.1 christos prepare_rdata(&rdatas[idx], bufs[idx], buf_len); 92 1.1 christos } 93 1.1 christos 94 1.1 christos dns_difftuple_t *tup_1 = NULL, *tup_2 = NULL, *tup_3 = NULL; 95 1.1 christos dns_difftuple_create(mctx, DNS_DIFFOP_ADD, &name_1, 1, &rdatas[0], 96 1.1 christos &tup_1); 97 1.1 christos dns_difftuple_create(mctx, DNS_DIFFOP_DEL, &name_2, 1, &rdatas[1], 98 1.1 christos &tup_2); 99 1.1 christos dns_difftuple_create(mctx, DNS_DIFFOP_DEL, &name_3, 1, &rdatas[2], 100 1.1 christos &tup_3); 101 1.1 christos 102 1.1 christos dns_difftuple_t *tup_dup = NULL, *tup_nodup = NULL; 103 1.1 christos dns_difftuple_create(mctx, DNS_DIFFOP_DEL, &name_dup, 1, &rdatas[3], 104 1.1 christos &tup_dup); 105 1.1 christos dns_difftuple_create(mctx, DNS_DIFFOP_ADD, &name_nodup, 1, &rdatas[4], 106 1.1 christos &tup_nodup); 107 1.1 christos 108 1.1 christos dns_diff_append(&diff, &tup_1); 109 1.1 christos assert_true(dns_diff_size(&diff) == 1); 110 1.1 christos assert_true(dns_diff_size(&diff) == count_elements(&diff)); 111 1.1 christos 112 1.1 christos dns_diff_append(&diff, &tup_2); 113 1.1 christos assert_true(dns_diff_size(&diff) == 2); 114 1.1 christos assert_true(dns_diff_size(&diff) == count_elements(&diff)); 115 1.1 christos 116 1.1 christos dns_diff_appendminimal(&diff, &tup_dup); 117 1.1 christos assert_true(dns_diff_size(&diff) == 1); 118 1.1 christos assert_true(dns_diff_size(&diff) == count_elements(&diff)); 119 1.1 christos 120 1.1 christos dns_diff_append(&diff, &tup_3); 121 1.1 christos assert_true(dns_diff_size(&diff) == 2); 122 1.1 christos assert_true(dns_diff_size(&diff) == count_elements(&diff)); 123 1.1 christos 124 1.1 christos dns_diff_appendminimal(&diff, &tup_nodup); 125 1.1 christos assert_true(dns_diff_size(&diff) == 3); 126 1.1 christos assert_true(dns_diff_size(&diff) == count_elements(&diff)); 127 1.1 christos 128 1.1 christos dns_diff_clear(&diff); 129 1.1 christos assert_true(dns_diff_size(&diff) == 0); 130 1.1 christos assert_true(dns_diff_size(&diff) == count_elements(&diff)); 131 1.1 christos 132 1.1 christos dns_difftuple_t *to_clear[] = { tup_1, tup_2, tup_3, tup_dup, 133 1.1 christos tup_nodup }; 134 1.1 christos size_t to_clear_size = sizeof(to_clear) / sizeof(*to_clear); 135 1.1 christos 136 1.1 christos for (size_t idx = 0; idx < to_clear_size; ++idx) { 137 1.1 christos if (to_clear[idx] != NULL) { 138 1.1 christos dns_difftuple_free(&to_clear[idx]); 139 1.1 christos } 140 1.1 christos } 141 1.1 christos } 142 1.1 christos 143 1.1 christos ISC_TEST_LIST_START 144 1.1 christos ISC_TEST_ENTRY(dns_diff_size) 145 1.1 christos ISC_TEST_LIST_END 146 1.1 christos 147 1.1 christos ISC_TEST_MAIN 148