source: branches/cname-collision/t/cname.t@ 1021

Last change on this file since 1021 was 1021, checked in by Kris Deugau, 4 days ago

/branches/cname-collision

Test with updating to a CNAME that expires:
Add test for collision with existing pending-expiry record
See #72, #88

File size: 23.2 KB
RevLine 
[950]1# -*- Perl -*-
2# Tests for CNAME records
[951]3# Note that not all possible cases are caught!
4# Template records mean not all published records are natively present in the DB
[950]5
[993]6use strict;
7use warnings;
8
[950]9use Test::More;
10use Data::Dumper;
11
12use lib 't';
13
14use DNSTest;
15my $dtest = DNSTest::new;
16
[993]17my ($code,$msg);
[950]18my $rectype = 5;
19my $newname;
20my $newval;
[993]21my $expirystamp;
22my $rcount;
[950]23
[963]24
[950]25## Domain tests
[952]26subtest 'Domain tests' => sub {
[950]27
[963]28 subtest 'CNAME add - new name' => sub {
29 $newname = 'newname.example.com';
30 $newval = 'fredshosting.example.net';
31 ($code, $msg) = $dnsdb->addRec('n', 'n', 1, \$newname, \$rectype, \$newval, 900);
32 ok( $code eq 'OK', "addRec() claimed succeess" );
33 if ($code eq 'OK') {
34 # crosscheck in the DB
35 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 1 AND host = '$newname'");
36 ok( $rcount == 1, " ... [$rcount] yep, hostname only occurs once" );
37 } else {
38 print "not ok: $msg";
39 }
40 };
[950]41
[963]42 subtest 'CNAME add - existing/colliding non-CNAME' => sub {
43 $newname = 'mx1.example.com';
44 ($code, $msg) = $dnsdb->addRec('n', 'n', 1, \$newname, \$rectype, \$newval, 900);
45 ok( $code eq 'FAIL', "addRec() claimed failure" );
46 if ($code eq 'FAIL') {
47 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 1 AND host = '$newname' AND type <> 5");
48 ok( $rcount == 2, " ... [$rcount] record(s) with $newname already exist" );
49 like( $msg, qr/One or more non-CNAME records/, " ... returned matching error" );
50 }
51 };
[950]52
[963]53 subtest 'CNAME add - existing/colliding CNAME' => sub {
54 $newname = 'www.example.com';
55 ($code, $msg) = $dnsdb->addRec('n', 'n', 1, \$newname, \$rectype, \$newval, 900);
56 ok( $code eq 'FAIL', "addRec() claimed failure" );
57 if ($code eq 'FAIL') {
58 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 1 AND host = '$newname' AND type = 5");
59 ok( $rcount == 1, " ... [$rcount] CNAME already exists" );
60 like( $msg, qr/already a CNAME present/, " ... returned matching error" );
61 }
62 };
[951]63
[963]64 subtest 'CNAME update - non-CNAME to CNAME, non-colliding' => sub {
65 $newname = 'smtp.example.com';
66 $newval = 'example.com';
67 ($code, $msg) = $dnsdb->updateRec('n', 'n', 39, 1, \$newname, \$rectype, \$newval, 900);
68 ok( $code eq 'OK', "updateRec() claimed success" );
69 if ($code eq 'OK') {
70 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 1 AND host = '$newname'");
71 ok( $rcount == 1, " ... [$rcount] yep, hostname only occurs once" );
72 } else {
73 print "not ok: $msg";
74 }
75 };
[953]76
[963]77 subtest 'CNAME update - non-CNAME to CNAME, colliding' => sub {
78 $newname = 'mx1.example.com';
79 ($code, $msg) = $dnsdb->updateRec('n', 'n', 39, 1, \$newname, \$rectype, \$newval, 900);
80 ok( $code eq 'FAIL', "updateRec() claimed failure" );
81 if ($code eq 'FAIL') {
82 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 1 AND host = '$newname' AND type <> 5");
83 ok( $rcount == 2, " ... [$rcount] record(s) with $newname already exist" );
84 like( $msg, qr/One or more non-CNAME records/, " ... returned matching error" );
85 }
86 };
[953]87
[963]88 subtest 'CNAME update - name to non-colliding name' => sub {
89 $newname = 'imap.example.com';
90 ($code, $msg) = $dnsdb->updateRec('n', 'n', 37, 1, \$newname, \$rectype, \$newval, 900);
91 ok( $code eq 'OK', "updateRec() claimed success" );
92 if ($code eq 'OK') {
93 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 1 AND host = '$newname'");
94 ok( $rcount == 1, " ... [$rcount] yep, hostname only occurs once" );
95 } else {
96 print "not ok: $msg";
97 }
98 };
[953]99
[963]100 subtest 'CNAME update - name to colliding name' => sub {
101 $newname = 'mx1.example.com';
102 ($code, $msg) = $dnsdb->updateRec('n', 'n', 41, 1, \$newname, \$rectype, \$newval, 900);
103 ok( $code eq 'FAIL', "updateRec() claimed failure" );
104 if ($code eq 'FAIL') {
105 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 1 AND host = '$newname' AND type <> 5");
106 ok( $rcount == 2, " ... [$rcount] record(s) with $newname already exist" );
107 like( $msg, qr/One or more non-CNAME records/, " ... returned matching error" );
108 }
109 };
[953]110
[952]111}; # domain tests
112
113
[963]114## Reverse zone tests
[952]115subtest 'Reverse zone tests' => sub {
[951]116
[963]117 subtest 'CNAME add - new reverse name' => sub {
118 $newval = '192.168.2.12';
119 $newname = '12.8-29.2.168.192.in-addr.arpa';
120 ($code, $msg) = $dnsdb->addRec('n', 'y', 1, \$newname, \$rectype, \$newval, 900);
121 ok( $code eq 'OK', "addRec() claimed succeess" );
122 if ($code eq 'OK') {
123 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE rdns_id = 1 AND val = '$newval'");
124 ok( $rcount == 1, " ... [$rcount] yep, IP only occurs once" );
125 } else {
126 print "not ok: $msg\n";
127 }
128 };
[951]129
[963]130 subtest 'CNAME add - existing/colliding non-CNAME' => sub {
131 $newval = '192.168.2.14';
132 $newname = '14.8-29.2.168.192.in-addr.arpa';
133 ($code, $msg) = $dnsdb->addRec('n', 'y', 1, \$newname, \$rectype, \$newval, 900);
134 ok( $code eq 'FAIL', "addRec() claimed failure" );
135 if ($code eq 'FAIL') {
136 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE rdns_id = 1 AND val = '$newval' AND type <> 5");
137 ok( $rcount == 2, " ... [$rcount] record(s) with $newname already exist" );
138 like( $msg, qr/One or more non-CNAME records/, " ... returned matching error" );
139 }
140 };
[951]141
[963]142 subtest 'CNAME add - existing/colliding CNAME' => sub {
143 $newval = '192.168.2.13';
144 $newname = '13.8-29.2.168.192.in-addr.arpa';
145 ($code, $msg) = $dnsdb->addRec('n', 'y', 1, \$newname, \$rectype, \$newval, 900);
146 ok( $code eq 'FAIL', "addRec() claimed failure" );
147 if ($code eq 'FAIL') {
148 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE rdns_id = 1 AND val = '$newval' AND type = 5");
149 ok( $rcount == 1, " ... [$rcount] CNAME already exists" );
150 like( $msg, qr/already a CNAME present/, " ... returned matching error" );
151 }
152 };
[951]153
[964]154 subtest 'CNAME update - non-CNAME to CNAME, non-colliding' => sub {
155 $newval = '192.168.2.15';
156 $newname = '15-29.arpa.example.net';
157 ($code, $msg) = $dnsdb->updateRec('n', 'y', 43, 1, \$newname, \$rectype, \$newval, 900);
158 ok( $code eq 'OK', "updateRec() claimed success" );
159 if ($code eq 'OK') {
160 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE rdns_id = 1 AND val = '$newval'");
161 ok( $rcount == 1, " ... [$rcount] yep, IP only occurs once" );
162 } else {
163 print "not ok: $msg\n";
164 }
165 };
166
167 subtest 'CNAME update - non-CNAME to CNAME, colliding' => sub {
168 $newval = '192.168.2.14';
169 $newname = 'arpa14.rev.example.net';
170 ($code, $msg) = $dnsdb->updateRec('n', 'y', 42, 1, \$newname, \$rectype, \$newval, 900);
171 ok( $code eq 'FAIL', "updateRec() claimed failure updating revzone record type to CNAME" );
172 if ($code eq 'FAIL') {
173 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE rdns_id = 1 AND val = '$newval' AND type <> 5");
174 ok( $rcount == 2, " ... [$rcount] record(s) with $newval already exist" );
175 like( $msg, qr/One or more non-CNAME records/, " ... returned matching error" );
176 }
177 };
178
179 subtest 'CNAME update - name to non-colliding name' => sub {
180 $newval = '192.168.2.11';
181 ($code, $msg) = $dnsdb->updateRec('n', 'y', 34, 1, \$newname, \$rectype, \$newval, 900);
182 ok( $code eq 'OK', "updateRec() claimed success updating revzone CNAME \"hostname\" (non-colliding)" );
183 if ($code eq 'OK') {
184 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE rdns_id = 1 AND val = '$newval'");
185 ok( $rcount == 1, " ... [$rcount] yep, IP only occurs once" );
186 } else {
187 print "not ok: $msg";
188 }
189 };
190
191 subtest 'CNAME update - name to colliding name' => sub {
192 $newval = '192.168.2.17';
193 ($code, $msg) = $dnsdb->updateRec('n', 'y', 46, 1, \$newname, \$rectype, \$newval, 900);
194 ok( $code eq 'FAIL', "updateRec() claimed failure" );
195 if ($code eq 'FAIL') {
196 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE rdns_id = 1 AND val = '$newval' AND type <> 5");
197 ok( $rcount == 1, " ... [$rcount] record(s) with $newval already exist" );
198 like( $msg, qr/One or more non-CNAME records/, " ... returned matching error" );
199 }
200 };
201
[952]202}; # reverse zone tests
203
[963]204
[968]205## Record expiry/valid-after cases
206subtest 'Record expiry/valid-after' => sub {
207
[1015]208 ## Add new CNAME
[968]209 subtest 'CNAME add - nonexpiring' => sub {
[997]210 $newval = 'target.example.com';
211 subtest 'collision with expired record' => sub {
[968]212 $newname = 'expired1.expiry1.test';
213 ($code, $msg) = $dnsdb->addRec('n', 'n', 4, \$newname, \$rectype, \$newval, 900);
[997]214 ok( $code eq 'FAIL', "addRec() claimed failure" );
215 if ($code eq 'FAIL') {
216 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 4 AND host = '$newname'");
[968]217 ok( $rcount == 1, " ... [$rcount] yep, hostname only occurs once" );
[997]218 like( $msg, qr/non-CNAME records with timestamps already exist/, " ... returned matching error" );
[968]219 }
220 };
[990]221# this test arguably overkill, subsumed by earlier test for nonexpiring collision
[997]222 subtest 'collision with soon to expire record' => sub {
[969]223 $newname = 'expired2.expiry1.test';
224 ($code, $msg) = $dnsdb->addRec('n', 'n', 4, \$newname, \$rectype, \$newval, 900);
225 ok( $code eq 'FAIL', "addRec() claimed failure" );
226 if ($code eq 'FAIL') {
227 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 4 AND host = '$newname' AND type <> 5 AND stampactive = 't'");
[975]228 ok( $rcount == 1, " ... [$rcount] record(s) with $newname already exist" );
[969]229# somewhat less overkill if we try to target a unique return based around the expiry bit
[997]230 like( $msg, qr/non-CNAME records with timestamps already exist/, " ... returned matching error" );
[969]231 }
232 };
[997]233 subtest 'collision with pending active-after record' => sub {
[982]234 $newname = 'active-after1.expiry1.test';
235 ($code, $msg) = $dnsdb->addRec('n', 'n', 4, \$newname, \$rectype, \$newval, 900);
[997]236 ok( $code eq 'FAIL', "addRec() claimed success with warning" );
237 if ($code eq 'FAIL') {
[982]238 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 4 AND host = '$newname'");
[997]239 ok( $rcount == 1, " ... [$rcount] correct number of records for $newname" );
240 like( $msg, qr/non-CNAME records with timestamps already exist/, " ... returned matching error" );
[982]241 }
242 };
[997]243 subtest 'collision with active active-after record' => sub {
[984]244 $newname = 'active-after2.expiry1.test';
245 ($code, $msg) = $dnsdb->addRec('n', 'n', 4, \$newname, \$rectype, \$newval, 900);
246 ok( $code eq 'FAIL', "addRec() claimed failure" );
247 if ($code eq 'FAIL') {
248 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 4 AND host = '$newname' AND type <> 5");
249 ok( $rcount == 1, " ... [$rcount] record(s) with $newname already exist" );
[997]250 like( $msg, qr/non-CNAME records with timestamps already exist/, " ... returned matching error" );
[984]251 }
252 };
[982]253 }; # add non-timestamp CNAME
[968]254
[987]255 subtest 'CNAME add - expires soon' => sub {
[1008]256 my @ltime = localtime(time + 86400 * 3);
257 $expirystamp = sprintf "%i-%i-%i %i:%i", $ltime[5] + 1900, ($ltime[4] + 1) % 12, $ltime[3], 15, $ltime[1];
[987]258 $newval = 'target.example.com';
259 subtest 'collision with nonexpiring record' => sub {
260 $newname = 'expires-at1.expiry2.test';
261 ($code, $msg) = $dnsdb->addRec('n', 'n', 5, \$newname, \$rectype, \$newval, 900, undef, 't', $expirystamp);
[991]262 ok($code eq 'FAIL', "addRec() claimed failure");
[987]263 if ($code eq 'FAIL') {
264 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 5 AND host = '$newname'");
265 ok( $rcount == 1, " ... [$rcount] yep, hostname only occurs once" );
266 like( $msg, qr/One or more non-CNAME records/, " ... returned matching error" );
267 }
268 };
269 subtest 'collision with expiring record' => sub {
270 $newname = 'expires-at2.expiry2.test';
271 ($code, $msg) = $dnsdb->addRec('n', 'n', 5, \$newname, \$rectype, \$newval, 900, undef, 't', $expirystamp);
[991]272 ok( $code eq 'FAIL', "addRec() claimed failure");
[987]273 if ($code eq 'FAIL') {
274 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 5 AND host = '$newname' AND type <> 5");
275 ok( $rcount == 1, " ... [$rcount] record(s) with $newname already exist" );
276 like( $msg, qr/One or more non-CNAME records/, " ... returned matching error" );
277 }
278 };
[989]279 subtest 'expire before valid-after record' => sub {
280 $newname = 'expires-at3.expiry2.test';
281 ($code, $msg) = $dnsdb->addRec('n', 'n', 5, \$newname, \$rectype, \$newval, 900, undef, 't', $expirystamp);
[991]282 ok( $code eq 'OK', "addRec() claimed success" );
[989]283 if ($code eq 'OK') {
284 # crosscheck in the DB
285 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 5 AND host = '$newname'");
286 ok( $rcount == 2, " ... [$rcount] correct number of records for $newname" );
287 my ($newstamp) = $dbh->selectrow_array("SELECT extract(epoch from stamp) FROM records WHERE domain_id = 5 AND host = '$newname' ".
[990]288 "AND stampactive = 't' AND expires = 't'");
[989]289 my ($oldstamp) = $dbh->selectrow_array("SELECT extract(epoch from stamp) FROM records WHERE domain_id = 5 AND host = '$newname' ".
[990]290 "AND stampactive = 't' AND expires = 'f'");
[989]291 ok( $newstamp <= $oldstamp, " ... added record expires before existing active-after record goes active" );
292 } else {
293 print "not ok: $msg";
294 }
295 };
[992]296 subtest 'expire after valid-after record' => sub {
297 $newname = 'expires-at4.expiry2.test';
298 ($code, $msg) = $dnsdb->addRec('n', 'n', 5, \$newname, \$rectype, \$newval, 900, undef, 't', $expirystamp);
299 ok( $code eq 'WARN', "addRec() claimed success with warning" );
300 if ($code eq 'WARN') {
301 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 5 AND host = '$newname'");
302 ok( $rcount == 2, " ... [$rcount] correct number of records for $newname" );
303 like( $msg, qr/added with modified expiry time; conflicting valid-after record found/, " ... returned appropriate warning message" );
304 my ($newstamp) = $dbh->selectrow_array("SELECT stamp FROM records WHERE domain_id = 5 AND host = '$newname' ".
305 "AND stampactive = 't' AND expires = 't'");
306 my ($oldstamp) = $dbh->selectrow_array("SELECT stamp FROM records WHERE domain_id = 5 AND host = '$newname' ".
307 "AND stampactive = 't' AND expires = 'f'");
308 ok( $newstamp eq $oldstamp, " ... coerced timestamp matches existing active-after timestamp" );
309 } else {
310 print "not ok: $msg";
311 }
312 };
[994]313 subtest 'collision with expired record' => sub {
314 $newname = 'expires-at5.expiry2.test';
315 ($code, $msg) = $dnsdb->addRec('n', 'n', 5, \$newname, \$rectype, \$newval, 900, undef, 't', $expirystamp);
[1001]316 cmp_ok( $code, 'eq', 'FAIL', "addRec() claimed failure" );
317 if ($code eq 'FAIL') {
[994]318 # crosscheck in the DB
319 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 5 AND host = '$newname'");
[1001]320 ok( $rcount == 1, " ... [$rcount] correct number of records for $newname" );
321 like( $msg, qr/non-CNAME records with timestamps already exist/, " ... returned matching error" );
[994]322 }
323 };
[987]324 }; # add expiring CNAME
325
[1004]326 subtest 'CNAME add - valid after' => sub {
[1008]327 my @ltime = localtime(time + 86400 * 3);
328 $expirystamp = sprintf "%i-%i-%i %i:%i", $ltime[5] + 1900, ($ltime[4] + 1) % 12, $ltime[3], 15, $ltime[1];
[1004]329 $newval = 'target.example.com';
330 subtest 'collision with nonexpiring record' => sub {
331 $newname = 'valid-after1.expiry2.test';
332 ($code, $msg) = $dnsdb->addRec('n', 'n', 5, \$newname, \$rectype, \$newval, 900, undef, 'f', $expirystamp);
333 cmp_ok( $code, 'eq', 'FAIL', "addRec() claimed failure" );
334 if ($code eq 'FAIL') {
335 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 5 AND host = '$newname'");
336 ok( $rcount == 1, " ... [$rcount] yep, hostname only occurs once" );
337 like( $msg, qr/One or more non-CNAME records already exist/, " ... returned matching error" );
338 }
339 };
[1005]340 subtest 'valid before expiring record' => sub {
341 $newname = 'valid-after2.expiry2.test';
342 ($code, $msg) = $dnsdb->addRec('n', 'n', 5, \$newname, \$rectype, \$newval, 900, undef, 'f', $expirystamp);
343 cmp_ok( $code, 'eq', 'WARN', "addRec() claimed failure" );
344 if ($code eq 'WARN') {
[1012]345 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 5 AND host = '$newname'");
346 ok( $rcount == 2, " ... [$rcount] record(s) with $newname found" );
[1005]347 like( $msg, qr/modified valid-after time; conflicting expiring record found/, " ... returned matching error" );
[1012]348 my ($newstamp) = $dbh->selectrow_array("SELECT extract(epoch from stamp) FROM records WHERE domain_id = 5 ".
349 "AND host = '$newname' AND stampactive = 't' AND expires = 't'");
350 my ($oldstamp) = $dbh->selectrow_array("SELECT extract(epoch from stamp) FROM records WHERE domain_id = 5 ".
351 "AND host = '$newname' AND stampactive = 't' AND expires = 'f'");
352 cmp_ok( $newstamp, '>=', $oldstamp, " ... coerced timestamp equal or later than existing expiry timestamp" );
353 } else {
354 print "not ok: $msg";
[1005]355 }
356 };
[1006]357 subtest 'valid after valid-after record' => sub {
358 $newname = 'valid-after3.expiry2.test';
359 ($code, $msg) = $dnsdb->addRec('n', 'n', 5, \$newname, \$rectype, \$newval, 900, undef, 'f', $expirystamp);
360 cmp_ok( $code, 'eq', 'FAIL', "addRec() claimed failure" );
361 if ($code eq 'FAIL') {
362 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 5 AND host = '$newname'");
363 ok( $rcount == 1, " ... [$rcount] correct number of records for $newname" );
364 like( $msg, qr/non-CNAME records with timestamps already exist for/, " ... returned matching error" );
365 }
366 };
[1009]367 subtest 'valid before existing valid-after record' => sub {
368 $newname = 'valid-after4.expiry2.test';
369 ($code, $msg) = $dnsdb->addRec('n', 'n', 5, \$newname, \$rectype, \$newval, 900, undef, 'f', $expirystamp);
370 cmp_ok( $code, 'eq', 'FAIL', "addRec() claimed failure" );
371 if ($code eq 'FAIL') {
372 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 5 AND host = '$newname'");
373 ok( $rcount == 1, " ... [$rcount] correct number of records for $newname" );
374 like( $msg, qr/non-CNAME records with timestamps already exist for/, " ... returned matching error" );
375 }
376 };
[1010]377 subtest 'valid after expiring record' => sub {
378 $newname = 'valid-after5.expiry2.test';
379 ($code, $msg) = $dnsdb->addRec('n', 'n', 5, \$newname, \$rectype, \$newval, 900, undef, 'f', $expirystamp);
380 cmp_ok( $code, 'eq', 'OK', "addRec() claimed success" );
381 if ($code eq 'OK') {
382 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 5 AND host = '$newname'");
383 ok( $rcount == 2, " ... [$rcount] correct number of records for $newname" );
384 } else {
385 print "not ok: $msg\n";
386 }
387 };
388 }; # add valid-after CNAME
[1004]389
[1015]390 ## Tests calling updateRec() instead of addRec()
391 subtest 'Update to CNAME - no timestamp' => sub {
392 $newval = 'target.example.com';
393 subtest 'collision with expired record' => sub {
394 $newname = 'nostamp1a.expiry3.test';
395 ($code, $msg) = $dnsdb->updateRec('n', 'n', 79, 6, \$newname, \$rectype, \$newval, 900);
396 ok( $code eq 'FAIL', "updateRec() claimed failure" );
397 if ($code eq 'FAIL') {
398 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 6 AND host = '$newname'");
399 ok( $rcount == 1, " ... [$rcount] yep, hostname only occurs once" );
400 like( $msg, qr/non-CNAME records with timestamps already exist/, " ... returned matching error" );
401 }
402 };
[1016]403 subtest 'collision with soon to expire record' => sub {
404 $newname = 'nostamp2a.expiry3.test';
405 ($code, $msg) = $dnsdb->updateRec('n', 'n', 80, 6, \$newname, \$rectype, \$newval, 900);
406 ok( $code eq 'FAIL', "updateRec() claimed failure" );
407 if ($code eq 'FAIL') {
408 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 6 AND host = '$newname'");
409 ok( $rcount == 1, " ... [$rcount] yep, hostname only occurs once" );
410 like( $msg, qr/non-CNAME records with timestamps already exist/, " ... returned matching error" );
411 }
412 };
413 subtest 'collision with pending active-after record' => sub {
414 $newname = 'nostamp3a.expiry3.test';
415 ($code, $msg) = $dnsdb->updateRec('n', 'n', 81, 6, \$newname, \$rectype, \$newval, 900);
416 ok( $code eq 'FAIL', "updateRec() claimed failure" );
417 if ($code eq 'FAIL') {
418 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 6 AND host = '$newname'");
419 ok( $rcount == 1, " ... [$rcount] yep, hostname only occurs once" );
420 like( $msg, qr/non-CNAME records with timestamps already exist/, " ... returned matching error" );
421 }
422 };
423 subtest 'collision with active active-after record' => sub {
424 $newname = 'nostamp4a.expiry3.test';
425 ($code, $msg) = $dnsdb->updateRec('n', 'n', 82, 6, \$newname, \$rectype, \$newval, 900);
426 ok( $code eq 'FAIL', "updateRec() claimed failure" );
427 if ($code eq 'FAIL') {
428 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 6 AND host = '$newname'");
429 ok( $rcount == 1, " ... [$rcount] yep, hostname only occurs once" );
430 like( $msg, qr/non-CNAME records with timestamps already exist/, " ... returned matching error" );
431 }
432 };
[1015]433 }; # update to CNAME with no timestamp
434
[1020]435 subtest 'CNAME update - expires soon' => sub {
436 my @ltime = localtime(time + 86400 * 3);
437 $expirystamp = sprintf "%i-%i-%i %i:%i", $ltime[5] + 1900, ($ltime[4] + 1) % 12, $ltime[3], 15, $ltime[1];
438 $newval = 'target.example.com';
439 subtest 'collision with nonexpiring record' => sub {
440 $newname = 'expires1a.expiry3.test';
441 ($code, $msg) = $dnsdb->updateRec('n', 'n', 89, 6, \$newname, \$rectype, \$newval, 900, undef, 't', $expirystamp);
442 ok($code eq 'FAIL', "updateRec() claimed failure");
443 if ($code eq 'FAIL') {
444 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 6 AND host = '$newname'");
445 ok( $rcount == 1, " ... [$rcount] yep, hostname only occurs once" );
446 like( $msg, qr/One or more non-CNAME records/, " ... returned matching error" );
447 }
448 };
[1021]449 subtest 'collision with expiring record' => sub {
450 $newname = 'expires2a.expiry3.test';
451 ($code, $msg) = $dnsdb->updateRec('n', 'n', 90, 6, \$newname, \$rectype, \$newval, 900, undef, 't', $expirystamp);
452 ok( $code eq 'FAIL', "updateRec() claimed failure");
453 if ($code eq 'FAIL') {
454 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 6 AND host = '$newname' AND type <> 5");
455 ok( $rcount == 1, " ... [$rcount] record(s) with $newname already exist" );
456 like( $msg, qr/One or more non-CNAME records/, " ... returned matching error" );
457 }
458 };
[1020]459 };
460
[982]461}; # record expiry/valid-after
[968]462
463
[950]464done_testing();
Note: See TracBrowser for help on using the repository browser.