summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklós Fazekas <mfazekas@szemafor.com>2010-02-26 07:11:49 +0100
committerMiklós Fazekas <mfazekas@szemafor.com>2010-02-26 07:11:49 +0100
commit40bc65a0f4c58bb113688ff7d238b7bcd6b586ca (patch)
treecf447391ae0c9076c9e959b1fa4732d20dc3ee55
parent47826b6f0cbd423c03d0e27fe2858e01305d3528 (diff)
downloadnet-ssh-40bc65a0f4c58bb113688ff7d238b7bcd6b586ca.tar.gz
Added tests for port forwarding
-rw-r--r--endtoendtests/common.rb5
-rw-r--r--endtoendtests/test_forward.rb118
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