expect4r 0.0.6.dev → 0.0.7.dev
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/expect/io.rb +127 -20
- data/lib/router/error.rb +3 -2
- metadata +3 -3
data/lib/expect/io.rb
CHANGED
@@ -9,9 +9,9 @@ class IO
|
|
9
9
|
s = _io_string!
|
10
10
|
exp_internal match_string
|
11
11
|
exp_internal s
|
12
|
-
return if no_echo
|
13
12
|
s = s.chomp(ch) if ch
|
14
|
-
_io_buf1 << s
|
13
|
+
_io_buf1 << s
|
14
|
+
_io_buf1
|
15
15
|
end
|
16
16
|
def _io_more? ; ! IO.select([self],nil,nil,0.20).nil? ; end
|
17
17
|
def _io_exit? ; _io_buf0.last.nil? ; end
|
@@ -178,26 +178,130 @@ module Expect4r
|
|
178
178
|
end
|
179
179
|
lines.size==1 ? r[0] : r
|
180
180
|
end
|
181
|
-
|
182
|
-
def expect(match, ti=5)
|
183
|
-
|
181
|
+
|
182
|
+
def expect(match, ti=5, matches=[])
|
183
|
+
t0 = Time.now
|
184
|
+
rc, buf = catch(:done) do
|
184
185
|
@r.readbuf(ti) do |r|
|
185
186
|
if r._io_exit?
|
186
|
-
throw :done, [
|
187
|
+
throw :done, [:abort, r._io_string!]
|
187
188
|
end
|
188
189
|
case r._io_string
|
189
190
|
when match
|
190
|
-
|
191
|
+
r._io_save false, "matching PROMPT"
|
192
|
+
# puts "debug IO BUF 1 #{r._io_buf1.inspect}"
|
193
|
+
throw(:done, [:ok, r._io_buf1])
|
194
|
+
# FIXME
|
195
|
+
# Watch out for the ping command !!!!
|
196
|
+
# throw :done, [:ok, r._io_string!.chomp("\r\n")]
|
197
|
+
when /(.+)\r\n/, "\r\n"
|
198
|
+
r._io_save false, "matching EOL"
|
199
|
+
else
|
200
|
+
matches.each do |match, arg|
|
201
|
+
if r._io_string =~ match
|
202
|
+
r._io_save false, "match #{match}"
|
203
|
+
if arg.is_a?(Proc)
|
204
|
+
arg.call(self)
|
205
|
+
else
|
206
|
+
exp_puts arg
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
191
210
|
end
|
192
211
|
end
|
193
212
|
end
|
194
|
-
|
195
|
-
|
196
|
-
|
213
|
+
case rc
|
214
|
+
when :abort
|
215
|
+
elapsed = Time.now - t0
|
216
|
+
if elapsed < ti
|
217
|
+
child_exit
|
218
|
+
raise ConnectionError.new(buf)
|
219
|
+
else
|
220
|
+
raise ExpTimeoutError.new(buf, elapsed)
|
221
|
+
end
|
222
|
+
else
|
223
|
+
@lp = buf.last
|
224
|
+
end
|
225
|
+
[buf, rc]
|
197
226
|
end
|
198
227
|
|
199
|
-
def
|
200
|
-
|
228
|
+
def get_prompt
|
229
|
+
putline '', :no_trim=>true, :no_echo=>true
|
230
|
+
end
|
231
|
+
|
232
|
+
def putline(line, arg={})
|
233
|
+
raise ConnectionError.new(line) if child_exited?
|
234
|
+
|
235
|
+
arg = {:ti=>13, :no_echo=>false, :debug=>0, :sync=> false, :no_trim=>false}.merge(arg)
|
236
|
+
no_echo = arg[:no_echo]
|
237
|
+
ti = arg[:ti]
|
238
|
+
unless arg[:no_trim]==true
|
239
|
+
line = line.gsub(/\s+/,' ').gsub(/^\s+/,'')
|
240
|
+
if line.size==0
|
241
|
+
log "DEBUG PUTLINE: NOT SENDING **** line = '#{line.inspect}' arg=#{arg.inspect}"
|
242
|
+
return [[], :empty_line]
|
243
|
+
end
|
244
|
+
end
|
245
|
+
sync if arg[:sync]
|
246
|
+
t0 = Time.now
|
247
|
+
exp_puts line
|
248
|
+
output=[]
|
249
|
+
rc, buf = catch(:done) do
|
250
|
+
@r.readbuf(arg[:ti]) do |r|
|
251
|
+
if r._io_exit?
|
252
|
+
r._io_save(no_echo)
|
253
|
+
throw :done, [ :abort, r._io_buf1]
|
254
|
+
end
|
255
|
+
case r._io_string
|
256
|
+
when @ps1, @ps1_bis
|
257
|
+
unless r._io_more?
|
258
|
+
r._io_save no_echo, "matching PROMPT"
|
259
|
+
# puts "debug IO BUF 1 #{r._io_buf1.inspect}"
|
260
|
+
throw(:done, [:ok, r._io_buf1])
|
261
|
+
end
|
262
|
+
exp_internal "more..."
|
263
|
+
when /(.+)\r\n/, "\r\n"
|
264
|
+
r._io_save no_echo, "matching EOL"
|
265
|
+
when @more
|
266
|
+
r._io_save no_echo, "matching MORE"
|
267
|
+
putc ' '
|
268
|
+
else
|
269
|
+
# For objects that include Expect4r but do not subclass base Login class.
|
270
|
+
@matches ||= []
|
271
|
+
@matches.each { |match, _send|
|
272
|
+
if r._io_string =~ match
|
273
|
+
r._io_save no_echo, "match #{match}"
|
274
|
+
if _send.is_a?(Proc)
|
275
|
+
_send.call(self)
|
276
|
+
else
|
277
|
+
exp_puts _send
|
278
|
+
end
|
279
|
+
end
|
280
|
+
}
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
case rc
|
286
|
+
when :abort
|
287
|
+
elapsed = Time.now - t0
|
288
|
+
if elapsed < ti
|
289
|
+
child_exit
|
290
|
+
raise ConnectionError.new(line)
|
291
|
+
else
|
292
|
+
raise ExpTimeoutError.new(line, elapsed)
|
293
|
+
end
|
294
|
+
else
|
295
|
+
@lp = buf.last
|
296
|
+
end
|
297
|
+
[buf, rc]
|
298
|
+
end
|
299
|
+
|
300
|
+
def readline(ti=0.2, matches=[])
|
301
|
+
ret = expect(/(.+)\r\n/, ti, matches)
|
302
|
+
ret[0][0].chomp
|
303
|
+
rescue ExpTimeoutError => ex
|
304
|
+
''
|
201
305
|
end
|
202
306
|
|
203
307
|
def connected?
|
@@ -453,9 +557,12 @@ module Expect4r
|
|
453
557
|
include Expect4r
|
454
558
|
class << self
|
455
559
|
attr_reader :routers
|
560
|
+
def all
|
561
|
+
@arr
|
562
|
+
end
|
456
563
|
def add(r)
|
457
|
-
@
|
458
|
-
@
|
564
|
+
@arr ||=[]
|
565
|
+
@arr << r
|
459
566
|
end
|
460
567
|
end
|
461
568
|
def initialize(*args)
|
@@ -578,11 +685,11 @@ end
|
|
578
685
|
if __FILE__ != $0
|
579
686
|
|
580
687
|
at_exit {
|
581
|
-
if Expect4r::Base.
|
582
|
-
Expect4r::Base.
|
688
|
+
if Expect4r::Base.all
|
689
|
+
Expect4r::Base.all.each { |o| o.logout if o.respond_to? :logout }
|
583
690
|
end
|
584
691
|
}
|
585
|
-
|
692
|
+
|
586
693
|
else
|
587
694
|
|
588
695
|
require "test/unit"
|
@@ -597,11 +704,11 @@ else
|
|
597
704
|
include Expect4r
|
598
705
|
|
599
706
|
def test_add
|
600
|
-
assert [], Base.
|
707
|
+
assert [], Base.all
|
601
708
|
Base.new
|
602
|
-
assert 1, Base.
|
709
|
+
assert 1, Base.all.size
|
603
710
|
Base.new
|
604
|
-
assert_equal 2, Base.
|
711
|
+
assert_equal 2, Base.all.size
|
605
712
|
end
|
606
713
|
end
|
607
714
|
|
data/lib/router/error.rb
CHANGED
@@ -23,9 +23,10 @@ module Error
|
|
23
23
|
end
|
24
24
|
|
25
25
|
class PingError < RuntimeError
|
26
|
-
attr_reader :rname, :dest, :exp_pct, :act_pct, :sent, :recv
|
26
|
+
attr_reader :rname, :dest, :exp_pct, :act_pct, :sent, :recv, :ping_output
|
27
27
|
def initialize(rname, dest, exp_pct, act_pct, sent, recv, output)
|
28
|
-
@rname, @dest, @exp_pct, @act_pct, @sent, @recv
|
28
|
+
@rname, @dest, @exp_pct, @act_pct, @sent, @recv, @ping_output = \
|
29
|
+
rname, dest, exp_pct, act_pct, sent, recv, output
|
29
30
|
end
|
30
31
|
def err_msg
|
31
32
|
"#{@rname} [PingError] : failed to ping #{@dest}, expected/actual pct: #{@exp_pct}/#{@act_pct}"
|
metadata
CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
8
|
+
- 7
|
9
9
|
- dev
|
10
|
-
version: 0.0.
|
10
|
+
version: 0.0.7.dev
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jean-Michel Esnault
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-12-16 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|