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

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

/branches/cname-collision

Add the other three tests for "update record to non-timestamp CNAME
colliding with variously timestamped existing record"
See #72, #88

File size: 21.8 KB
Line 
1# -*- Perl -*-
2# Tests for CNAME records
3# Note that not all possible cases are caught!
4# Template records mean not all published records are natively present in the DB
5
6use strict;
7use warnings;
8
9use Test::More;
10use Data::Dumper;
11
12use lib 't';
13
14use DNSTest;
15my $dtest = DNSTest::new;
16
17my ($code,$msg);
18my $rectype = 5;
19my $newname;
20my $newval;
21my $expirystamp;
22my $rcount;
23
24
25## Domain tests
26subtest 'Domain tests' => sub {
27
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 };
41
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 };
52
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 };
63
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 };
76
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 };
87
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 };
99
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 };
110
111}; # domain tests
112
113
114## Reverse zone tests
115subtest 'Reverse zone tests' => sub {
116
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 };
129
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 };
141
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 };
153
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
202}; # reverse zone tests
203
204
205## Record expiry/valid-after cases
206subtest 'Record expiry/valid-after' => sub {
207
208 ## Add new CNAME
209 subtest 'CNAME add - nonexpiring' => sub {
210 $newval = 'target.example.com';
211 subtest 'collision with expired record' => sub {
212 $newname = 'expired1.expiry1.test';
213 ($code, $msg) = $dnsdb->addRec('n', 'n', 4, \$newname, \$rectype, \$newval, 900);
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'");
217 ok( $rcount == 1, " ... [$rcount] yep, hostname only occurs once" );
218 like( $msg, qr/non-CNAME records with timestamps already exist/, " ... returned matching error" );
219 }
220 };
221# this test arguably overkill, subsumed by earlier test for nonexpiring collision
222 subtest 'collision with soon to expire record' => sub {
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'");
228 ok( $rcount == 1, " ... [$rcount] record(s) with $newname already exist" );
229# somewhat less overkill if we try to target a unique return based around the expiry bit
230 like( $msg, qr/non-CNAME records with timestamps already exist/, " ... returned matching error" );
231 }
232 };
233 subtest 'collision with pending active-after record' => sub {
234 $newname = 'active-after1.expiry1.test';
235 ($code, $msg) = $dnsdb->addRec('n', 'n', 4, \$newname, \$rectype, \$newval, 900);
236 ok( $code eq 'FAIL', "addRec() claimed success with warning" );
237 if ($code eq 'FAIL') {
238 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 4 AND host = '$newname'");
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" );
241 }
242 };
243 subtest 'collision with active active-after record' => sub {
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" );
250 like( $msg, qr/non-CNAME records with timestamps already exist/, " ... returned matching error" );
251 }
252 };
253 }; # add non-timestamp CNAME
254
255 subtest 'CNAME add - expires soon' => sub {
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];
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);
262 ok($code eq 'FAIL', "addRec() claimed failure");
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);
272 ok( $code eq 'FAIL', "addRec() claimed failure");
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 };
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);
282 ok( $code eq 'OK', "addRec() claimed success" );
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' ".
288 "AND stampactive = 't' AND expires = 't'");
289 my ($oldstamp) = $dbh->selectrow_array("SELECT extract(epoch from stamp) FROM records WHERE domain_id = 5 AND host = '$newname' ".
290 "AND stampactive = 't' AND expires = 'f'");
291 ok( $newstamp <= $oldstamp, " ... added record expires before existing active-after record goes active" );
292 } else {
293 print "not ok: $msg";
294 }
295 };
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 };
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);
316 cmp_ok( $code, 'eq', 'FAIL', "addRec() claimed failure" );
317 if ($code eq 'FAIL') {
318 # crosscheck in the DB
319 ($rcount) = $dbh->selectrow_array("SELECT count(*) FROM records WHERE domain_id = 5 AND host = '$newname'");
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" );
322 }
323 };
324 }; # add expiring CNAME
325
326 subtest 'CNAME add - valid after' => sub {
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];
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 };
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') {
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" );
347 like( $msg, qr/modified valid-after time; conflicting expiring record found/, " ... returned matching error" );
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";
355 }
356 };
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 };
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 };
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
389
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 };
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 };
433 }; # update to CNAME with no timestamp
434
435}; # record expiry/valid-after
436
437
438done_testing();
Note: See TracBrowser for help on using the repository browser.