1#!/usr/bin/perl
2#
3# Copyright (C) 2004, 2007, 2010  Internet Systems Consortium, Inc. ("ISC")
4# Copyright (C) 2002  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# DNSSEC 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# Installation notes:
29#
30# This program uses the Net::DNS::Resolver module.
31# You can install it by saying
32#
33#    perl -MCPAN -e "install Net::DNS"
34#
35# $Id: dnssec_update_test.pl,v 1.7 2010/08/13 23:47:03 tbox Exp $
36#
37
38use Getopt::Std;
39use Net::DNS;
40use Net::DNS::Update;
41use Net::DNS::Resolver;
42
43$opt_s = "127.0.0.1";
44$opt_p = 53;
45
46getopt('s:p:');
47
48$res = new Net::DNS::Resolver;
49$res->nameservers($opt_s);
50$res->port($opt_p);
51$res->defnames(0); # Do not append default domain.
52
53@ARGV == 1 or die
54    "usage: perl update_test.pl [-s server] [-p port] zone\n";
55
56$zone = shift @ARGV;
57
58my $failures = 0;
59
60sub assert {
61    my ($cond, $explanation) = @_;
62    if (!$cond) {
63	print "I:Test Failed: $explanation ***\n";
64	$failures++
65    }
66}
67
68sub test {
69    my ($expected, @records) = @_;
70
71    my $update = new Net::DNS::Update("$zone");
72
73    foreach $rec (@records) {
74	$update->push(@$rec);
75    }
76
77    $reply = $res->send($update);
78
79    # Did it work?
80    if (defined $reply) {
81	my $rcode = $reply->header->rcode;
82        assert($rcode eq $expected, "expected $expected, got $rcode");
83    } else {
84	print "I:Update failed: ", $res->errorstring, "\n";
85    }
86}
87
88sub section {
89    my ($msg) = @_;
90    print "I:$msg\n";
91}
92
93section("Add a name");
94test("NOERROR", ["update", rr_add("a.$zone 300 A 73.80.65.49")]);
95
96section("Delete the name");
97test("NOERROR", ["update", rr_del("a.$zone")]);
98
99if ($failures) {
100    print "I:$failures update tests failed.\n";
101} else {
102    print "I:All update tests successful.\n";
103}
104
105exit $failures;
106