diff options
author | Miklós Fazekas <mfazekas@szemafor.com> | 2010-02-26 07:11:49 +0100 |
---|---|---|
committer | Miklós Fazekas <mfazekas@szemafor.com> | 2010-02-26 07:11:49 +0100 |
commit | 40bc65a0f4c58bb113688ff7d238b7bcd6b586ca (patch) | |
tree | cf447391ae0c9076c9e959b1fa4732d20dc3ee55 | |
parent | 47826b6f0cbd423c03d0e27fe2858e01305d3528 (diff) | |
download | net-ssh-40bc65a0f4c58bb113688ff7d238b7bcd6b586ca.tar.gz |
Added tests for port forwarding
-rw-r--r-- | endtoendtests/common.rb | 5 | ||||
-rw-r--r-- | endtoendtests/test_forward.rb | 118 |
2 files changed, 123 insertions, 0 deletions
diff --git a/endtoendtests/common.rb b/endtoendtests/common.rb new file mode 100644 index 0000000..6bde716 --- /dev/null +++ b/endtoendtests/common.rb @@ -0,0 +1,5 @@ +$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../lib" +require 'rubygems' +gem "test-unit" # http://rubyforge.org/pipermail/test-unit-tracker/2009-July/000075.html +require 'test/unit' +require 'mocha' diff --git a/endtoendtests/test_forward.rb b/endtoendtests/test_forward.rb new file mode 100644 index 0000000..ba8e519 --- /dev/null +++ b/endtoendtests/test_forward.rb @@ -0,0 +1,118 @@ +require 'common' +require 'net/ssh/buffer' +require 'net/ssh' + +# keyless ssh setup +# +# cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys +# to test: +# ssh localhost +# + +class TestForward < Test::Unit::TestCase + + def localhost + 'localhost' + end + + def ssh_start_params + [localhost ,ENV['USER']] + end + + def find_free_port + 8080 + end + + def start_server_sending_lot_of_data + server = TCPServer.open(0) + Thread.start do + loop do + Thread.start(server.accept) do |client| + 10000.times do |i| + client.puts "item#{i}" + end + client.close + end + end + end + return server + end + + def start_server_closing_soon + server = TCPServer.open(0) + Thread.start do + loop do + Thread.start(server.accept) do |client| + client.recv(1024) + client.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, [1, 0].pack("ii")) + client.close + #client.close + end + end + end + return server + end + + def test_loop_should_not_abort_when_local_side_of_forward_is_closed + session = Net::SSH.start(*ssh_start_params) + server = start_server_sending_lot_of_data + remote_port = server.addr[1] + local_port = find_free_port + session.forward.local(local_port, localhost, remote_port) + client_done = Queue.new + Thread.start do + begin + client = TCPSocket.new(localhost, local_port) + client.recv(1024) + client.close + sleep(0.2) + ensure + client_done << true + end + end + session.loop(0.1) { client_done.empty? } + end + + def test_loop_should_not_abort_when_local_side_of_forward_is_reset + session = Net::SSH.start(*ssh_start_params) + server = start_server_sending_lot_of_data + remote_port = server.addr[1] + local_port = find_free_port+1 + session.forward.local(local_port, localhost, remote_port) + client_done = Queue.new + Thread.start do + begin + client = TCPSocket.new(localhost, local_port) + client.recv(1024) + client.setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, [1, 0].pack("ii")) + client.close + sleep(0.1) + ensure + client_done << true + end + end + session.loop(0.1) { client_done.empty? } + end + + def test_loop_should_not_abort_when_server_side_of_forward_is_closed + session = Net::SSH.start(*ssh_start_params) + server = start_server_closing_soon + remote_port = server.addr[1] + local_port = find_free_port+2 + session.forward.local(local_port, localhost, remote_port) + client_done = Queue.new + Thread.start do + begin + client = TCPSocket.new(localhost, local_port) + 1.times do |i| + client.puts "item#{i}" + end + client.close + sleep(0.1) + ensure + client_done << true + end + end + session.loop(0.1) { client_done.empty? } + end +end
\ No newline at end of file |