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