1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
|
package Net::DNS::Resolver::Mock;
use strict;
use warnings;
our $VERSION = '1.20200215'; # VERSION
use base 'Net::DNS::Resolver';
use Net::DNS::Packet;
use Net::DNS::Question;
use Net::DNS::ZoneFile;
my $die_on = {};
{
my @_debug_output;
sub enable_debug {
my ( $self ) = @_;
$self->{_mock_debug} = 1;
$self->_add_debug( "Net::DNS::Resolver::Mock Debugging enabled" );
return;
}
sub disable_debug {
my ( $self ) = @_;
$self->clear_debug();
delete $self->{_mock_debug};
return;
}
sub _add_debug {
my ( $self, $debug ) = @_;
push @_debug_output, $debug;
warn $debug;
return;
}
sub clear_debug {
my ( $self ) = @_;
@_debug_output = ();
return;
}
sub get_debug {
my ( $self ) = @_;
return @_debug_output;
}
}
sub die_on {
my ( $self, $name, $type, $error ) = @_;
$die_on->{ "$name $type" } = $error;
return;
}
sub zonefile_read {
my ( $self, $zonefile ) = @_;
$self->{ 'zonefile' } = Net::DNS::ZoneFile->read( $zonefile );
return;
}
sub zonefile_parse {
my ( $self, $zonefile ) = @_;
$self->{ 'zonefile' } = Net::DNS::ZoneFile->parse( $zonefile );
return;
}
sub send {
my ( $self, $name, $type ) = @_;
$self->_add_debug( "DNS Lookup '$name' '$type'" ) if $self->{_mock_debug};
if ( exists ( $die_on->{ "$name $type" } ) ) {
die $die_on->{ "$name $type" };
}
$name =~ s/\.$//;
my $FakeZone = $self->{ 'zonefile' };
my $origname = $name;
if ( lc $type eq 'ptr' ) {
if ( index( lc $name, '.in-addr.arpa' ) == -1 ) {
if ( $name =~ /^\d+\.\d+\.\d+\.\d+$/ ) {
$name = join( '.', reverse( split( /\./, $name ) ) );
$name .= '.in-addr.arpa';
}
}
}
my $Packet = Net::DNS::Packet->new();
$Packet->push( 'question' => Net::DNS::Question->new( $origname, $type, 'IN' ) );
foreach my $Item ( @$FakeZone ) {
my $itemname = $Item->name();
my $itemtype = $Item->type();
if ( ( lc $itemname eq lc $name ) && ( lc $itemtype eq lc $type ) ) {
$Packet->push( 'answer' => $Item );
}
elsif ( ( lc $itemname eq lc $name ) && ( lc $itemtype eq lc 'cname' ) ) {
$Packet->push( 'answer' => $Item );
}
}
$Packet->{ 'answerfrom' } = '127.0.0.1';
$Packet->{ 'status' } = 33152;
return $Packet;
}
1;
__END__
=head1 NAME
Net::DNS::Resolver::Mock - Mock a DNS Resolver object for testing
=head1 DESCRIPTION
A subclass of Net::DNS::Resolver which parses a zonefile for it's data source. Primarily for use in testing.
=for markdown [](https://github.com/marcbradshaw/Net-DNS-Resolver-Mock)
=for markdown [](https://travis-ci.org/marcbradshaw/Net-DNS-Resolver-Mock)
=for markdown [](https://github.com/marcbradshaw/Net-DNS-Resolver-Mock/issues)
=for markdown [](https://metacpan.org/release/Net-DNS-Resolver-Mock)
=for markdown [](http://cpants.cpanauthors.org/dist/Net-DNS-Resolver-Mock)
=head1 SYNOPSIS
use Net::DNS::Resolver::Mock;
my $Resolver = Net::DNS::Resolver::Mock-new();
$Resolver->zonefile_read( $FileName );
# or
$Resolver->zonefile_parse( $String );
=head1 PUBLIC METHODS
=over
=item zonefile_read ( $FileName )
Reads specified file for zone data
=item zonefile_parse ( $String )
Reads the zone data from the supplied string
=item die_on ( $Name, $Type, $Error )
Die with $Error for a query of $Name and $Type
=item enable_debug ()
Once set, the resolver will write any lookups received to STDERR
and will be available via the following methods
=item disble_debug ()
Disable debugging
=item clear_debug ()
Clear the debugging list
=item get_debug ()
Returns a list of debugging entries
=back
=head1 DEPENDENCIES
Net::DNS::Resolver
Net::DNS::Packet
Net::DNS::Question
Net::DNS::ZoneFile
=head1 BUGS
Please report bugs via the github tracker.
https://github.com/marcbradshaw/Net-DNS-Resolver-Mock/issues
=head1 AUTHORS
Marc Bradshaw, E<lt>marc@marcbradshaw.netE<gt>
=head1 COPYRIGHT
Copyright (c) 2017, Marc Bradshaw.
=head1 LICENCE
This library is free software; you may redistribute it and/or modify it
under the same terms as Perl itself.
=cut
|