Home | History | Annotate | Line # | Download | only in dns
dbdiff_test.c revision 1.2.6.1
      1 /*	$NetBSD: dbdiff_test.c,v 1.2.6.1 2025/08/02 05:54:11 perseant 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 #include <inttypes.h>
     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 <string.h>
     23 #include <unistd.h>
     24 
     25 #define UNIT_TESTING
     26 #include <cmocka.h>
     27 
     28 #include <isc/util.h>
     29 
     30 #include <dns/db.h>
     31 #include <dns/dbiterator.h>
     32 #include <dns/journal.h>
     33 #include <dns/name.h>
     34 
     35 #include <tests/dns.h>
     36 
     37 #define BUFLEN	    255
     38 #define BIGBUFLEN   (64 * 1024)
     39 #define TEST_ORIGIN "test"
     40 
     41 static void
     42 test_create(const char *oldfile, dns_db_t **old, const char *newfile,
     43 	    dns_db_t **newdb) {
     44 	isc_result_t result;
     45 
     46 	result = dns_test_loaddb(old, dns_dbtype_zone, TEST_ORIGIN, oldfile);
     47 	assert_int_equal(result, ISC_R_SUCCESS);
     48 
     49 	result = dns_test_loaddb(newdb, dns_dbtype_zone, TEST_ORIGIN, newfile);
     50 	assert_int_equal(result, ISC_R_SUCCESS);
     51 }
     52 
     53 /* dns_db_diffx of identical content */
     54 ISC_RUN_TEST_IMPL(diffx_same) {
     55 	dns_db_t *newdb = NULL, *olddb = NULL;
     56 	isc_result_t result;
     57 	dns_diff_t diff;
     58 
     59 	UNUSED(state);
     60 
     61 	test_create(TESTS_DIR "/testdata/diff/zone1.data", &olddb,
     62 		    TESTS_DIR "/testdata/diff/zone1.data", &newdb);
     63 
     64 	dns_diff_init(mctx, &diff);
     65 
     66 	result = dns_db_diffx(&diff, newdb, NULL, olddb, NULL, NULL);
     67 	assert_int_equal(result, ISC_R_SUCCESS);
     68 
     69 	assert_true(ISC_LIST_EMPTY(diff.tuples));
     70 
     71 	dns_diff_clear(&diff);
     72 	dns_db_detach(&newdb);
     73 	dns_db_detach(&olddb);
     74 }
     75 
     76 /* dns_db_diffx of zone with record added */
     77 ISC_RUN_TEST_IMPL(diffx_add) {
     78 	dns_db_t *newdb = NULL, *olddb = NULL;
     79 	dns_difftuple_t *tuple;
     80 	isc_result_t result;
     81 	dns_diff_t diff;
     82 	int count = 0;
     83 
     84 	UNUSED(state);
     85 
     86 	test_create(TESTS_DIR "/testdata/diff/zone1.data", &olddb,
     87 		    TESTS_DIR "/testdata/diff/zone2.data", &newdb);
     88 
     89 	dns_diff_init(mctx, &diff);
     90 
     91 	result = dns_db_diffx(&diff, newdb, NULL, olddb, NULL, NULL);
     92 	assert_int_equal(result, ISC_R_SUCCESS);
     93 
     94 	assert_false(ISC_LIST_EMPTY(diff.tuples));
     95 	for (tuple = ISC_LIST_HEAD(diff.tuples); tuple != NULL;
     96 	     tuple = ISC_LIST_NEXT(tuple, link))
     97 	{
     98 		assert_int_equal(tuple->op, DNS_DIFFOP_ADD);
     99 		count++;
    100 	}
    101 	assert_int_equal(count, 1);
    102 
    103 	dns_diff_clear(&diff);
    104 	dns_db_detach(&newdb);
    105 	dns_db_detach(&olddb);
    106 }
    107 
    108 /* dns_db_diffx of zone with record removed */
    109 ISC_RUN_TEST_IMPL(diffx_remove) {
    110 	dns_db_t *newdb = NULL, *olddb = NULL;
    111 	dns_difftuple_t *tuple;
    112 	isc_result_t result;
    113 	dns_diff_t diff;
    114 	int count = 0;
    115 
    116 	UNUSED(state);
    117 
    118 	test_create(TESTS_DIR "/testdata/diff/zone1.data", &olddb,
    119 		    TESTS_DIR "/testdata/diff/zone3.data", &newdb);
    120 
    121 	dns_diff_init(mctx, &diff);
    122 
    123 	result = dns_db_diffx(&diff, newdb, NULL, olddb, NULL, NULL);
    124 	assert_int_equal(result, ISC_R_SUCCESS);
    125 
    126 	assert_false(ISC_LIST_EMPTY(diff.tuples));
    127 	for (tuple = ISC_LIST_HEAD(diff.tuples); tuple != NULL;
    128 	     tuple = ISC_LIST_NEXT(tuple, link))
    129 	{
    130 		assert_int_equal(tuple->op, DNS_DIFFOP_DEL);
    131 		count++;
    132 	}
    133 	assert_int_equal(count, 1);
    134 
    135 	dns_diff_clear(&diff);
    136 	dns_db_detach(&newdb);
    137 	dns_db_detach(&olddb);
    138 }
    139 
    140 ISC_TEST_LIST_START
    141 ISC_TEST_ENTRY(diffx_same)
    142 ISC_TEST_ENTRY(diffx_add)
    143 ISC_TEST_ENTRY(diffx_remove)
    144 ISC_TEST_LIST_END
    145 
    146 ISC_TEST_MAIN
    147