From 84df3d4d0278e21a36a453bfee94799f0df67c2a Mon Sep 17 00:00:00 2001
From: Hans Nilsson <hans@erlang.org>
Date: Tue, 6 Oct 2015 21:18:23 +0200
Subject: ssh: Option max_channels added.

It actually counts the number of subsystem alive.  Allocating a channel does not consume any resources
(except some cpu cycles), but the subsystem start spawns processes.
---
 lib/ssh/test/ssh_connection_SUITE.erl | 75 ++++++++++++++++++++++++++++++++++-
 1 file changed, 74 insertions(+), 1 deletion(-)

(limited to 'lib/ssh/test')

diff --git a/lib/ssh/test/ssh_connection_SUITE.erl b/lib/ssh/test/ssh_connection_SUITE.erl
index fbcf06290a..37bba07440 100644
--- a/lib/ssh/test/ssh_connection_SUITE.erl
+++ b/lib/ssh/test/ssh_connection_SUITE.erl
@@ -48,7 +48,8 @@ all() ->
      gracefull_invalid_long_start,
      gracefull_invalid_long_start_no_nl,
      stop_listener,
-     start_subsystem_on_closed_channel
+     start_subsystem_on_closed_channel,
+     max_channels_option
     ].
 groups() ->
     [{openssh, [], payload() ++ ptty()}].
@@ -605,6 +606,78 @@ start_subsystem_on_closed_channel(Config) ->
     ssh:close(ConnectionRef),
     ssh:stop_daemon(Pid).
 
+%%--------------------------------------------------------------------
+max_channels_option() ->
+    [{doc, "Test max_channels option"}].
+
+max_channels_option(Config) when is_list(Config) ->
+    PrivDir = ?config(priv_dir, Config),
+    UserDir = filename:join(PrivDir, nopubkey), % to make sure we don't use public-key-auth
+    file:make_dir(UserDir),
+    SysDir = ?config(data_dir, Config),
+    {Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, SysDir},
+					     {user_dir, UserDir},
+					     {password, "morot"},
+					     {max_channels, 3},
+					     {subsystems, [{"echo_n", {ssh_echo_server, [4000000]}}]}
+					    ]),
+
+    ConnectionRef = ssh_test_lib:connect(Host, Port, [{silently_accept_hosts, true},
+						      {user, "foo"},
+						      {password, "morot"},
+						      {user_interaction, true},
+						      {user_dir, UserDir}]),
+
+    {ok, ChannelId0} = ssh_connection:session_channel(ConnectionRef, infinity),
+    {ok, ChannelId1} = ssh_connection:session_channel(ConnectionRef, infinity),
+    {ok, ChannelId2} = ssh_connection:session_channel(ConnectionRef, infinity),
+    {ok, ChannelId3} = ssh_connection:session_channel(ConnectionRef, infinity),
+    {ok, ChannelId4} = ssh_connection:session_channel(ConnectionRef, infinity),
+    {ok, ChannelId5} = ssh_connection:session_channel(ConnectionRef, infinity),
+    {ok, _ChannelId6} = ssh_connection:session_channel(ConnectionRef, infinity),
+
+    %%%---- shell
+    ok = ssh_connection:shell(ConnectionRef,ChannelId0),
+    receive
+	{ssh_cm,ConnectionRef, {data, ChannelId0, 0, <<"Eshell",_/binary>>}} ->
+	    ok
+    after 5000 ->
+	    ct:fail("CLI Timeout")
+    end,
+
+    %%%---- subsystem "echo_n"
+    success = ssh_connection:subsystem(ConnectionRef, ChannelId1, "echo_n", infinity),
+
+    %%%---- exec #1
+    success = ssh_connection:exec(ConnectionRef, ChannelId2, "testing1.\n", infinity),
+    receive
+	{ssh_cm, ConnectionRef, {data, ChannelId2, 0, <<"testing1",_/binary>>}} ->
+	    ok
+    after 5000 ->
+	    ct:fail("Exec #1 Timeout")
+    end,
+
+    %%%---- ptty
+    success = ssh_connection:ptty_alloc(ConnectionRef, ChannelId3, []),
+
+    %%%---- exec #2
+    failure = ssh_connection:exec(ConnectionRef, ChannelId4, "testing2.\n", infinity),
+
+    %%%---- close the shell
+    ok = ssh_connection:send(ConnectionRef, ChannelId0, "exit().\n", 5000),
+    
+    %%%---- exec #3
+    success = ssh_connection:exec(ConnectionRef, ChannelId5, "testing3.\n", infinity),
+    receive
+	{ssh_cm, ConnectionRef, {data, ChannelId5, 0, <<"testing3",_/binary>>}} ->
+	    ok
+    after 5000 ->
+	    ct:fail("Exec #3 Timeout")
+    end,
+
+    ssh:close(ConnectionRef),
+    ssh:stop_daemon(Pid).
+
 %%--------------------------------------------------------------------
 %% Internal functions ------------------------------------------------
 %%--------------------------------------------------------------------
-- 
cgit v1.2.3