rubydns 0.8.5 → 0.9.0

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 +4 -4
  2. data/.travis.yml +4 -0
  3. data/Gemfile +0 -4
  4. data/README.md +16 -8
  5. data/Rakefile +6 -6
  6. data/{test/examples → examples}/dropping-dns.rb +0 -0
  7. data/lib/rubydns/handler.rb +133 -102
  8. data/lib/rubydns/message.rb +0 -1
  9. data/lib/rubydns/resolver.rb +135 -187
  10. data/lib/rubydns/server.rb +92 -86
  11. data/lib/rubydns/transaction.rb +24 -48
  12. data/lib/rubydns/{binary_string.rb → transport.rb} +38 -0
  13. data/lib/rubydns/version.rb +1 -1
  14. data/lib/rubydns.rb +15 -8
  15. data/rubydns.gemspec +5 -2
  16. data/{test/test_daemon.rb → spec/rubydns/daemon_spec.rb} +36 -48
  17. data/{test → spec/rubydns}/hosts.txt +0 -0
  18. data/{test/test_rules.rb → spec/rubydns/message_spec.rb} +26 -44
  19. data/spec/rubydns/passthrough_spec.rb +78 -0
  20. data/spec/rubydns/resolver_performance_spec.rb +110 -0
  21. data/spec/rubydns/resolver_spec.rb +144 -0
  22. data/spec/rubydns/rules_spec.rb +74 -0
  23. data/{test/performance → spec/rubydns/server}/benchmark.rb +0 -0
  24. data/{test/performance → spec/rubydns/server}/bind9/generate-local.rb +0 -0
  25. data/{test/performance → spec/rubydns/server}/bind9/local.zone +0 -0
  26. data/{test/performance → spec/rubydns/server}/bind9/named.conf +0 -0
  27. data/spec/rubydns/server/bind9/named.run +0 -0
  28. data/{test/performance → spec/rubydns/server}/million.rb +1 -3
  29. data/spec/rubydns/server/rubydns.stackprof +0 -0
  30. data/spec/rubydns/server_performance_spec.rb +136 -0
  31. data/spec/rubydns/slow_server_spec.rb +89 -0
  32. data/spec/rubydns/socket_spec.rb +77 -0
  33. data/{test/test_system.rb → spec/rubydns/system_spec.rb} +28 -22
  34. data/spec/rubydns/transaction_spec.rb +64 -0
  35. data/{test/test_truncation.rb → spec/rubydns/truncation_spec.rb} +22 -48
  36. metadata +91 -54
  37. data/test/examples/fortune-dns.rb +0 -107
  38. data/test/examples/geoip-dns.rb +0 -76
  39. data/test/examples/soa-dns.rb +0 -82
  40. data/test/examples/test-dns-1.rb +0 -77
  41. data/test/examples/test-dns-2.rb +0 -83
  42. data/test/examples/wikipedia-dns.rb +0 -112
  43. data/test/test_message.rb +0 -65
  44. data/test/test_passthrough.rb +0 -120
  45. data/test/test_resolver.rb +0 -106
  46. data/test/test_resolver_performance.rb +0 -123
  47. data/test/test_server_performance.rb +0 -134
  48. data/test/test_slow_server.rb +0 -125
@@ -1,83 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Copyright, 2009, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- # THE SOFTWARE.
22
-
23
- require 'rubydns'
24
- require 'process-daemon'
25
-
26
- # To run this command, use the standard daemon syntax as root
27
- # ./daemon2.rb start
28
-
29
- # You should be able to see that the server has dropped priviledges
30
- # # ps aux | grep daemon2.rb
31
- # daemon 16555 0.4 0.0 81392 2024 ?? S 3:35am 0:00.28 ruby ../test/daemon2.rb start
32
-
33
- # Test using the following command
34
- # dig @localhost test.mydomain.org
35
- # dig +tcp @localhost test.mydomain.org
36
-
37
- # You might need to change the user name "daemon". This can be a user name or a user id.
38
- RUN_AS = "daemon"
39
-
40
- INTERFACES = [
41
- [:udp, "0.0.0.0", 53],
42
- [:tcp, "0.0.0.0", 53]
43
- ]
44
-
45
- # We need to be root in order to bind to privileged port
46
- if RExec.current_user != "root"
47
- $stderr.puts "Sorry, this command needs to be run as root!"
48
- exit 1
49
- end
50
-
51
- # The Daemon itself
52
- class Server < Process::Daemon
53
- Name = Resolv::DNS::Name
54
- IN = Resolv::DNS::Resource::IN
55
-
56
- # Use upstream DNS for name resolution.
57
- UPSTREAM = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]])
58
-
59
- def startup
60
- # Don't buffer output (for debug purposes)
61
- $stderr.sync = true
62
-
63
- # Start the RubyDNS server
64
- RubyDNS::run_server(:listen => INTERFACES) do
65
- on(:start) do
66
- RExec.change_user(RUN_AS)
67
- end
68
-
69
- match("test.mydomain.org", IN::A) do |transaction|
70
- transaction.respond!("10.0.0.80")
71
- end
72
-
73
- # Default DNS handler
74
- otherwise do |transaction|
75
- logger.info "Passthrough: #{transaction}"
76
- transaction.passthrough!(UPSTREAM)
77
- end
78
- end
79
- end
80
- end
81
-
82
- # RExec daemon runner
83
- Server.daemonize
@@ -1,112 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # encoding: utf-8
3
-
4
- # Copyright, 2009, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
5
- #
6
- # Permission is hereby granted, free of charge, to any person obtaining a copy
7
- # of this software and associated documentation files (the "Software"), to deal
8
- # in the Software without restriction, including without limitation the rights
9
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
- # copies of the Software, and to permit persons to whom the Software is
11
- # furnished to do so, subject to the following conditions:
12
- #
13
- # The above copyright notice and this permission notice shall be included in
14
- # all copies or substantial portions of the Software.
15
- #
16
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
- # THE SOFTWARE.
23
-
24
- require 'rubydns'
25
- require 'rubydns/extensions/string'
26
-
27
- require 'process/daemon'
28
-
29
- require 'em-http'
30
- require 'cgi'
31
- require 'nokogiri'
32
- require 'json'
33
-
34
- require 'digest/md5'
35
-
36
- # You might need to change the user name "daemon". This can be a user name or a user id.
37
- RUN_AS = "daemon"
38
-
39
- if RExec.current_user != "root"
40
- $stderr.puts "Sorry, this command needs to be run as root!"
41
- exit 1
42
- end
43
-
44
- module Wikipedia
45
- def self.summary_url(title)
46
- "http://en.wikipedia.org/w/api.php?action=parse&page=#{CGI.escape title}&prop=text&section=0&format=json"
47
- end
48
-
49
- def self.extract_summary(json_text)
50
- document = JSON::parse(json_text)
51
- return Nokogiri::HTML(document["parse"]["text"]["*"]).css('p')[0].text
52
- rescue
53
- return "Invalid Article."
54
- end
55
- end
56
-
57
- # To use, start the daemon and try:
58
- # dig @localhost fortune CNAME
59
- class WikipediaDNS < Process::Daemon
60
- Name = Resolv::DNS::Name
61
- IN = Resolv::DNS::Resource::IN
62
-
63
- def startup
64
- # Don't buffer output (for debug purposes)
65
- $stderr.sync = true
66
-
67
- cache = {}
68
- stats = {:requested => 0}
69
-
70
- # Start the RubyDNS server
71
- RubyDNS::run_server do
72
- on(:start) do
73
- RExec.change_user(RUN_AS)
74
- if ARGV.include?("--debug")
75
- @logger.level = Logger::DEBUG
76
- else
77
- @logger.level = Logger::WARN
78
- end
79
- end
80
-
81
- match(/stats\.wikipedia/, IN::TXT) do |transaction|
82
- transaction.respond!(*stats.inspect.chunked)
83
- end
84
-
85
- match(/(.+)\.wikipedia/, IN::TXT) do |transaction, match_data|
86
- title = match_data[1]
87
- stats[:requested] += 1
88
-
89
- transaction.defer!
90
-
91
- http = EventMachine::HttpRequest.new(Wikipedia.summary_url(title)).get
92
-
93
- http.callback do
94
- summary = Wikipedia.extract_summary(http.response)
95
- transaction.respond!(*summary.chunked)
96
- end
97
-
98
- http.errback do
99
- transaction.fail!(:ServFail)
100
- end
101
- end
102
-
103
- # Default DNS handler
104
- otherwise do |transaction|
105
- transaction.fail!(:NXDomain)
106
- end
107
- end
108
- end
109
- end
110
-
111
- # RExec daemon runner
112
- WikipediaDNS.daemonize
data/test/test_message.rb DELETED
@@ -1,65 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Copyright, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- # THE SOFTWARE.
22
-
23
- require 'minitest/autorun'
24
-
25
- require 'rubydns'
26
-
27
- class MessageTest < MiniTest::Test
28
- def setup
29
- end
30
-
31
- def teardown
32
- end
33
-
34
- def hex2bin(hexstring)
35
- ret = "\x00" * (hexstring.length / 2)
36
- ret.force_encoding("BINARY")
37
- offset = 0
38
- while offset < hexstring.length
39
- hex_byte = hexstring[offset..(offset+1)]
40
- ret.setbyte(offset/2, hex_byte.to_i(16))
41
- offset += 2
42
- end
43
- ret
44
- end
45
-
46
- def test_good_decode
47
- data = hex2bin("1d008180000100080000000103777777057961686f6f03636f6d0000010001c00c000500010000012c000f0666642d667033037767310162c010c02b000500010000012c00090664732d667033c032c046000500010000003c00150e64732d616e792d6670332d6c666203776131c036c05b000500010000012c00120f64732d616e792d6670332d7265616cc06ac07c000100010000003c0004628afc1ec07c000100010000003c0004628bb495c07c000100010000003c0004628bb718c07c000100010000003c0004628afd6d0000291000000000000000")
48
-
49
- decoded = RubyDNS.decode_message(data)
50
- assert_equal(RubyDNS::Message, decoded.class)
51
- assert_equal(0x1d00, decoded.id)
52
- assert_equal(1, decoded.question.count)
53
- assert_equal(8, decoded.answer.count)
54
- assert_equal(0, decoded.authority.count)
55
- assert_equal(1, decoded.additional.count)
56
- end
57
-
58
- def test_bad_AAAA_length
59
- data = hex2bin("ea9e8180000100010000000108626169636169636e03636f6d00001c0001c00c001c00010000011e000432177b770000291000000000000000")
60
-
61
- assert_raises Resolv::DNS::DecodeError do
62
- RubyDNS.decode_message(data)
63
- end
64
- end
65
- end
@@ -1,120 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Copyright, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- # THE SOFTWARE.
22
-
23
- require 'minitest/autorun'
24
-
25
- require 'rubydns'
26
-
27
- require 'process/daemon'
28
-
29
- class PassthroughServer < Process::Daemon
30
- SERVER_PORTS = [[:udp, '127.0.0.1', 5340], [:tcp, '127.0.0.1', 5340]]
31
-
32
- def working_directory
33
- File.expand_path("../tmp", __FILE__)
34
- end
35
-
36
- Name = Resolv::DNS::Name
37
- IN = Resolv::DNS::Resource::IN
38
-
39
- def startup
40
- resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]])
41
-
42
- # Start the RubyDNS server
43
- RubyDNS::run_server(:listen => SERVER_PORTS) do
44
- match(/.*\.com/, IN::A) do |transaction|
45
- transaction.passthrough!(resolver)
46
- end
47
-
48
- match(/a-(.*\.org)/) do |transaction, match_data|
49
- transaction.passthrough!(resolver, :name => match_data[1])
50
- end
51
-
52
- # Default DNS handler
53
- otherwise do |transaction|
54
- transaction.fail!(:NXDomain)
55
- end
56
- end
57
- end
58
- end
59
-
60
- class PassthroughTest < MiniTest::Test
61
- def setup
62
- PassthroughServer.controller output: File.open("/dev/null", "w")
63
-
64
- PassthroughServer.start
65
- end
66
-
67
- def teardown
68
- PassthroughServer.stop
69
- end
70
-
71
- def test_basic_dns
72
- answer = nil, response = nil
73
-
74
- assert_equal :running, PassthroughServer.status
75
-
76
- EventMachine.run do
77
- resolver = RubyDNS::Resolver.new(
78
- PassthroughServer::SERVER_PORTS,
79
- # Enable this to get more debug output from the resolver:
80
- # :logger => Logger.new($stderr)
81
- )
82
-
83
- resolver.query("google.com") do |response|
84
- refute_kind_of RubyDNS::ResolutionFailure, response
85
-
86
- assert_equal 1, response.ra
87
-
88
- answer = response.answer.first
89
-
90
- EventMachine.stop
91
- end
92
- end
93
-
94
- # Check whether we got some useful records in the answer:
95
- refute_nil answer
96
- assert answer.count > 0
97
- assert answer.any? {|record| record.kind_of? Resolv::DNS::Resource::IN::A}
98
- end
99
-
100
- def test_basic_dns_prefix
101
- answer = nil
102
-
103
- assert_equal :running, PassthroughServer.status
104
-
105
- EventMachine.run do
106
- resolver = RubyDNS::Resolver.new(PassthroughServer::SERVER_PORTS)
107
-
108
- resolver.query("a-slashdot.org") do |response|
109
- refute_kind_of RubyDNS::ResolutionFailure, response
110
-
111
- answer = response.answer.first
112
-
113
- EventMachine.stop
114
- end
115
- end
116
-
117
- assert answer != nil
118
- assert answer.count > 0
119
- end
120
- end
@@ -1,106 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Copyright, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- # THE SOFTWARE.
22
-
23
- require 'minitest/autorun'
24
-
25
- require 'rubydns'
26
-
27
- class ResolverTest < MiniTest::Test
28
- def test_basic_resolver
29
- resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]])
30
-
31
- EventMachine::run do
32
- resolver.query('google.com') do |response|
33
- assert_equal RubyDNS::Message, response.class
34
- EventMachine::stop
35
- end
36
- end
37
-
38
- EventMachine::run do
39
- resolver.query('foobar.oriontransfer.org') do |response|
40
- assert_equal Resolv::DNS::RCode::NXDomain, response.rcode
41
- EventMachine::stop
42
- end
43
- end
44
- end
45
-
46
- def test_broken_resolver
47
- resolver = RubyDNS::Resolver.new([])
48
-
49
- EventMachine::run do
50
- resolver.query('google.com') do |response|
51
- assert_equal RubyDNS::ResolutionFailure, response.class
52
-
53
- EventMachine::stop
54
- end
55
- end
56
- end
57
-
58
- class MockRequest
59
- attr :response
60
-
61
- def process_response!(response)
62
- @response = response
63
- end
64
- end
65
-
66
- def test_dirty_packets_udp
67
- mock_request = MockRequest.new
68
-
69
- handler_class = Class.new{ include RubyDNS::Resolver::Request::UDPRequestHandler }
70
- handler = handler_class.new(mock_request, nil, nil)
71
-
72
- handler.receive_data("This is not a real message!")
73
-
74
- assert_equal Resolv::DNS::DecodeError, mock_request.response.class
75
- end
76
-
77
- def test_dirty_packets_tcp
78
- mock_request = MockRequest.new
79
-
80
- handler_class = Class.new{ include RubyDNS::Resolver::Request::TCPRequestHandler }
81
- handler = handler_class.new(mock_request)
82
-
83
- data = "This is not a real message!"
84
- handler.receive_data([data.length].pack('n') + data)
85
-
86
- assert_equal Resolv::DNS::DecodeError, mock_request.response.class
87
- end
88
-
89
- def test_addresses_for
90
- resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]])
91
- resolved_addresses = nil
92
-
93
- EventMachine::run do
94
- resolver.addresses_for("www.google.com.") do |addresses|
95
- resolved_addresses = addresses
96
-
97
- EventMachine::stop
98
- end
99
- end
100
-
101
- assert resolved_addresses.count > 0
102
-
103
- address = resolved_addresses[0]
104
- assert address.kind_of?(Resolv::IPv4) || address.kind_of?(Resolv::IPv6)
105
- end
106
- end
@@ -1,123 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Copyright, 2012, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
- #
5
- # Permission is hereby granted, free of charge, to any person obtaining a copy
6
- # of this software and associated documentation files (the "Software"), to deal
7
- # in the Software without restriction, including without limitation the rights
8
- # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- # copies of the Software, and to permit persons to whom the Software is
10
- # furnished to do so, subject to the following conditions:
11
- #
12
- # The above copyright notice and this permission notice shall be included in
13
- # all copies or substantial portions of the Software.
14
- #
15
- # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- # THE SOFTWARE.
22
-
23
- require 'minitest/autorun'
24
-
25
- require 'rubydns'
26
- require 'rubydns/system'
27
-
28
- require 'benchmark'
29
-
30
- class ResolverPerformanceTest < MiniTest::Test
31
- # The larger this number, the better RubyDNS::Resolver will look as it is highly asynchronous.
32
- DOMAINS = %W{
33
- Facebook.com
34
- Twitter.com
35
- Google.com
36
- Youtube.com
37
- Wordpress.org
38
- Adobe.com
39
- Blogspot.com
40
- Wikipedia.org
41
- Linkedin.com
42
- Wordpress.com
43
- Yahoo.com
44
- Amazon.com
45
- Flickr.com
46
- Pinterest.com
47
- Tumblr.com
48
- W3.org
49
- Apple.com
50
- Myspace.com
51
- Vimeo.com
52
- Microsoft.com
53
- Youtu.be
54
- Qq.com
55
- Digg.com
56
- Baidu.com
57
- Stumbleupon.com
58
- Addthis.com
59
- Statcounter.com
60
- Feedburner.com
61
- TradeMe.co.nz
62
- Delicious.com
63
- Nytimes.com
64
- Reddit.com
65
- Weebly.com
66
- Bbc.co.uk
67
- Blogger.com
68
- Msn.com
69
- Macromedia.com
70
- Goo.gl
71
- Instagram.com
72
- Gov.uk
73
- Icio.us
74
- Yandex.ru
75
- Cnn.com
76
- Webs.com
77
- Google.de
78
- T.co
79
- Livejournal.com
80
- Imdb.com
81
- Mail.ru
82
- Jimdo.com
83
- }
84
-
85
- def test_resolvers
86
- rubydns_resolved = {}
87
- resolv_resolved = {}
88
-
89
- puts nil, "Comparing resolvers..."
90
- Benchmark.bm(20) do |x|
91
- x.report("RubyDNS::Resolver") do
92
- resolver = RubyDNS::Resolver.new([[:udp, "8.8.8.8", 53], [:tcp, "8.8.8.8", 53]])
93
-
94
- # Number of requests remaining since this is an asynchronous event loop:
95
- pending = DOMAINS.size
96
-
97
- EventMachine::run do
98
- DOMAINS.each do |domain|
99
- resolver.addresses_for(domain) do |addresses|
100
- rubydns_resolved[domain] = addresses
101
-
102
- EventMachine::stop if (pending -= 1) == 0
103
- end
104
- end
105
- end
106
- end
107
-
108
- x.report("Resolv::DNS") do
109
- resolver = Resolv::DNS.new(:nameserver => "8.8.8.8")
110
-
111
- DOMAINS.each do |domain|
112
- resolv_resolved[domain] = resolver.getaddresses(domain)
113
- end
114
- end
115
- end
116
-
117
- DOMAINS.first(3).each do |domain|
118
- # We don't really care if the responses aren't identical - they should be most of the time but due to the way DNS works this isn't always the case:
119
- refute_empty resolv_resolved[domain]
120
- refute_empty rubydns_resolved[domain]
121
- end
122
- end
123
- end