xref: /netbsd-src/external/mpl/bind/dist/tests/dns/dbdiff_test.c (revision bcda20f65a8566e103791ec395f7f499ef322704)
1 /*	$NetBSD: dbdiff_test.c,v 1.3 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 #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