Home | History | Annotate | Line # | Download | only in dns
      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