xref: /minix3/external/bsd/bind/dist/lib/dns/tests/update_test.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1 /*	$NetBSD: update_test.c,v 1.1.1.4 2014/12/10 03:34:43 christos Exp $	*/
2 
3 /*
4  * Copyright (C) 2011, 2012  Internet Systems Consortium, Inc. ("ISC")
5  *
6  * Permission to use, copy, modify, and/or distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /* Id */
20 
21 /*! \file */
22 
23 #include <config.h>
24 
25 #include <atf-c.h>
26 
27 #include <unistd.h>
28 #include <time.h>
29 
30 #include <isc/serial.h>
31 #include <isc/stdtime.h>
32 
33 #include <dns/update.h>
34 
35 #include "dnstest.h"
36 
37 static isc_uint32_t mystdtime;
38 
set_mystdtime(int year,int month,int day)39 static void set_mystdtime(int year, int month, int day) {
40 	struct tm tm;
41 
42 	memset(&tm, 0, sizeof(tm));
43 	tm.tm_year = year - 1900;
44 	tm.tm_mon = month;
45 	tm.tm_mday = day;
46 	mystdtime = timegm(&tm) ;
47 }
48 
isc_stdtime_get(isc_stdtime_t * now)49 void isc_stdtime_get(isc_stdtime_t *now) {
50 	*now = mystdtime;
51 }
52 
53 /*
54  * Individual unit tests
55  */
56 
57 ATF_TC(increment);
ATF_TC_HEAD(increment,tc)58 ATF_TC_HEAD(increment, tc) {
59   atf_tc_set_md_var(tc, "descr", "simple increment by 1");
60 }
ATF_TC_BODY(increment,tc)61 ATF_TC_BODY(increment, tc) {
62 	isc_uint32_t old = 50;
63 	isc_uint32_t new;
64 	isc_result_t result;
65 
66 	UNUSED(tc);
67 
68 	result = dns_test_begin(NULL, ISC_FALSE);
69 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
70 	new = dns_update_soaserial(old, dns_updatemethod_increment);
71 	ATF_REQUIRE_EQ(isc_serial_lt(old, new), ISC_TRUE);
72 	ATF_CHECK_MSG(new != 0, "new (%d) should not equal 0", new);
73 	ATF_REQUIRE_EQ(new, 51);
74 	dns_test_end();
75 }
76 
77 /* 0xfffffffff -> 1 */
78 ATF_TC(increment_past_zero);
ATF_TC_HEAD(increment_past_zero,tc)79 ATF_TC_HEAD(increment_past_zero, tc) {
80   atf_tc_set_md_var(tc, "descr", "increment past zero, ffffffff -> 1");
81 }
ATF_TC_BODY(increment_past_zero,tc)82 ATF_TC_BODY(increment_past_zero, tc) {
83 	isc_uint32_t old = 0xffffffffu;
84 	isc_uint32_t new;
85 	isc_result_t result;
86 
87 	UNUSED(tc);
88 
89 	result = dns_test_begin(NULL, ISC_FALSE);
90 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
91 	new = dns_update_soaserial(old, dns_updatemethod_increment);
92 	ATF_REQUIRE_EQ(isc_serial_lt(old, new), ISC_TRUE);
93 	ATF_CHECK(new != 0);
94 	ATF_REQUIRE_EQ(new, 1u);
95 	dns_test_end();
96 }
97 
98 ATF_TC(past_to_unix);
ATF_TC_HEAD(past_to_unix,tc)99 ATF_TC_HEAD(past_to_unix, tc) {
100   atf_tc_set_md_var(tc, "descr", "past to unixtime");
101 }
ATF_TC_BODY(past_to_unix,tc)102 ATF_TC_BODY(past_to_unix, tc) {
103 	isc_uint32_t old;
104 	isc_uint32_t new;
105 	isc_result_t result;
106 
107 	UNUSED(tc);
108 
109 	set_mystdtime(2011, 6, 22);
110 	old = mystdtime - 1;
111 
112 	result = dns_test_begin(NULL, ISC_FALSE);
113 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
114 	new = dns_update_soaserial(old, dns_updatemethod_unixtime);
115 	ATF_REQUIRE_EQ(isc_serial_lt(old, new), ISC_TRUE);
116 	ATF_CHECK(new != 0);
117 	ATF_REQUIRE_EQ(new, mystdtime);
118 	dns_test_end();
119 }
120 
121 ATF_TC(now_to_unix);
ATF_TC_HEAD(now_to_unix,tc)122 ATF_TC_HEAD(now_to_unix, tc) {
123   atf_tc_set_md_var(tc, "descr", "now to unixtime");
124 }
ATF_TC_BODY(now_to_unix,tc)125 ATF_TC_BODY(now_to_unix, tc) {
126 	isc_uint32_t old;
127 	isc_uint32_t new;
128 	isc_result_t result;
129 
130 	UNUSED(tc);
131 
132 	set_mystdtime(2011, 6, 22);
133 	old = mystdtime;
134 
135 	result = dns_test_begin(NULL, ISC_FALSE);
136 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
137 	new = dns_update_soaserial(old, dns_updatemethod_unixtime);
138 	ATF_REQUIRE_EQ(isc_serial_lt(old, new), ISC_TRUE);
139 	ATF_CHECK(new != 0);
140 	ATF_REQUIRE_EQ(new, old+1);
141 	dns_test_end();
142 }
143 
144 ATF_TC(future_to_unix);
ATF_TC_HEAD(future_to_unix,tc)145 ATF_TC_HEAD(future_to_unix, tc) {
146   atf_tc_set_md_var(tc, "descr", "future to unixtime");
147 }
ATF_TC_BODY(future_to_unix,tc)148 ATF_TC_BODY(future_to_unix, tc) {
149 	isc_uint32_t old;
150 	isc_uint32_t new;
151 	isc_result_t result;
152 
153 	UNUSED(tc);
154 
155 	set_mystdtime(2011, 6, 22);
156 	old = mystdtime + 1;
157 
158 	result = dns_test_begin(NULL, ISC_FALSE);
159 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
160 	new = dns_update_soaserial(old, dns_updatemethod_unixtime);
161 	ATF_REQUIRE_EQ(isc_serial_lt(old, new), ISC_TRUE);
162 	ATF_CHECK(new != 0);
163 	ATF_REQUIRE_EQ(new, old+1);
164 	dns_test_end();
165 }
166 
167 ATF_TC(undefined_plus1_to_unix);
ATF_TC_HEAD(undefined_plus1_to_unix,tc)168 ATF_TC_HEAD(undefined_plus1_to_unix, tc) {
169   atf_tc_set_md_var(tc, "descr", "undefined plus 1 to unixtime");
170 }
ATF_TC_BODY(undefined_plus1_to_unix,tc)171 ATF_TC_BODY(undefined_plus1_to_unix, tc) {
172 	isc_uint32_t old;
173 	isc_uint32_t new;
174 	isc_result_t result;
175 
176 	UNUSED(tc);
177 
178 	set_mystdtime(2011, 6, 22);
179 	old = mystdtime ^ 0x80000000u;
180 	old += 1;
181 
182 	result = dns_test_begin(NULL, ISC_FALSE);
183 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
184 	new = dns_update_soaserial(old, dns_updatemethod_unixtime);
185 	ATF_REQUIRE_EQ(isc_serial_lt(old, new), ISC_TRUE);
186 	ATF_CHECK(new != 0);
187 	ATF_REQUIRE_EQ(new, mystdtime);
188 	dns_test_end();
189 }
190 
191 ATF_TC(undefined_minus1_to_unix);
ATF_TC_HEAD(undefined_minus1_to_unix,tc)192 ATF_TC_HEAD(undefined_minus1_to_unix, tc) {
193   atf_tc_set_md_var(tc, "descr", "undefined minus 1 to unixtime");
194 }
ATF_TC_BODY(undefined_minus1_to_unix,tc)195 ATF_TC_BODY(undefined_minus1_to_unix, tc) {
196 	isc_uint32_t old;
197 	isc_uint32_t new;
198 	isc_result_t result;
199 
200 	UNUSED(tc);
201 
202 	set_mystdtime(2011, 6, 22);
203 	old = mystdtime ^ 0x80000000u;
204 	old -= 1;
205 
206 	result = dns_test_begin(NULL, ISC_FALSE);
207 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
208 	new = dns_update_soaserial(old, dns_updatemethod_unixtime);
209 	ATF_REQUIRE_EQ(isc_serial_lt(old, new), ISC_TRUE);
210 	ATF_CHECK(new != 0);
211 	ATF_REQUIRE_EQ(new, old+1);
212 	dns_test_end();
213 }
214 
215 ATF_TC(undefined_to_unix);
ATF_TC_HEAD(undefined_to_unix,tc)216 ATF_TC_HEAD(undefined_to_unix, tc) {
217   atf_tc_set_md_var(tc, "descr", "undefined to unixtime");
218 }
ATF_TC_BODY(undefined_to_unix,tc)219 ATF_TC_BODY(undefined_to_unix, tc) {
220 	isc_uint32_t old;
221 	isc_uint32_t new;
222 	isc_result_t result;
223 
224 	UNUSED(tc);
225 
226 	set_mystdtime(2011, 6, 22);
227 	old = mystdtime ^ 0x80000000u;
228 
229 	result = dns_test_begin(NULL, ISC_FALSE);
230 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
231 	new = dns_update_soaserial(old, dns_updatemethod_unixtime);
232 	ATF_REQUIRE_EQ(isc_serial_lt(old, new), ISC_TRUE);
233 	ATF_CHECK(new != 0);
234 	ATF_REQUIRE_EQ(new, old+1);
235 	dns_test_end();
236 }
237 
238 ATF_TC(unixtime_zero);
ATF_TC_HEAD(unixtime_zero,tc)239 ATF_TC_HEAD(unixtime_zero, tc) {
240   atf_tc_set_md_var(tc, "descr", "handle unixtime being zero");
241 }
ATF_TC_BODY(unixtime_zero,tc)242 ATF_TC_BODY(unixtime_zero, tc) {
243 	isc_uint32_t old;
244 	isc_uint32_t new;
245 	isc_result_t result;
246 
247 	UNUSED(tc);
248 
249 	mystdtime = 0;
250 	old = 0xfffffff0;
251 
252 	result = dns_test_begin(NULL, ISC_FALSE);
253 	ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
254 	new = dns_update_soaserial(old, dns_updatemethod_unixtime);
255 	ATF_REQUIRE_EQ(isc_serial_lt(old, new), ISC_TRUE);
256 	ATF_CHECK(new != 0);
257 	ATF_REQUIRE_EQ(new, old+1);
258 	dns_test_end();
259 }
260 
261 /*
262  * Main
263  */
ATF_TP_ADD_TCS(tp)264 ATF_TP_ADD_TCS(tp) {
265 	ATF_TP_ADD_TC(tp, increment);
266 	ATF_TP_ADD_TC(tp, increment_past_zero);
267 	ATF_TP_ADD_TC(tp, past_to_unix);
268 	ATF_TP_ADD_TC(tp, now_to_unix);
269 	ATF_TP_ADD_TC(tp, future_to_unix);
270 	ATF_TP_ADD_TC(tp, undefined_to_unix);
271 	ATF_TP_ADD_TC(tp, undefined_plus1_to_unix);
272 	ATF_TP_ADD_TC(tp, undefined_minus1_to_unix);
273 	ATF_TP_ADD_TC(tp, unixtime_zero);
274 
275 	return (atf_no_error());
276 }
277 
278