dnsruby 1.36 → 1.37
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.
- data/demo/axfr.rb +16 -0
- data/demo/check_soa.rb +17 -0
- data/demo/check_zone.rb +16 -0
- data/demo/digdlv.rb +16 -0
- data/demo/digitar.rb +16 -0
- data/demo/digroot.rb +92 -0
- data/demo/example_recurse.rb +16 -0
- data/demo/mresolv.rb +17 -0
- data/demo/mx.rb +16 -0
- data/demo/rubydig.rb +16 -0
- data/demo/trace_dns.rb +16 -0
- data/html/created.rid +1 -1
- data/html/fr_class_index.html +0 -6
- data/html/fr_method_index.html +332 -348
- data/lib/Dnsruby/Cache.rb +18 -1
- data/lib/Dnsruby/iana_ports.rb +17 -1
- data/lib/Dnsruby/key_cache.rb +16 -0
- data/lib/Dnsruby/resource/delete_me.rhtml +6 -0
- data/lib/Dnsruby/select_thread.rb.michael.rb +602 -0
- data/lib/Dnsruby/single_verifier.rb +17 -0
- data/lib/Dnsruby/validator_thread.rb +16 -0
- data/lib/Dnsruby/zone_transfer.rb +16 -0
- data/test/resolv.conf +16 -1
- data/test/tc_auth.rb +49 -0
- data/test/tc_cache.rb +16 -0
- data/test/tc_dlv.rb +16 -0
- data/test/tc_dnskey.rb +16 -0
- data/test/tc_ds.rb +16 -0
- data/test/tc_itar.rb +16 -0
- data/test/tc_nsec.rb +16 -0
- data/test/tc_nsec3.rb +16 -0
- data/test/tc_nsec3param.rb +16 -0
- data/test/tc_queue.rb +16 -0
- data/test/tc_recur.rb +16 -0
- data/test/tc_rrset.rb +16 -0
- data/test/tc_rrsig.rb +16 -0
- data/test/tc_soak_base.rb +16 -0
- data/test/tc_validator.rb +16 -0
- data/test/tc_verifier.rb +16 -0
- data/test/ts_queue.rb +3 -0
- metadata +7 -7
- data/lib/Dnsruby/event_machine_interface.rb +0 -266
- data/test/tc_event_machine_deferrable.rb +0 -85
- data/test/tc_event_machine_res.rb +0 -174
- data/test/tc_event_machine_single_res.rb +0 -101
- data/test/tc_event_machine_soak.rb +0 -98
@@ -1,266 +0,0 @@
|
|
1
|
-
# Support for EventMachine has been deprecated.
|
2
|
-
#require 'eventmachine'
|
3
|
-
#module Dnsruby
|
4
|
-
# class EventMachineInterface#:nodoc: all
|
5
|
-
# @@started_em_here = false
|
6
|
-
# @@running_clients=[]
|
7
|
-
# @@outstanding_sends = []
|
8
|
-
# @@em_thread=nil
|
9
|
-
# # We want to have one EM loop running continuously in this class.
|
10
|
-
# # Remember to use stop_event_loop inside of EM callback in order to stop the event machine
|
11
|
-
#
|
12
|
-
# # Timers - can't use EM timers as they max out at 1000.
|
13
|
-
# # Instead, while queries are outstanding, call next_tick to manage our own list of timers.
|
14
|
-
#
|
15
|
-
# @@timer_procs={} # timeout=>[proc
|
16
|
-
# @@timer_keys_sorted=[]
|
17
|
-
# TIMER_PERIOD = 0.1
|
18
|
-
#
|
19
|
-
# def EventMachineInterface::process_timers
|
20
|
-
# # Go through list of timers
|
21
|
-
# now = Time.now
|
22
|
-
# @@timer_keys_sorted.each do |timeout|
|
23
|
-
# if (timeout > now)
|
24
|
-
# break
|
25
|
-
# end
|
26
|
-
# c, proc = @@timer_procs[timeout]
|
27
|
-
# @@timer_procs.delete(timeout)
|
28
|
-
# @@timer_keys_sorted.delete(timeout)
|
29
|
-
# proc.call
|
30
|
-
# end
|
31
|
-
#
|
32
|
-
# if (!@@outstanding_sends.empty?)
|
33
|
-
# EventMachine::add_timer(TIMER_PERIOD) {process_timers}
|
34
|
-
# end
|
35
|
-
# end
|
36
|
-
#
|
37
|
-
# def EventMachineInterface::remove_timer(c)
|
38
|
-
# # Remove from timer structures - if still there!
|
39
|
-
# @@timer_procs.each do |timeout, value|
|
40
|
-
# conn, proc = value
|
41
|
-
# if (c==conn)
|
42
|
-
# @@timer_procs.delete(timeout)
|
43
|
-
# @@timer_keys_sorted.delete(timeout)
|
44
|
-
# end
|
45
|
-
# end
|
46
|
-
# end
|
47
|
-
#
|
48
|
-
# def EventMachineInterface::add_to_outstanding(c, timeout)
|
49
|
-
# # Add to timer structures
|
50
|
-
# @@timer_procs[Time.now+timeout]=[c, Proc.new {
|
51
|
-
# # Cancel the send
|
52
|
-
# c.closing=true
|
53
|
-
# c.close_connection
|
54
|
-
# c.send_timeout
|
55
|
-
# }]
|
56
|
-
# @@timer_keys_sorted=@@timer_procs.keys.sort
|
57
|
-
# @@outstanding_sends.push(c)
|
58
|
-
## puts "#{@@outstanding_sends.length} outstanding connections"
|
59
|
-
# if (@@outstanding_sends.length==1)
|
60
|
-
# EventMachine::add_timer(0) {process_timers}
|
61
|
-
# end
|
62
|
-
# end
|
63
|
-
#
|
64
|
-
# def EventMachineInterface::remove_from_outstanding(c)
|
65
|
-
# @@outstanding_sends.delete(c)
|
66
|
-
## puts "#{@@outstanding_sends.length} outstanding connections"
|
67
|
-
# remove_timer(c)
|
68
|
-
# # If we explicitly started the EM loop, and there are no more outstanding sends, then stop the EM loop
|
69
|
-
# stop_eventmachine
|
70
|
-
# end
|
71
|
-
#
|
72
|
-
# def EventMachineInterface::start_eventmachine
|
73
|
-
# if (!eventmachine_running?)
|
74
|
-
# if Resolver.start_eventmachine_loop?
|
75
|
-
# Dnsruby.log.debug("Starting EventMachine")
|
76
|
-
# @@started_em_here = true
|
77
|
-
# @@em_thread = Thread.new {
|
78
|
-
# EM.run {
|
79
|
-
## EventMachine::add_periodic_timer(0.1) {EventMachineInterface::process_timers}
|
80
|
-
# EventMachine::add_timer(0.1) {EventMachineInterface::process_timers}
|
81
|
-
# @@df = EventMachine::DefaultDeferrable.new
|
82
|
-
# @@df.callback{
|
83
|
-
# Dnsruby.log.debug("Stopping EventMachine")
|
84
|
-
# EM.stop
|
85
|
-
# @@em_thread=nil
|
86
|
-
# }
|
87
|
-
# }
|
88
|
-
# }
|
89
|
-
# else
|
90
|
-
# Dnsruby.log.debug("Not trying to start event loop")
|
91
|
-
# end
|
92
|
-
# end
|
93
|
-
# end
|
94
|
-
#
|
95
|
-
# def EventMachineInterface::start_em_for_resolver(res)
|
96
|
-
# @@running_clients.push(res)
|
97
|
-
# start_eventmachine
|
98
|
-
# end
|
99
|
-
#
|
100
|
-
# def EventMachineInterface::stop_em_for_resolver(res)
|
101
|
-
# @@running_clients.each_index do |i|
|
102
|
-
# if (@@running_clients[i]==res)
|
103
|
-
# @@running_clients.delete_at(i)
|
104
|
-
# end
|
105
|
-
# end
|
106
|
-
# stop_eventmachine
|
107
|
-
# end
|
108
|
-
#
|
109
|
-
# def EventMachineInterface::eventmachine_running?
|
110
|
-
# return (@@em_thread!=nil)
|
111
|
-
# end
|
112
|
-
#
|
113
|
-
# def EventMachineInterface::stop_eventmachine
|
114
|
-
# if (@@started_em_here)
|
115
|
-
# if (@@outstanding_sends.size==0)
|
116
|
-
# if (@@running_clients.length == 0)
|
117
|
-
# if (@@em_thread)
|
118
|
-
# @@df.set_deferred_status :succeeded
|
119
|
-
# @@started_em_here = false
|
120
|
-
# # @@em_thread = nil
|
121
|
-
# end
|
122
|
-
# end
|
123
|
-
# end
|
124
|
-
# end
|
125
|
-
# end
|
126
|
-
#
|
127
|
-
# def EventMachineInterface::send(args={})#msg, timeout, server, port, src_add, src_port, use_tcp)
|
128
|
-
# # Is the EventMachine loop running? If not, we need to start it (and mark that we started it)
|
129
|
-
# begin
|
130
|
-
# if (!EventMachine.reactor_running?)
|
131
|
-
# start_eventmachine
|
132
|
-
# end
|
133
|
-
# rescue Exception
|
134
|
-
# #@TODO@ EM::reactor_running? only introduced in EM v0.9.0 - if it's not there, we simply don't know what to do...
|
135
|
-
# Dnsruby.log.error("EventMachine::reactor_running? not available.")
|
136
|
-
# # if Resolver.start_eventmachine_loop?
|
137
|
-
# # Dnsruby.log.debug("Trying to start event loop - may prove fatal...")
|
138
|
-
# start_eventmachine
|
139
|
-
# # else
|
140
|
-
# # Dnsruby.log.debug("Not trying to start event loop.")
|
141
|
-
# # end
|
142
|
-
# end
|
143
|
-
# df = nil
|
144
|
-
# if (args[:use_tcp])
|
145
|
-
# df = send_tcp(args)
|
146
|
-
# else
|
147
|
-
# df = send_udp(args)
|
148
|
-
# end
|
149
|
-
# # Need to add this send to the list of outstanding sends
|
150
|
-
# add_to_outstanding(df, args[:timeout])
|
151
|
-
# return df
|
152
|
-
# end
|
153
|
-
#
|
154
|
-
# def EventMachineInterface::send_tcp(args={})#msg, timeout, server, port, src_add, src_port, use_tcp)
|
155
|
-
# connection = EventMachine::connect(args[:server], args[:port], EmTcpHandler) { |c|
|
156
|
-
# #@TODO SRC_PORT FOR TCP!!!
|
157
|
-
# c.timeout_time=Time.now + args[:timeout]
|
158
|
-
# c.instance_eval {@args = args}
|
159
|
-
# lenmsg = [args[:msg].length].pack('n')
|
160
|
-
# c.send_data(lenmsg)
|
161
|
-
# c.send_data args[:msg] # , args[:server], args[:port]
|
162
|
-
# Dnsruby.log.debug {"EventMachine : Sent TCP packet to #{args[:server]}:#{args[:port]}" + # from #{args[:src_address]}:#{args[:src_port]}, timeout=#{args[:timeout]}"
|
163
|
-
# ", timeout=#{args[:timeout]}"}
|
164
|
-
# }
|
165
|
-
# return connection # allows clients to set callback, errback, etc., if desired
|
166
|
-
# end
|
167
|
-
#
|
168
|
-
# def EventMachineInterface::send_udp(args={})# msg, timeout, server, port, src_add, src_port, use_tcp)
|
169
|
-
# connection = EventMachine::open_datagram_socket(args[:src_address], args[:src_port], EmUdpHandler) { |c|
|
170
|
-
# c.timeout_time=Time.now + args[:timeout]
|
171
|
-
# c.instance_eval {@args = args}
|
172
|
-
# c.send_datagram args[:msg], args[:server], args[:port]
|
173
|
-
# Dnsruby.log.debug{"EventMachine : Sent datagram to #{args[:server]}:#{args[:port]} from #{args[:src_address]}:#{args[:src_port]}, timeout=#{args[:timeout]}"}
|
174
|
-
# }
|
175
|
-
# return connection # allows clients to set callback, errback, etc., if desired
|
176
|
-
# end
|
177
|
-
#
|
178
|
-
#
|
179
|
-
# class EmUdpHandler < EventMachine::Connection #:nodoc: all
|
180
|
-
# include EM::Deferrable
|
181
|
-
# attr_accessor :closing, :timeout_time
|
182
|
-
# def post_init
|
183
|
-
# @closing=false
|
184
|
-
# end
|
185
|
-
# def receive_data(dgm)
|
186
|
-
# Dnsruby.log.debug{"UDP receive_data called"}
|
187
|
-
# process_incoming_message(dgm)
|
188
|
-
# end
|
189
|
-
#
|
190
|
-
# def process_incoming_message(data)
|
191
|
-
# Dnsruby.log.debug{"Processing incoming message, #{data.length} bytes"}
|
192
|
-
# ans=nil
|
193
|
-
# begin
|
194
|
-
# ans = Message.decode(data)
|
195
|
-
# rescue Exception => e
|
196
|
-
# Dnsruby.log.error{"Decode error! #{e.class}, #{e}\nfor msg (length=#{data.length}) : #{data}"}
|
197
|
-
# @closing=true
|
198
|
-
# close_connection
|
199
|
-
# send_to_client(nil, nil, e)
|
200
|
-
# return
|
201
|
-
# end
|
202
|
-
# Dnsruby.log.debug{"#{ans}"}
|
203
|
-
# ans.answerfrom=(@args[:server])
|
204
|
-
# ans.answersize=(data.length)
|
205
|
-
# exception = ans.header.get_exception
|
206
|
-
# @closing=true
|
207
|
-
# close_connection
|
208
|
-
# send_to_client(ans, data, exception)
|
209
|
-
# end
|
210
|
-
#
|
211
|
-
# def unbind
|
212
|
-
# Dnsruby.log.debug{"Unbind called"}
|
213
|
-
# if (!@closing)
|
214
|
-
# if (@timeout_time <= Time.now + 1)
|
215
|
-
# send_timeout
|
216
|
-
# else
|
217
|
-
# Dnsruby.log.debug{"Sending IOError to client"}
|
218
|
-
# send_to_client(nil, nil, IOError.new("Network error"))
|
219
|
-
# end
|
220
|
-
# end
|
221
|
-
# @closing=false
|
222
|
-
# # Take the last send off the list of outstanding sends
|
223
|
-
# EventMachineInterface.remove_from_outstanding(self)
|
224
|
-
# end
|
225
|
-
# def send_timeout
|
226
|
-
# Dnsruby.log.debug{"Sending timeout to client"}
|
227
|
-
# send_to_client(nil, nil, ResolvTimeout.new("Query timed out"))
|
228
|
-
# end
|
229
|
-
# def send_to_client(msg, bytes, err)
|
230
|
-
# # We call set_defered_status when done
|
231
|
-
# if (err != nil)
|
232
|
-
# set_deferred_status :failed, msg, err
|
233
|
-
# else
|
234
|
-
# set_deferred_status :succeeded, msg, bytes
|
235
|
-
# end
|
236
|
-
# end
|
237
|
-
# end
|
238
|
-
#
|
239
|
-
#
|
240
|
-
# class EmTcpHandler < EmUdpHandler #:nodoc: all
|
241
|
-
# def post_init
|
242
|
-
# super
|
243
|
-
# @data=""
|
244
|
-
# @answersize = 0
|
245
|
-
# end
|
246
|
-
# def receive_data(data)
|
247
|
-
# Dnsruby.log.debug{"TCP receive_data called"}
|
248
|
-
# #Buffer up the incoming data until we have a complete packet
|
249
|
-
# @data << data
|
250
|
-
# if (@data.length >= 2)
|
251
|
-
# if (@answersize == 0)
|
252
|
-
# @answersize = @data[0..1].unpack('n')[0]
|
253
|
-
# Dnsruby.log.debug{"TCP - expecting #{@answersize} bytes"}
|
254
|
-
# end
|
255
|
-
# if (@answersize == @data.length - 2)
|
256
|
-
# Dnsruby.log.debug{"TCP - got all #{@answersize} bytes "}
|
257
|
-
# process_incoming_message(@data[2..@data.length])
|
258
|
-
# else
|
259
|
-
# Dnsruby.log.debug{"TCP - got #{@data.length-2} message bytes"}
|
260
|
-
# end
|
261
|
-
# end
|
262
|
-
# end
|
263
|
-
# end
|
264
|
-
#
|
265
|
-
# end
|
266
|
-
#end
|
@@ -1,85 +0,0 @@
|
|
1
|
-
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'test/unit'
|
5
|
-
require 'eventmachine'
|
6
|
-
require 'dnsruby'
|
7
|
-
|
8
|
-
class EventMachineTestDeferrable < Test::Unit::TestCase
|
9
|
-
Dnsruby::Resolver.use_eventmachine(true)
|
10
|
-
def setup
|
11
|
-
# Dnsruby.log.level=Logger::DEBUG
|
12
|
-
Dnsruby::Resolver.use_eventmachine(true)
|
13
|
-
Dnsruby::Resolver.start_eventmachine_loop(true)
|
14
|
-
end
|
15
|
-
def teardown
|
16
|
-
Dnsruby::Resolver.use_eventmachine(false)
|
17
|
-
Dnsruby::Resolver.start_eventmachine_loop(true)
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_deferrable_success
|
21
|
-
res = Dnsruby::SingleResolver.new
|
22
|
-
Dnsruby::Resolver.use_eventmachine
|
23
|
-
Dnsruby::Resolver.start_eventmachine_loop(false)
|
24
|
-
EM.run {
|
25
|
-
df = res.send_async(Dnsruby::Message.new("nominet.org.uk"))
|
26
|
-
df.callback {|msg| EM.stop}
|
27
|
-
df.errback {|msg, err|
|
28
|
-
EM.stop
|
29
|
-
assert(false)}
|
30
|
-
}
|
31
|
-
Dnsruby::Resolver.start_eventmachine_loop(true)
|
32
|
-
end
|
33
|
-
|
34
|
-
def test_deferrable_timeout
|
35
|
-
res = Dnsruby::SingleResolver.new("10.0.1.128")
|
36
|
-
Dnsruby::Resolver.use_eventmachine
|
37
|
-
res.packet_timeout=2
|
38
|
-
Dnsruby::Resolver.start_eventmachine_loop(false)
|
39
|
-
EM.run {
|
40
|
-
df = res.send_async(Dnsruby::Message.new("nominet.org.uk"))
|
41
|
-
df.callback {|msg| EM.stop; assert(false)}
|
42
|
-
df.errback {|msg, err|
|
43
|
-
EM.stop
|
44
|
-
}
|
45
|
-
}
|
46
|
-
Dnsruby::Resolver.start_eventmachine_loop(true)
|
47
|
-
end
|
48
|
-
|
49
|
-
def test_deferrable_success
|
50
|
-
sleep(0.1) # Give the Event loop a chance to close down from previous test
|
51
|
-
Dnsruby::Resolver.use_eventmachine
|
52
|
-
Dnsruby::Resolver.start_eventmachine_loop(false)
|
53
|
-
res = Dnsruby::Resolver.new
|
54
|
-
q = Queue.new
|
55
|
-
id = 1
|
56
|
-
EM.run {
|
57
|
-
df = res.send_async(Dnsruby::Message.new("nominet.org.uk"))
|
58
|
-
df.callback {|msg| done = true; EM.stop}
|
59
|
-
df.errback {|msg, err|
|
60
|
-
puts "errback: #{msg}, #{err}"
|
61
|
-
done = true
|
62
|
-
EM.stop
|
63
|
-
assert(false)}
|
64
|
-
}
|
65
|
-
Dnsruby::Resolver.start_eventmachine_loop(true)
|
66
|
-
end
|
67
|
-
|
68
|
-
def test_deferrable_timeout
|
69
|
-
sleep(0.1) # Give the Event loop a chance to close down from previous test
|
70
|
-
Dnsruby::Resolver.start_eventmachine_loop(false)
|
71
|
-
Dnsruby::Resolver.use_eventmachine
|
72
|
-
res = Dnsruby::Resolver.new("10.0.1.128")
|
73
|
-
res.query_timeout=2
|
74
|
-
q = Queue.new
|
75
|
-
id = 1
|
76
|
-
EM.run {
|
77
|
-
df = res.send_async(Dnsruby::Message.new("nominet.org.uk"))
|
78
|
-
df.callback {|msg| EM.stop; assert(false)}
|
79
|
-
df.errback {|msg, err|
|
80
|
-
EM.stop
|
81
|
-
}
|
82
|
-
}
|
83
|
-
Dnsruby::Resolver.start_eventmachine_loop(true)
|
84
|
-
end
|
85
|
-
end
|
@@ -1,174 +0,0 @@
|
|
1
|
-
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'test/unit'
|
5
|
-
require 'eventmachine'
|
6
|
-
require 'dnsruby'
|
7
|
-
|
8
|
-
class EventMachineTestResolver < Test::Unit::TestCase
|
9
|
-
include Dnsruby
|
10
|
-
Dnsruby::Resolver.use_eventmachine(true)
|
11
|
-
Thread::abort_on_exception = true
|
12
|
-
def setup
|
13
|
-
Dnsruby::Config.reset
|
14
|
-
# Dnsruby.log.level=Logger::DEBUG
|
15
|
-
Dnsruby::Resolver.use_eventmachine(true)
|
16
|
-
Dnsruby::Resolver.start_eventmachine_loop(true)
|
17
|
-
end
|
18
|
-
def teardown
|
19
|
-
Dnsruby::Resolver.use_eventmachine(false)
|
20
|
-
Dnsruby::Resolver.start_eventmachine_loop(true)
|
21
|
-
end
|
22
|
-
|
23
|
-
def test_send_message
|
24
|
-
res = Resolver.new
|
25
|
-
ret = res.send_message(Message.new("example.com", Types.A))
|
26
|
-
assert(ret.kind_of?(Message))
|
27
|
-
end
|
28
|
-
|
29
|
-
def test_query
|
30
|
-
res = Resolver.new
|
31
|
-
ret = res.query("example.com")
|
32
|
-
assert(ret.kind_of?(Message))
|
33
|
-
end
|
34
|
-
|
35
|
-
def test_query_async
|
36
|
-
res = Resolver.new
|
37
|
-
q = Queue.new
|
38
|
-
res.send_async(Message.new("example.com", Types.A),q,q)
|
39
|
-
id, ret, error = q.pop
|
40
|
-
assert_equal(id, q, "Id wrong!")
|
41
|
-
assert(ret.kind_of?(Message), "Ret wrong!")
|
42
|
-
assert(error==nil)
|
43
|
-
end
|
44
|
-
|
45
|
-
def test_query_one_duff_server_one_good
|
46
|
-
res = Resolver.new({:nameserver => ["localhost", "128.8.10.90"]})
|
47
|
-
res.retry_delay=1
|
48
|
-
q = Queue.new
|
49
|
-
res.send_async(Message.new("example.com", Types.A),q,q)
|
50
|
-
id, ret, error = q.pop
|
51
|
-
assert_equal(id, q, "Id wrong!")
|
52
|
-
assert(ret.kind_of?(Message), "Ret wrong! (#{ret.class}")
|
53
|
-
assert(error==nil)
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_reverse_lookup
|
57
|
-
m = Message.new("210.251.121.214", Types.PTR)
|
58
|
-
r = Resolver.new
|
59
|
-
q=Queue.new
|
60
|
-
r.send_async(m,q,q)
|
61
|
-
id,ret, error=q.pop
|
62
|
-
assert(ret.kind_of?(Message))
|
63
|
-
no_pointer=true
|
64
|
-
ret.each_answer do |answer|
|
65
|
-
if (answer.type==Types.PTR)
|
66
|
-
no_pointer=false
|
67
|
-
assert(answer.domainname.to_s=~/ruby-lang/)
|
68
|
-
end
|
69
|
-
end
|
70
|
-
assert(!no_pointer)
|
71
|
-
end
|
72
|
-
|
73
|
-
def test_nxdomain
|
74
|
-
res=Resolver.new
|
75
|
-
q = Queue.new
|
76
|
-
res.send_async(Message.new("dklfjhdFHFHDVVUIEWRFDSAJKVCNASDLFJHN.com", Types.A), q, 1)
|
77
|
-
id, m, err = q.pop
|
78
|
-
assert(id==1)
|
79
|
-
assert(m.rcode == RCode.NXDOMAIN)
|
80
|
-
assert(err.kind_of?(NXDomain))
|
81
|
-
end
|
82
|
-
|
83
|
-
def test_timeouts
|
84
|
-
#test timeout behaviour for different retry, retrans, total timeout etc.
|
85
|
-
#Problem here is that many sockets will be created for queries which time out.
|
86
|
-
# Run a query which will not respond, and check that the timeout works
|
87
|
-
start=stop=0
|
88
|
-
retry_times = 3
|
89
|
-
retry_delay=1
|
90
|
-
packet_timeout=2
|
91
|
-
# Work out what time should be, then time it to check
|
92
|
-
expected = ((2**(retry_times-1))*retry_delay) + packet_timeout
|
93
|
-
begin
|
94
|
-
res = Resolver.new("10.0.1.128")
|
95
|
-
res.packet_timeout=packet_timeout
|
96
|
-
res.retry_times=retry_times
|
97
|
-
res.retry_delay=retry_delay
|
98
|
-
start=Time.now
|
99
|
-
m = res.send_message(Message.new("a.t.dnsruby.validation-test-servers.nominet.org.uk", Types.A))
|
100
|
-
fail
|
101
|
-
rescue ResolvTimeout
|
102
|
-
stop=Time.now
|
103
|
-
time = stop-start
|
104
|
-
assert(time <= expected *1.1 && time >= expected *0.9, "Wrong time taken, expected #{expected}, took #{time}")
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def test_query_timeout
|
109
|
-
res = Resolver.new({:nameserver => "10.0.1.128"})
|
110
|
-
start=stop=0
|
111
|
-
retry_times = retry_delay = packet_timeout= 10
|
112
|
-
query_timeout=2
|
113
|
-
begin
|
114
|
-
res.packet_timeout=packet_timeout
|
115
|
-
res.retry_times=retry_times
|
116
|
-
res.retry_delay=retry_delay
|
117
|
-
res.query_timeout=query_timeout
|
118
|
-
# Work out what time should be, then time it to check
|
119
|
-
expected = query_timeout
|
120
|
-
start=Time.now
|
121
|
-
m = res.send_message(Message.new("a.t.dnsruby.validation-test-servers.nominet.org.uk", Types.A))
|
122
|
-
fail
|
123
|
-
rescue ResolvTimeout
|
124
|
-
stop=Time.now
|
125
|
-
time = stop-start
|
126
|
-
assert(time <= expected *1.1 && time >= expected *0.9, "Wrong time take, expected #{expected}, took #{time}")
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
|
-
def test_queue_query_timeout
|
131
|
-
res = Resolver.new({:nameserver => "10.0.1.128"})
|
132
|
-
bad = SingleResolver.new("localhost")
|
133
|
-
res.add_resolver(bad)
|
134
|
-
expected = 2
|
135
|
-
res.query_timeout=expected
|
136
|
-
q = Queue.new
|
137
|
-
start = Time.now
|
138
|
-
m = res.send_async(Message.new("a.t.dnsruby.validation-test-servers.nominet.org.uk", Types.A), q, q)
|
139
|
-
id,ret,err = q.pop
|
140
|
-
stop = Time.now
|
141
|
-
assert(id=q)
|
142
|
-
assert(ret==nil)
|
143
|
-
assert(err.class == ResolvTimeout, "#{err.class}, #{err}")
|
144
|
-
time = stop-start
|
145
|
-
assert(time <= expected *1.2 && time >= expected *0.9, "Wrong time take, expected #{expected}, took #{time}")
|
146
|
-
end
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
def test_tcp
|
151
|
-
res = Dnsruby::Resolver.new
|
152
|
-
res.use_tcp = true
|
153
|
-
Dnsruby::Resolver.use_eventmachine
|
154
|
-
q = Queue.new
|
155
|
-
id = 1
|
156
|
-
res.send_async(Dnsruby::Message.new("nominet.org.uk"), q, id)
|
157
|
-
id+=1
|
158
|
-
res.send_async(Dnsruby::Message.new("example.com"), q, id)
|
159
|
-
id.times do |i|
|
160
|
-
itemid = q.pop[0]
|
161
|
-
assert(itemid <= id)
|
162
|
-
assert(itemid >= 0)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
def test_truncated_response
|
167
|
-
res = Dnsruby::Resolver.new('ns0.validation-test-servers.nominet.org.uk')
|
168
|
-
res.packet_timeout = 10
|
169
|
-
m = res.query("overflow.dnsruby.validation-test-servers.nominet.org.uk", 'txt')
|
170
|
-
assert(m.header.ancount == 61, "61 answer records expected, got #{m.header.ancount}")
|
171
|
-
assert(!m.header.tc, "Message was truncated!")
|
172
|
-
end
|
173
|
-
|
174
|
-
end
|
@@ -1,101 +0,0 @@
|
|
1
|
-
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'test/unit'
|
5
|
-
require 'eventmachine'
|
6
|
-
require 'dnsruby'
|
7
|
-
|
8
|
-
class EventMachineTestSingleResolver < Test::Unit::TestCase
|
9
|
-
Dnsruby::Resolver.use_eventmachine(true)
|
10
|
-
def setup
|
11
|
-
# Dnsruby.log.level=Logger::DEBUG
|
12
|
-
Dnsruby::Resolver.use_eventmachine(true)
|
13
|
-
Dnsruby::Resolver.start_eventmachine_loop(true)
|
14
|
-
sleep(0.01)
|
15
|
-
end
|
16
|
-
def teardown
|
17
|
-
Dnsruby::Resolver.use_eventmachine(false)
|
18
|
-
Dnsruby::Resolver.start_eventmachine_loop(true)
|
19
|
-
end
|
20
|
-
def test_udp
|
21
|
-
res = Dnsruby::SingleResolver.new
|
22
|
-
Dnsruby::Resolver.use_eventmachine(true)
|
23
|
-
Dnsruby::Resolver.start_eventmachine_loop(true)
|
24
|
-
q = Queue.new
|
25
|
-
id = 1
|
26
|
-
res.send_async(Dnsruby::Message.new("nominet.org.uk"), q, id)
|
27
|
-
id+=1
|
28
|
-
res.send_async(Dnsruby::Message.new("example.com"), q, id)
|
29
|
-
id.times do |i|
|
30
|
-
item = q.pop
|
31
|
-
assert(item[1].class==Dnsruby::Message)
|
32
|
-
assert(item[0] <= id)
|
33
|
-
assert(item[0] >= 0)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def test_tcp
|
38
|
-
res = Dnsruby::SingleResolver.new
|
39
|
-
res.use_tcp = true
|
40
|
-
Dnsruby::Resolver.use_eventmachine
|
41
|
-
q = Queue.new
|
42
|
-
id = 1
|
43
|
-
res.send_async(Dnsruby::Message.new("nominet.org.uk"), q, id)
|
44
|
-
id+=1
|
45
|
-
res.send_async(Dnsruby::Message.new("example.com"), q, id)
|
46
|
-
id.times do |i|
|
47
|
-
itemid, response, error = q.pop
|
48
|
-
assert(itemid <= id)
|
49
|
-
assert(itemid >= 0)
|
50
|
-
assert(error==nil)
|
51
|
-
end
|
52
|
-
#@TODO@ How do we check that TCP was actually used? Do we need a test server for this?
|
53
|
-
#Or will the truncated test catch this? (Query retried over TCP to fetch all records)
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_tcp_queue_timeout
|
57
|
-
res = Dnsruby::SingleResolver.new("10.0.1.128")
|
58
|
-
Dnsruby::Resolver.use_eventmachine(true)
|
59
|
-
res.packet_timeout=2
|
60
|
-
res.use_tcp=true
|
61
|
-
q = Queue.new
|
62
|
-
msg = Dnsruby::Message.new("a.t.dnsruby.validation-test-servers.nominet.org.uk")
|
63
|
-
res.send_async(msg, q, 1)
|
64
|
-
start=Time.now
|
65
|
-
id,ret,error = q.pop
|
66
|
-
end_time = Time.now
|
67
|
-
assert(id==1)
|
68
|
-
assert(ret==nil)
|
69
|
-
assert(error.class == Dnsruby::ResolvTimeout)
|
70
|
-
# p "Difference = #{end_time-start}"
|
71
|
-
assert(end_time - start >= 1.9)
|
72
|
-
assert(end_time - start <= 2.2)
|
73
|
-
end
|
74
|
-
|
75
|
-
def test_udp_queue_timeout
|
76
|
-
res = Dnsruby::SingleResolver.new("10.0.1.128")
|
77
|
-
Dnsruby::Resolver.use_eventmachine(true)
|
78
|
-
res.packet_timeout=2
|
79
|
-
q = Queue.new
|
80
|
-
start=Time.now
|
81
|
-
msg = Dnsruby::Message.new("a.t.dnsruby.validation-test-servers.nominet.org.uk")
|
82
|
-
res.send_async(msg, q, 1)
|
83
|
-
id,ret,error = q.pop
|
84
|
-
end_time = Time.now
|
85
|
-
assert(id==1)
|
86
|
-
assert(ret==nil)
|
87
|
-
# p "Difference = #{end_time-start}"
|
88
|
-
assert(error.class == Dnsruby::ResolvTimeout)
|
89
|
-
assert(end_time - start >= 1.9)
|
90
|
-
assert(end_time - start <= 2.2)
|
91
|
-
end
|
92
|
-
|
93
|
-
def test_truncated_response
|
94
|
-
res = Dnsruby::SingleResolver.new
|
95
|
-
res.packet_timeout = 10
|
96
|
-
res.server=('ns0.validation-test-servers.nominet.org.uk')
|
97
|
-
m = res.query("overflow.dnsruby.validation-test-servers.nominet.org.uk", 'txt')
|
98
|
-
assert(m.header.ancount == 61, "61 answer records expected, got #{m.header.ancount}")
|
99
|
-
assert(!m.header.tc, "Message was truncated!")
|
100
|
-
end
|
101
|
-
end
|