1#!/usr/bin/perl
2#
3# Copyright (C) 2004, 2007  Internet Systems Consortium, Inc. ("ISC")
4# Copyright (C) 2000, 2001  Internet Software Consortium.
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# Dynamic update test suite.
20#
21# Usage:
22#
23#   perl update_test.pl [-s server] [-p port] zone
24#
25# The server defaults to 127.0.0.1.
26# The port defaults to 53.
27#
28# The "Special NS rules" tests will only work correctly if the
29# has no NS records to begin with, or alternatively has a
30# single NS record pointing at the name "ns1" (relative to
31# the zone name).
32#
33# Installation notes:
34#
35# This program uses the Net::DNS::Resolver module.
36# You can install it by saying
37#
38#    perl -MCPAN -e "install Net::DNS"
39#
40# $Id: update.pl,v 1.5 2007/06/19 23:47:05 tbox Exp $
41#
42
43use Getopt::Std;
44use Net::DNS;
45use Net::DNS::Update;
46use Net::DNS::Resolver;
47
48$opt_s = "127.0.0.1";
49$opt_p = 53;
50
51getopt('s:p:');
52
53$res = new Net::DNS::Resolver;
54$res->nameservers($opt_s);
55$res->port($opt_p);
56$res->defnames(0); # Do not append default domain.
57
58@ARGV == 1 or die
59    "usage: perl update_test.pl [-s server] [-p port] zone\n";
60
61$zone = shift @ARGV;
62
63my $failures = 0;
64
65sub assert {
66    my ($cond, $explanation) = @_;
67    if (!$cond) {
68	print "I:Test Failed: $explanation ***\n";
69	$failures++
70    }
71}
72
73sub test {
74    my ($expected, @records) = @_;
75
76    my $update = new Net::DNS::Update("$zone");
77
78    foreach $rec (@records) {
79	$update->push(@$rec);
80    }
81
82    $reply = $res->send($update);
83
84    # Did it work?
85    if (defined $reply) {
86	my $rcode = $reply->header->rcode;
87        assert($rcode eq $expected, "expected $expected, got $rcode");
88    } else {
89	print "I:Update failed: ", $res->errorstring, "\n";
90    }
91}
92
93sub section {
94    my ($msg) = @_;
95    print "I:$msg\n";
96}
97
98for ($i = 0; $i < 1000; $i++) {
99    test("NOERROR", ["update", rr_add("dynamic-$i.$zone 300 TXT txt-$i" )]);
100}
101
102if ($failures) {
103    print "I:$failures tests failed.\n";
104} else {
105    print "I:Update of $opt_s zone $zone successful.\n";
106}
107exit $failures;
108