dnsruby 1.60.2 → 1.61.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.travis.yml +9 -6
- data/.yardopts +7 -0
- data/README.md +7 -4
- data/RELEASE_NOTES.md +43 -0
- data/Rakefile +1 -0
- data/demo/digroot.rb +2 -0
- data/demo/rubydig.rb +1 -0
- data/dnsruby.gemspec +15 -8
- data/lib/dnsruby/code_mappers.rb +3 -0
- data/lib/dnsruby/config.rb +30 -8
- data/lib/dnsruby/dnssec.rb +4 -0
- data/lib/dnsruby/hosts.rb +8 -4
- data/lib/dnsruby/message/encoder.rb +2 -2
- data/lib/dnsruby/message/header.rb +15 -15
- data/lib/dnsruby/name.rb +18 -2
- data/lib/dnsruby/packet_sender.rb +14 -2
- data/lib/dnsruby/recursor.rb +10 -1
- data/lib/dnsruby/resolver.rb +11 -0
- data/lib/dnsruby/resource/CAA.rb +1 -1
- data/lib/dnsruby/resource/CDNSKEY.rb +17 -0
- data/lib/dnsruby/resource/CDS.rb +35 -0
- data/lib/dnsruby/resource/DNSKEY.rb +33 -6
- data/lib/dnsruby/resource/IN.rb +4 -1
- data/lib/dnsruby/resource/URI.rb +57 -0
- data/lib/dnsruby/resource/generic.rb +3 -0
- data/lib/dnsruby/select_thread.rb +1 -1
- data/lib/dnsruby/single_verifier.rb +27 -4
- data/lib/dnsruby/validator_thread.rb +4 -4
- data/lib/dnsruby/version.rb +1 -1
- data/lib/dnsruby/zone_transfer.rb +5 -1
- data/test/localdns.rb +29 -0
- data/test/tc_caa.rb +0 -1
- data/test/tc_dns.rb +11 -1
- data/test/tc_dnskey.rb +29 -0
- data/test/tc_encoding.rb +31 -0
- data/test/tc_hs.rb +4 -3
- data/test/tc_long_labels.rb +46 -0
- data/test/tc_name.rb +19 -0
- data/test/tc_resolv.rb +5 -4
- data/test/tc_resolver.rb +28 -2
- data/test/tc_rr-opt.rb +9 -3
- data/test/tc_rr.rb +33 -0
- data/test/tc_soak.rb +33 -67
- data/test/tc_tcp_pipelining.rb +27 -19
- data/test/tc_verifier.rb +15 -0
- data/test/test_dnsserver.rb +110 -17
- metadata +50 -44
data/lib/dnsruby/version.rb
CHANGED
@@ -33,6 +33,8 @@ module Dnsruby
|
|
33
33
|
attr_reader :tsig
|
34
34
|
# Returns the tsigstate of the last transfer (nil if no TSIG signed transfer has occurred)
|
35
35
|
attr_reader :last_tsigstate
|
36
|
+
# Sets the connect timeout in seconds
|
37
|
+
attr_accessor :connect_timeout
|
36
38
|
|
37
39
|
# Sets the TSIG to sign the zone transfer with.
|
38
40
|
# Pass in either a Dnsruby::RR::TSIG, or a key_name and key (or just a key)
|
@@ -54,6 +56,7 @@ module Dnsruby
|
|
54
56
|
@tsig = nil
|
55
57
|
@axfr = nil
|
56
58
|
@src_address = nil
|
59
|
+
@connect_timeout = 5
|
57
60
|
end
|
58
61
|
|
59
62
|
# Perform a zone transfer (RFC1995)
|
@@ -107,7 +110,8 @@ module Dnsruby
|
|
107
110
|
def do_transfer(zone, server) #:nodoc: all
|
108
111
|
@transfer_type = Types.new(@transfer_type)
|
109
112
|
@state = :InitialSoa
|
110
|
-
socket =
|
113
|
+
socket = Socket.tcp(server, @port, @src_address, connect_timeout: @connect_timeout)
|
114
|
+
# socket = TCPSocket.new(server, @port, @src_address)
|
111
115
|
begin
|
112
116
|
# Send an initial query
|
113
117
|
msg = Message.new(zone, @transfer_type, @klass)
|
data/test/localdns.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative 'spec_helper'
|
4
|
+
|
5
|
+
require_relative "test_dnsserver"
|
6
|
+
|
7
|
+
class SimpleTCPPipeliningUDPServer < Async::DNS::Server
|
8
|
+
PORT = 53938
|
9
|
+
IP = '127.0.0.1'
|
10
|
+
|
11
|
+
def initialize(**options)
|
12
|
+
super(options)
|
13
|
+
|
14
|
+
@handlers << TcpPipelineHandler.new(self, IP, PORT)
|
15
|
+
@handlers << Async::DNS::UDPServerHandler.new(self, IP, PORT)
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def process(name, resource_class, transaction)
|
20
|
+
@logger.debug "name: #{name}"
|
21
|
+
transaction.respond!("93.184.216.34", { resource_class: ::Resolv::DNS::Resource::IN::A })
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
if __FILE__ == $0
|
28
|
+
RubyDNS::run_server(server_class: SimpleTCPPipeliningUDPServer)
|
29
|
+
end
|
data/test/tc_caa.rb
CHANGED
data/test/tc_dns.rb
CHANGED
@@ -247,6 +247,16 @@ class TestDNS < Minitest::Test
|
|
247
247
|
assert_equal(a[0].name.to_s, 'a.t.net-dns.org',"Correct name (with persistent socket and #{method})")
|
248
248
|
# assert_equal(a[0].name.to_s, 'a.t.dnsruby.validation-test-servers.nominet.org.uk',"Correct name (with persistent socket and #{method})")
|
249
249
|
end
|
250
|
-
|
251
250
|
end
|
251
|
+
|
252
|
+
def test_port
|
253
|
+
d = DNS.new({:port => 5353})
|
254
|
+
assert(d.to_s.include?"5353")
|
255
|
+
end
|
256
|
+
|
257
|
+
def test_port_nil
|
258
|
+
d = DNS.new({:port => nil})
|
259
|
+
assert(d.to_s.include? Dnsruby::Config::DEFAULT_PORT.to_s)
|
260
|
+
end
|
261
|
+
|
252
262
|
end
|
data/test/tc_dnskey.rb
CHANGED
@@ -85,4 +85,33 @@ class DnskeyTest < Minitest::Test
|
|
85
85
|
dnskey.protocol=3
|
86
86
|
|
87
87
|
end
|
88
|
+
|
89
|
+
def test_ecdsa_integrity
|
90
|
+
ecdsa_256_pub = 'example.com. 3600 IN DNSKEY 256 3 13 ( oJMRESz5E4gYzS/q6XD' +
|
91
|
+
'rvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA== )'
|
92
|
+
|
93
|
+
dnskey = Dnsruby::RR.create(ecdsa_256_pub)
|
94
|
+
assert_equal(3, dnskey.protocol)
|
95
|
+
assert_equal(256, dnskey.flags)
|
96
|
+
assert_equal(Dnsruby::Algorithms::ECDSAP256SHA256, dnskey.algorithm)
|
97
|
+
assert_equal(Dnsruby::RR::DNSKEY::ZONE_KEY, dnskey.flags & Dnsruby::RR::DNSKEY::ZONE_KEY)
|
98
|
+
assert_equal(0, dnskey.flags & Dnsruby::RR::DNSKEY::SEP_KEY)
|
99
|
+
|
100
|
+
dnskey2 = Dnsruby::RR.create(dnskey.to_s)
|
101
|
+
assert(dnskey2.to_s == dnskey.to_s, "#{dnskey} not equal to \n#{dnskey2}")
|
102
|
+
|
103
|
+
ecdsa_384_pub = 'example.com. 3600 IN DNSKEY 256 3 14 ( Bl2HDw98sGin4lNlx7n' +
|
104
|
+
'QX3w98jx6UhAgC73Jq+6LFlD12gnVTMHecM8Z GoTFSh+mV+qEPFZ5s3NbC4qvwUW0kkPb+0ip' +
|
105
|
+
'CuLRwZYhYKk7D+RDb+fX XozI9hhZrsXBcEhss )'
|
106
|
+
|
107
|
+
dnskey = Dnsruby::RR.create(ecdsa_384_pub)
|
108
|
+
assert_equal(3, dnskey.protocol)
|
109
|
+
assert_equal(256, dnskey.flags)
|
110
|
+
assert_equal(Dnsruby::Algorithms::ECDSAP384SHA384, dnskey.algorithm)
|
111
|
+
assert_equal(Dnsruby::RR::DNSKEY::ZONE_KEY, dnskey.flags & Dnsruby::RR::DNSKEY::ZONE_KEY)
|
112
|
+
assert_equal(0, dnskey.flags & Dnsruby::RR::DNSKEY::SEP_KEY)
|
113
|
+
|
114
|
+
dnskey2 = Dnsruby::RR.create(dnskey.to_s)
|
115
|
+
assert(dnskey2.to_s == dnskey.to_s, "#{dnskey} not equal to \n#{dnskey2}")
|
116
|
+
end
|
88
117
|
end
|
data/test/tc_encoding.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
require 'socket'
|
4
|
+
|
5
|
+
# @TODO@ We also need a test server so we can control behaviour of server to test
|
6
|
+
# different aspects of retry strategy.
|
7
|
+
# Of course, with Ruby's limit of 256 open sockets per process, we'd need to run
|
8
|
+
# the server in a different Ruby process.
|
9
|
+
|
10
|
+
class TestEncoding < Minitest::Test
|
11
|
+
|
12
|
+
include Dnsruby
|
13
|
+
|
14
|
+
Thread::abort_on_exception = true
|
15
|
+
|
16
|
+
Dnsruby::TheLog.level = Logger::DEBUG
|
17
|
+
|
18
|
+
|
19
|
+
def test_cdnskey
|
20
|
+
rrString = "tjeb.nl.\t3600\tIN\tCDNSKEY\t256 3 RSASHA1-NSEC3-SHA1 ( AwEAAcglEOS7bECRK5fqTuGTMJycmDhTzmUu/EQbAhKJOYJxDb5SG/RYqsJgzG7wgtGy0W1aP7I4k6SPtHmwcqjLaZLVUwRNWCGr2adjb9JTFyBR7F99Ngi11lEGM6Uiw/eDRk66lhoSGzohjj/rmhRTV6gN2+0ADPnafv3MBkPgryA3 ) ; key_tag=53177"
|
21
|
+
rr = RR.create(rrString)
|
22
|
+
puts rr
|
23
|
+
puts rrString
|
24
|
+
assert(rrString.to_s == rr.to_s)
|
25
|
+
m = Dnsruby::Message.new
|
26
|
+
m.add_additional(rr)
|
27
|
+
m2 = Message.decode(m.encode)
|
28
|
+
rr2 = m2.additional()[0]
|
29
|
+
assert(rr.to_s == rr2.to_s)
|
30
|
+
end
|
31
|
+
end
|
data/test/tc_hs.rb
CHANGED
@@ -12,11 +12,12 @@ class TestDNS < Minitest::Test
|
|
12
12
|
# the response returns with an rcode of NOTIMP and a Dnsruby::NotImp error.
|
13
13
|
def test_hs_class_returns_notimp_code_and_error
|
14
14
|
resolver_host = 'a.gtld-servers.net'
|
15
|
-
resolver = Resolver.new(resolver_host)
|
16
|
-
|
15
|
+
resolver = Dnsruby::Resolver.new(resolver_host)
|
16
|
+
resolver.query_timeout = 20
|
17
|
+
message = Dnsruby::Message.new('test.com', 'A', 'HS')
|
17
18
|
response, error = resolver.send_plain_message(message)
|
18
19
|
|
19
|
-
assert_equal(RCode::NOTIMP, response.rcode)
|
20
|
+
assert_equal(Dnsruby::RCode::NOTIMP, response.rcode)
|
20
21
|
assert_equal(Dnsruby::NotImp, error.class)
|
21
22
|
end
|
22
23
|
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
include Dnsruby
|
4
|
+
class TestPacket < Minitest::Test
|
5
|
+
def test_labels
|
6
|
+
wirePacket = %w{0
|
7
|
+
68 5b 35 91 3a f7 00 0f 94 22 d9 51 08 00 45 00 05 12 71 65 40 00 3d 06 46 1f 2e e3 90 33
|
8
|
+
c0 a8 01 a3 00 35 e3 cf 94 d5 49 0a 88 da e7 1e 80 18 00 1d 6f 52 00 00 01 01 08 0a 8e 3a
|
9
|
+
a6 b1 1f 4d ce 28 c5 b1 c0 0c 00 0c 00 01 00 00 0b 49 00 12 0f 69 6d 70 72 6f 76 65 61 6e
|
10
|
+
61 6c 79 73 69 73 c0 65 c0 0c 00 0c 00 01 00 00 0b 49 00 0e 0b 77 69 6e 64 6f 77 73 72 75
|
11
|
+
62 79 d3 12 c0 0c 00 0c 00 01 00 00 0b 49 00 15 12 6d 69 63 72 6f 73 6f 66 74 66 6f 72 65
|
12
|
+
66 72 6f 6e 74 d3 bd c0 0c 00 0c 00 01 00 00 0b 49 00 11 09 6d 69 63 72 6f 73 6f 66 74 02
|
13
|
+
63 6f 02 6d 7a 00 c0 0c 00 0c 00 01 00 00 0b 49 00 12 09 77 69 6e 64 6f 77 73 78 70 03 6f
|
14
|
+
72 67 02 70 65 00 c0 0c 00 0c 00 01 00 00 0b 49 00 16 0f 65 75 67 72 61 6e 74 73 61 64 76
|
15
|
+
69 73 6f 72 03 63 6f 6d ca 49 c0 0c 00 0c 00 01 00 00 0b 49 00 14 11 64 65 66 79 61 6c 6c
|
16
|
+
63 68 61 6c 6c 65 6e 67 65 73 c5 97 c0 0c 00 0c 00 01 00 00 0b 49 00 18 15 63 6f 6e 73 6f
|
17
|
+
6c 69 64 61 74 65 64 6d 65 73 73 65 6e 67 65 72 c0 65 c0 0c 00 0c 00 01 00 00 0b 49 00 19
|
18
|
+
16 72 65 74 61 69 6c 65 78 65 63 75 74 69 76 65 73 65 6d 69 6e 61 72 c0 a7 c0 0c 00 0c 00
|
19
|
+
01 00 00 0b 49 00 0e 0b 63 74 72 6f 70 65 6e 6f 72 6d 65 c0 65 c0 0c 00 0c 00 01 00 00 0b
|
20
|
+
49 00 0e 0b 77 69 6e 64 6f 77 73 32 30 30 30 cc 6f c0 0c 00 0c 00 01 00 00 0b 49 00 1a 17
|
21
|
+
77 69 6e 64 6f 77 73 6d 6f 62 69 6c 65 63 6f 6d 6d 6d 75 6e 69 74 79 c0 41 c0 0c 00 0c 00
|
22
|
+
01 00 00 0b 49 00 11 0e 72 69 73 65 6f 66 70 65 72 61 74 68 69 61 c0 41 c0 0c 00 0c 00 01
|
23
|
+
00 00 0b 49 00 11 0e 72 65 6e 63 6f 6e 74 72 65 73 2d 33 36 30 c0 41 c0 0c 00 0c 00 01 00
|
24
|
+
00 0b 49 00 11 0e 66 75 74 75 72 65 70 6f 73 74 6d 61 69 6c c0 41 c0 0c 00 0c 00 01 00 00
|
25
|
+
0b 49 00 10 0d 72 65 73 70 6f 6e 73 65 70 6f 69 6e 74 cc 4d c0 0c 00 0c 00 01 00 00 0b 49
|
26
|
+
00 10 0d 74 61 76 75 74 61 74 72 6f 6e 63 68 65 c0 a7 c0 0c 00 0c 00 01 00 00 0b 49 00 09
|
27
|
+
06 66 6c 65 78 67 6f df 34 c0 0c 00 0c 00 01 00 00 0b 49 00 0e 09 77 69 6e 64 6f 77 73 78
|
28
|
+
70 02 73 68 00 c0 0c 00 0c 00 01 00 00 0b 49 00 16 13 73 6d 61 72 74 70 68 6f 6e 65 63 6f
|
29
|
+
6d 6d 75 6e 69 74 79 c0 a7 c0 0c 00 0c 00 01 00 00 0b 49 00 12 0f 63 65 6e 74 72 65 64 65
|
30
|
+
73 75 73 61 67 65 73 c0 65 c0 0c 00 0c 00 01 00 00 0b 49 00 0c 09 77 69 6e 64 6f 77 73 6e
|
31
|
+
74 fc 07 c0 0c 00 0c 00 01 00 00 0b 49 00 19 16 6c 65 73 2d 64 6f 69 67 74 73 2d 64 61 6e
|
32
|
+
73 2d 6c 65 2d 6e 65 7a c0 a7 c0 0c 00 0c 00 01 00 00 0b 49 00 13 10 74 65 63 68 6e 65 74
|
33
|
+
63 68 61 6c 6c 65 6e 67 65 c0 65 c0 0c 00 0c 00 01 00 00 0b 49 00 15 12 6d 69 63 72 6f 73 6f 66 74 66 6f 72 65 66 72 6f 6e 74 c0 41 c0 0c 00 0c 00 01 00 00 0b 49 00 10 0d 6c 65 73 62 6f 6e 73 6f 75 74 69 6c 73 c0 41 c0 0c 00 0c 00 01 00 00 0b 49 00 0d 0a 77 69 6e 74 65 72 6e 61 6c 73 c3 d6 c0 0c 00 0c 00 01 00 00 0b 49 00 23 0e 64 65 73 69 67 6e 65 64 66 6f 72 62 69 67 02 64 65 0e 64 65 73 69 67 6e 65 64 66 6f 72 62 69 67 c2 b2 c0 0c 00 0c 00 01 00 00 0b 49 00 13 10 77 69 6e 64 6f 77 73 76 69 73 74 61 62 6c 6f 67 c9 42 c0 0c 00 0c 00 01 00 00 0b 49 00 12 09 77 69 6e 64 6f 77 73 6e 74 03 6f 72 67 02 66 6a 00 c0 0c 00 0c 00 01 00 00 0b 49 00 0c 09 77 69 6e 64 6f 77 73 6e 74 c1 b6 c0 0c 00 0c 00 01 00 00 0b 49 00 0f 0c 6f 66 66 69 63 65 73 79 73 74 65 6d c2 18 c0 0c 00 0c 00 01 00 00 0b 49 00 0f 0c 74 72 65 79 72 65 73 65 61 72 63 68 c0 41 c0 0c 00 0c 00 01 00 00 0b 49 00 09 06 63 70 61 6e 64 6c c0 65 c0 0c 00 0c 00 01 00 00 0b 49 00 16 13 6f 66 66 72 65 2d 65 62 6c 6f 75 69 73 73 61 6e 74 65 73 c0 41 c0 0c 00 0c 00 01 00 00 0b 49 00 0d 0a 63 6f 68 6f 77 69 6e 65 72 79 c0 41 c0 0c 00 0c 00 01 00 00 0b 49 00 13 10 74 6f 64 6f 73 6c 6f 65 6e 74 69 65 6e 64 65 6e c0 41 c0 0c 00 0c 00 01 00 00 0b 49 00 0f 09 77 69 6e 64 6f 77 73 78 70 02 63 6f f1 03 c0 0c 00 0c 00 01 00 00 0b 49 00 0b 08 74 65 63 68 65 64 30 36 c0 65 c0 0c 00 0c 00 01 00 00 0b 49 00 09 06 66 6c 65 78 67 6f dd 7f c0 0c 00 0c 00 01 00 00 0b 49 00 0c 09 66 6f 72 65 66 72 6f 6e 74 cb 21 c0 0c 00 0c 00 01 00 00 0b 49 00 14 11 64 65 66 79 61 6c 6c 63 68 61 6c 6c 65 6e 67 65 73 cb 44 00 00 29 05 78 00 00 80 00 00 00
|
34
|
+
}
|
35
|
+
wirePacket.map!{|e| e.hex}
|
36
|
+
packetdata = wirePacket.pack('c*')
|
37
|
+
|
38
|
+
packet = Message.decode(packetdata)
|
39
|
+
assert(packet, 'new data returned something'); #28
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_live
|
43
|
+
resolver = Dnsruby::Resolver.new
|
44
|
+
query = resolver.query('207.46.197.32', 'PTR', 'IN')
|
45
|
+
end
|
46
|
+
end
|
data/test/tc_name.rb
CHANGED
@@ -80,4 +80,23 @@ class TestName < Minitest::Test
|
|
80
80
|
n2 = Name.create("nall.all.")
|
81
81
|
assert(n1 == n2, n1.to_s)
|
82
82
|
end
|
83
|
+
|
84
|
+
def test_punycode
|
85
|
+
[
|
86
|
+
[
|
87
|
+
"møllerriis.com",
|
88
|
+
"xn--mllerriis-l8a.com"
|
89
|
+
],
|
90
|
+
[
|
91
|
+
"フガフガ。hogehoge.エグザンプル.JP",
|
92
|
+
"xn--mcka5jb.hogehoge.xn--ickqs6k2dyb.jp"
|
93
|
+
],
|
94
|
+
[
|
95
|
+
"フガ#フガ。hogehoge.エグザンプル.JP",
|
96
|
+
"xn--#-yeub5nc.hogehoge.xn--ickqs6k2dyb.jp"
|
97
|
+
]
|
98
|
+
].each do |tc|
|
99
|
+
assert_equal(Dnsruby::Name.create(tc[0]).to_s, tc[1])
|
100
|
+
end
|
101
|
+
end
|
83
102
|
end
|
data/test/tc_resolv.rb
CHANGED
@@ -20,6 +20,7 @@ require_relative '../lib/dnsruby/resolv'
|
|
20
20
|
class TestResolv < Minitest::Test
|
21
21
|
|
22
22
|
RELATIVE_NAME = 'google-public-dns-a.google.com'
|
23
|
+
SHORT_RELATIVE_NAME = 'dns.google'
|
23
24
|
ABSOLUTE_NAME = RELATIVE_NAME + '.'
|
24
25
|
IPV4_ADDR = '8.8.8.8'
|
25
26
|
IPV6_ADDR = '2001:4860:4860::8888'
|
@@ -53,16 +54,16 @@ class TestResolv < Minitest::Test
|
|
53
54
|
|
54
55
|
def test_resolv_address_to_name
|
55
56
|
|
56
|
-
assert_equal(
|
57
|
+
assert_equal(SHORT_RELATIVE_NAME, Dnsruby::Resolv.getname(IPV4_ADDR).to_s)
|
57
58
|
|
58
59
|
assert_raises(Dnsruby::ResolvError) do
|
59
|
-
Dnsruby::Resolv.getname(
|
60
|
+
Dnsruby::Resolv.getname(SHORT_RELATIVE_NAME)
|
60
61
|
end
|
61
62
|
|
62
63
|
names = Dnsruby::Resolv.getnames(IPV4_ADDR)
|
63
64
|
assert_equal(1, names.size)
|
64
|
-
assert_equal(
|
65
|
-
Dnsruby::Resolv.each_name(IPV4_ADDR) { |name| assert_equal(
|
65
|
+
assert_equal(SHORT_RELATIVE_NAME, names.first.to_s)
|
66
|
+
Dnsruby::Resolv.each_name(IPV4_ADDR) { |name| assert_equal(SHORT_RELATIVE_NAME, name.to_s)}
|
66
67
|
end
|
67
68
|
|
68
69
|
def test_resolv_address_to_address
|
data/test/tc_resolver.rb
CHANGED
@@ -138,7 +138,7 @@ class TestResolver < Minitest::Test
|
|
138
138
|
ret.each_answer do |answer|
|
139
139
|
if (answer.type==Types.PTR)
|
140
140
|
no_pointer=false
|
141
|
-
assert(answer.domainname.to_s=~/google
|
141
|
+
assert(answer.domainname.to_s=~/google/)
|
142
142
|
end
|
143
143
|
end
|
144
144
|
assert(!no_pointer)
|
@@ -171,7 +171,7 @@ class TestResolver < Minitest::Test
|
|
171
171
|
# test timeout behaviour for different retry, retrans, total timeout etc.
|
172
172
|
# Problem here is that many sockets will be created for queries which time out.
|
173
173
|
# Run a query which will not respond, and check that the timeout works
|
174
|
-
if (
|
174
|
+
if (RUBY_PLATFORM !~ /darwin/)
|
175
175
|
start=stop=0
|
176
176
|
retry_times = 3
|
177
177
|
retry_delay=1
|
@@ -374,5 +374,31 @@ class TestRawQuery < Minitest::Test
|
|
374
374
|
assert_equal KEY, options[:key]
|
375
375
|
assert_equal ALGO, options[:algorithm]
|
376
376
|
end
|
377
|
+
|
378
|
+
def test_threads
|
379
|
+
resolver = Dnsruby::Resolver.new(nameserver: ["8.8.8.8", "8.8.4.4"])
|
380
|
+
resolver.query("google.com", "MX")
|
381
|
+
resolver.query("google.com", "MX")
|
382
|
+
resolver.query("google.com", "MX")
|
383
|
+
begin
|
384
|
+
resolver.query("googlöe.com", "MX")
|
385
|
+
rescue Dnsruby::ResolvError => e
|
386
|
+
# fine
|
387
|
+
end
|
388
|
+
resolver.query("google.com", "MX")
|
389
|
+
resolver.query("google.com", "MX")
|
390
|
+
begin
|
391
|
+
resolver.query("googlöe.com", "MX")
|
392
|
+
rescue Dnsruby::ResolvError => e
|
393
|
+
# fine
|
394
|
+
end
|
395
|
+
begin
|
396
|
+
resolver.query("googlöe.com", "MX")
|
397
|
+
rescue Dnsruby::ResolvError => e
|
398
|
+
# fine
|
399
|
+
end
|
400
|
+
# Dnsruby::Cache.delete("googlöe.com", "MX")
|
401
|
+
|
402
|
+
end
|
377
403
|
end
|
378
404
|
|
data/test/tc_rr-opt.rb
CHANGED
@@ -28,10 +28,13 @@ class TestRrOpt < Minitest::Test
|
|
28
28
|
# This works only with send_plain_message, not send_message, query, etc.
|
29
29
|
def test_plain_respects_bufsize
|
30
30
|
|
31
|
-
|
31
|
+
|
32
|
+
resolver = Resolver.new(['a.gtld-servers.net', 'b.gtld-servers.net', 'c.gtld-servers.net'])
|
33
|
+
resolver.query_timeout=20
|
32
34
|
|
33
35
|
run_test = ->(bufsize) do
|
34
36
|
|
37
|
+
|
35
38
|
create_test_query = ->(bufsize) do
|
36
39
|
message = Message.new('com', Types.ANY, Classes.IN)
|
37
40
|
message.add_additional(RR::OPT.new(bufsize))
|
@@ -40,13 +43,16 @@ class TestRrOpt < Minitest::Test
|
|
40
43
|
|
41
44
|
query = create_test_query.(bufsize)
|
42
45
|
response, _error = resolver.send_plain_message(query)
|
46
|
+
if (_error != nil) then
|
47
|
+
print "Error at #{bufsize} : #{_error}"
|
48
|
+
end
|
43
49
|
# puts "\nBufsize is #{bufsize}, binary message size is #{response.encode.size}"
|
44
50
|
assert_equal(true, response.header.tc)
|
45
51
|
assert(response.encode.size <= bufsize)
|
46
52
|
end
|
47
53
|
|
48
|
-
run_test.(512)
|
49
|
-
run_test.(612)
|
54
|
+
#run_test.(512)
|
55
|
+
#run_test.(612)
|
50
56
|
run_test.(4096)
|
51
57
|
end
|
52
58
|
|
data/test/tc_rr.rb
CHANGED
@@ -285,6 +285,39 @@ class TestRR < Minitest::Test
|
|
285
285
|
update.encode
|
286
286
|
end
|
287
287
|
|
288
|
+
def test_uri
|
289
|
+
rrString = "_ftp._tcp.\t300\tIN\tURI\t10\ 1 \"ftp://ftp1.example.com/public\""
|
290
|
+
rr = RR.create(rrString)
|
291
|
+
assert(rrString.to_s == rr.to_s)
|
292
|
+
m = Dnsruby::Message.new
|
293
|
+
m.add_additional(rr)
|
294
|
+
m2 = Message.decode(m.encode)
|
295
|
+
rr2 = m2.additional()[0]
|
296
|
+
assert(rr == rr2)
|
297
|
+
end
|
298
|
+
|
299
|
+
def test_cds
|
300
|
+
rrString = "dskey.example.com.\t86400\tIN\tCDS\t60485 RSASHA1 1 ( 2BB183AF5F22588179A53B0A98631FAD1A292118 )"
|
301
|
+
rr = RR.create(rrString)
|
302
|
+
assert(rrString.to_s == rr.to_s)
|
303
|
+
m = Dnsruby::Message.new
|
304
|
+
m.add_additional(rr)
|
305
|
+
m2 = Message.decode(m.encode)
|
306
|
+
rr2 = m2.additional()[0]
|
307
|
+
assert(rr.to_s == rr2.to_s)
|
308
|
+
end
|
309
|
+
|
310
|
+
def test_cdnskey
|
311
|
+
rrString = "tjeb.nl.\t3600\tIN\tCDNSKEY\t256 3 RSASHA1-NSEC3-SHA1 ( AwEAAcglEOS7bECRK5fqTuGTMJycmDhTzmUu/EQbAhKJOYJxDb5SG/RYqsJgzG7wgtGy0W1aP7I4k6SPtHmwcqjLaZLVUwRNWCGr2adjb9JTFyBR7F99Ngi11lEGM6Uiw/eDRk66lhoSGzohjj/rmhRTV6gN2+0ADPnafv3MBkPgryA3 ) ; key_tag=53177"
|
312
|
+
rr = RR.create(rrString)
|
313
|
+
assert(rrString.to_s == rr.to_s)
|
314
|
+
m = Dnsruby::Message.new
|
315
|
+
m.add_additional(rr)
|
316
|
+
m2 = Message.decode(m.encode)
|
317
|
+
rr2 = m2.additional()[0]
|
318
|
+
assert(rr.to_s == rr2.to_s)
|
319
|
+
end
|
320
|
+
|
288
321
|
def test_cert
|
289
322
|
rr = RR.create("test.kht.se. 60 IN CERT PGP 0 0 mQGiBDnY2vERBAD3cOxqoAYHYzS+xttvuyN9wZS8CrgwLIlT8Ewo/CCFI11PEO+gJyNPvWPRQsyt1SE60reaIsie2bQTg3DYIg0PmH+ZOlNkpKesPULzdlw4Rx3dD/M3Lkrm977h4Y70ZKC+tbvoYKCCOIkUVevny1PVZ+mB94rb0mMgawSTrct03QCg/w6aHNJFQV7O9ZQ1Fir85M3RS8cEAOo4/1ASVudz3qKZQEhU2Z9O2ydXqpEanHfGirjWYi5RelVsQ9IfBSPFaPAWzQ24nvQ18NU7TgdDQhP4meZXiVXcLBR5Mee2kByf2KAnBUF9aah5s8wZbSrC6u8xEZLuiauvWmCUIWe0Ylc1/L37XeDjrBI2pT+k183X119d6Fr1BACGfZVGsot5rxBUEFPPSrBqYXG/0hRYv9Eq8a4rJAHK2IUWYfivZgL4DtrJnHlha+H5EPQVYkIAN3nGjXoHmosY+J3Sk+GyR+dCBHEwCkoHMKph3igczCEfxAWgqKeYd5mf+QQq2JKrkn2jceiIO7s3CrepeEFAjDSGuxhZjPJVm7QoRGFuaWVsIFAuIE1haG9uZXkgPGRhbm1AcHJpbWUuZ3VzaGkub3JnPohOBBARAgAOBQI52NrxBAsDAQICGQEACgkQ+75aMGJLskn6LgCbBXUD7UmGla5e1zyhuY667hP3F+UAoJIeDZJyRFkQAmb+u8KekRyLD1MLtDJEYW5pZWwgTWFob25leSAoU2Vjb25kYXJ5IEVtYWlsKSA8Z3VzaGlAZ3VzaGkub3JnPohgBBMRAgAgBQJF1J/XAhsjBgsJCAcDAgQVAggDBBYCAwECHgECF4AACgkQ+75aMGJLskkVhACggsivQ9qLhfdA1rGm6f8LRJBSC4wAoI930h+/hshClj6AkNwGRtHdf5XJuQINBDnY2vQQCAD2Qle3CH8IF3KiutapQvMF6PlTETlPtvFuuUs4INoBp1ajFOmPQFXz0AfGy0OplK33TGSGSfgMg71l6RfUodNQ+PVZX9x2Uk89PY3bzpnhV5JZzf24rnRPxfx2vIPFRzBhznzJZv8V+bv9kV7HAarTW56NoKVyOtQa8L9GAFgr5fSI/VhOSdvNILSd5JEHNmszbDgNRR0PfIizHHxbLY7288kjwEPwpVsYjY67VYy4XTjTNP18F1dDox0YbN4zISy1Kv884bEpQBgRjXyEpwpy1obEAxnIByl6ypUM2Zafq9AKUJsCRtMIPWakXUGfnHy9iUsiGSa6q6Jew1XpMgs7AAICB/9eGjzF2gDh6U7I72x/6bSdlExx2LvIF92OZKc0S55IOS4Lgzs7Hbfm1aOL4oJt7wBg94xkF4cerxz7y8R9J+k3GNl14KOjbYaMAh1rdxdAzikYMH1p1hS78GMtwxky6jE5en87BGGMmnbC84JlxwN+MD7diu8D0Gkgjj/pxOp32D5jEe02wBPVjFTpFLJjpFniLUY6AohRDEdSuZwWPuoKVWhpeWkasNn5qgwGyDREbXpyPsU02BkwE4JiGs+JMMdOn9KMh5dxiuwsMM9gHiQZS3mSNBBKPWI5ZXsdStVFvapjf2FUFDXLUbTROPv1Xhqf0u7YYORFnWeVtvzKIxVaiEYEGBECAAYFAjnY2vQACgkQ+75aMGJLsklBWgCeN7z9xk52y/aoaCuF6hYb0d+3k98AoMRxvHuXI1Nc2FXY/x65PwHiUbaY")
|
290
323
|
rr = RR.create("all.rr.org. IN CERT 6 0 0 FFsAyW1dVK7hIGuvhN56r26UwJx/")
|
data/test/tc_soak.rb
CHANGED
@@ -19,72 +19,39 @@ require_relative 'spec_helper'
|
|
19
19
|
# require_relative 'tc_single_resolver'
|
20
20
|
require_relative 'tc_soak_base'
|
21
21
|
require_relative 'test_dnsserver'
|
22
|
+
require_relative 'localdns'
|
22
23
|
|
23
24
|
|
24
25
|
# This class tries to soak test the Dnsruby library.
|
25
26
|
# It can't do this very well, owing to the small number of sockets allowed to be open simultaneously.
|
26
27
|
# @TODO@ Future versions of dnsruby will allow random streaming over a fixed number of (cycling) random sockets,
|
27
28
|
# so this test can be beefed up considerably at that point.
|
28
|
-
# @todo@ A test DNS server running on localhost is really needed here
|
29
|
-
|
30
|
-
class MyServer < RubyDNS::Server
|
31
|
-
|
32
|
-
include Dnsruby
|
33
|
-
|
34
|
-
IP = "127.0.0.1"
|
35
|
-
PORT = 53927
|
36
|
-
|
37
|
-
@@stats = Stats.new
|
38
|
-
|
39
|
-
def self.stats
|
40
|
-
@@stats
|
41
|
-
end
|
42
|
-
|
43
|
-
def process(name, resource_class, transaction)
|
44
|
-
transaction.respond!("93.184.216.34", { resource_class: Resolv::DNS::Resource::IN::A })
|
45
|
-
Celluloid.logger.debug "got message"
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
class PipeliningServer < MyServer
|
50
|
-
def run
|
51
|
-
fire(:setup)
|
52
|
-
|
53
|
-
link NioTcpPipeliningHandler.new(self, IP, PORT, 5) #5 max request
|
54
|
-
link RubyDNS::UDPHandler.new(self, IP, PORT)
|
55
|
-
|
56
|
-
fire(:start)
|
57
|
-
end
|
58
|
-
end
|
59
29
|
|
60
30
|
class TestSingleResolverSoak < Minitest::Test
|
61
31
|
|
62
|
-
IP =
|
63
|
-
PORT =
|
32
|
+
IP = SimpleTCPPipeliningUDPServer::IP
|
33
|
+
PORT = SimpleTCPPipeliningUDPServer::PORT
|
64
34
|
|
65
35
|
def initialize(arg)
|
66
36
|
super(arg)
|
67
|
-
self.class.init
|
68
37
|
end
|
69
38
|
|
70
|
-
def
|
71
|
-
|
72
|
-
Celluloid.boot
|
73
|
-
# By default, Celluloid logs output to console. Use Dnsruby.log instead.
|
74
|
-
Celluloid.logger = Dnsruby.log
|
75
|
-
@initialized = true
|
76
|
-
end
|
39
|
+
def teardown
|
40
|
+
Celluloid.shutdown
|
77
41
|
end
|
78
42
|
|
79
43
|
SINGLE_RESOLVER_QUERY_TIMES = 63
|
80
44
|
|
81
45
|
def setup
|
82
|
-
# Instantiate a
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
46
|
+
# Instantiate a local dns server
|
47
|
+
pipe = IO.popen("./test/localdns.rb")
|
48
|
+
@dnspid = pipe.pid
|
49
|
+
sleep 1
|
50
|
+
end
|
87
51
|
|
52
|
+
def teardown
|
53
|
+
Process.kill("KILL", @dnspid)
|
54
|
+
sleep 1
|
88
55
|
end
|
89
56
|
|
90
57
|
def test_many_asynchronous_queries_one_single_resolver
|
@@ -115,14 +82,14 @@ class TestSingleResolverSoak < Minitest::Test
|
|
115
82
|
q = Queue.new
|
116
83
|
timeout_count = 0
|
117
84
|
resolvers = Array.new(num_resolvers) do
|
118
|
-
SingleResolver.new(server: IP,
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
85
|
+
Dnsruby::SingleResolver.new(server: IP,
|
86
|
+
port: PORT,
|
87
|
+
do_caching: false,
|
88
|
+
do_validation: false,
|
89
|
+
tcp_pipelining: pipelining,
|
90
|
+
packet_timeout: 10,
|
91
|
+
tcp_pipelining_max_queries: 5,
|
92
|
+
use_tcp: tcp)
|
126
93
|
end
|
127
94
|
start = Time.now
|
128
95
|
|
@@ -130,7 +97,7 @@ class TestSingleResolverSoak < Minitest::Test
|
|
130
97
|
# this test while we're not using single sockets.
|
131
98
|
# We run four queries per iteration, so we're limited to 64 runs.
|
132
99
|
messages = TestSoakBase::Rrs.map do |data|
|
133
|
-
message = Message.new(data[:name], data[:type])
|
100
|
+
message = Dnsruby::Message.new(data[:name], data[:type])
|
134
101
|
message.do_validation = false
|
135
102
|
message.do_caching = false
|
136
103
|
message
|
@@ -141,9 +108,9 @@ class TestSingleResolverSoak < Minitest::Test
|
|
141
108
|
receive_thread = Thread.new do
|
142
109
|
query_count.times do
|
143
110
|
_id, ret, error = q.pop
|
144
|
-
if error.is_a?(ResolvTimeout)
|
111
|
+
if error.is_a?(Dnsruby::ResolvTimeout)
|
145
112
|
timeout_count+=1
|
146
|
-
elsif ret.class != Message
|
113
|
+
elsif ret.class != Dnsruby::Message
|
147
114
|
p "ERROR RETURNED : #{error}"
|
148
115
|
end
|
149
116
|
end
|
@@ -193,7 +160,7 @@ class TestSingleResolverSoak < Minitest::Test
|
|
193
160
|
packet=nil
|
194
161
|
begin
|
195
162
|
packet = res.query(data[:name], data[:type])
|
196
|
-
rescue ResolvTimeout
|
163
|
+
rescue Dnsruby::ResolvTimeout
|
197
164
|
mutex.synchronize { timeout_count += 1 }
|
198
165
|
next
|
199
166
|
end
|
@@ -248,19 +215,19 @@ class TestSingleResolverSoak < Minitest::Test
|
|
248
215
|
end
|
249
216
|
q = Queue.new
|
250
217
|
|
251
|
-
message = Message.new(data[:name], data[:type])
|
218
|
+
message = Dnsruby::Message.new(data[:name], data[:type])
|
252
219
|
message.do_validation = false
|
253
220
|
message.do_caching = false
|
254
221
|
|
255
222
|
res.send_async(message, q, [i,j])
|
256
223
|
|
257
224
|
id, packet, error = q.pop
|
258
|
-
if (error.class == ResolvTimeout)
|
225
|
+
if (error.class == Dnsruby::ResolvTimeout)
|
259
226
|
mutex.synchronize {
|
260
227
|
timeout_count+=1
|
261
228
|
}
|
262
229
|
next
|
263
|
-
elsif (packet.class!=Message)
|
230
|
+
elsif (packet.class!=Dnsruby::Message)
|
264
231
|
puts "ERROR! #{error}"
|
265
232
|
end
|
266
233
|
|
@@ -278,13 +245,12 @@ class TestSingleResolverSoak < Minitest::Test
|
|
278
245
|
assert(timeout_count < query_count * 0.1, "#{timeout_count} of #{query_count} timed out!")
|
279
246
|
end
|
280
247
|
|
281
|
-
|
282
248
|
def create_default_single_resolver
|
283
|
-
SingleResolver.new(server: IP,
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
249
|
+
Dnsruby::SingleResolver.new(server: IP,
|
250
|
+
port: PORT,
|
251
|
+
do_caching: false,
|
252
|
+
do_validation: false,
|
253
|
+
packet_timeout: 10)
|
288
254
|
|
289
255
|
end
|
290
256
|
end
|