1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
require 'common'
require 'net/ssh/transport/server_version'
module Transport
class TestServerVersion < Test::Unit::TestCase
def test_1_99_server_version_should_be_acceptible
s = subject(socket(true, "SSH-1.99-Testing_1.0\r\n"))
assert s.header.empty?
assert_equal "SSH-1.99-Testing_1.0", s.version
end
def test_2_0_server_version_should_be_acceptible
s = subject(socket(true, "SSH-2.0-Testing_1.0\r\n"))
assert s.header.empty?
assert_equal "SSH-2.0-Testing_1.0", s.version
end
def test_trailing_whitespace_should_be_preserved
# some servers, like Mocana, send a version string with trailing
# spaces, which are significant when exchanging keys later.
s = subject(socket(true, "SSH-2.0-Testing_1.0 \r\n"))
assert_equal "SSH-2.0-Testing_1.0 ", s.version
end
def test_unacceptible_server_version_should_raise_exception
assert_raises(Net::SSH::Exception) { subject(socket(false, "SSH-1.4-Testing_1.0\r\n")) }
end
def test_unexpected_server_close_should_raise_exception
assert_raises(Net::SSH::Disconnect) { subject(socket(false, "\r\nDestination server does not have Ssh activated.\r\nContact Cisco Systems, Inc to purchase a\r\nlicense key to activate Ssh.\r\n", true)) }
end
def test_header_lines_should_be_accumulated
s = subject(socket(true, "Welcome\r\nAnother line\r\nSSH-2.0-Testing_1.0\r\n"))
assert_equal "Welcome\r\nAnother line\r\n", s.header
assert_equal "SSH-2.0-Testing_1.0", s.version
end
def test_server_disconnect_should_raise_exception
assert_raises(Net::SSH::Disconnect) { subject(socket(false, "SSH-2.0-Aborting")) }
end
private
def socket(good, version_header, raise_eot=false)
socket = mock("socket")
data = version_header.split('')
recv_times = data.length
recv_times += 1 if data[-1] != "\n"
unless raise_eot
# socket.expects(:recv).with(1).times(recv_times).returns(*data).then.returns(nil)
# socket.expects(:readchar).times(recv_times).returns(*data).then.returns(nil)
socket.expects(:readpartial).with(1).times(recv_times).returns(*data).then.returns(nil)
else
socket.expects(:readpartial).with(1).times(recv_times+1).returns(*data).then.raises(EOFError, "end of file reached")
end
if good
socket.expects(:write).with("#{Net::SSH::Transport::ServerVersion::PROTO_VERSION}\r\n")
socket.expects(:flush)
else
socket.expects(:write).never
end
socket
end
def subject(socket)
Net::SSH::Transport::ServerVersion.new(socket, nil)
end
end
end
|