1 /*
2  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
3  *
4  * This Source Code Form is subject to the terms of the Mozilla Public
5  * License, v. 2.0. If a copy of the MPL was not distributed with this
6  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
7  *
8  * See the COPYRIGHT file distributed with this work for additional
9  * information regarding copyright ownership.
10  */
11 
12 #include <config.h>
13 
14 #if HAVE_CMOCKA
15 
16 #include <stdarg.h>
17 #include <stddef.h>
18 #include <setjmp.h>
19 
20 #include <sched.h> /* IWYU pragma: keep */
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/print.h>
29 #include <isc/util.h>
30 
31 #include <dns/rdataset.h>
32 #include <dns/rdatastruct.h>
33 
34 #include "dnstest.h"
35 
36 static int
_setup(void ** state)37 _setup(void **state) {
38 	isc_result_t result;
39 
40 	UNUSED(state);
41 
42 	result = dns_test_begin(NULL, false);
43 	assert_int_equal(result, ISC_R_SUCCESS);
44 
45 	return (0);
46 }
47 
48 static int
_teardown(void ** state)49 _teardown(void **state) {
50 	UNUSED(state);
51 
52 	dns_test_end();
53 
54 	return (0);
55 }
56 
57 /* test trimming of rdataset TTLs */
58 static void
trimttl(void ** state)59 trimttl(void **state) {
60 	dns_rdataset_t rdataset, sigrdataset;
61 	dns_rdata_rrsig_t rrsig;
62 	isc_stdtime_t ttltimenow, ttltimeexpire;
63 
64 	ttltimenow = 10000000;
65 	ttltimeexpire = ttltimenow + 800;
66 
67 	UNUSED(state);
68 
69 	dns_rdataset_init(&rdataset);
70 	dns_rdataset_init(&sigrdataset);
71 
72 	rdataset.ttl = 900;
73 	sigrdataset.ttl = 1000;
74 	rrsig.timeexpire = ttltimeexpire;
75 	rrsig.originalttl = 1000;
76 
77 	dns_rdataset_trimttl(&rdataset, &sigrdataset, &rrsig, ttltimenow,
78 			     true);
79 	assert_int_equal(rdataset.ttl, 800);
80 	assert_int_equal(sigrdataset.ttl, 800);
81 
82 	rdataset.ttl = 900;
83 	sigrdataset.ttl = 1000;
84 	rrsig.timeexpire = ttltimenow - 200;
85 	rrsig.originalttl = 1000;
86 
87 	dns_rdataset_trimttl(&rdataset, &sigrdataset, &rrsig, ttltimenow,
88 			     true);
89 	assert_int_equal(rdataset.ttl, 120);
90 	assert_int_equal(sigrdataset.ttl, 120);
91 
92 	rdataset.ttl = 900;
93 	sigrdataset.ttl = 1000;
94 	rrsig.timeexpire = ttltimenow - 200;
95 	rrsig.originalttl = 1000;
96 
97 	dns_rdataset_trimttl(&rdataset, &sigrdataset, &rrsig, ttltimenow,
98 			     false);
99 	assert_int_equal(rdataset.ttl, 0);
100 	assert_int_equal(sigrdataset.ttl, 0);
101 
102 	sigrdataset.ttl = 900;
103 	rdataset.ttl = 1000;
104 	rrsig.timeexpire = ttltimeexpire;
105 	rrsig.originalttl = 1000;
106 
107 	dns_rdataset_trimttl(&rdataset, &sigrdataset, &rrsig, ttltimenow,
108 			     true);
109 	assert_int_equal(rdataset.ttl, 800);
110 	assert_int_equal(sigrdataset.ttl, 800);
111 
112 	sigrdataset.ttl = 900;
113 	rdataset.ttl = 1000;
114 	rrsig.timeexpire = ttltimenow - 200;
115 	rrsig.originalttl = 1000;
116 
117 	dns_rdataset_trimttl(&rdataset, &sigrdataset, &rrsig, ttltimenow,
118 			     true);
119 	assert_int_equal(rdataset.ttl, 120);
120 	assert_int_equal(sigrdataset.ttl, 120);
121 
122 	sigrdataset.ttl = 900;
123 	rdataset.ttl = 1000;
124 	rrsig.timeexpire = ttltimenow - 200;
125 	rrsig.originalttl = 1000;
126 
127 	dns_rdataset_trimttl(&rdataset, &sigrdataset, &rrsig, ttltimenow,
128 			     false);
129 	assert_int_equal(rdataset.ttl, 0);
130 	assert_int_equal(sigrdataset.ttl, 0);
131 }
132 
133 int
main(void)134 main(void) {
135 	const struct CMUnitTest tests[] = {
136 		cmocka_unit_test_setup_teardown(trimttl, _setup, _teardown),
137 	};
138 
139 	return (cmocka_run_group_tests(tests, dns_test_init, dns_test_final));
140 }
141 
142 #else /* HAVE_CMOCKA */
143 
144 #include <stdio.h>
145 
146 int
main(void)147 main(void) {
148 	printf("1..0 # Skipped: cmocka not available\n");
149 	return (0);
150 }
151 
152 #endif
153