dnsruby 1.61.2 → 1.61.7
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/.github/workflows/ci.yml +23 -0
- data/.yardopts +7 -0
- data/Gemfile +0 -2
- data/README.md +2 -1
- data/RELEASE_NOTES.md +32 -1
- data/Rakefile +2 -0
- data/dnsruby.gemspec +14 -9
- data/lib/dnsruby.rb +4 -4
- data/lib/dnsruby/DNS.rb +1 -1
- data/lib/dnsruby/config.rb +13 -13
- data/lib/dnsruby/dnssec.rb +1 -0
- data/lib/dnsruby/hosts.rb +8 -4
- data/lib/dnsruby/message/encoder.rb +2 -2
- data/lib/dnsruby/message/header.rb +0 -3
- data/lib/dnsruby/name.rb +13 -15
- data/lib/dnsruby/packet_sender.rb +12 -16
- data/lib/dnsruby/recursor.rb +6 -5
- data/lib/dnsruby/resolver.rb +14 -17
- data/lib/dnsruby/resource/CAA.rb +2 -2
- data/lib/dnsruby/resource/DNSKEY.rb +18 -0
- data/lib/dnsruby/resource/NSEC3PARAM.rb +1 -1
- data/lib/dnsruby/resource/TLSA.rb +3 -3
- data/lib/dnsruby/resource/TXT.rb +11 -1
- data/lib/dnsruby/select_thread.rb +6 -7
- data/lib/dnsruby/single_verifier.rb +14 -3
- data/lib/dnsruby/validator_thread.rb +4 -4
- data/lib/dnsruby/version.rb +1 -1
- data/lib/dnsruby/zone_reader.rb +2 -2
- data/lib/dnsruby/zone_transfer.rb +0 -1
- data/test/localdns.rb +29 -0
- data/test/spec_helper.rb +6 -0
- data/test/tc_caa.rb +0 -1
- data/test/tc_dns.rb +7 -2
- 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 +12 -12
- data/test/tc_rr-opt.rb +8 -5
- data/test/tc_rr-txt.rb +7 -1
- data/test/tc_soak.rb +31 -69
- data/test/tc_tcp.rb +2 -2
- data/test/tc_tcp_pipelining.rb +26 -25
- data/test/tc_verifier.rb +15 -0
- data/test/test_dnsserver.rb +110 -17
- data/test/test_utils.rb +0 -2
- data/test/ts_offline.rb +8 -8
- metadata +40 -51
- data/.travis.yml +0 -14
data/test/spec_helper.rb
CHANGED
data/test/tc_caa.rb
CHANGED
data/test/tc_dns.rb
CHANGED
|
@@ -247,11 +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
|
+
end
|
|
250
251
|
|
|
251
252
|
def test_port
|
|
252
253
|
d = DNS.new({:port => 5353})
|
|
253
|
-
|
|
254
|
+
assert(d.to_s.include?"5353")
|
|
254
255
|
end
|
|
255
256
|
|
|
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
|
+
|
|
257
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_ABSOLUTE_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_ABSOLUTE_NAME, Dnsruby::Resolv.getname(IPV4_ADDR).to_s(true))
|
|
57
58
|
|
|
58
59
|
assert_raises(Dnsruby::ResolvError) do
|
|
59
|
-
Dnsruby::Resolv.getname(
|
|
60
|
+
Dnsruby::Resolv.getname(SHORT_ABSOLUTE_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_ABSOLUTE_NAME, names.first.to_s(true))
|
|
66
|
+
Dnsruby::Resolv.each_name(IPV4_ADDR) { |name| assert_equal(SHORT_ABSOLUTE_NAME, name.to_s(true))}
|
|
66
67
|
end
|
|
67
68
|
|
|
68
69
|
def test_resolv_address_to_address
|
data/test/tc_resolver.rb
CHANGED
|
@@ -73,8 +73,8 @@ class TestResolver < Minitest::Test
|
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
def test_send_plain_message
|
|
76
|
-
resolver = Resolver.new
|
|
77
|
-
response, error = resolver.send_plain_message(Message.new("
|
|
76
|
+
resolver = Resolver.new('1.1.1.1')
|
|
77
|
+
response, error = resolver.send_plain_message(Message.new("example.com", Types.A))
|
|
78
78
|
assert_nil_error(error)
|
|
79
79
|
assert_valid_response(response)
|
|
80
80
|
|
|
@@ -132,13 +132,13 @@ class TestResolver < Minitest::Test
|
|
|
132
132
|
r = Resolver.new
|
|
133
133
|
q=Queue.new
|
|
134
134
|
r.send_async(m,q,q)
|
|
135
|
-
|
|
135
|
+
_id, ret, _error=q.pop
|
|
136
136
|
assert(ret.kind_of?(Message))
|
|
137
137
|
no_pointer=true
|
|
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
|
|
@@ -185,14 +185,14 @@ class TestResolver < Minitest::Test
|
|
|
185
185
|
res.retry_times=retry_times
|
|
186
186
|
res.retry_delay=retry_delay
|
|
187
187
|
start=Time.now
|
|
188
|
-
|
|
188
|
+
res.send_message(Message.new("a.t.dnsruby.validation-test-servers.nominet.org.uk", Types.A))
|
|
189
189
|
fail
|
|
190
190
|
rescue ResolvTimeout
|
|
191
191
|
stop=Time.now
|
|
192
192
|
time = stop-start
|
|
193
193
|
assert(time <= expected * 1.3 && time >= expected * 0.9, "Wrong time take, expected #{expected}, took #{time}")
|
|
194
194
|
end
|
|
195
|
-
|
|
195
|
+
end
|
|
196
196
|
end
|
|
197
197
|
|
|
198
198
|
def test_packet_timeout
|
|
@@ -209,7 +209,7 @@ class TestResolver < Minitest::Test
|
|
|
209
209
|
# Work out what time should be, then time it to check
|
|
210
210
|
expected = query_timeout
|
|
211
211
|
start=Time.now
|
|
212
|
-
|
|
212
|
+
res.send_message(Message.new("a.t.dnsruby.validation-test-servers.nominet.org.uk", Types.A))
|
|
213
213
|
fail
|
|
214
214
|
rescue Dnsruby::ResolvTimeout
|
|
215
215
|
stop=Time.now
|
|
@@ -227,7 +227,7 @@ class TestResolver < Minitest::Test
|
|
|
227
227
|
res.query_timeout=expected
|
|
228
228
|
q = Queue.new
|
|
229
229
|
start = Time.now
|
|
230
|
-
|
|
230
|
+
res.send_async(Message.new("a.t.dnsruby.validation-test-servers.nominet.org.uk", Types.A), q, q)
|
|
231
231
|
id,ret,err = q.pop
|
|
232
232
|
stop = Time.now
|
|
233
233
|
assert(id=q)
|
|
@@ -382,19 +382,19 @@ class TestRawQuery < Minitest::Test
|
|
|
382
382
|
resolver.query("google.com", "MX")
|
|
383
383
|
begin
|
|
384
384
|
resolver.query("googlöe.com", "MX")
|
|
385
|
-
rescue Dnsruby::ResolvError
|
|
385
|
+
rescue Dnsruby::ResolvError
|
|
386
386
|
# fine
|
|
387
387
|
end
|
|
388
388
|
resolver.query("google.com", "MX")
|
|
389
389
|
resolver.query("google.com", "MX")
|
|
390
390
|
begin
|
|
391
391
|
resolver.query("googlöe.com", "MX")
|
|
392
|
-
rescue Dnsruby::ResolvError
|
|
392
|
+
rescue Dnsruby::ResolvError
|
|
393
393
|
# fine
|
|
394
394
|
end
|
|
395
395
|
begin
|
|
396
396
|
resolver.query("googlöe.com", "MX")
|
|
397
|
-
rescue Dnsruby::ResolvError
|
|
397
|
+
rescue Dnsruby::ResolvError
|
|
398
398
|
# fine
|
|
399
399
|
end
|
|
400
400
|
# Dnsruby::Cache.delete("googlöe.com", "MX")
|
data/test/tc_rr-opt.rb
CHANGED
|
@@ -28,26 +28,29 @@ 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
|
+
resolver = Resolver.new('a.gtld-servers.net')
|
|
32
|
+
resolver.query_timeout=20
|
|
32
33
|
|
|
33
34
|
run_test = ->(bufsize) do
|
|
34
35
|
|
|
36
|
+
|
|
35
37
|
create_test_query = ->(bufsize) do
|
|
36
|
-
message = Message.new('com', Types.
|
|
38
|
+
message = Message.new('com', Types.RRSIG, Classes.IN)
|
|
37
39
|
message.add_additional(RR::OPT.new(bufsize))
|
|
38
40
|
message
|
|
39
41
|
end
|
|
40
42
|
|
|
41
43
|
query = create_test_query.(bufsize)
|
|
42
44
|
response, _error = resolver.send_plain_message(query)
|
|
43
|
-
|
|
45
|
+
if (_error != nil) then
|
|
46
|
+
print "Error at #{bufsize} : #{_error}"
|
|
47
|
+
end
|
|
48
|
+
# puts "\nBufsize is #{bufsize}, binary message size is #{response.encode.size}"
|
|
44
49
|
assert_equal(true, response.header.tc)
|
|
45
50
|
assert(response.encode.size <= bufsize)
|
|
46
51
|
end
|
|
47
52
|
|
|
48
|
-
run_test.(512)
|
|
49
53
|
run_test.(612)
|
|
50
|
-
run_test.(4096)
|
|
51
54
|
end
|
|
52
55
|
|
|
53
56
|
|
data/test/tc_rr-txt.rb
CHANGED
|
@@ -143,7 +143,13 @@ class TestRrTest < Minitest::Test
|
|
|
143
143
|
|
|
144
144
|
r1 = RR.create("auto._domainkey.cacert.org. 43200 IN TXT \"v=DKIM1\;g=*\;k=rsa\;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDNFxiNr+NHJwih3OPhGr4iwLE+BBDu72YrMSzUnU1FF50CW7iOtuhg796UZ6xrZ5VuhAix6YmmzcvF2UxYzoD/XpfZ4MzBu0ND4/nkt9/YOTyIBzwQqn9uMNve0Y76Zsel89dIJtOI+y+lfnFExV0jKwe53gzmxMVpMSSCcZPGwIDAQAB\" ; ----- DKIM auto for cacert.org")
|
|
145
145
|
r2 = RR.create("auto._domainkey.cacert.org. 43200 IN TXT \"v=DKIM1;g=*;k=rsa;p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDNFxiNr+NHJwih3OPhGr4iwLE+BBDu72YrMSzUnU1FF50CW7iOtuhg796UZ6xrZ5VuhAix6YmmzcvF2UxYzoD/XpfZ4MzBu0ND4/nkt9/YOTyIBzwQqn9uMNve0Y76Zsel89dIJtOI+y+lfnFExV0jKwe53gzmxMVpMSSCcZPGwIDAQAB\"")
|
|
146
|
-
|
|
146
|
+
assert_equal(r1.to_s, r2.to_s)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def test_quote_and_unquoted
|
|
150
|
+
t = Dnsruby::RR::TXT.parse '"a" b'
|
|
151
|
+
assert_equal("a", t[0])
|
|
152
|
+
assert_equal("b", t[1])
|
|
147
153
|
end
|
|
148
154
|
|
|
149
155
|
end
|
data/test/tc_soak.rb
CHANGED
|
@@ -19,61 +19,21 @@ 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
|
-
end
|
|
69
|
-
|
|
70
|
-
def self.init
|
|
71
|
-
unless @initialized
|
|
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
|
|
77
37
|
end
|
|
78
38
|
|
|
79
39
|
def teardown
|
|
@@ -83,12 +43,15 @@ class TestSingleResolverSoak < Minitest::Test
|
|
|
83
43
|
SINGLE_RESOLVER_QUERY_TIMES = 63
|
|
84
44
|
|
|
85
45
|
def setup
|
|
86
|
-
# Instantiate a
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
46
|
+
# Instantiate a local dns server
|
|
47
|
+
pipe = IO.popen("./test/localdns.rb")
|
|
48
|
+
@dnspid = pipe.pid
|
|
49
|
+
sleep 1
|
|
50
|
+
end
|
|
91
51
|
|
|
52
|
+
def teardown
|
|
53
|
+
Process.kill("KILL", @dnspid)
|
|
54
|
+
sleep 1
|
|
92
55
|
end
|
|
93
56
|
|
|
94
57
|
def test_many_asynchronous_queries_one_single_resolver
|
|
@@ -119,14 +82,14 @@ class TestSingleResolverSoak < Minitest::Test
|
|
|
119
82
|
q = Queue.new
|
|
120
83
|
timeout_count = 0
|
|
121
84
|
resolvers = Array.new(num_resolvers) do
|
|
122
|
-
SingleResolver.new(server: IP,
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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)
|
|
130
93
|
end
|
|
131
94
|
start = Time.now
|
|
132
95
|
|
|
@@ -134,7 +97,7 @@ class TestSingleResolverSoak < Minitest::Test
|
|
|
134
97
|
# this test while we're not using single sockets.
|
|
135
98
|
# We run four queries per iteration, so we're limited to 64 runs.
|
|
136
99
|
messages = TestSoakBase::Rrs.map do |data|
|
|
137
|
-
message = Message.new(data[:name], data[:type])
|
|
100
|
+
message = Dnsruby::Message.new(data[:name], data[:type])
|
|
138
101
|
message.do_validation = false
|
|
139
102
|
message.do_caching = false
|
|
140
103
|
message
|
|
@@ -145,9 +108,9 @@ class TestSingleResolverSoak < Minitest::Test
|
|
|
145
108
|
receive_thread = Thread.new do
|
|
146
109
|
query_count.times do
|
|
147
110
|
_id, ret, error = q.pop
|
|
148
|
-
if error.is_a?(ResolvTimeout)
|
|
111
|
+
if error.is_a?(Dnsruby::ResolvTimeout)
|
|
149
112
|
timeout_count+=1
|
|
150
|
-
elsif ret.class != Message
|
|
113
|
+
elsif ret.class != Dnsruby::Message
|
|
151
114
|
p "ERROR RETURNED : #{error}"
|
|
152
115
|
end
|
|
153
116
|
end
|
|
@@ -197,7 +160,7 @@ class TestSingleResolverSoak < Minitest::Test
|
|
|
197
160
|
packet=nil
|
|
198
161
|
begin
|
|
199
162
|
packet = res.query(data[:name], data[:type])
|
|
200
|
-
rescue ResolvTimeout
|
|
163
|
+
rescue Dnsruby::ResolvTimeout
|
|
201
164
|
mutex.synchronize { timeout_count += 1 }
|
|
202
165
|
next
|
|
203
166
|
end
|
|
@@ -252,19 +215,19 @@ class TestSingleResolverSoak < Minitest::Test
|
|
|
252
215
|
end
|
|
253
216
|
q = Queue.new
|
|
254
217
|
|
|
255
|
-
message = Message.new(data[:name], data[:type])
|
|
218
|
+
message = Dnsruby::Message.new(data[:name], data[:type])
|
|
256
219
|
message.do_validation = false
|
|
257
220
|
message.do_caching = false
|
|
258
221
|
|
|
259
222
|
res.send_async(message, q, [i,j])
|
|
260
223
|
|
|
261
224
|
id, packet, error = q.pop
|
|
262
|
-
if (error.class == ResolvTimeout)
|
|
225
|
+
if (error.class == Dnsruby::ResolvTimeout)
|
|
263
226
|
mutex.synchronize {
|
|
264
227
|
timeout_count+=1
|
|
265
228
|
}
|
|
266
229
|
next
|
|
267
|
-
elsif (packet.class!=Message)
|
|
230
|
+
elsif (packet.class!=Dnsruby::Message)
|
|
268
231
|
puts "ERROR! #{error}"
|
|
269
232
|
end
|
|
270
233
|
|
|
@@ -282,13 +245,12 @@ class TestSingleResolverSoak < Minitest::Test
|
|
|
282
245
|
assert(timeout_count < query_count * 0.1, "#{timeout_count} of #{query_count} timed out!")
|
|
283
246
|
end
|
|
284
247
|
|
|
285
|
-
|
|
286
248
|
def create_default_single_resolver
|
|
287
|
-
SingleResolver.new(server: IP,
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
249
|
+
Dnsruby::SingleResolver.new(server: IP,
|
|
250
|
+
port: PORT,
|
|
251
|
+
do_caching: false,
|
|
252
|
+
do_validation: false,
|
|
253
|
+
packet_timeout: 10)
|
|
292
254
|
|
|
293
255
|
end
|
|
294
256
|
end
|