Home | History | Annotate | Line # | Download | only in dns
ede_test.c revision 1.2.4.2
      1  1.2.4.2  perseant /*	$NetBSD: ede_test.c,v 1.2.4.2 2025/08/02 05:54:11 perseant Exp $	*/
      2  1.2.4.2  perseant 
      3  1.2.4.2  perseant /*
      4  1.2.4.2  perseant  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
      5  1.2.4.2  perseant  *
      6  1.2.4.2  perseant  * SPDX-License-Identifier: MPL-2.0
      7  1.2.4.2  perseant  *
      8  1.2.4.2  perseant  * This Source Code Form is subject to the terms of the Mozilla Public
      9  1.2.4.2  perseant  * License, v. 2.0. If a copy of the MPL was not distributed with this
     10  1.2.4.2  perseant  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
     11  1.2.4.2  perseant  *
     12  1.2.4.2  perseant  * See the COPYRIGHT file distributed with this work for additional
     13  1.2.4.2  perseant  * information regarding copyright ownership.
     14  1.2.4.2  perseant  */
     15  1.2.4.2  perseant 
     16  1.2.4.2  perseant #include <inttypes.h>
     17  1.2.4.2  perseant #include <sched.h> /* IWYU pragma: keep */
     18  1.2.4.2  perseant #include <setjmp.h>
     19  1.2.4.2  perseant #include <stdarg.h>
     20  1.2.4.2  perseant #include <stdbool.h>
     21  1.2.4.2  perseant #include <stddef.h>
     22  1.2.4.2  perseant #include <stdio.h>
     23  1.2.4.2  perseant #include <stdlib.h>
     24  1.2.4.2  perseant #include <unistd.h>
     25  1.2.4.2  perseant 
     26  1.2.4.2  perseant #define UNIT_TESTING
     27  1.2.4.2  perseant #include <cmocka.h>
     28  1.2.4.2  perseant 
     29  1.2.4.2  perseant #include <isc/list.h>
     30  1.2.4.2  perseant 
     31  1.2.4.2  perseant #include <dns/ede.h>
     32  1.2.4.2  perseant 
     33  1.2.4.2  perseant #include "../../lib/dns/ede.c"
     34  1.2.4.2  perseant 
     35  1.2.4.2  perseant #include <tests/isc.h>
     36  1.2.4.2  perseant 
     37  1.2.4.2  perseant typedef struct {
     38  1.2.4.2  perseant 	uint16_t code;
     39  1.2.4.2  perseant 	const char *txt;
     40  1.2.4.2  perseant } ede_test_expected_t;
     41  1.2.4.2  perseant 
     42  1.2.4.2  perseant static void
     43  1.2.4.2  perseant dns_ede_test_equals(const ede_test_expected_t *expected, size_t expected_count,
     44  1.2.4.2  perseant 		    dns_edectx_t *edectx) {
     45  1.2.4.2  perseant 	size_t count = 0;
     46  1.2.4.2  perseant 
     47  1.2.4.2  perseant 	for (size_t i = 0; i < DNS_EDE_MAX_ERRORS; i++) {
     48  1.2.4.2  perseant 		dns_ednsopt_t *edns = edectx->ede[i];
     49  1.2.4.2  perseant 
     50  1.2.4.2  perseant 		if (edns == NULL) {
     51  1.2.4.2  perseant 			break;
     52  1.2.4.2  perseant 		}
     53  1.2.4.2  perseant 
     54  1.2.4.2  perseant 		uint16_t code;
     55  1.2.4.2  perseant 		const unsigned char *txt;
     56  1.2.4.2  perseant 
     57  1.2.4.2  perseant 		assert_in_range(count, 0, expected_count);
     58  1.2.4.2  perseant 		assert_int_equal(edns->code, DNS_OPT_EDE);
     59  1.2.4.2  perseant 
     60  1.2.4.2  perseant 		code = ISC_U8TO16_BE(edns->value);
     61  1.2.4.2  perseant 		assert_int_equal(code, expected[count].code);
     62  1.2.4.2  perseant 
     63  1.2.4.2  perseant 		if (edns->length > sizeof(code)) {
     64  1.2.4.2  perseant 			assert_non_null(expected[count].txt);
     65  1.2.4.2  perseant 			txt = edns->value + sizeof(code);
     66  1.2.4.2  perseant 			assert_memory_equal(expected[count].txt, txt,
     67  1.2.4.2  perseant 					    edns->length - sizeof(code));
     68  1.2.4.2  perseant 		} else {
     69  1.2.4.2  perseant 			assert_null(expected[count].txt);
     70  1.2.4.2  perseant 		}
     71  1.2.4.2  perseant 
     72  1.2.4.2  perseant 		count++;
     73  1.2.4.2  perseant 	}
     74  1.2.4.2  perseant 	assert_int_equal(count, expected_count);
     75  1.2.4.2  perseant }
     76  1.2.4.2  perseant 
     77  1.2.4.2  perseant ISC_RUN_TEST_IMPL(dns_ede_test_text_max_count) {
     78  1.2.4.2  perseant 	dns_edectx_t edectx;
     79  1.2.4.2  perseant 
     80  1.2.4.2  perseant 	dns_ede_init(mctx, &edectx);
     81  1.2.4.2  perseant 
     82  1.2.4.2  perseant 	const char *txt1 = "foobar";
     83  1.2.4.2  perseant 	const char *txt2 = "It's been a long time since I rock-and-rolled"
     84  1.2.4.2  perseant 			   "Ooh, let me get it back, let me get it back";
     85  1.2.4.2  perseant 
     86  1.2.4.2  perseant 	dns_ede_add(&edectx, 2, txt1);
     87  1.2.4.2  perseant 	dns_ede_add(&edectx, 22, NULL);
     88  1.2.4.2  perseant 	dns_ede_add(&edectx, 3, txt2);
     89  1.2.4.2  perseant 
     90  1.2.4.2  perseant 	const ede_test_expected_t expected[3] = {
     91  1.2.4.2  perseant 		{ .code = 2, .txt = "foobar" },
     92  1.2.4.2  perseant 		{ .code = 22, .txt = NULL },
     93  1.2.4.2  perseant 		{ .code = 3,
     94  1.2.4.2  perseant 		  .txt = "It's been a long time since I rock-and-rolledOoh, "
     95  1.2.4.2  perseant 			 "let me get it " }
     96  1.2.4.2  perseant 	};
     97  1.2.4.2  perseant 
     98  1.2.4.2  perseant 	dns_ede_test_equals(expected, 3, &edectx);
     99  1.2.4.2  perseant 
    100  1.2.4.2  perseant 	dns_ede_reset(&edectx);
    101  1.2.4.2  perseant }
    102  1.2.4.2  perseant 
    103  1.2.4.2  perseant ISC_RUN_TEST_IMPL(dns_ede_test_max_count) {
    104  1.2.4.2  perseant 	dns_edectx_t edectx;
    105  1.2.4.2  perseant 
    106  1.2.4.2  perseant 	dns_ede_init(mctx, &edectx);
    107  1.2.4.2  perseant 
    108  1.2.4.2  perseant 	dns_ede_add(&edectx, 1, NULL);
    109  1.2.4.2  perseant 	dns_ede_add(&edectx, 22, "two");
    110  1.2.4.2  perseant 	dns_ede_add(&edectx, 3, "three");
    111  1.2.4.2  perseant 	dns_ede_add(&edectx, 4, "four");
    112  1.2.4.2  perseant 	dns_ede_add(&edectx, 5, "five");
    113  1.2.4.2  perseant 
    114  1.2.4.2  perseant 	const ede_test_expected_t expected[3] = {
    115  1.2.4.2  perseant 		{ .code = 1, .txt = NULL },
    116  1.2.4.2  perseant 		{ .code = 22, .txt = "two" },
    117  1.2.4.2  perseant 		{ .code = 3, .txt = "three" },
    118  1.2.4.2  perseant 	};
    119  1.2.4.2  perseant 
    120  1.2.4.2  perseant 	dns_ede_test_equals(expected, 3, &edectx);
    121  1.2.4.2  perseant 
    122  1.2.4.2  perseant 	dns_ede_reset(&edectx);
    123  1.2.4.2  perseant }
    124  1.2.4.2  perseant 
    125  1.2.4.2  perseant ISC_RUN_TEST_IMPL(dns_ede_test_duplicates) {
    126  1.2.4.2  perseant 	dns_edectx_t edectx;
    127  1.2.4.2  perseant 
    128  1.2.4.2  perseant 	dns_ede_init(mctx, &edectx);
    129  1.2.4.2  perseant 
    130  1.2.4.2  perseant 	dns_ede_add(&edectx, 1, NULL);
    131  1.2.4.2  perseant 	dns_ede_add(&edectx, 1, "two");
    132  1.2.4.2  perseant 	dns_ede_add(&edectx, 1, "three");
    133  1.2.4.2  perseant 
    134  1.2.4.2  perseant 	const ede_test_expected_t expected[] = {
    135  1.2.4.2  perseant 		{ .code = 1, .txt = NULL },
    136  1.2.4.2  perseant 	};
    137  1.2.4.2  perseant 	dns_ede_test_equals(expected, 1, &edectx);
    138  1.2.4.2  perseant 
    139  1.2.4.2  perseant 	dns_ede_reset(&edectx);
    140  1.2.4.2  perseant 
    141  1.2.4.2  perseant 	const ede_test_expected_t expectedempty[] = {};
    142  1.2.4.2  perseant 	dns_ede_test_equals(expectedempty, 0, &edectx);
    143  1.2.4.2  perseant }
    144  1.2.4.2  perseant 
    145  1.2.4.2  perseant ISC_RUN_TEST_IMPL(dns_ede_test_infocode_range) {
    146  1.2.4.2  perseant 	dns_edectx_t edectx;
    147  1.2.4.2  perseant 
    148  1.2.4.2  perseant 	dns_ede_init(mctx, &edectx);
    149  1.2.4.2  perseant 
    150  1.2.4.2  perseant 	dns_ede_add(&edectx, 1, NULL);
    151  1.2.4.2  perseant 	expect_assert_failure(dns_ede_add(&edectx, 32, NULL));
    152  1.2.4.2  perseant 
    153  1.2.4.2  perseant 	const ede_test_expected_t expected[] = {
    154  1.2.4.2  perseant 		{ .code = 1, .txt = NULL },
    155  1.2.4.2  perseant 	};
    156  1.2.4.2  perseant 	dns_ede_test_equals(expected, 1, &edectx);
    157  1.2.4.2  perseant 
    158  1.2.4.2  perseant 	dns_ede_reset(&edectx);
    159  1.2.4.2  perseant }
    160  1.2.4.2  perseant 
    161  1.2.4.2  perseant ISC_RUN_TEST_IMPL(dns_ede_test_copy) {
    162  1.2.4.2  perseant 	dns_edectx_t edectx1;
    163  1.2.4.2  perseant 	dns_edectx_t edectx2;
    164  1.2.4.2  perseant 	dns_edectx_t edectx3;
    165  1.2.4.2  perseant 
    166  1.2.4.2  perseant 	dns_ede_init(mctx, &edectx1);
    167  1.2.4.2  perseant 	dns_ede_init(mctx, &edectx2);
    168  1.2.4.2  perseant 
    169  1.2.4.2  perseant 	dns_ede_add(&edectx1, 1, NULL);
    170  1.2.4.2  perseant 	dns_ede_add(&edectx1, 2, "two-the-first");
    171  1.2.4.2  perseant 	dns_ede_add(&edectx1, 3, "three");
    172  1.2.4.2  perseant 
    173  1.2.4.2  perseant 	const ede_test_expected_t expected[] = {
    174  1.2.4.2  perseant 		{ .code = 1, .txt = NULL },
    175  1.2.4.2  perseant 		{ .code = 2, .txt = "two-the-first" },
    176  1.2.4.2  perseant 		{ .code = 3, .txt = "three" },
    177  1.2.4.2  perseant 	};
    178  1.2.4.2  perseant 
    179  1.2.4.2  perseant 	dns_ede_test_equals(expected, 3, &edectx1);
    180  1.2.4.2  perseant 	dns_ede_copy(&edectx2, &edectx1);
    181  1.2.4.2  perseant 	dns_ede_test_equals(expected, 3, &edectx2);
    182  1.2.4.2  perseant 	dns_ede_test_equals(expected, 3, &edectx1);
    183  1.2.4.2  perseant 
    184  1.2.4.2  perseant 	dns_ede_reset(&edectx2);
    185  1.2.4.2  perseant 	dns_ede_add(&edectx2, 1, "one-the-first-with-txt");
    186  1.2.4.2  perseant 	dns_ede_add(&edectx2, 2, "two-the-second");
    187  1.2.4.2  perseant 
    188  1.2.4.2  perseant 	const ede_test_expected_t expected2[] = {
    189  1.2.4.2  perseant 		{ .code = 1, .txt = "one-the-first-with-txt" },
    190  1.2.4.2  perseant 		{ .code = 2, .txt = "two-the-second" },
    191  1.2.4.2  perseant 		{ .code = 3, .txt = "three" }
    192  1.2.4.2  perseant 	};
    193  1.2.4.2  perseant 
    194  1.2.4.2  perseant 	dns_ede_copy(&edectx2, &edectx1);
    195  1.2.4.2  perseant 	dns_ede_test_equals(expected2, 3, &edectx2);
    196  1.2.4.2  perseant 	dns_ede_test_equals(expected, 3, &edectx1);
    197  1.2.4.2  perseant 
    198  1.2.4.2  perseant 	dns_ede_init(mctx, &edectx3);
    199  1.2.4.2  perseant 	dns_ede_add(&edectx3, 2, "two-the-third");
    200  1.2.4.2  perseant 	dns_ede_copy(&edectx3, &edectx2);
    201  1.2.4.2  perseant 
    202  1.2.4.2  perseant 	const ede_test_expected_t expected3[] = {
    203  1.2.4.2  perseant 		{ .code = 2, .txt = "two-the-third" },
    204  1.2.4.2  perseant 		{ .code = 1, .txt = "one-the-first-with-txt" },
    205  1.2.4.2  perseant 		{ .code = 3, .txt = "three" }
    206  1.2.4.2  perseant 	};
    207  1.2.4.2  perseant 	dns_ede_test_equals(expected3, 3, &edectx3);
    208  1.2.4.2  perseant 
    209  1.2.4.2  perseant 	dns_ede_reset(&edectx1);
    210  1.2.4.2  perseant 	dns_ede_reset(&edectx2);
    211  1.2.4.2  perseant 	dns_ede_reset(&edectx3);
    212  1.2.4.2  perseant }
    213  1.2.4.2  perseant 
    214  1.2.4.2  perseant ISC_TEST_LIST_START
    215  1.2.4.2  perseant 
    216  1.2.4.2  perseant ISC_TEST_ENTRY(dns_ede_test_text_max_count)
    217  1.2.4.2  perseant ISC_TEST_ENTRY(dns_ede_test_max_count)
    218  1.2.4.2  perseant ISC_TEST_ENTRY(dns_ede_test_duplicates)
    219  1.2.4.2  perseant ISC_TEST_ENTRY(dns_ede_test_infocode_range)
    220  1.2.4.2  perseant ISC_TEST_ENTRY(dns_ede_test_copy)
    221  1.2.4.2  perseant 
    222  1.2.4.2  perseant ISC_TEST_LIST_END
    223  1.2.4.2  perseant 
    224  1.2.4.2  perseant ISC_TEST_MAIN
    225