# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'
######################### We start with some black magic to print on failure.
# Change 1..1 below to 1..last_test_to_print .
# (It may become useful if the test is moved to ./t subdirectory.)
BEGIN { $| = 1; print "1..20\n"; }
END {print "not ok 1\n" unless $loaded;}
use Net::DNS::Codes qw(:all );
use Net::DNS::ToolKit qw(
newhead
put_qdcount
put_ancount
inet_aton
inet_ntoa
get1char
parse_char
);
use Net::DNS::ToolKit::Debug qw(
print_head
print_buf
);
use Net::DNS::ToolKit::RR;
$loaded = 1;
print "ok 1\n";
######################### End of black magic.
# Insert your test code below (better if it prints "ok 13"
# (correspondingly "not ok 13") depending on the success of chunk 13
# of the test code):
$test = 2;
sub ok {
print "ok $test\n";
++$test;
}
##################################################
# first 10 test are from Question.t
# and are just setup + a little checking
##################################################
## test 2 generate a header for a question
my $buffer = '';
my $off = newhead(\$buffer,
12345, # id
QR | BITS_QUERY | RD | RA, # query response, query, recursion desired, recursion available
);
print "bad question size $off\nnot "
unless $off == NS_HFIXEDSZ;
&ok;
sub expect {
my $x = shift;
my @exp;
foreach(split(/\n/,$x)) {
if ($_ =~ /0x\w+\s+(\d+) /) {
push @exp,$1;
}
}
return @exp;
}
sub print_ptrs {
foreach(@_) {
print "$_ ";
}
print "\n";
}
sub chk_exp {
my($bp,$exp) = @_;
my @expect = expect($$exp);
foreach(0..length($$bp) -1) {
$char = get1char($bp,$_);
next if $char == $expect[$_];
print "buffer mismatch $_, got: $char, exp: $expect[$_]\nnot ";
last;
}
&ok;
}
my ($get,$put,$parse) = new Net::DNS::ToolKit::RR;
## test 3 append question
# expect this from print_buf
my $exptext = q(
0 : 0011_0000 0x30 48 0
1 : 0011_1001 0x39 57 9
2 : 1000_0001 0x81 129
3 : 1000_0000 0x80 128
4 : 0000_0000 0x00 0
5 : 0000_0001 0x01 1
6 : 0000_0000 0x00 0
7 : 0000_0000 0x00 0
8 : 0000_0000 0x00 0
9 : 0000_0000 0x00 0
10 : 0000_0000 0x00 0
11 : 0000_0000 0x00 0
12 : 0000_0011 0x03 3
13 : 0110_0110 0x66 102 f
14 : 0110_1111 0x6F 111 o
15 : 0110_1111 0x6F 111 o
16 : 0000_0011 0x03 3
17 : 0110_0010 0x62 98 b
18 : 0110_0001 0x61 97 a
19 : 0111_0010 0x72 114 r
20 : 0000_0011 0x03 3
21 : 0110_0011 0x63 99 c
22 : 0110_1111 0x6F 111 o
23 : 0110_1101 0x6D 109 m
24 : 0000_0000 0x00 0
25 : 0000_0000 0x00 0
26 : 0000_1111 0x0F 15
27 : 0000_0000 0x00 0
28 : 0000_0001 0x01 1
);
my $name = 'foo.bar.com';
my @dnptrs;
my $type = T_MX;
my $class = C_IN;
(my $newoff,@dnptrs) = $put->Question(\$buffer,$off,$name,$type,$class);
put_qdcount(\$buffer,1);
#print_head(\$buffer);
#print_buf(\$buffer);
#print_ptrs(@dnptrs);
#print $newoff,"\n";
chk_exp(\$buffer,\$exptext);
## test 4 check offset
print "bad offset, $newoff, exp: 29\nnot "
unless $newoff == 29;
&ok;
## test 5 get Question, check name
($newoff,$newname,$newtype,$newclass) = $get->Question(\$buffer,$off);
print "bad name, $newname, exp: $name\nnot "
unless $newname eq $name;
&ok;
## test 6 check type
print "bad type: ",TypeTxt->{$newtype},", exp: ",TypeTxt->{$type},"\nnot "
unless $newtype == $type;
&ok;
## test 7 check class
print "bad type: ",ClassTxt->{$newclass},", exp: ",ClassTxt->{$class},"\nnot "
unless $newclass == $class;
&ok;
## test 8 parse record, check name .. should be pass thru
($name,$type,$class) = $parse->Question($newname,$newtype,$newclass);
print "bad name, $name, exp: $newname.\nnot "
unless $newname.'.' eq $name;
&ok;
## test 9 check type
print "bad type: $type, exp: ",TypeTxt->{$newtype},"\nnot "
unless $type eq TypeTxt->{$newtype};
&ok;
## test 10 check class
print "bad class: $class, exp: ",ClassTxt->{$newclass},"\nnot "
unless $class eq ClassTxt->{$newclass};
&ok;
############ real tests follow
## test 11 autoload A.pm
$exptext = q(
0 : 0011_0000 0x30 48 0
1 : 0011_1001 0x39 57 9
2 : 1000_0001 0x81 129
3 : 1000_0000 0x80 128
4 : 0000_0000 0x00 0
5 : 0000_0001 0x01 1
6 : 0000_0000 0x00 0
7 : 0011_1010 0x3A 58 :
8 : 0000_0000 0x00 0
9 : 0000_0000 0x00 0
10 : 0000_0000 0x00 0
11 : 0000_0000 0x00 0
12 : 0000_0011 0x03 3
13 : 0110_0110 0x66 102 f
14 : 0110_1111 0x6F 111 o
15 : 0110_1111 0x6F 111 o
16 : 0000_0011 0x03 3
17 : 0110_0010 0x62 98 b
18 : 0110_0001 0x61 97 a
19 : 0111_0010 0x72 114 r
20 : 0000_0011 0x03 3
21 : 0110_0011 0x63 99 c
22 : 0110_1111 0x6F 111 o
23 : 0110_1101 0x6D 109 m
24 : 0000_0000 0x00 0
25 : 0000_0000 0x00 0
26 : 0000_1111 0x0F 15
27 : 0000_0000 0x00 0
28 : 0000_0001 0x01 1
29 : 0000_0101 0x05 5
30 : 0110_0111 0x67 103 g
31 : 0110_1111 0x6F 111 o
32 : 0110_1111 0x6F 111 o
33 : 0111_0011 0x73 115 s
34 : 0110_0101 0x65 101 e
35 : 0000_0110 0x06 6
36 : 0110_1110 0x6E 110 n
37 : 0110_1111 0x6F 111 o
38 : 0111_0100 0x74 116 t
39 : 0110_0110 0x66 102 f
40 : 0110_1111 0x6F 111 o
41 : 0110_1111 0x6F 111 o
42 : 1100_0000 0xC0 192
43 : 0001_0000 0x10 16
44 : 0000_0000 0x00 0
45 : 0000_0001 0x01 0
46 : 0000_0000 0x00 0
47 : 0000_0001 0x01 1
48 : 0000_0000 0x00 0
49 : 0000_0001 0x01 1
50 : 0101_0001 0x51 81 Q
51 : 1000_0000 0x80 128
52 : 0000_0000 0x00 0
53 : 0000_0100 0x04 4
54 : 0000_1010 0x0A 10
55 : 0000_0001 0x01 1
56 : 0000_0010 0x02 2
57 : 0000_0011 0x03 3
);
$name = 'goose.notfoo.bar.com';
my $IPaddr = '10.1.2.3';
my $netaddr = inet_aton($IPaddr);
$off = $newoff;
my $ttl = 86400;
$type = 0; # non-existent type, tests false anyway
# NO, as of RR.pm v0.07, should process as TYPE0
$class = C_IN;
($newoff,@dnptrs) = $put->A(\$buffer,$off,\@dnptrs,$name,$type,$class,$ttl,$netaddr);
my $putoff = put_ancount(\$buffer,$newoff);
#print_buf(\$buffer);
#print_ptrs(@dnptrs);
chk_exp(\$buffer,\$exptext);
## test 12 check offset
print "bad offset, $newoff, exp: 58\nnot "
unless $newoff == 58;
&ok;
## test 13 get, check offset
$newoff = 0;
($newoff,$newname,$newtype,$newclass, my $newttl, my $rdlength, my $rdata) = $get->next(\$buffer,$off);
#print "$newoff, $newname, $newtype, $newclass, $newttl, $rdlength, $rdata\n";
print "bad offset, $newoff, exp: 58\nnot "
unless $newoff == 58;
&ok;
## test 14 check name
print "bad name, $newname, exp: $name\nnot "
unless $newname eq $name;
&ok;
## test 15 check type
print "bad type: ",TypeTxt->{$newtype},", exp: ",TypeTxt->{$type},"\nnot "
unless $newtype == $type;
&ok;
## test 16 check class
print "bad type: ",ClassTxt->{$newclass},", exp: ",ClassTxt->{$class},"\nnot "
unless $newclass == $class;
&ok;
## test 17 check ttl
print "bad ttl, $newttl, exp: $ttl\nnot "
unless $newttl == $ttl;
&ok;
## test 18 check rdlength
print "bad rdlength, $rdlength, exp: 4\nnot "
unless $rdlength == 4;
&ok;
### test 19 check for null
#print "got: $rdata, exp: (null)\nnot "
# unless $rdata eq "\0";
# as of RR.pm v0.07, should process as A record to this point
my $got = inet_ntoa($rdata);
print "got: $got, exp: $IPaddr\nnot "
unless $got eq $IPaddr;
&ok;
# add a test for v0.07
### test 20 check returned text representation
my $exp = '\# 4 0a010203';
($newname,$newtype,$newclass, $newttl, $rdlength, $rdata) =
$parse->TYPE0($newname,$newtype,$newclass, $newttl, $rdlength, $rdata);
print "got: $rdata\nexp: $exp\nnot "
unless $rdata eq $exp;
&ok;