diff options
Diffstat (limited to 'lib/ssh/test')
| -rw-r--r-- | lib/ssh/test/ssh_connection_SUITE.erl | 64 | ||||
| -rw-r--r-- | lib/ssh/test/ssh_sftp_SUITE.erl | 55 | 
2 files changed, 118 insertions, 1 deletions
| diff --git a/lib/ssh/test/ssh_connection_SUITE.erl b/lib/ssh/test/ssh_connection_SUITE.erl index 0f757a0322..97dcb8570d 100644 --- a/lib/ssh/test/ssh_connection_SUITE.erl +++ b/lib/ssh/test/ssh_connection_SUITE.erl @@ -47,6 +47,7 @@ all() ->       start_shell,       start_shell_exec,       start_shell_exec_fun, +     start_shell_sock_exec_fun,       gracefull_invalid_version,       gracefull_invalid_start,       gracefull_invalid_long_start, @@ -60,6 +61,9 @@ groups() ->  payload() ->      [simple_exec, +     simple_exec_sock, +     connect_sock_not_tcp, +     connect_sock_not_passive,       small_cat,       big_cat,       send_after_exit]. @@ -111,6 +115,18 @@ simple_exec() ->  simple_exec(Config) when is_list(Config) ->      ConnectionRef = ssh_test_lib:connect(?SSH_DEFAULT_PORT, [{silently_accept_hosts, true},  							     {user_interaction, false}]), +    do_simple_exec(ConnectionRef). + + +simple_exec_sock(Config) -> +    {ok, Sock} = gen_tcp:connect("localhost", ?SSH_DEFAULT_PORT, [{active,false}]), +    {ok, ConnectionRef} = ssh:connect(Sock, [{silently_accept_hosts, true}, +					     {user_interaction, false}]), +    do_simple_exec(ConnectionRef). +     + + +do_simple_exec(ConnectionRef) ->      {ok, ChannelId0} = ssh_connection:session_channel(ConnectionRef, infinity),      success = ssh_connection:exec(ConnectionRef, ChannelId0,  				  "echo testing", infinity), @@ -143,6 +159,18 @@ simple_exec(Config) when is_list(Config) ->      end.  %%-------------------------------------------------------------------- +connect_sock_not_tcp(Config) -> +    {ok,Sock} = gen_udp:open(0, []),  +    {error, not_tcp_socket} = ssh:connect(Sock, []), +    gen_udp:close(Sock). + +%%-------------------------------------------------------------------- +connect_sock_not_passive(Config) -> +    {ok,Sock} = gen_tcp:connect("localhost", ?SSH_DEFAULT_PORT, []),  +    {error, not_passive_mode} = ssh:connect(Sock, []), +    gen_tcp:close(Sock). + +%%--------------------------------------------------------------------  small_cat() ->      [{doc, "Use 'cat' to echo small data block back to us."}]. @@ -456,6 +484,42 @@ start_shell_exec_fun(Config) when is_list(Config) ->      ssh:stop_daemon(Pid).  %%-------------------------------------------------------------------- +start_shell_sock_exec_fun() -> +    [{doc, "start shell on tcp-socket to exec command"}]. + +start_shell_sock_exec_fun(Config) when is_list(Config) -> +    PrivDir = proplists:get_value(priv_dir, Config), +    UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth +    file:make_dir(UserDir), +    SysDir = proplists:get_value(data_dir, Config), +    {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir}, +					     {user_dir, UserDir}, +					     {password, "morot"}, +					     {exec, fun ssh_exec/1}]), + +    {ok, Sock} = gen_tcp:connect(Host, Port, [{active,false}]), +    {ok,ConnectionRef} = ssh:connect(Sock, [{silently_accept_hosts, true}, +					    {user, "foo"}, +					    {password, "morot"}, +					    {user_interaction, true}, +					    {user_dir, UserDir}]), + +    {ok, ChannelId0} = ssh_connection:session_channel(ConnectionRef, infinity), + +    success = ssh_connection:exec(ConnectionRef, ChannelId0, +				  "testing", infinity), + +    receive +	{ssh_cm, ConnectionRef, {data, _ChannelId, 0, <<"testing\r\n">>}} -> +	    ok +    after 5000 -> +	    ct:fail("Exec Timeout") +    end, + +    ssh:close(ConnectionRef), +    ssh:stop_daemon(Pid). + +%%--------------------------------------------------------------------  gracefull_invalid_version(Config) when is_list(Config) ->      PrivDir = ?config(priv_dir, Config), diff --git a/lib/ssh/test/ssh_sftp_SUITE.erl b/lib/ssh/test/ssh_sftp_SUITE.erl index 26fe0935e1..46db85c1be 100644 --- a/lib/ssh/test/ssh_sftp_SUITE.erl +++ b/lib/ssh/test/ssh_sftp_SUITE.erl @@ -86,7 +86,8 @@ groups() ->  			     write_file, write_file_iolist, write_big_file, sftp_read_big_file,  			     rename_file, mk_rm_dir, remove_file, links,  			     retrieve_attributes, set_attributes, async_read, -			     async_write, position, pos_read, pos_write +			     async_write, position, pos_read, pos_write, +			     start_channel_sock  			    ]}      ]. @@ -625,6 +626,58 @@ pos_write(Config) when is_list(Config) ->      {ok, NewData1} = ssh_sftp:read_file(Sftp, FileName).  %%-------------------------------------------------------------------- +start_channel_sock(Config) -> +    LoginOpts = +	case proplists:get_value(group,Config) of +	    erlang_server ->  +		[{user,     proplists:get_value(user, Config)}, +		 {password, proplists:get_value(passwd, Config)}]; +	    openssh_server -> +		[] % Use public key +	end, + +    Opts = [{user_interaction, false}, +	    {silently_accept_hosts, true} +	    | LoginOpts], + +    {Host,Port} = proplists:get_value(peer, Config), + +    %% Get a tcp socket +    {ok, Sock} = gen_tcp:connect(Host, Port, [{active,false}]), + +    %% and open one channel on one new Connection +    {ok, ChPid1, Conn} = ssh_sftp:start_channel(Sock, Opts), +     +    %% Test that the channel is usable +    FileName = proplists:get_value(filename, Config), +    ok = open_close_file(ChPid1, FileName, [read]), +    ok = open_close_file(ChPid1, FileName, [write]), + +    %% Try to open a second channel on the Connection +    {ok, ChPid2} = ssh_sftp:start_channel(Conn, Opts), +    ok = open_close_file(ChPid1, FileName, [read]), +    ok = open_close_file(ChPid2, FileName, [read]), + +    %% Test that the second channel still works after closing the first one +    ok = ssh_sftp:stop_channel(ChPid1), +    ok = open_close_file(ChPid2, FileName, [write]), +     +    %% Test the Connection survives that all channels are closed +    ok = ssh_sftp:stop_channel(ChPid2), +    {ok, ChPid3} = ssh_sftp:start_channel(Conn, Opts), +    ok = open_close_file(ChPid3, FileName, [write]), +     +    %% Test that a closed channel really is closed +    {error, closed} = ssh_sftp:open(ChPid2, FileName, [write]), +    ok = ssh_sftp:stop_channel(ChPid3), + +    %% Test that the socket is closed when the Connection closes +    ok = ssh:close(Conn), +    {error,einval} = inet:getopts(Sock, [active]), + +    ok. + +%%--------------------------------------------------------------------  sftp_nonexistent_subsystem() ->      [{doc, "Try to execute sftp subsystem on a server that does not support it"}].  sftp_nonexistent_subsystem(Config) when is_list(Config) -> | 
