Skip to content

Commit 6f8e3c6

Browse files
committed
don't try to select on io's that are closed
1 parent 00e01a9 commit 6f8e3c6

File tree

2 files changed

+38
-18
lines changed

2 files changed

+38
-18
lines changed

lib/net/ssh/multi/server.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,14 +206,13 @@ def preprocess #:nodoc:
206206
# session is not open.
207207
def readers #:nodoc:
208208
return [] unless session
209-
session.listeners.keys
209+
session.listeners.keys.reject { |io| io.closed? }
210210
end
211211

212212
# Returns all registered and pending writers on the session, or an empty
213213
# array if the session is not open.
214214
def writers #:nodoc:
215-
return [] unless session
216-
session.listeners.keys.select do |io|
215+
readers.select do |io|
217216
io.respond_to?(:pending_write?) && io.pending_write?
218217
end
219218
end

test/server_test.rb

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -178,9 +178,10 @@ def test_readers_should_return_empty_array_when_session_is_not_open
178178
def test_readers_should_return_all_listeners_when_session_is_open
179179
srv = server('host')
180180
session = expect_connection_to(srv)
181-
session.expects(:listeners).returns(1 => 2, 3 => 4, 5 => 6, 7 => 8)
181+
io1, io2, io3, io4 = Reader.new, Reader.new, Reader.new, Reader.new
182+
session.expects(:listeners).returns(io1 => 2, io2 => 4, io3 => 6, io4 => 8)
182183
srv.session(true)
183-
assert_equal [1, 3, 5, 7], srv.readers.sort
184+
assert_equal [io1, io2, io3, io4], srv.readers.sort
184185
end
185186

186187
def test_writers_should_return_empty_array_when_session_is_not_open
@@ -190,8 +191,8 @@ def test_writers_should_return_empty_array_when_session_is_not_open
190191
def test_writers_should_return_all_listeners_that_are_pending_writes_when_session_is_open
191192
srv = server('host')
192193
session = expect_connection_to(srv)
193-
listeners = { writer(:ready) => 1, writer(:reader) => 2,
194-
writer(:reader) => 3, writer(:idle) => 4, writer(:ready) => 5 }
194+
listeners = { Reader.new(true) => 1, MockIO.new => 2,
195+
MockIO.new => 3, Reader.new => 4, Reader.new(true) => 5 }
195196
session.expects(:listeners).returns(listeners)
196197
srv.session(true)
197198
assert_equal 2, srv.writers.length
@@ -212,6 +213,37 @@ def test_postprocess_should_call_session_postprocess_with_ios_belonging_to_sessi
212213

213214
private
214215

216+
class MockIO
217+
include Comparable
218+
219+
@@identifier = 0
220+
221+
attr_reader :id
222+
223+
def initialize
224+
@id = (@@identifier += 1)
225+
end
226+
227+
def <=>(io)
228+
@id <=> io.id
229+
end
230+
231+
def closed?
232+
false
233+
end
234+
end
235+
236+
class Reader < MockIO
237+
def initialize(ready=false)
238+
super()
239+
@ready = ready
240+
end
241+
242+
def pending_write?
243+
@ready
244+
end
245+
end
246+
215247
def server(host, options={})
216248
Net::SSH::Multi::Server.new(@master, host, options)
217249
end
@@ -221,15 +253,4 @@ def expect_connection_to(server)
221253
@master.expects(:next_session).with(server).returns(session)
222254
return session
223255
end
224-
225-
def writer(mode)
226-
case mode
227-
when :ready then
228-
stub('io', :pending_write? => true)
229-
when :idle then
230-
stub('io', :pending_write? => false)
231-
else
232-
stub('io')
233-
end
234-
end
235256
end

0 commit comments

Comments
 (0)