dnsruby 1.57.0 → 1.58.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -2
- data/.travis.yml +1 -1
- data/README.md +2 -2
- data/RELEASE_NOTES.md +16 -0
- data/Rakefile +2 -0
- data/dnsruby.gemspec +2 -0
- data/lib/dnsruby.rb +5 -0
- data/lib/dnsruby/bit_mapping.rb +138 -0
- data/lib/dnsruby/bitmap.rb +108 -0
- data/lib/dnsruby/message/decoder.rb +90 -80
- data/lib/dnsruby/message/message.rb +16 -3
- data/lib/dnsruby/message/section.rb +3 -3
- data/lib/dnsruby/name.rb +2 -2
- data/lib/dnsruby/packet_sender.rb +73 -1
- data/lib/dnsruby/resolv.rb +56 -42
- data/lib/dnsruby/resolver.rb +95 -73
- data/lib/dnsruby/resource/GPOS.rb +9 -3
- data/lib/dnsruby/resource/HIP.rb +1 -1
- data/lib/dnsruby/resource/IN.rb +3 -1
- data/lib/dnsruby/resource/NAPTR.rb +2 -2
- data/lib/dnsruby/resource/NSEC3.rb +2 -2
- data/lib/dnsruby/resource/NXT.rb +302 -0
- data/lib/dnsruby/resource/OPT.rb +2 -2
- data/lib/dnsruby/resource/TXT.rb +2 -2
- data/lib/dnsruby/resource/generic.rb +1 -0
- data/lib/dnsruby/resource/type_bitmap.rb +0 -0
- data/lib/dnsruby/select_thread.rb +174 -83
- data/lib/dnsruby/single_resolver.rb +2 -2
- data/lib/dnsruby/version.rb +1 -1
- data/lib/dnsruby/zone_reader.rb +19 -9
- data/lib/dnsruby/zone_transfer.rb +1 -1
- data/test/spec_helper.rb +9 -1
- data/test/tc_axfr.rb +17 -4
- data/test/tc_gpos.rb +3 -3
- data/test/tc_message.rb +7 -1
- data/test/tc_nxt.rb +192 -0
- data/test/tc_recur.rb +2 -1
- data/test/tc_resolv.rb +73 -0
- data/test/tc_resolver.rb +22 -4
- data/test/tc_rr-opt.rb +9 -8
- data/test/tc_rr.rb +22 -0
- data/test/tc_single_resolver.rb +15 -15
- data/test/tc_soak.rb +154 -65
- data/test/tc_soak_base.rb +15 -15
- data/test/tc_tcp.rb +1 -1
- data/test/tc_tcp_pipelining.rb +203 -0
- data/test/tc_zone_reader.rb +73 -0
- data/test/test_dnsserver.rb +208 -0
- data/test/test_utils.rb +49 -0
- data/test/ts_offline.rb +59 -41
- data/test/ts_online.rb +92 -63
- metadata +40 -3
- data/test/tc_dnsruby.rb +0 -51
@@ -114,7 +114,7 @@ module Dnsruby
|
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
117
|
-
isr = PacketSender.new({:server=>@server, :dnssec=>@dnssec,
|
117
|
+
isr = PacketSender.new({:server=>@server, :port=>@port, :dnssec=>@dnssec,
|
118
118
|
:use_tcp=>@use_tcp, :no_tcp=>@no_tcp, :packet_timeout=>@packet_timeout,
|
119
119
|
:tsig => @tsig, :ignore_truncation=>@ignore_truncation,
|
120
120
|
:src_address=>@src_address, :src_address6=>@src_address6, :src_port=>@src_port,
|
@@ -174,4 +174,4 @@ module Dnsruby
|
|
174
174
|
alias :query_timeout :packet_timeout
|
175
175
|
alias :query_timeout= :packet_timeout=
|
176
176
|
end
|
177
|
-
end
|
177
|
+
end
|
data/lib/dnsruby/version.rb
CHANGED
data/lib/dnsruby/zone_reader.rb
CHANGED
@@ -42,14 +42,24 @@ module Dnsruby
|
|
42
42
|
@in_quoted_section = false
|
43
43
|
end
|
44
44
|
|
45
|
-
# Takes a filename string and attempts to load a zone.
|
46
|
-
# of RRs if successful, nil otherwise.
|
47
|
-
def process_file(
|
48
|
-
|
45
|
+
# Takes a filename string, or any type of IO object, and attempts to load a zone.
|
46
|
+
# Returns a list of RRs if successful, nil otherwise.
|
47
|
+
def process_file(source)
|
48
|
+
if source.is_a?(String)
|
49
|
+
File.open(source) do |file|
|
50
|
+
process_io(file)
|
51
|
+
end
|
52
|
+
else
|
53
|
+
process_io(source)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Iterate over each line in a IO object, and process it.
|
58
|
+
# Returns a list of RRs if successful, nil otherwise.
|
59
|
+
def process_io(io)
|
49
60
|
zone = nil
|
50
|
-
|
61
|
+
io.each do |line|
|
51
62
|
begin
|
52
|
-
|
53
63
|
ret = process_line(line)
|
54
64
|
if (ret)
|
55
65
|
rr = RR.create(ret)
|
@@ -59,9 +69,9 @@ module Dnsruby
|
|
59
69
|
zone.push(rr)
|
60
70
|
end
|
61
71
|
rescue Exception => e
|
62
|
-
raise ParseException.new("Error reading line #{
|
72
|
+
raise ParseException.new("Error reading line #{io.lineno} of #{io.inspect} : [#{line}]")
|
63
73
|
end
|
64
|
-
|
74
|
+
end
|
65
75
|
return zone
|
66
76
|
end
|
67
77
|
|
@@ -345,7 +355,7 @@ module Dnsruby
|
|
345
355
|
Types::PTR, Types::DNAME].include?type_was)
|
346
356
|
# if (line[line.length-1, 1] != ".")
|
347
357
|
if (!(/\.\z/ =~ line))
|
348
|
-
line = line + "." + @origin.to_s
|
358
|
+
line = line + "." + @origin.to_s
|
349
359
|
end
|
350
360
|
end
|
351
361
|
# Other RRs have several names. These should be parsed by Dnsruby,
|
data/test/spec_helper.rb
CHANGED
@@ -14,4 +14,12 @@ end
|
|
14
14
|
|
15
15
|
require 'minitest'
|
16
16
|
require 'minitest/autorun'
|
17
|
-
|
17
|
+
|
18
|
+
# This is in a self invoking anonymous lambda so local variables do not
|
19
|
+
# leak to the outer scope.
|
20
|
+
-> do
|
21
|
+
load_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
22
|
+
$LOAD_PATH.unshift(load_dir) unless $LOAD_PATH.include?(load_dir)
|
23
|
+
require_relative '../lib/dnsruby'
|
24
|
+
require_relative 'test_utils'
|
25
|
+
end.()
|
data/test/tc_axfr.rb
CHANGED
@@ -20,12 +20,25 @@ class TestAxfr < Minitest::Test
|
|
20
20
|
def test_axfr
|
21
21
|
zt = Dnsruby::ZoneTransfer.new
|
22
22
|
zt.transfer_type = Dnsruby::Types.AXFR
|
23
|
-
zt.server =
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
zt.server = 'nsztm1.digi.ninja'
|
24
|
+
|
25
|
+
if contactable?(zt.server)
|
26
|
+
zone = zt.transfer('zonetransfer.me')
|
27
|
+
assert(zone.length > 0)
|
28
|
+
assert_nil(zt.last_tsigstate)
|
29
|
+
end
|
27
30
|
end
|
28
31
|
|
32
|
+
def contactable?(server)
|
33
|
+
begin
|
34
|
+
sock = UDPSocket.new
|
35
|
+
sock.connect(server, 25)
|
36
|
+
sock.close
|
37
|
+
true
|
38
|
+
rescue Exception
|
39
|
+
false
|
40
|
+
end
|
41
|
+
end
|
29
42
|
|
30
43
|
# NB - test_ixfr is in tc_tsig.rg - this is becuase it requires
|
31
44
|
# TSIG to make an update (which we can then test for with ixfr)
|
data/test/tc_gpos.rb
CHANGED
@@ -70,9 +70,9 @@ class TestGPOS < Minitest::Test
|
|
70
70
|
|
71
71
|
def test_creation_approaches
|
72
72
|
|
73
|
-
ans_from_data = RR::GPOS.
|
74
|
-
ans_from_string = RR::GPOS.
|
75
|
-
ans_from_hash = RR::GPOS.
|
73
|
+
ans_from_data = RR::GPOS.new_from_data(*EXAMPLE_GPOS_DATA)
|
74
|
+
ans_from_string = RR::GPOS.new_from_string(EXAMPLE_GPOS_STRING)
|
75
|
+
ans_from_hash = RR::GPOS.new_from_hash(EXAMPLE_GPOS_HASH)
|
76
76
|
|
77
77
|
fails_to_populate_rdata = []
|
78
78
|
fails_to_populate_rdata << 'data' if ans_from_data.rdata.nil?
|
data/test/tc_message.rb
CHANGED
@@ -27,7 +27,7 @@ class TestMessage < Minitest::Test
|
|
27
27
|
# ;; Security Level : UNCHECKED
|
28
28
|
# ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7195
|
29
29
|
# ;; flags: ; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
|
30
|
-
def
|
30
|
+
def sample_message
|
31
31
|
Message.new('cnn.com', 'A')
|
32
32
|
end
|
33
33
|
|
@@ -84,4 +84,10 @@ class TestMessage < Minitest::Test
|
|
84
84
|
test.(msg_a, nil, false)
|
85
85
|
# TODO: Add more tests.
|
86
86
|
end
|
87
|
+
|
88
|
+
def test_equals
|
89
|
+
response_as_string = "\x10\a\x81\x90\x00\x01\x00\x04\x00\x00\x00\x06\x03cnn\x03com\x00\x00\x02\x00\x01\xC0\f\x00\x02\x00\x01\x00\x01QC\x00\x14\x03ns3\ntimewarner\x03net\x00\xC0\f\x00\x02\x00\x01\x00\x01QC\x00\x11\x03ns2\x03p42\x06dynect\xC04\xC0\f\x00\x02\x00\x01\x00\x01QC\x00\x06\x03ns1\xC0)\xC0\f\x00\x02\x00\x01\x00\x01QC\x00\x06\x03ns1\xC0I\xC0%\x00\x01\x00\x01\x00\x001\xA2\x00\x04\xC7\aD\xEE\xC0E\x00\x01\x00\x01\x00\x00\xB1\x0E\x00\x04\xCC\r\xFA*\xC0b\x00\x01\x00\x01\x00\x009`\x00\x04\xCCJl\xEE\xC0t\x00\x01\x00\x01\x00\x00\xBDg\x00\x04\xD0NF*\xC0t\x00\x1C\x00\x01\x00\x00\x00\xBB\x00\x10 \x01\x05\x00\x00\x90\x00\x01\x00\x00\x00\x00\x00\x00\x00B\x00\x00)\x0F\xA0\x00\x00\x80\x00\x00\x00".force_encoding("ASCII-8BIT")
|
90
|
+
message = Message.decode(response_as_string)
|
91
|
+
assert(message == message, message.to_s)
|
92
|
+
end
|
87
93
|
end
|
data/test/tc_nxt.rb
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
require_relative '../lib/dnsruby/resource/NXT'
|
4
|
+
require_relative '../lib/dnsruby/code_mappers'
|
5
|
+
|
6
|
+
include Dnsruby
|
7
|
+
|
8
|
+
# Tests NXT resource record. See bottom of file for sample zone file.
|
9
|
+
class TestNXT < Minitest::Test
|
10
|
+
|
11
|
+
# Get this by running the following script:
|
12
|
+
# require 'dnsruby'
|
13
|
+
# include Dnsruby
|
14
|
+
# query = Message.new('a.dnsruby.com', 'NXT')
|
15
|
+
# resolver = Resolver.new('127.0.0.1')
|
16
|
+
# response, error = resolver.query_raw(query)
|
17
|
+
# puts response.encode.inspect # to get a quoted string to be inserted in source code
|
18
|
+
|
19
|
+
|
20
|
+
EXAMPLE_NXT_RESPONSE_AS_BINARY = \
|
21
|
+
"\xC2\xE0\x84\x80\x00\x01\x00\x01\x00\x01" +
|
22
|
+
"\x00\x01\x01a\adnsruby\x03com\x00" +
|
23
|
+
"\x00\x1E\x00\x01\xC0\f\x00\x1E\x00\x01\x00\x00*0\x00\x13\x01b\adnsruby\x03com\x00" +
|
24
|
+
"@\x00\x00\n\xC0\x0E\x00\x02\x00\x01\x00\x00*0\x00\x06\x03ns1\xC0\x0E\xC0J\x00\x01\x00" +
|
25
|
+
"\x01\x00\x00*0\x00\x04\x7F\x00\x00\x01"
|
26
|
+
|
27
|
+
def test_type_val_to_string
|
28
|
+
assert_equal 'SOA', RR::NXT::NxtTypes.code_to_name(6)
|
29
|
+
assert_equal 'AXFR', RR::NXT::NxtTypes.code_to_name(252)
|
30
|
+
assert_equal 'TYPE9999', RR::NXT::NxtTypes.code_to_name(9999)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_type_name_to_code
|
34
|
+
assert_equal 6, RR::NXT::NxtTypes.name_to_code('SOA')
|
35
|
+
assert_equal 252, RR::NXT::NxtTypes.name_to_code('AXFR')
|
36
|
+
assert_equal 9999, RR::NXT::NxtTypes.name_to_code('TYPE9999')
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_type_names_to_codes
|
40
|
+
strings = %w(TYPE9999 SOA AXFR)
|
41
|
+
assert_equal [9999, 6, 252], RR::NXT::NxtTypes.names_to_codes(strings)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_type_name_to_codes
|
45
|
+
assert_equal [9999, 6, 252], RR::NXT::NxtTypes.names_string_to_codes("TYPE9999 SOA AXFR")
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_codes_to_names
|
49
|
+
assert_equal %w(TYPE9999 SOA AXFR), RR::NXT::NxtTypes.codes_to_names([9999, 6, 252])
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_codes_to_string
|
53
|
+
assert_equal 'SOA AXFR TYPE9999', RR::NXT::NxtTypes.codes_to_string([6, 252, 9999])
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_codes_to_name_sorts_by_code
|
57
|
+
assert_equal 'SOA AXFR TYPE9999', RR::NXT::NxtTypes.codes_to_string([9999, 6, 252])
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_binary_string_to_codes
|
61
|
+
test_type_codes_as_code_array = [1, 6, 28, 100]
|
62
|
+
test_type_codes_as_name_array = %w(A SOA AAAA UINFO)
|
63
|
+
test_type_codes_as_number = 1267650600228229401496971640898 # (2 ** 1) + (2 ** 6) + (2 ** 28) + (2 ** 100)
|
64
|
+
test_type_codes_as_binary_string = "\x10\x0\x0\x0\x0\x0\x0\x0\x0\x10\x0\x0\x42"
|
65
|
+
assert_equal(test_type_codes_as_code_array, RR::NXT::NxtTypes.binary_string_to_codes(test_type_codes_as_binary_string))
|
66
|
+
assert_equal(test_type_codes_as_name_array, RR::NXT::NxtTypes.binary_string_to_names(test_type_codes_as_binary_string))
|
67
|
+
assert_equal(test_type_codes_as_binary_string, RR::NXT::NxtTypes.codes_to_binary_string(test_type_codes_as_code_array))
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_that_codes_are_in_range_1_to_127
|
71
|
+
TestUtils.assert_not_raised(ArgumentError) { RR::NXT::NxtTypes.codes_to_binary_string([1]) }
|
72
|
+
TestUtils.assert_not_raised(ArgumentError) { RR::NXT::NxtTypes.codes_to_binary_string([127]) }
|
73
|
+
assert_raises(ArgumentError) { RR::NXT::NxtTypes.codes_to_binary_string([0]) }
|
74
|
+
assert_raises(ArgumentError) { RR::NXT::NxtTypes.codes_to_binary_string([128]) }
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_that_zero_bit_set_raises_error
|
78
|
+
assert_raises(ArgumentError) { RR::NXT::NxtTypes.codes_to_binary_string([]) }
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_A_AAAA_NXT
|
82
|
+
assert_equal([1, 28, 30], RR::NXT::NxtTypes.names_string_to_codes('A AAAA NXT'))
|
83
|
+
assert_equal("P\x00\x00\x02", RR::NXT::NxtTypes.codes_to_binary_string([1, 28, 30]))
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_type_bitmap_ctor_is_private
|
87
|
+
assert_raises(NoMethodError) { RR::NXT::TypeBitmap.new('') }
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_type_bitmap_to_s
|
91
|
+
type_bitmap = RR::NXT::TypeBitmap.from_type_codes([1, 16, 30])
|
92
|
+
assert_equal('A TXT NXT', type_bitmap.to_s)
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_parse_response_correctly
|
96
|
+
response = Message.decode(EXAMPLE_NXT_RESPONSE_AS_BINARY)
|
97
|
+
answer = response.answer
|
98
|
+
nxt_record = answer[0]
|
99
|
+
|
100
|
+
# Note: Although the NXT class is defined as Dnsruby::RR::NXT and not
|
101
|
+
# Dnsruby::RR::IN::NXT, the IN module (in IN.rb) creates new classes
|
102
|
+
# in the IN module for all class-insensitive resource record classes.
|
103
|
+
# When the binary record is parsed, it is a Dnsruby::RR::IN::NXT
|
104
|
+
# that is created.
|
105
|
+
assert_equal(Dnsruby::RR::IN::NXT, nxt_record.class)
|
106
|
+
actual_tokens = nxt_record.to_s.split
|
107
|
+
expected_tokens = 'a.dnsruby.com. 10800 IN NXT b.dnsruby.com A AAAA NXT'.split
|
108
|
+
assert_equal(actual_tokens, expected_tokens)
|
109
|
+
end
|
110
|
+
|
111
|
+
def assert_rr_content(rr)
|
112
|
+
assert_equal(rr.type, 'NXT') # TODO: Should this be a string or a number?
|
113
|
+
assert_equal(rr.name, Name.create('b.dnsruby.com.'))
|
114
|
+
assert_equal(rr.ttl, 10800)
|
115
|
+
assert_equal(rr.klass, 'IN')
|
116
|
+
assert_equal(rr.next_domain, Name.create('a.dnsruby.com.'))
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_new_from_string
|
120
|
+
rr = RR::NXT.new_from_string('b.dnsruby.com. 10800 IN NXT a.dnsruby.com. SOA NXT')
|
121
|
+
assert_rr_content(rr)
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_new_from_hash
|
125
|
+
assert_rr_content(sample_nxt_rr)
|
126
|
+
end
|
127
|
+
|
128
|
+
def test_new_from_data
|
129
|
+
rdata = RR::NXT.build_rdata('a.dnsruby.com.', [Types::SOA, Types::NXT])
|
130
|
+
|
131
|
+
rr = RR::NXT.new_from_data('b.dnsruby.com.', Types::NXT, Classes::IN, 10800,
|
132
|
+
rdata.size, rdata, 0)
|
133
|
+
assert_rr_content(rr)
|
134
|
+
end
|
135
|
+
|
136
|
+
def test_owner_alias
|
137
|
+
rr = sample_nxt_rr
|
138
|
+
assert_equal('b.dnsruby.com', rr.owner.to_s)
|
139
|
+
assert_equal('b.dnsruby.com', rr.name.to_s)
|
140
|
+
new_name = Name.create('z.com')
|
141
|
+
rr.owner = new_name
|
142
|
+
assert_equal(new_name, rr.owner)
|
143
|
+
assert_equal(new_name, rr.name)
|
144
|
+
end
|
145
|
+
|
146
|
+
|
147
|
+
def test_encode_decode_message
|
148
|
+
nxt_rr = sample_nxt_rr
|
149
|
+
message = Message.new
|
150
|
+
message.add_answer(nxt_rr)
|
151
|
+
binary_message = message.encode
|
152
|
+
reconstructed_message = Message.decode(binary_message)
|
153
|
+
reconstructed_nxt_rr = reconstructed_message.answer[0]
|
154
|
+
assert_equal(nxt_rr, reconstructed_nxt_rr)
|
155
|
+
end
|
156
|
+
|
157
|
+
def sample_nxt_rr
|
158
|
+
RR::NXT.new_from_hash(
|
159
|
+
name: 'b.dnsruby.com.',
|
160
|
+
ttl: 10800,
|
161
|
+
klass: Classes::IN,
|
162
|
+
next_domain: 'a.dnsruby.com.',
|
163
|
+
types: [Types::SOA, Types::NXT])
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
# Sample zone file for setting up BIND to serve a NXT record:
|
170
|
+
=begin
|
171
|
+
$TTL 3h
|
172
|
+
|
173
|
+
@ IN SOA dnsruby.com. foo.dnsruby.com. (
|
174
|
+
1 ; serial
|
175
|
+
3H ; refresh after 3 hours
|
176
|
+
1H ; retry after 1 hour
|
177
|
+
1W ; expire after 1 week
|
178
|
+
1H) ; negative caching TTL of 1 hour
|
179
|
+
|
180
|
+
dnsruby.com. IN NS ns1
|
181
|
+
|
182
|
+
; Addresses for canonical names
|
183
|
+
|
184
|
+
ns1.dnsruby.com. IN A 127.0.0.1
|
185
|
+
|
186
|
+
a.dnsruby.com. IN A 2.4.6.8
|
187
|
+
IN NXT b A AAAA NXT
|
188
|
+
|
189
|
+
b.dnsruby.com. IN A 2.4.6.9
|
190
|
+
IN GPOS 40 50 60
|
191
|
+
|
192
|
+
=end
|
data/test/tc_recur.rb
CHANGED
@@ -23,7 +23,8 @@ class TestRecur < Minitest::Test
|
|
23
23
|
# Dnsruby::TheLog.level = Logger::DEBUG
|
24
24
|
ret = r.query("uk", Dnsruby::Types.DNSKEY)
|
25
25
|
# print ret
|
26
|
-
assert
|
26
|
+
assert ret, "Query result was nil."
|
27
|
+
assert ret.answer.length > 0, "Answer length should > 0, but was #{ret.answer.length}."
|
27
28
|
# ret = r.query_dorecursion("aaa.bigzone.uk-dnssec.nic.uk", Dnsruby::Types.DNSKEY)
|
28
29
|
# ret = r.query_dorecursion("uk-dnssec.nic.uk", Dnsruby::Types.DNSKEY)
|
29
30
|
end
|
data/test/tc_resolv.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
# --
|
2
|
+
# Copyright 2007 Nominet UK
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
# ++
|
16
|
+
|
17
|
+
require_relative 'spec_helper'
|
18
|
+
require_relative '../lib/dnsruby/resolv'
|
19
|
+
|
20
|
+
include Dnsruby
|
21
|
+
class TestResolv < Minitest::Test
|
22
|
+
|
23
|
+
RELATIVE_NAME = 'google-public-dns-a.google.com'
|
24
|
+
ABSOLUTE_NAME = RELATIVE_NAME + '.'
|
25
|
+
IPV4_ADDR = '8.8.8.8'
|
26
|
+
IPV6_ADDR = '2001:4860:4860::8888'
|
27
|
+
ADDRESSES = [IPV4_ADDR, IPV6_ADDR]
|
28
|
+
|
29
|
+
|
30
|
+
def test_resolv_name_to_addresses
|
31
|
+
|
32
|
+
assert_equal(IPV4_ADDR, Dnsruby::Resolv.getaddress(ABSOLUTE_NAME).to_s)
|
33
|
+
|
34
|
+
addresses = Dnsruby::Resolv.getaddresses(ABSOLUTE_NAME)
|
35
|
+
|
36
|
+
case addresses.length
|
37
|
+
when 1
|
38
|
+
assert_equal IPV4_ADDR, addresses.first.to_s
|
39
|
+
Dnsruby::Resolv.each_address(ABSOLUTE_NAME) do |address|
|
40
|
+
assert_equal IPV4_ADDR, address.to_s
|
41
|
+
end
|
42
|
+
when 2
|
43
|
+
assert_equal ADDRESSES.sort, addresses.map(&:to_s).sort
|
44
|
+
addresses_from_each = []
|
45
|
+
Dnsruby::Resolv.each_address(ABSOLUTE_NAME) do |address|
|
46
|
+
addresses_from_each << address.to_s
|
47
|
+
end
|
48
|
+
assert_equal ADDRESSES.sort, addresses_from_each.sort
|
49
|
+
else
|
50
|
+
raise "Addresses length must be 1 or 2 but was #{addresses.length}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
def test_resolv_address_to_name
|
56
|
+
|
57
|
+
assert_equal(RELATIVE_NAME, Dnsruby::Resolv.getname(IPV4_ADDR).to_s)
|
58
|
+
|
59
|
+
assert_raises(Dnsruby::Resolv::ResolvError) do
|
60
|
+
Dnsruby::Resolv.getname(RELATIVE_NAME)
|
61
|
+
end
|
62
|
+
|
63
|
+
names = Dnsruby::Resolv.getnames(IPV4_ADDR)
|
64
|
+
assert_equal(1, names.size)
|
65
|
+
assert_equal(RELATIVE_NAME, names.first.to_s)
|
66
|
+
Dnsruby::Resolv.each_name(IPV4_ADDR) { |name| assert_equal(RELATIVE_NAME, name.to_s)}
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_resolv_address_to_address
|
70
|
+
local = '127.0.0.1'
|
71
|
+
assert_equal(local, Dnsruby::Resolv.new.getaddress(local))
|
72
|
+
end
|
73
|
+
end
|
data/test/tc_resolver.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
# --
|
2
2
|
# Copyright 2007 Nominet UK
|
3
|
-
#
|
3
|
+
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
5
|
# you may not use this file except in compliance with the License.
|
6
6
|
# You may obtain a copy of the License at
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# Unless required by applicable law or agreed to in writing, software
|
11
11
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
12
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either tmexpress or implied.
|
@@ -157,7 +157,7 @@ class TestResolver < Minitest::Test
|
|
157
157
|
# assert(m == nil)
|
158
158
|
# assert(err.kind_of?(OtherResolvError) || err.kind_of?(IOError), "OtherResolvError or IOError expected : got #{err.class}")
|
159
159
|
# end
|
160
|
-
#
|
160
|
+
#
|
161
161
|
def test_nxdomain
|
162
162
|
resolver = Resolver.new
|
163
163
|
q = Queue.new
|
@@ -291,6 +291,10 @@ end
|
|
291
291
|
# Tests to see that query_raw handles send_plain_message's return values correctly.
|
292
292
|
class TestRawQuery < Minitest::Test
|
293
293
|
|
294
|
+
KEY_NAME = 'key-name'
|
295
|
+
KEY = '0123456789'
|
296
|
+
ALGO = 'hmac-md5'
|
297
|
+
|
294
298
|
class CustomError < RuntimeError; end
|
295
299
|
|
296
300
|
# Returns a new resolver whose send_plain_message method always returns
|
@@ -357,5 +361,19 @@ class TestRawQuery < Minitest::Test
|
|
357
361
|
assert_nil error
|
358
362
|
assert_equal :response_from_send_plain_message, response
|
359
363
|
end
|
364
|
+
|
365
|
+
def test_2_args_init
|
366
|
+
options = Resolver.create_tsig_options(KEY_NAME, KEY)
|
367
|
+
assert_equal KEY_NAME, options[:name]
|
368
|
+
assert_equal KEY, options[:key]
|
369
|
+
assert_nil options[:algorithm]
|
370
|
+
end
|
371
|
+
|
372
|
+
def test_3_args_init
|
373
|
+
options = Resolver.create_tsig_options(KEY_NAME,KEY,ALGO)
|
374
|
+
assert_equal KEY_NAME, options[:name]
|
375
|
+
assert_equal KEY, options[:key]
|
376
|
+
assert_equal ALGO, options[:algorithm]
|
377
|
+
end
|
360
378
|
end
|
361
379
|
|