dnsruby 1.60.1 → 1.61.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +6 -7
  3. data/.yardopts +7 -0
  4. data/README.md +7 -4
  5. data/RELEASE_NOTES.md +46 -0
  6. data/Rakefile +1 -0
  7. data/demo/digroot.rb +2 -0
  8. data/dnsruby.gemspec +15 -8
  9. data/lib/dnsruby/code_mappers.rb +3 -0
  10. data/lib/dnsruby/config.rb +24 -4
  11. data/lib/dnsruby/dnssec.rb +4 -0
  12. data/lib/dnsruby/message/encoder.rb +2 -2
  13. data/lib/dnsruby/message/header.rb +15 -15
  14. data/lib/dnsruby/name.rb +18 -2
  15. data/lib/dnsruby/packet_sender.rb +14 -2
  16. data/lib/dnsruby/recursor.rb +10 -1
  17. data/lib/dnsruby/resolver.rb +12 -0
  18. data/lib/dnsruby/resource/CAA.rb +6 -4
  19. data/lib/dnsruby/resource/CDNSKEY.rb +17 -0
  20. data/lib/dnsruby/resource/CDS.rb +35 -0
  21. data/lib/dnsruby/resource/DNSKEY.rb +33 -6
  22. data/lib/dnsruby/resource/IN.rb +4 -1
  23. data/lib/dnsruby/resource/NAPTR.rb +9 -7
  24. data/lib/dnsruby/resource/URI.rb +57 -0
  25. data/lib/dnsruby/resource/generic.rb +3 -0
  26. data/lib/dnsruby/select_thread.rb +1 -2
  27. data/lib/dnsruby/single_verifier.rb +27 -4
  28. data/lib/dnsruby/update.rb +65 -48
  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 +27 -1
  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_update.rb +12 -0
  47. data/test/tc_verifier.rb +15 -0
  48. data/test/test_dnsserver.rb +110 -17
  49. metadata +50 -44
@@ -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 express or implied.
@@ -109,7 +109,7 @@ module Dnsruby
109
109
  return true
110
110
  rescue VerifyError => e
111
111
  response.security_error = e
112
- response.security_level = BOGUS
112
+ response.security_level = Message::SecurityLevel.BOGUS
113
113
  # Response security_level should already be set
114
114
  return false
115
115
  end
@@ -1,3 +1,3 @@
1
1
  module Dnsruby
2
- VERSION = '1.60.1'
2
+ VERSION = '1.61.4'
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)
@@ -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