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