summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJamis Buck <jamis@37signals.com>2008-04-18 15:33:13 -0600
committerJamis Buck <jamis@37signals.com>2008-04-18 15:33:13 -0600
commit6f8e3c6e342fb1544c72a7b58411a5bfb8466b6b (patch)
tree50a28ade0446f3b03b83bdafc48a430598aff62a
parent00e01a9f1079017f3b5ca72a0d9d33496f7e5143 (diff)
downloadnet-ssh-multi-6f8e3c6e342fb1544c72a7b58411a5bfb8466b6b.tar.gz
don't try to select on io's that are closed
-rw-r--r--lib/net/ssh/multi/server.rb5
-rw-r--r--test/server_test.rb51
2 files changed, 38 insertions, 18 deletions
diff --git a/lib/net/ssh/multi/server.rb b/lib/net/ssh/multi/server.rb
index 41fd97c..6ac5769 100644
--- a/lib/net/ssh/multi/server.rb
+++ b/lib/net/ssh/multi/server.rb
@@ -206,14 +206,13 @@ module Net; module SSH; module Multi
# session is not open.
def readers #:nodoc:
return [] unless session
- session.listeners.keys
+ session.listeners.keys.reject { |io| io.closed? }
end
# Returns all registered and pending writers on the session, or an empty
# array if the session is not open.
def writers #:nodoc:
- return [] unless session
- session.listeners.keys.select do |io|
+ readers.select do |io|
io.respond_to?(:pending_write?) && io.pending_write?
end
end
diff --git a/test/server_test.rb b/test/server_test.rb
index 02ba0e0..4c0c640 100644
--- a/test/server_test.rb
+++ b/test/server_test.rb
@@ -178,9 +178,10 @@ class ServerTest < Test::Unit::TestCase
def test_readers_should_return_all_listeners_when_session_is_open
srv = server('host')
session = expect_connection_to(srv)
- session.expects(:listeners).returns(1 => 2, 3 => 4, 5 => 6, 7 => 8)
+ io1, io2, io3, io4 = Reader.new, Reader.new, Reader.new, Reader.new
+ session.expects(:listeners).returns(io1 => 2, io2 => 4, io3 => 6, io4 => 8)
srv.session(true)
- assert_equal [1, 3, 5, 7], srv.readers.sort
+ assert_equal [io1, io2, io3, io4], srv.readers.sort
end
def test_writers_should_return_empty_array_when_session_is_not_open
@@ -190,8 +191,8 @@ class ServerTest < Test::Unit::TestCase
def test_writers_should_return_all_listeners_that_are_pending_writes_when_session_is_open
srv = server('host')
session = expect_connection_to(srv)
- listeners = { writer(:ready) => 1, writer(:reader) => 2,
- writer(:reader) => 3, writer(:idle) => 4, writer(:ready) => 5 }
+ listeners = { Reader.new(true) => 1, MockIO.new => 2,
+ MockIO.new => 3, Reader.new => 4, Reader.new(true) => 5 }
session.expects(:listeners).returns(listeners)
srv.session(true)
assert_equal 2, srv.writers.length
@@ -212,6 +213,37 @@ class ServerTest < Test::Unit::TestCase
private
+ class MockIO
+ include Comparable
+
+ @@identifier = 0
+
+ attr_reader :id
+
+ def initialize
+ @id = (@@identifier += 1)
+ end
+
+ def <=>(io)
+ @id <=> io.id
+ end
+
+ def closed?
+ false
+ end
+ end
+
+ class Reader < MockIO
+ def initialize(ready=false)
+ super()
+ @ready = ready
+ end
+
+ def pending_write?
+ @ready
+ end
+ end
+
def server(host, options={})
Net::SSH::Multi::Server.new(@master, host, options)
end
@@ -221,15 +253,4 @@ class ServerTest < Test::Unit::TestCase
@master.expects(:next_session).with(server).returns(session)
return session
end
-
- def writer(mode)
- case mode
- when :ready then
- stub('io', :pending_write? => true)
- when :idle then
- stub('io', :pending_write? => false)
- else
- stub('io')
- end
- end
end \ No newline at end of file