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 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 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); 58 ATF_TC_HEAD(increment, tc) { 59 atf_tc_set_md_var(tc, "descr", "simple increment by 1"); 60 } 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); 79 ATF_TC_HEAD(increment_past_zero, tc) { 80 atf_tc_set_md_var(tc, "descr", "increment past zero, ffffffff -> 1"); 81 } 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); 99 ATF_TC_HEAD(past_to_unix, tc) { 100 atf_tc_set_md_var(tc, "descr", "past to unixtime"); 101 } 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); 122 ATF_TC_HEAD(now_to_unix, tc) { 123 atf_tc_set_md_var(tc, "descr", "now to unixtime"); 124 } 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); 145 ATF_TC_HEAD(future_to_unix, tc) { 146 atf_tc_set_md_var(tc, "descr", "future to unixtime"); 147 } 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); 168 ATF_TC_HEAD(undefined_plus1_to_unix, tc) { 169 atf_tc_set_md_var(tc, "descr", "undefined plus 1 to unixtime"); 170 } 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); 192 ATF_TC_HEAD(undefined_minus1_to_unix, tc) { 193 atf_tc_set_md_var(tc, "descr", "undefined minus 1 to unixtime"); 194 } 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); 216 ATF_TC_HEAD(undefined_to_unix, tc) { 217 atf_tc_set_md_var(tc, "descr", "undefined to unixtime"); 218 } 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); 239 ATF_TC_HEAD(unixtime_zero, tc) { 240 atf_tc_set_md_var(tc, "descr", "handle unixtime being zero"); 241 } 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 */ 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