File 0393-ssl-Add-test-cases-to-cover-handling-of-max-session-.patch of Package erlang

From 3fb2290222391dadc9afd679975ad0303035ff4d Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Wed, 28 Apr 2021 10:48:24 +0200
Subject: [PATCH] ssl: Add test cases to cover handling of max session table

---
 lib/ssl/test/ssl_session_SUITE.erl | 119 +++++++++++++++++++++++++++--
 1 file changed, 114 insertions(+), 5 deletions(-)

diff --git a/lib/ssl/test/ssl_session_SUITE.erl b/lib/ssl/test/ssl_session_SUITE.erl
index 552be7ddd6..57e8944fe2 100644
--- a/lib/ssl/test/ssl_session_SUITE.erl
+++ b/lib/ssl/test/ssl_session_SUITE.erl
@@ -41,7 +41,7 @@
         ]).
 
 %% Test cases
--export([reuse_session/0,
+ -export([reuse_session/0,
          reuse_session/1,
          reuse_session_expired/0,
          reuse_session_expired/1,
@@ -53,6 +53,10 @@
          no_reuses_session_server_restart_new_cert/1,
          no_reuses_session_server_restart_new_cert_file/0,
          no_reuses_session_server_restart_new_cert_file/1,
+         client_max_session_table/0,
+         client_max_session_table/1, 
+         server_max_session_table/0,
+         server_max_session_table/1, 
          session_table_stable_size_on_tcp_close/0,
          session_table_stable_size_on_tcp_close/1
         ]).
@@ -87,7 +91,10 @@ session_tests() ->
      server_does_not_want_to_reuse_session,
      explicit_session_reuse,
      no_reuses_session_server_restart_new_cert,
-     no_reuses_session_server_restart_new_cert_file].
+     no_reuses_session_server_restart_new_cert_file,
+     client_max_session_table,
+     server_max_session_table
+    ].
 
 tls_session_tests() ->
        [session_table_stable_size_on_tcp_close].
@@ -124,9 +131,29 @@ init_per_testcase(reuse_session_expired, Config)  ->
     ssl_test_lib:ct_log_supported_protocol_versions(Config),
     ct:timetrap({seconds, 30}),
     Config;
-init_per_testcase(_, Config)  ->
+init_per_testcase(client_max_session_table, Config) ->
+    Versions = ssl_test_lib:protocol_version(Config),
+    ssl:stop(),
+    application:load(ssl),    
+    ssl_test_lib:clean_env(),
+    ssl_test_lib:set_protocol_versions(Versions),
+    application:set_env(ssl, session_cache_client_max, 2),
+    ssl:start(),
     ssl_test_lib:ct_log_supported_protocol_versions(Config),
-    ct:timetrap({seconds, 15}),
+    ct:timetrap({seconds, 30}),
+    Config;
+init_per_testcase(server_max_session_table, Config) ->
+    Versions = ssl_test_lib:protocol_version(Config),
+    ssl:stop(),
+    application:load(ssl),    
+    ssl_test_lib:clean_env(),
+    ssl_test_lib:set_protocol_versions(Versions),
+    application:set_env(ssl, session_cache_server_max, 2),
+    ssl:start(),
+    ssl_test_lib:ct_log_supported_protocol_versions(Config),
+    ct:timetrap({seconds, 30}),
+    Config;
+init_per_testcase(_, Config) ->
     Config.
 
 end_per_testcase(reuse_session_expired, Config) ->
@@ -337,7 +364,7 @@ no_reuses_session_server_restart_new_cert(Config) when is_list(Config) ->
 		      {from, self()},  {options, [{reuse_sessions, save} | ClientOpts]}]),
     SessionInfo =
 	receive
-	    {Server, Info} ->
+	    {Server, Info} -> 
 		Info
 	end,
 
@@ -424,6 +451,25 @@ no_reuses_session_server_restart_new_cert_file(Config) when is_list(Config) ->
     ssl_test_lib:close(Server1),
     ssl_test_lib:close(Client1).
 
+
+client_max_session_table() ->
+      [{doc, "Check that max session table limit handling set max to 1 in init_per_testcase"}].
+
+client_max_session_table(Config) when is_list(Config)->
+    ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
+    ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+    {ClientNode, ServerNode, HostName} = ssl_test_lib:run_where(Config),
+    test_max_session_limit(ClientOpts,ServerOpts,ClientNode, ServerNode, HostName).
+    
+server_max_session_table() ->
+      [{doc, "Check that max session table limit handling set max to 1 in init_per_testcase"}].
+
+server_max_session_table(Config) when is_list(Config)->
+    ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
+    ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+    {ClientNode, ServerNode, HostName} = ssl_test_lib:run_where(Config),
+    test_max_session_limit(ClientOpts,ServerOpts,ClientNode, ServerNode, HostName).
+
 session_table_stable_size_on_tcp_close() ->
       [{doc, "Check that new sessions are cleanup when connection is closed abruptly during first handshake"}].
 
@@ -593,3 +639,66 @@ connection_states(Random) ->
                    server_random = undefined,
                    exportable = undefined},
             sequence_number => 0,server_verify_data => undefined,max_fragment_length => undefined}}.
+
+
+
+test_max_session_limit(ClientOpts, ServerOpts, ClientNode, ServerNode, HostName) ->
+     Server0 =
+	ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+				   {from, self()},
+				   {mfa, {ssl_test_lib, no_result, []}},
+				   {tcp_options, [{active, false}]},
+				   {options, ServerOpts}]),
+    Port0 = ssl_test_lib:inet_port(Server0),
+    
+    Client0 = ssl_test_lib:start_client([{node, ClientNode},
+                                         {port, Port0}, {host, HostName},
+                                         {mfa, {ssl_test_lib, session_id, []}},
+                                         {from, self()},  {options, [{reuse_sessions, save} | ClientOpts]}]),
+    SID0 = receive
+          {Client0, Id0} ->
+                  Id0
+          end,
+       
+   
+    Server0 ! listen,
+    
+    Client1 = ssl_test_lib:start_client([{node, ClientNode},
+                                         {port, Port0}, {host, HostName},
+                                         {mfa, {ssl_test_lib, session_id, []}},
+                                         {from, self()},  {options, [{reuse_sessions, save} | ClientOpts]}]),    
+       
+    SID1 = receive
+               {Client1, Id1} ->
+                   Id1 
+           end,
+       
+    false = SID0 == SID1,
+    
+    
+    Server0 ! listen,
+    
+    Client2 = ssl_test_lib:start_client([{node, ClientNode},
+                                         {port, Port0}, {host, HostName},
+                                         {mfa, {ssl_test_lib, session_id, []}},
+                                         {from, self()},  {options, [{reuse_sessions, save}| ClientOpts]}]),  
+
+    
+    SID2 = receive
+               {Client2, Id2} ->
+                   Id2 
+           end,
+
+    Server0 ! listen,
+    
+    Client3 = ssl_test_lib:start_client([{node, ClientNode},
+                                         {port, Port0}, {host, HostName},
+                                         {mfa, {ssl_test_lib, session_id, []}},
+                                         {from, self()},  {options, [{reuse_session, SID2}| ClientOpts]}]),   
+    
+    receive
+        {Client3, SID2} ->
+            ok;
+        Other  ->
+            ct:fail({{expected, SID2}, {got,Other}})
+    end.
-- 
2.26.2

openSUSE Build Service is sponsored by