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.
Files changed (48) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +9 -6
  3. data/.yardopts +7 -0
  4. data/README.md +7 -4
  5. data/RELEASE_NOTES.md +43 -0
  6. data/Rakefile +1 -0
  7. data/demo/digroot.rb +2 -0
  8. data/demo/rubydig.rb +1 -0
  9. data/dnsruby.gemspec +15 -8
  10. data/lib/dnsruby/code_mappers.rb +3 -0
  11. data/lib/dnsruby/config.rb +30 -8
  12. data/lib/dnsruby/dnssec.rb +4 -0
  13. data/lib/dnsruby/hosts.rb +8 -4
  14. data/lib/dnsruby/message/encoder.rb +2 -2
  15. data/lib/dnsruby/message/header.rb +15 -15
  16. data/lib/dnsruby/name.rb +18 -2
  17. data/lib/dnsruby/packet_sender.rb +14 -2
  18. data/lib/dnsruby/recursor.rb +10 -1
  19. data/lib/dnsruby/resolver.rb +11 -0
  20. data/lib/dnsruby/resource/CAA.rb +1 -1
  21. data/lib/dnsruby/resource/CDNSKEY.rb +17 -0
  22. data/lib/dnsruby/resource/CDS.rb +35 -0
  23. data/lib/dnsruby/resource/DNSKEY.rb +33 -6
  24. data/lib/dnsruby/resource/IN.rb +4 -1
  25. data/lib/dnsruby/resource/URI.rb +57 -0
  26. data/lib/dnsruby/resource/generic.rb +3 -0
  27. data/lib/dnsruby/select_thread.rb +1 -1
  28. data/lib/dnsruby/single_verifier.rb +27 -4
  29. data/lib/dnsruby/validator_thread.rb +4 -4
  30. data/lib/dnsruby/version.rb +1 -1
  31. data/lib/dnsruby/zone_transfer.rb +5 -1
  32. data/test/localdns.rb +29 -0
  33. data/test/tc_caa.rb +0 -1
  34. data/test/tc_dns.rb +11 -1
  35. data/test/tc_dnskey.rb +29 -0
  36. data/test/tc_encoding.rb +31 -0
  37. data/test/tc_hs.rb +4 -3
  38. data/test/tc_long_labels.rb +46 -0
  39. data/test/tc_name.rb +19 -0
  40. data/test/tc_resolv.rb +5 -4
  41. data/test/tc_resolver.rb +28 -2
  42. data/test/tc_rr-opt.rb +9 -3
  43. data/test/tc_rr.rb +33 -0
  44. data/test/tc_soak.rb +33 -67
  45. data/test/tc_tcp_pipelining.rb +27 -19
  46. data/test/tc_verifier.rb +15 -0
  47. data/test/test_dnsserver.rb +110 -17
  48. metadata +50 -44
@@ -1,3 +1,3 @@
1
1
  module Dnsruby
2
- VERSION = '1.60.2'
2
+ VERSION = '1.61.5'
3
3
  end
@@ -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 = TCPSocket.new(server, @port, @src_address)
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)
@@ -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
@@ -16,7 +16,6 @@
16
16
  # ++
17
17
 
18
18
  require_relative 'spec_helper'
19
- require 'pry'
20
19
 
21
20
  class TestCAA < Minitest::Test
22
21
 
@@ -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
@@ -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
@@ -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
@@ -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
- message = Message.new('test.com', 'A', 'HS')
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
@@ -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
@@ -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(RELATIVE_NAME, Dnsruby::Resolv.getname(IPV4_ADDR).to_s)
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(RELATIVE_NAME)
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(RELATIVE_NAME, names.first.to_s)
65
- Dnsruby::Resolv.each_name(IPV4_ADDR) { |name| assert_equal(RELATIVE_NAME, name.to_s)}
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
@@ -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-public-dns/)
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 (!RUBY_PLATFORM=~/darwin/)
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
 
@@ -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
- resolver = Resolver.new('a.gtld-servers.net')
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
 
@@ -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/")
@@ -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 = MyServer::IP
63
- PORT = MyServer::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 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
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 new server
83
- # For each query respond with 93.184.216.34
84
-
85
- @@supervisor ||= RubyDNS::run_server(asynchronous: true,
86
- server_class: PipeliningServer)
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
- port: PORT,
120
- do_caching: false,
121
- do_validation: false,
122
- tcp_pipelining: pipelining,
123
- packet_timeout: 10,
124
- tcp_pipelining_max_queries: 5,
125
- use_tcp: tcp)
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
- port: PORT,
285
- do_caching: false,
286
- do_validation: false,
287
- packet_timeout: 10)
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