LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File 0503-Rewrite-to-work-for-stream-connection.patch of Package erlang (Project home:Ledest:erlang:20)

From 5fd6d9a8b13530d7201fdadfd840add08697f380 Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Wed, 5 Dec 2018 15:38:57 +0100
Subject: [PATCH 2/2] Rewrite to work for stream connection

---
 lib/ssl/test/ssl_payload_SUITE.erl | 654 ++++++++++++++++++-------------------
 1 file changed, 325 insertions(+), 329 deletions(-)

diff --git a/lib/ssl/test/ssl_payload_SUITE.erl b/lib/ssl/test/ssl_payload_SUITE.erl
index 5939800001..1f9b6a5772 100644
--- a/lib/ssl/test/ssl_payload_SUITE.erl
+++ b/lib/ssl/test/ssl_payload_SUITE.erl
@@ -71,7 +71,10 @@ init_per_suite(Config) ->
     try crypto:start() of
 	ok ->
 	    ssl_test_lib:clean_start(),
-	    {ok, _} = make_certs:all(proplists:get_value(data_dir, Config), proplists:get_value(priv_dir, Config)),
+	    {ok, _} =
+                make_certs:all(
+                  proplists:get_value(data_dir, Config),
+                  proplists:get_value(priv_dir, Config)),
 	    ssl_test_lib:cert_options(Config)
     catch _:_  ->
 	    {skip, "Crypto did not start"}
@@ -103,12 +106,13 @@ end_per_group(GroupName, Config) ->
             Config
     end.
 
-init_per_testcase(TestCase, Config) when TestCase == server_echos_passive_huge;
-					 TestCase == server_echos_active_once_huge;
-					 TestCase == server_echos_active_huge;
-					 TestCase == client_echos_passive_huge;
-					 TestCase == client_echos_active_once_huge;
-					 TestCase == client_echos_active_huge ->
+init_per_testcase(TestCase, Config)
+  when TestCase == server_echos_passive_huge;
+       TestCase == server_echos_active_once_huge;
+       TestCase == server_echos_active_huge;
+       TestCase == client_echos_passive_huge;
+       TestCase == client_echos_active_once_huge;
+       TestCase == client_echos_active_huge ->
     case erlang:system_info(system_architecture) of
 	"sparc-sun-solaris2.10" ->
 	    {skip,"Will take to long time on an old Sparc"};
@@ -117,12 +121,13 @@ init_per_testcase(TestCase, Config) when TestCase == server_echos_passive_huge;
 	    Config
     end;
 
-init_per_testcase(TestCase, Config) when TestCase == server_echos_passive_big;
-					 TestCase == server_echos_active_once_big;
-					 TestCase == server_echos_active_big;
-					 TestCase == client_echos_passive_big;
-					 TestCase == client_echos_active_once_big;
-					 TestCase == client_echos_active_big ->
+init_per_testcase(TestCase, Config)
+  when TestCase == server_echos_passive_big;
+       TestCase == server_echos_active_once_big;
+       TestCase == server_echos_active_big;
+       TestCase == client_echos_passive_big;
+       TestCase == client_echos_active_once_big;
+       TestCase == client_echos_active_big ->
     ct:timetrap({seconds, 60}),
     Config;
 
@@ -144,11 +149,10 @@ server_echos_passive_small(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    
-    server_echos_passive(Str, 1000, ClientOpts, ServerOpts, 
-			 ClientNode, ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 100),
+    server_echos_passive(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 %%--------------------------------------------------------------------
 
@@ -160,11 +164,10 @@ server_echos_active_once_small(Config) when is_list(Config) ->
         ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    
-    server_echos_active_once(Str, 1000, ClientOpts, ServerOpts, 
-			     ClientNode, ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 100),
+    server_echos_active_once(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 %%--------------------------------------------------------------------
 
@@ -176,11 +179,10 @@ server_echos_active_small(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    
-    server_echos_active(Str, 1000, ClientOpts, ServerOpts, 
-			ClientNode, ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 100),
+    server_echos_active(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 %%--------------------------------------------------------------------
 client_echos_passive_small() ->
@@ -191,11 +193,10 @@ client_echos_passive_small(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-
-    client_echos_passive(Str, 1000, ClientOpts, ServerOpts, ClientNode, 
-			 ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 100),
+    client_echos_passive(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 %%--------------------------------------------------------------------
 client_echos_active_once_small() ->
@@ -206,11 +207,10 @@ client_echos_active_once_small(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    
-    client_echos_active_once(Str, 1000, ClientOpts, ServerOpts, ClientNode, 
-			     ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 100),
+    client_echos_active_once(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
    
 %%--------------------------------------------------------------------
 client_echos_active_small() ->
@@ -221,11 +221,10 @@ client_echos_active_small(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890",     
-
-    client_echos_active(Str, 1000, ClientOpts, ServerOpts, ClientNode, 
-			ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 100),
+    client_echos_active(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 
 %%--------------------------------------------------------------------
@@ -237,11 +236,10 @@ server_echos_passive_big(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    
-    server_echos_passive(Str, 50000, ClientOpts, ServerOpts, ClientNode, 
-			 ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 5000),
+    server_echos_passive(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 %%--------------------------------------------------------------------
 
@@ -253,11 +251,10 @@ server_echos_active_once_big(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    
-    server_echos_active_once(Str, 50000, ClientOpts, ServerOpts, ClientNode, 
-			     ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 5000),
+    server_echos_active_once(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 %%--------------------------------------------------------------------
 
@@ -269,11 +266,10 @@ server_echos_active_big(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    
-    server_echos_active(Str, 50000, ClientOpts, ServerOpts, ClientNode, 
-			ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 5000),
+    server_echos_active(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 %%--------------------------------------------------------------------
 client_echos_passive_big() ->
@@ -284,11 +280,10 @@ client_echos_passive_big(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-
-    client_echos_passive(Str, 50000, ClientOpts, ServerOpts, ClientNode, 
-			 ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 5000),
+    client_echos_passive(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 %%--------------------------------------------------------------------
 client_echos_active_once_big() ->
@@ -299,11 +294,10 @@ client_echos_active_once_big(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-
-    client_echos_active_once(Str, 50000, ClientOpts, ServerOpts, ClientNode, 
-			     ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 5000),
+    client_echos_active_once(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
    
 %%--------------------------------------------------------------------
 client_echos_active_big() ->
@@ -314,11 +308,10 @@ client_echos_active_big(Config) when is_list(Config) ->
      ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    
-    client_echos_active(Str, 50000, ClientOpts, ServerOpts, ClientNode, 
-			ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 5000),
+    client_echos_active(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 %%--------------------------------------------------------------------
 server_echos_passive_huge() ->
@@ -329,11 +322,10 @@ server_echos_passive_huge(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    
-    server_echos_passive(Str, 500000, ClientOpts, ServerOpts, ClientNode, 
-			 ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 50000),
+    server_echos_passive(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 %%--------------------------------------------------------------------
 server_echos_active_once_huge() ->
@@ -344,11 +336,10 @@ server_echos_active_once_huge(Config) when is_list(Config) ->
         ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    
-    server_echos_active_once(Str, 500000, ClientOpts, ServerOpts, ClientNode, 
-			     ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 50000),
+    server_echos_active_once(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 %%--------------------------------------------------------------------
 server_echos_active_huge() ->
@@ -359,11 +350,10 @@ server_echos_active_huge(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    
-    server_echos_active(Str, 500000, ClientOpts, ServerOpts, ClientNode, 
-			ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 50000),
+    server_echos_active(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 %%--------------------------------------------------------------------
 client_echos_passive_huge() ->
@@ -374,10 +364,10 @@ client_echos_passive_huge(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    client_echos_passive(Str, 500000, ClientOpts, ServerOpts, ClientNode, 
-			 ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 50000),
+    client_echos_passive(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
 
 %%--------------------------------------------------------------------
 client_echos_active_once_huge() ->
@@ -388,10 +378,10 @@ client_echos_active_once_huge(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    client_echos_active_once(Str, 500000, ClientOpts, ServerOpts, ClientNode, 
-			     ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 50000),
+    client_echos_active_once(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
    
 %%--------------------------------------------------------------------
 client_echos_active_huge() ->
@@ -402,293 +392,299 @@ client_echos_active_huge(Config) when is_list(Config) ->
      ClientOpts = ssl_test_lib:ssl_options(client_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_opts, Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-
-    Str = "1234567890", 
-    client_echos_active(Str, 500000, ClientOpts, ServerOpts, ClientNode,
-			ServerNode, Hostname).
+    %%
+    Data = binary:copy(<<"1234567890">>, 50000),
+    client_echos_active(
+      Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname).
  
 %%--------------------------------------------------------------------
 %% Internal functions ------------------------------------------------
 %%--------------------------------------------------------------------
 
-server_echos_passive(Data, Length, ClientOpts, ServerOpts, 
-		     ClientNode, ServerNode, Hostname) ->
-    Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, 
-					{from, self()}, 
-					{mfa, 
-					 {?MODULE, echoer, 
-					  [Data, Length]}},
-					{options, 
-					 [{active, false},{mode, binary} 
-					  | ServerOpts]}]),
-				       Port = ssl_test_lib:inet_port(Server),
-    Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
-					{host, Hostname},
-					{from, self()}, 
-					{mfa, 
-					 {?MODULE, sender, 
-					       [Data, 
-						Length]}},
-					{options, 
-					 [{active, false}, {mode, binary} |
-					  ClientOpts]}]),
+server_echos_passive(
+  Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname) ->
+    Length = byte_size(Data),
+    Server =
+        ssl_test_lib:start_server(
+          [{node, ServerNode}, {port, 0},
+           {from, self()},
+           {mfa, {?MODULE, echoer, [Length]}},
+           {options, [{active, false}, {mode, binary} | ServerOpts]}]),
+    Port = ssl_test_lib:inet_port(Server),
+    Client =
+        ssl_test_lib:start_client(
+          [{node, ClientNode}, {port, Port},
+           {host, Hostname},
+           {from, self()},
+           {mfa, {?MODULE, sender, [Data]}},
+           {options, [{active, false}, {mode, binary} | ClientOpts]}]),
+    %%
     ssl_test_lib:check_result(Server, ok, Client, ok),
-    
+    %%
     ssl_test_lib:close(Server),
     ssl_test_lib:close(Client).
 
 
-server_echos_active_once(Data, Length, ClientOpts, ServerOpts, ClientNode,
-			 ServerNode, Hostname) ->
-    Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, 
-					{from, self()}, 
-					{mfa, 
-					 {?MODULE, echoer_once, 
-					  [Data, Length]}},
-					{options, [{active, once},
-						   {mode, binary}| 
-						   ServerOpts]}]),
+server_echos_active_once(
+  Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname) ->
+    Length = byte_size(Data),
+    Server =
+        ssl_test_lib:start_server(
+          [{node, ServerNode}, {port, 0},
+           {from, self()},
+           {mfa, {?MODULE, echoer_active_once, [Length]}},
+           {options, [{active, once}, {mode, binary} | ServerOpts]}]),
     Port = ssl_test_lib:inet_port(Server),
-    Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
-					{host, Hostname},
-					{from, self()}, 
-					{mfa, 
-					 {?MODULE, sender_once, 
-					  [Data, Length]}},
-					{options, [{active, once}, 
-						   {mode, binary} | 
-						   ClientOpts]}]),
+    Client =
+        ssl_test_lib:start_client(
+          [{node, ClientNode}, {port, Port},
+           {host, Hostname},
+           {from, self()},
+           {mfa, {?MODULE, sender_active_once, [Data]}},
+           {options, [{active, once}, {mode, binary} | ClientOpts]}]),
+    %%
     ssl_test_lib:check_result(Server, ok, Client, ok),
-    
+    %%
     ssl_test_lib:close(Server),
     ssl_test_lib:close(Client).
 
 
-server_echos_active(Data, Length, ClientOpts, ServerOpts, 
-		    ClientNode, ServerNode, Hostname) ->
-    Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, 
-					{from, self()}, 
-					{mfa, 
-					 {?MODULE, echoer_active, 
-					  [Data, Length]}},
-					{options,  
-					 [{active, true},
-					  {mode, binary} | ServerOpts]}]),
+server_echos_active(
+  Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname) ->
+    Length = byte_size(Data),
+    Server =
+        ssl_test_lib:start_server(
+          [{node, ServerNode}, {port, 0},
+           {from, self()},
+           {mfa, {?MODULE, echoer_active, [Length]}},
+           {options, [{active, true}, {mode, binary} | ServerOpts]}]),
     Port = ssl_test_lib:inet_port(Server),
-    Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
-					{host, Hostname},
-					{from, self()}, 
-					{mfa, 
-					 {?MODULE, sender_active, 
-					       [Data, 
-						Length]}},
-					{options,  
-					 [{active, true}, {mode, binary}
-					  | ClientOpts]}]),
+    Client =
+        ssl_test_lib:start_client(
+          [{node, ClientNode}, {port, Port},
+           {host, Hostname},
+           {from, self()},
+           {mfa, {?MODULE, sender_active, [Data]}},
+           {options, [{active, true}, {mode, binary} | ClientOpts]}]),
+    %%
     ssl_test_lib:check_result(Server, ok, Client, ok),
-    
+    %%
     ssl_test_lib:close(Server),
     ssl_test_lib:close(Client).
 
-client_echos_passive(Data, Length, ClientOpts, ServerOpts, 
-		     ClientNode, ServerNode, Hostname) ->
-    Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, 
-					{from, self()}, 
-					{mfa, 
-					 {?MODULE, sender, 
-					  [Data, Length]}},
-					{options, 
-					 [{active, false}, {mode, binary} | 
-					  ServerOpts]}]),
+client_echos_passive(
+  Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname) ->
+    Length = byte_size(Data),
+    Server =
+        ssl_test_lib:start_server(
+          [{node, ServerNode}, {port, 0},
+           {from, self()},
+           {mfa, {?MODULE, sender, [Data]}},
+           {options, [{active, false}, {mode, binary} | ServerOpts]}]),
     Port = ssl_test_lib:inet_port(Server),
-    Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
-					{host, Hostname},
-					{from, self()}, 
-					{mfa, 
-					 {?MODULE, echoer, 
-					       [Data, 
-						Length]}},
-					{options, 
-					 [{active, false}, {mode, binary}
-					  | ClientOpts]}]),
+    Client =
+        ssl_test_lib:start_client(
+          [{node, ClientNode}, {port, Port},
+           {host, Hostname},
+           {from, self()},
+           {mfa, {?MODULE, echoer, [Length]}},
+           {options, [{active, false}, {mode, binary} | ClientOpts]}]),
+    %%
     ssl_test_lib:check_result(Server, ok, Client, ok),
-    
+    %%
     ssl_test_lib:close(Server),
     ssl_test_lib:close(Client).
 
-client_echos_active_once(Data, Length, 
-			 ClientOpts, ServerOpts, ClientNode, ServerNode,
-			 Hostname) ->
-    Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, 
-					{from, self()}, 
-					{mfa, 
-					 {?MODULE, sender_once, 
-					  [Data, Length]}},
-					{options, [{active, once},
-						   {mode, binary} | 
-						   ServerOpts]}]),
+client_echos_active_once(
+  Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname) ->
+    Length = byte_size(Data),
+    Server =
+        ssl_test_lib:start_server(
+          [{node, ServerNode}, {port, 0},
+           {from, self()},
+           {mfa, {?MODULE, sender_active_once, [Data]}},
+           {options, [{active, once}, {mode, binary} | ServerOpts]}]),
     Port = ssl_test_lib:inet_port(Server),
-    Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
-					{host, Hostname},
-					{from, self()}, 
-					{mfa, 
-					 {?MODULE, echoer_once, 
-					  [Data, 
-					   Length]}},
-					{options,[{active, once},
-						  {mode, binary}
-						  | ClientOpts]}]),
+    Client =
+        ssl_test_lib:start_client(
+          [{node, ClientNode}, {port, Port},
+           {host, Hostname},
+           {from, self()},
+           {mfa, {?MODULE, echoer_active_once, [Length]}},
+           {options,[{active, once}, {mode, binary} | ClientOpts]}]),
+    %%
     ssl_test_lib:check_result(Server, ok, Client, ok),
-    
+    %%
     ssl_test_lib:close(Server),
     ssl_test_lib:close(Client).
 
-client_echos_active(Data, Length, ClientOpts, ServerOpts, ClientNode, 
-		    ServerNode,
-			 Hostname) ->
-    Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, 
-					{from, self()}, 
-					{mfa, 
-					 {?MODULE, sender_active, 
-					  [Data, Length]}},
-					{options, [{active, true}, 
-						   {mode, binary}
-						   | ServerOpts]}]),
+client_echos_active(
+  Data, ClientOpts, ServerOpts, ClientNode, ServerNode, Hostname) ->
+    Length = byte_size(Data),
+    Server =
+        ssl_test_lib:start_server(
+          [{node, ServerNode}, {port, 0},
+           {from, self()},
+           {mfa, {?MODULE, sender_active, [Data]}},
+           {options, [{active, true}, {mode, binary} | ServerOpts]}]),
     Port = ssl_test_lib:inet_port(Server),
-    Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
-					{host, Hostname},
-					{from, self()}, 
-					{mfa, 
-					 {?MODULE, echoer_active, 
-					       [Data, 
-						Length]}},
-					{options, [{active, true},
-						   {mode, binary}
-						   | ClientOpts]}]),
+    Client =
+        ssl_test_lib:start_client(
+          [{node, ClientNode}, {port, Port},
+           {host, Hostname},
+           {from, self()},
+           {mfa, {?MODULE, echoer_active, [Length]}},
+           {options, [{active, true}, {mode, binary} | ClientOpts]}]),
+    %
     ssl_test_lib:check_result(Server, ok, Client, ok),
-    
+    %%
     ssl_test_lib:close(Server),
     ssl_test_lib:close(Client).
 
-send(_, _, _, 0,_) ->
-    ok;
-send(Socket, Data, Size, Repeate,F) ->
-    NewData = lists:duplicate(Size div 10, Data),
-    ssl:send(Socket, NewData),
-    F(),
-    send(Socket, Data, Size, Repeate - 1,F).
+
+send(Socket, Data, Count, Verify) ->
+    send(Socket, Data, Count, <<>>, Verify).
+%%
+send(_Socket, _Data, 0, Acc, _Verify) ->
+    Acc;
+send(Socket, Data, Count, Acc, Verify) ->
+    ok = ssl:send(Socket, Data),
+    NewAcc = Verify(Acc),
+    send(Socket, Data, Count - 1, NewAcc, Verify).
+
  
-sender(Socket, Data, Size) ->
-    ok = send(Socket, Data, Size, 100, fun() -> do_recv(Socket, Data, Size, <<>>, false) end),
+sender(Socket, Data) ->
     ct:log("Sender recv: ~p~n", [ssl:getopts(Socket, [active])]),
+    <<>> =
+        send(
+          Socket, Data, 100,
+          fun(Acc) -> verify_recv(Socket, Data, Acc) end),
     ok.
 
-sender_once(Socket, Data, Size) ->
-    send(Socket, Data, Size, 100, 
-	 fun() -> do_active_once(Socket, Data, Size, <<>>, false) end),
-    ct:log("Sender active once: ~p~n",
-		       [ssl:getopts(Socket, [active])]),
+sender_active_once(Socket, Data) ->
+    ct:log("Sender active once: ~p~n", [ssl:getopts(Socket, [active])]),
+    <<>> =
+        send(
+          Socket, Data, 100,
+          fun(Acc) -> verify_active_once(Socket, Data, Acc) end),
     ok.
 
-sender_active(Socket, Data, Size) ->
-    F = fun() -> do_active(Socket, Data, Size, <<>>, false) end,
-    send(Socket, Data, Size, 100, F),
+sender_active(Socket, Data) ->
     ct:log("Sender active: ~p~n", [ssl:getopts(Socket, [active])]),
+    <<>> =
+        send(
+          Socket, Data, 100,
+          fun(Acc) -> verify_active(Socket, Data, Acc) end),
     ok.
 
-echoer(Socket, Data, Size) ->
+
+echoer(Socket, Size) ->
     ct:log("Echoer recv: ~p~n", [ssl:getopts(Socket, [active])]),
-    echo(fun() -> do_recv(Socket, Data, Size, <<>>, true) end, 100).
+    echo_recv(Socket, Size * 100).
 
-echoer_once(Socket, Data, Size) ->
-    ct:log("Echoer active once: ~p ~n",
-		       [ssl:getopts(Socket, [active])]),
-    echo(fun() -> do_active_once(Socket, Data, Size, <<>>, true) end, 100).
+echoer_active_once(Socket, Size) ->
+    ct:log("Echoer active once: ~p~n", [ssl:getopts(Socket, [active])]),
+    echo_active_once(Socket, Size * 100).
 
-echoer_active(Socket, Data, Size) ->
+echoer_active(Socket, Size) ->
     ct:log("Echoer active: ~p~n", [ssl:getopts(Socket, [active])]),
-    echo(fun() -> do_active(Socket, Data, Size, <<>>, true) end, 100).
-
-echo(_Fun, 0) -> ok;
-echo(Fun, N) ->
-    Fun(),
-    echo(Fun, N-1).
+    echo_active(Socket, Size * 100).
+
+
+%% Receive Size bytes
+echo_recv(Socket, Size) ->
+    {ok, Data} = ssl:recv(Socket, 0),
+    ok = ssl:send(Socket, Data),
+    NewSize = Size - byte_size(Data),
+    if
+        0 < NewSize ->
+            echo_recv(Socket, NewSize);
+        0 == NewSize ->
+            ok
+    end.
 
+%% Verify that received data is SentData, return any superflous data
+verify_recv(Socket, SentData, Acc) ->
+    {ok, NewData} = ssl:recv(Socket, 0),
+    SentSize = byte_size(SentData),
+    NewAcc = <<Acc/binary, NewData/binary>>,
+    NewSize = byte_size(NewAcc),
+    if
+        SentSize < NewSize ->
+            {SentData,Rest} = split_binary(NewAcc, SentSize),
+            Rest;
+        NewSize < SentSize ->
+            verify_recv(Socket, SentData, NewAcc);
+        true ->
+            SentData = NewAcc,
+            <<>>
+    end.
 
-do_recv(_Socket, _Data, 0, _Acc, true) ->
-    ok;
-do_recv(_Socket, Data, 0, Acc, false) ->
-    Data = lists:sublist(binary_to_list(Acc), 10);
+%% Receive Size bytes
+echo_active_once(Socket, Size) ->
+    receive
+        {ssl, Socket, Data} ->
+            ok = ssl:send(Socket, Data),
+            NewSize = Size - byte_size(Data),
+            ssl:setopts(Socket, [{active, once}]),
+            if
+                0 < NewSize ->
+                    echo_active_once(Socket, NewSize);
+                0 == NewSize ->
+                    ok
+            end
+    end.
 
-do_recv(Socket, Data, Size, Acc, Echo) ->
-    {ok, NewData} = ssl:recv(Socket, 0),
-    NewSize = size(NewData), 
-    case Echo of
-	true ->
-	    ssl:send(Socket, NewData),
-	    NewSize = size(NewData), 
-	    do_recv(Socket, Data, Size - NewSize, [], Echo);
-	false ->
-	    case size(Acc) < 10 of
-		true ->
-		    do_recv(Socket, Data, Size - NewSize, 
-			    <<Acc/binary, NewData/binary>>, Echo);
-		false ->
-		    do_recv(Socket, Data, Size - NewSize, Acc, Echo) 
-	    end
+%% Verify that received data is SentData, return any superflous data
+verify_active_once(Socket, SentData, Acc) ->
+    receive
+        {ssl, Socket, Data} ->
+            SentSize = byte_size(SentData),
+            NewAcc = <<Acc/binary, Data/binary>>,
+            NewSize = byte_size(NewAcc),
+            ssl:setopts(Socket, [{active, once}]),
+            if
+                SentSize < NewSize ->
+                    {SentData,Rest} = split_binary(NewAcc, SentSize),
+                    Rest;
+                NewSize < SentSize ->
+                    verify_active_once(Socket, SentData, NewAcc);
+                true ->
+                    SentData = NewAcc,
+                    <<>>
+            end
     end.
 
-do_active_once(_Socket, _Data, 0, _Acc, true) ->
-    ok;
-do_active_once(_Socket, Data, 0, Acc, false) ->
-    Data = lists:sublist(binary_to_list(Acc), 10);
 
-do_active_once(Socket, Data, Size, Acc, Echo) ->    
-    receive 
-	{ssl, Socket, NewData} ->
-	    NewSize = size(NewData), 
-	    case Echo of
-		true ->
-		    ssl:send(Socket, NewData),
-		    ssl:setopts(Socket, [{active, once}]),
-		    do_active_once(Socket, Data, Size - NewSize, [], Echo);
-		false ->
-		    case size(Acc) < 10 of
-			true ->
-			    ssl:setopts(Socket, [{active, once}]),
-			    do_active_once(Socket, Data, Size - NewSize, 
-					   <<Acc/binary, NewData/binary>>, 
-					   Echo);
-			false ->
-			    ssl:setopts(Socket, [{active, once}]),
-			    do_active_once(Socket, Data, 
-					   Size - NewSize, Acc, Echo) 
-		    end 
-	    end
+%% Receive Size bytes
+echo_active(Socket, Size) ->
+    receive
+        {ssl, Socket, Data} ->
+            ok = ssl:send(Socket, Data),
+            NewSize = Size - byte_size(Data),
+            if
+                0 < NewSize ->
+                    echo_active(Socket, NewSize);
+                0 == NewSize ->
+                    ok
+            end
     end.
-    
-do_active(_Socket, _Data, 0, _Acc, true) ->
-    ok;
-do_active(_Socket, Data, 0, Acc, false) ->
-    Data = lists:sublist(binary_to_list(Acc), 10);
-
-do_active(Socket, Data, Size, Acc, Echo) ->    
-    receive 
-	{ssl, Socket, NewData} ->
-	    NewSize = size(NewData), 
-	    case Echo of
-		true ->
-		    ssl:send(Socket, NewData),
-		    do_active(Socket, Data, Size - NewSize, [], Echo);
-		false ->
-		    case size(Acc) < 10 of
-			true ->
-			    do_active(Socket, Data, Size - NewSize, 
-					   <<Acc/binary, NewData/binary>>, 
-				      Echo);
-			false ->
-			    do_active(Socket, Data, 
-				      Size - NewSize, Acc, Echo) 
-		    end 
-	    end
+
+%% Verify that received data is SentData, return any superflous data
+verify_active(Socket, SentData, Acc) ->
+    receive
+        {ssl, Socket, Data} ->
+            SentSize = byte_size(SentData),
+            NewAcc = <<Acc/binary, Data/binary>>,
+            NewSize = byte_size(NewAcc),
+            if
+                SentSize < NewSize ->
+                    {SentData,Rest} = split_binary(NewAcc, SentSize),
+                    Rest;
+                NewSize < SentSize ->
+                    verify_active(Socket, SentData, NewAcc);
+                true ->
+                    SentData = NewAcc,
+                    <<>>
+            end
     end.
-- 
2.16.4