Home | History | Annotate | Line # | Download | only in dns
      1 /*	$NetBSD: rdatasetstats_test.c,v 1.3 2025/01/26 16:25:48 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 <stdbool.h>
     21 #include <stddef.h>
     22 #include <stdlib.h>
     23 #include <string.h>
     24 #include <unistd.h>
     25 
     26 #define UNIT_TESTING
     27 #include <cmocka.h>
     28 
     29 #include <isc/util.h>
     30 
     31 #include <dns/stats.h>
     32 
     33 #include <tests/dns.h>
     34 
     35 static void
     36 set_typestats(dns_stats_t *stats, dns_rdatatype_t type) {
     37 	dns_rdatastatstype_t which;
     38 	unsigned int attributes;
     39 
     40 	attributes = 0;
     41 	which = DNS_RDATASTATSTYPE_VALUE(type, attributes);
     42 	dns_rdatasetstats_increment(stats, which);
     43 
     44 	attributes = DNS_RDATASTATSTYPE_ATTR_NXRRSET;
     45 	which = DNS_RDATASTATSTYPE_VALUE(type, attributes);
     46 	dns_rdatasetstats_increment(stats, which);
     47 }
     48 
     49 static void
     50 set_nxdomainstats(dns_stats_t *stats) {
     51 	dns_rdatastatstype_t which;
     52 	unsigned int attributes;
     53 
     54 	attributes = DNS_RDATASTATSTYPE_ATTR_NXDOMAIN;
     55 	which = DNS_RDATASTATSTYPE_VALUE(0, attributes);
     56 	dns_rdatasetstats_increment(stats, which);
     57 }
     58 
     59 static void
     60 mark_stale(dns_stats_t *stats, dns_rdatatype_t type, int from, int to) {
     61 	dns_rdatastatstype_t which;
     62 	unsigned int attributes;
     63 
     64 	attributes = from;
     65 	which = DNS_RDATASTATSTYPE_VALUE(type, attributes);
     66 	dns_rdatasetstats_decrement(stats, which);
     67 
     68 	attributes |= to;
     69 	which = DNS_RDATASTATSTYPE_VALUE(type, attributes);
     70 	dns_rdatasetstats_increment(stats, which);
     71 
     72 	attributes = DNS_RDATASTATSTYPE_ATTR_NXRRSET | from;
     73 	which = DNS_RDATASTATSTYPE_VALUE(type, attributes);
     74 	dns_rdatasetstats_decrement(stats, which);
     75 
     76 	attributes |= to;
     77 	which = DNS_RDATASTATSTYPE_VALUE(type, attributes);
     78 	dns_rdatasetstats_increment(stats, which);
     79 }
     80 
     81 static void
     82 mark_nxdomain_stale(dns_stats_t *stats, int from, int to) {
     83 	dns_rdatastatstype_t which;
     84 	unsigned int attributes;
     85 
     86 	attributes = DNS_RDATASTATSTYPE_ATTR_NXDOMAIN | from;
     87 	which = DNS_RDATASTATSTYPE_VALUE(0, attributes);
     88 	dns_rdatasetstats_decrement(stats, which);
     89 
     90 	attributes |= to;
     91 	which = DNS_RDATASTATSTYPE_VALUE(0, attributes);
     92 	dns_rdatasetstats_increment(stats, which);
     93 }
     94 
     95 #define ATTRIBUTE_SET(y) ((attributes & (y)) != 0)
     96 static void
     97 verify_active_counters(dns_rdatastatstype_t which, uint64_t value, void *arg) {
     98 	unsigned int attributes;
     99 #if debug
    100 	unsigned int type;
    101 #endif /* if debug */
    102 
    103 	UNUSED(which);
    104 	UNUSED(arg);
    105 
    106 	attributes = DNS_RDATASTATSTYPE_ATTR(which);
    107 #if debug
    108 	type = DNS_RDATASTATSTYPE_BASE(which);
    109 
    110 	fprintf(stderr, "%s%s%s%s%s/%u, %u\n",
    111 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_OTHERTYPE) ? "O" : " ",
    112 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_NXRRSET) ? "!" : " ",
    113 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_ANCIENT) ? "~" : " ",
    114 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_STALE) ? "#" : " ",
    115 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_NXDOMAIN) ? "X" : " ",
    116 		type, (unsigned int)value);
    117 #endif /* if debug */
    118 	if ((attributes & DNS_RDATASTATSTYPE_ATTR_ANCIENT) == 0 &&
    119 	    (attributes & DNS_RDATASTATSTYPE_ATTR_STALE) == 0)
    120 	{
    121 		assert_int_equal(value, 1);
    122 	} else {
    123 		assert_int_equal(value, 0);
    124 	}
    125 }
    126 
    127 static void
    128 verify_stale_counters(dns_rdatastatstype_t which, uint64_t value, void *arg) {
    129 	unsigned int attributes;
    130 #if debug
    131 	unsigned int type;
    132 #endif /* if debug */
    133 
    134 	UNUSED(which);
    135 	UNUSED(arg);
    136 
    137 	attributes = DNS_RDATASTATSTYPE_ATTR(which);
    138 #if debug
    139 	type = DNS_RDATASTATSTYPE_BASE(which);
    140 
    141 	fprintf(stderr, "%s%s%s%s%s/%u, %u\n",
    142 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_OTHERTYPE) ? "O" : " ",
    143 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_NXRRSET) ? "!" : " ",
    144 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_ANCIENT) ? "~" : " ",
    145 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_STALE) ? "#" : " ",
    146 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_NXDOMAIN) ? "X" : " ",
    147 		type, (unsigned int)value);
    148 #endif /* if debug */
    149 	if ((attributes & DNS_RDATASTATSTYPE_ATTR_STALE) != 0) {
    150 		assert_int_equal(value, 1);
    151 	} else {
    152 		assert_int_equal(value, 0);
    153 	}
    154 }
    155 
    156 static void
    157 verify_ancient_counters(dns_rdatastatstype_t which, uint64_t value, void *arg) {
    158 	unsigned int attributes;
    159 #if debug
    160 	unsigned int type;
    161 #endif /* if debug */
    162 
    163 	UNUSED(which);
    164 	UNUSED(arg);
    165 
    166 	attributes = DNS_RDATASTATSTYPE_ATTR(which);
    167 #if debug
    168 	type = DNS_RDATASTATSTYPE_BASE(which);
    169 
    170 	fprintf(stderr, "%s%s%s%s%s/%u, %u\n",
    171 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_OTHERTYPE) ? "O" : " ",
    172 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_NXRRSET) ? "!" : " ",
    173 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_ANCIENT) ? "~" : " ",
    174 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_STALE) ? "#" : " ",
    175 		ATTRIBUTE_SET(DNS_RDATASTATSTYPE_ATTR_NXDOMAIN) ? "X" : " ",
    176 		type, (unsigned int)value);
    177 #endif /* if debug */
    178 	if ((attributes & DNS_RDATASTATSTYPE_ATTR_ANCIENT) != 0) {
    179 		assert_int_equal(value, 1);
    180 	} else {
    181 		assert_int_equal(value, 0);
    182 	}
    183 }
    184 /*
    185  * Individual unit tests
    186  */
    187 
    188 /*
    189  * Test that rdatasetstats counters are properly set when moving from
    190  * active -> stale -> ancient.
    191  */
    192 static void
    193 rdatasetstats(void **state ISC_ATTR_UNUSED, bool servestale) {
    194 	unsigned int i;
    195 	unsigned int from = 0;
    196 	dns_stats_t *stats = NULL;
    197 
    198 	dns_rdatasetstats_create(mctx, &stats);
    199 
    200 	/* First 255 types. */
    201 	for (i = 1; i <= 255; i++) {
    202 		set_typestats(stats, (dns_rdatatype_t)i);
    203 	}
    204 	/* Specials */
    205 	set_typestats(stats, (dns_rdatatype_t)1000);
    206 	set_nxdomainstats(stats);
    207 
    208 	/* Check that all active counters are set to appropriately. */
    209 	dns_rdatasetstats_dump(stats, verify_active_counters, NULL, 1);
    210 
    211 	if (servestale) {
    212 		/* Mark stale */
    213 		for (i = 1; i <= 255; i++) {
    214 			mark_stale(stats, (dns_rdatatype_t)i, 0,
    215 				   DNS_RDATASTATSTYPE_ATTR_STALE);
    216 		}
    217 		mark_stale(stats, (dns_rdatatype_t)1000, 0,
    218 			   DNS_RDATASTATSTYPE_ATTR_STALE);
    219 		mark_nxdomain_stale(stats, 0, DNS_RDATASTATSTYPE_ATTR_STALE);
    220 
    221 		/* Check that all counters are set to appropriately. */
    222 		dns_rdatasetstats_dump(stats, verify_stale_counters, NULL, 1);
    223 
    224 		/* Set correct staleness state */
    225 		from = DNS_RDATASTATSTYPE_ATTR_STALE;
    226 	}
    227 
    228 	/* Mark ancient */
    229 	for (i = 1; i <= 255; i++) {
    230 		mark_stale(stats, (dns_rdatatype_t)i, from,
    231 			   DNS_RDATASTATSTYPE_ATTR_ANCIENT);
    232 	}
    233 	mark_stale(stats, (dns_rdatatype_t)1000, from,
    234 		   DNS_RDATASTATSTYPE_ATTR_ANCIENT);
    235 	mark_nxdomain_stale(stats, from, DNS_RDATASTATSTYPE_ATTR_ANCIENT);
    236 
    237 	/*
    238 	 * Check that all counters are set to appropriately.
    239 	 */
    240 	dns_rdatasetstats_dump(stats, verify_ancient_counters, NULL, 1);
    241 
    242 	dns_stats_detach(&stats);
    243 }
    244 
    245 /*
    246  * Test that rdatasetstats counters are properly set when moving from
    247  * active -> stale -> ancient.
    248  */
    249 ISC_RUN_TEST_IMPL(active_stale_ancient) { rdatasetstats(state, true); }
    250 
    251 /*
    252  * Test that rdatasetstats counters are properly set when moving from
    253  * active -> ancient.
    254  */
    255 ISC_RUN_TEST_IMPL(active_ancient) { rdatasetstats(state, false); }
    256 
    257 ISC_TEST_LIST_START
    258 ISC_TEST_ENTRY(active_stale_ancient)
    259 ISC_TEST_ENTRY(active_ancient)
    260 ISC_TEST_LIST_END
    261 
    262 ISC_TEST_MAIN
    263