xref: /netbsd-src/external/mpl/bind/dist/tests/dns/rdatasetstats_test.c (revision bcda20f65a8566e103791ec395f7f499ef322704)
1*bcda20f6Schristos /*	$NetBSD: rdatasetstats_test.c,v 1.3 2025/01/26 16:25:48 christos Exp $	*/
28aaca124Schristos 
38aaca124Schristos /*
48aaca124Schristos  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
58aaca124Schristos  *
68aaca124Schristos  * SPDX-License-Identifier: MPL-2.0
78aaca124Schristos  *
88aaca124Schristos  * This Source Code Form is subject to the terms of the Mozilla Public
98aaca124Schristos  * License, v. 2.0. If a copy of the MPL was not distributed with this
108aaca124Schristos  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
118aaca124Schristos  *
128aaca124Schristos  * See the COPYRIGHT file distributed with this work for additional
138aaca124Schristos  * information regarding copyright ownership.
148aaca124Schristos  */
158aaca124Schristos 
168aaca124Schristos #include <inttypes.h>
178aaca124Schristos #include <sched.h> /* IWYU pragma: keep */
188aaca124Schristos #include <setjmp.h>
198aaca124Schristos #include <stdarg.h>
208aaca124Schristos #include <stdbool.h>
218aaca124Schristos #include <stddef.h>
228aaca124Schristos #include <stdlib.h>
238aaca124Schristos #include <string.h>
248aaca124Schristos #include <unistd.h>
258aaca124Schristos 
268aaca124Schristos #define UNIT_TESTING
278aaca124Schristos #include <cmocka.h>
288aaca124Schristos 
298aaca124Schristos #include <isc/util.h>
308aaca124Schristos 
318aaca124Schristos #include <dns/stats.h>
328aaca124Schristos 
338aaca124Schristos #include <tests/dns.h>
348aaca124Schristos 
358aaca124Schristos static void
368aaca124Schristos set_typestats(dns_stats_t *stats, dns_rdatatype_t type) {
378aaca124Schristos 	dns_rdatastatstype_t which;
388aaca124Schristos 	unsigned int attributes;
398aaca124Schristos 
408aaca124Schristos 	attributes = 0;
418aaca124Schristos 	which = DNS_RDATASTATSTYPE_VALUE(type, attributes);
428aaca124Schristos 	dns_rdatasetstats_increment(stats, which);
438aaca124Schristos 
448aaca124Schristos 	attributes = DNS_RDATASTATSTYPE_ATTR_NXRRSET;
458aaca124Schristos 	which = DNS_RDATASTATSTYPE_VALUE(type, attributes);
468aaca124Schristos 	dns_rdatasetstats_increment(stats, which);
478aaca124Schristos }
488aaca124Schristos 
498aaca124Schristos static void
508aaca124Schristos set_nxdomainstats(dns_stats_t *stats) {
518aaca124Schristos 	dns_rdatastatstype_t which;
528aaca124Schristos 	unsigned int attributes;
538aaca124Schristos 
548aaca124Schristos 	attributes = DNS_RDATASTATSTYPE_ATTR_NXDOMAIN;
558aaca124Schristos 	which = DNS_RDATASTATSTYPE_VALUE(0, attributes);
568aaca124Schristos 	dns_rdatasetstats_increment(stats, which);
578aaca124Schristos }
588aaca124Schristos 
598aaca124Schristos static void
608aaca124Schristos mark_stale(dns_stats_t *stats, dns_rdatatype_t type, int from, int to) {
618aaca124Schristos 	dns_rdatastatstype_t which;
628aaca124Schristos 	unsigned int attributes;
638aaca124Schristos 
648aaca124Schristos 	attributes = from;
658aaca124Schristos 	which = DNS_RDATASTATSTYPE_VALUE(type, attributes);
668aaca124Schristos 	dns_rdatasetstats_decrement(stats, which);
678aaca124Schristos 
688aaca124Schristos 	attributes |= to;
698aaca124Schristos 	which = DNS_RDATASTATSTYPE_VALUE(type, attributes);
708aaca124Schristos 	dns_rdatasetstats_increment(stats, which);
718aaca124Schristos 
728aaca124Schristos 	attributes = DNS_RDATASTATSTYPE_ATTR_NXRRSET | from;
738aaca124Schristos 	which = DNS_RDATASTATSTYPE_VALUE(type, attributes);
748aaca124Schristos 	dns_rdatasetstats_decrement(stats, which);
758aaca124Schristos 
768aaca124Schristos 	attributes |= to;
778aaca124Schristos 	which = DNS_RDATASTATSTYPE_VALUE(type, attributes);
788aaca124Schristos 	dns_rdatasetstats_increment(stats, which);
798aaca124Schristos }
808aaca124Schristos 
818aaca124Schristos static void
828aaca124Schristos mark_nxdomain_stale(dns_stats_t *stats, int from, int to) {
838aaca124Schristos 	dns_rdatastatstype_t which;
848aaca124Schristos 	unsigned int attributes;
858aaca124Schristos 
868aaca124Schristos 	attributes = DNS_RDATASTATSTYPE_ATTR_NXDOMAIN | from;
878aaca124Schristos 	which = DNS_RDATASTATSTYPE_VALUE(0, attributes);
888aaca124Schristos 	dns_rdatasetstats_decrement(stats, which);
898aaca124Schristos 
908aaca124Schristos 	attributes |= to;
918aaca124Schristos 	which = DNS_RDATASTATSTYPE_VALUE(0, attributes);
928aaca124Schristos 	dns_rdatasetstats_increment(stats, which);
938aaca124Schristos }
948aaca124Schristos 
958aaca124Schristos #define ATTRIBUTE_SET(y) ((attributes & (y)) != 0)
968aaca124Schristos static void
978aaca124Schristos verify_active_counters(dns_rdatastatstype_t which, uint64_t value, void *arg) {
988aaca124Schristos 	unsigned int attributes;
998aaca124Schristos #if debug
1008aaca124Schristos 	unsigned int type;
1018aaca124Schristos #endif /* if debug */
1028aaca124Schristos 
1038aaca124Schristos 	UNUSED(which);
1048aaca124Schristos 	UNUSED(arg);
1058aaca124Schristos 
1068aaca124Schristos 	attributes = DNS_RDATASTATSTYPE_ATTR(which);
1078aaca124Schristos #if debug
1088aaca124Schristos 	type = DNS_RDATASTATSTYPE_BASE(which);
1098aaca124Schristos 
1108aaca124Schristos 	fprintf(stderr, "%s%s%s%s%s/%u, %u\n",
1118aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_OTHERTYPE) ? "O" : " ",
1128aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_NXRRSET) ? "!" : " ",
1138aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_ANCIENT) ? "~" : " ",
1148aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_STALE) ? "#" : " ",
1158aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_NXDOMAIN) ? "X" : " ",
116*bcda20f6Schristos 		type, (unsigned int)value);
1178aaca124Schristos #endif /* if debug */
1188aaca124Schristos 	if ((attributes & DNS_RDATASTATSTYPE_ATTR_ANCIENT) == 0 &&
1198aaca124Schristos 	    (attributes & DNS_RDATASTATSTYPE_ATTR_STALE) == 0)
1208aaca124Schristos 	{
1218aaca124Schristos 		assert_int_equal(value, 1);
1228aaca124Schristos 	} else {
1238aaca124Schristos 		assert_int_equal(value, 0);
1248aaca124Schristos 	}
1258aaca124Schristos }
1268aaca124Schristos 
1278aaca124Schristos static void
1288aaca124Schristos verify_stale_counters(dns_rdatastatstype_t which, uint64_t value, void *arg) {
1298aaca124Schristos 	unsigned int attributes;
1308aaca124Schristos #if debug
1318aaca124Schristos 	unsigned int type;
1328aaca124Schristos #endif /* if debug */
1338aaca124Schristos 
1348aaca124Schristos 	UNUSED(which);
1358aaca124Schristos 	UNUSED(arg);
1368aaca124Schristos 
1378aaca124Schristos 	attributes = DNS_RDATASTATSTYPE_ATTR(which);
1388aaca124Schristos #if debug
1398aaca124Schristos 	type = DNS_RDATASTATSTYPE_BASE(which);
1408aaca124Schristos 
1418aaca124Schristos 	fprintf(stderr, "%s%s%s%s%s/%u, %u\n",
1428aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_OTHERTYPE) ? "O" : " ",
1438aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_NXRRSET) ? "!" : " ",
1448aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_ANCIENT) ? "~" : " ",
1458aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_STALE) ? "#" : " ",
1468aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_NXDOMAIN) ? "X" : " ",
147*bcda20f6Schristos 		type, (unsigned int)value);
1488aaca124Schristos #endif /* if debug */
1498aaca124Schristos 	if ((attributes & DNS_RDATASTATSTYPE_ATTR_STALE) != 0) {
1508aaca124Schristos 		assert_int_equal(value, 1);
1518aaca124Schristos 	} else {
1528aaca124Schristos 		assert_int_equal(value, 0);
1538aaca124Schristos 	}
1548aaca124Schristos }
1558aaca124Schristos 
1568aaca124Schristos static void
1578aaca124Schristos verify_ancient_counters(dns_rdatastatstype_t which, uint64_t value, void *arg) {
1588aaca124Schristos 	unsigned int attributes;
1598aaca124Schristos #if debug
1608aaca124Schristos 	unsigned int type;
1618aaca124Schristos #endif /* if debug */
1628aaca124Schristos 
1638aaca124Schristos 	UNUSED(which);
1648aaca124Schristos 	UNUSED(arg);
1658aaca124Schristos 
1668aaca124Schristos 	attributes = DNS_RDATASTATSTYPE_ATTR(which);
1678aaca124Schristos #if debug
1688aaca124Schristos 	type = DNS_RDATASTATSTYPE_BASE(which);
1698aaca124Schristos 
1708aaca124Schristos 	fprintf(stderr, "%s%s%s%s%s/%u, %u\n",
1718aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_OTHERTYPE) ? "O" : " ",
1728aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_NXRRSET) ? "!" : " ",
1738aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_ANCIENT) ? "~" : " ",
1748aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_STALE) ? "#" : " ",
1758aaca124Schristos 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_NXDOMAIN) ? "X" : " ",
176*bcda20f6Schristos 		type, (unsigned int)value);
1778aaca124Schristos #endif /* if debug */
1788aaca124Schristos 	if ((attributes & DNS_RDATASTATSTYPE_ATTR_ANCIENT) != 0) {
1798aaca124Schristos 		assert_int_equal(value, 1);
1808aaca124Schristos 	} else {
1818aaca124Schristos 		assert_int_equal(value, 0);
1828aaca124Schristos 	}
1838aaca124Schristos }
1848aaca124Schristos /*
1858aaca124Schristos  * Individual unit tests
1868aaca124Schristos  */
1878aaca124Schristos 
1888aaca124Schristos /*
1898aaca124Schristos  * Test that rdatasetstats counters are properly set when moving from
1908aaca124Schristos  * active -> stale -> ancient.
1918aaca124Schristos  */
1928aaca124Schristos static void
193*bcda20f6Schristos rdatasetstats(void **state ISC_ATTR_UNUSED, bool servestale) {
1948aaca124Schristos 	unsigned int i;
1958aaca124Schristos 	unsigned int from = 0;
1968aaca124Schristos 	dns_stats_t *stats = NULL;
1978aaca124Schristos 
198*bcda20f6Schristos 	dns_rdatasetstats_create(mctx, &stats);
1998aaca124Schristos 
2008aaca124Schristos 	/* First 255 types. */
2018aaca124Schristos 	for (i = 1; i <= 255; i++) {
2028aaca124Schristos 		set_typestats(stats, (dns_rdatatype_t)i);
2038aaca124Schristos 	}
2048aaca124Schristos 	/* Specials */
2058aaca124Schristos 	set_typestats(stats, (dns_rdatatype_t)1000);
2068aaca124Schristos 	set_nxdomainstats(stats);
2078aaca124Schristos 
2088aaca124Schristos 	/* Check that all active counters are set to appropriately. */
2098aaca124Schristos 	dns_rdatasetstats_dump(stats, verify_active_counters, NULL, 1);
2108aaca124Schristos 
2118aaca124Schristos 	if (servestale) {
2128aaca124Schristos 		/* Mark stale */
2138aaca124Schristos 		for (i = 1; i <= 255; i++) {
2148aaca124Schristos 			mark_stale(stats, (dns_rdatatype_t)i, 0,
2158aaca124Schristos 				   DNS_RDATASTATSTYPE_ATTR_STALE);
2168aaca124Schristos 		}
2178aaca124Schristos 		mark_stale(stats, (dns_rdatatype_t)1000, 0,
2188aaca124Schristos 			   DNS_RDATASTATSTYPE_ATTR_STALE);
2198aaca124Schristos 		mark_nxdomain_stale(stats, 0, DNS_RDATASTATSTYPE_ATTR_STALE);
2208aaca124Schristos 
2218aaca124Schristos 		/* Check that all counters are set to appropriately. */
2228aaca124Schristos 		dns_rdatasetstats_dump(stats, verify_stale_counters, NULL, 1);
2238aaca124Schristos 
2248aaca124Schristos 		/* Set correct staleness state */
2258aaca124Schristos 		from = DNS_RDATASTATSTYPE_ATTR_STALE;
2268aaca124Schristos 	}
2278aaca124Schristos 
2288aaca124Schristos 	/* Mark ancient */
2298aaca124Schristos 	for (i = 1; i <= 255; i++) {
2308aaca124Schristos 		mark_stale(stats, (dns_rdatatype_t)i, from,
2318aaca124Schristos 			   DNS_RDATASTATSTYPE_ATTR_ANCIENT);
2328aaca124Schristos 	}
2338aaca124Schristos 	mark_stale(stats, (dns_rdatatype_t)1000, from,
2348aaca124Schristos 		   DNS_RDATASTATSTYPE_ATTR_ANCIENT);
2358aaca124Schristos 	mark_nxdomain_stale(stats, from, DNS_RDATASTATSTYPE_ATTR_ANCIENT);
2368aaca124Schristos 
2378aaca124Schristos 	/*
2388aaca124Schristos 	 * Check that all counters are set to appropriately.
2398aaca124Schristos 	 */
2408aaca124Schristos 	dns_rdatasetstats_dump(stats, verify_ancient_counters, NULL, 1);
2418aaca124Schristos 
2428aaca124Schristos 	dns_stats_detach(&stats);
2438aaca124Schristos }
2448aaca124Schristos 
2458aaca124Schristos /*
2468aaca124Schristos  * Test that rdatasetstats counters are properly set when moving from
2478aaca124Schristos  * active -> stale -> ancient.
2488aaca124Schristos  */
2498aaca124Schristos ISC_RUN_TEST_IMPL(active_stale_ancient) { rdatasetstats(state, true); }
2508aaca124Schristos 
2518aaca124Schristos /*
2528aaca124Schristos  * Test that rdatasetstats counters are properly set when moving from
2538aaca124Schristos  * active -> ancient.
2548aaca124Schristos  */
2558aaca124Schristos ISC_RUN_TEST_IMPL(active_ancient) { rdatasetstats(state, false); }
2568aaca124Schristos 
2578aaca124Schristos ISC_TEST_LIST_START
2588aaca124Schristos ISC_TEST_ENTRY(active_stale_ancient)
2598aaca124Schristos ISC_TEST_ENTRY(active_ancient)
2608aaca124Schristos ISC_TEST_LIST_END
2618aaca124Schristos 
2628aaca124Schristos ISC_TEST_MAIN
263