File 4318-kernel-tcp-misc-test-Adjust-busy-send-test-case.patch of Package erlang
From ab41f0b97e446f30ba765dbd4cfd03e6093107a3 Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Sun, 24 May 2020 22:04:19 +0200
Subject: [PATCH 18/35] [kernel|tcp|misc-test] Adjust busy-send test case
Add a skip clause (eaddrnotavail on connect).
---
lib/kernel/test/gen_tcp_misc_SUITE.erl | 196 ++++++++++++++++++-------
1 file changed, 142 insertions(+), 54 deletions(-)
diff --git a/lib/kernel/test/gen_tcp_misc_SUITE.erl b/lib/kernel/test/gen_tcp_misc_SUITE.erl
index e1006b27d0..28b06756fa 100644
--- a/lib/kernel/test/gen_tcp_misc_SUITE.erl
+++ b/lib/kernel/test/gen_tcp_misc_SUITE.erl
@@ -1715,53 +1715,128 @@ http_bad_client(Port) ->
%% Fill send queue and then start receiving.
%%
busy_send(Config) when is_list(Config) ->
- Master = self(),
- Msg = <<"the quick brown fox jumps over a lazy dog~n">>,
- Server =
- spawn_link(fun () ->
- {ok,L} = gen_tcp:listen
- (0, [{active,false},binary,
- {reuseaddr,true},{packet,0}]),
- {ok,Port} = inet:port(L),
- Master ! {self(),client,
- busy_send_client(Port, Master, Msg)},
- busy_send_srv(L, Master, Msg)
- end),
- io:format("~p Server~n", [Server]),
- receive
- {Server,client,Client} ->
- io:format("~p Client~n", [Client]),
- busy_send_loop(Server, Client, 0)
+ try do_busy_send(Config)
+ catch
+ throw:{skip, _} = SKIP ->
+ SKIP
end.
+do_busy_send(_Config) ->
+ OldFlag = process_flag(trap_exit, true),
+ Master = self(),
+ Msg = <<"the quick brown fox jumps over a lazy dog~n">>,
+ p("[master] start server"),
+ ServerF =
+ fun() ->
+ p("[server] create listen socket"),
+ case gen_tcp:listen(0, [{active,false},binary,
+ {reuseaddr,true},{packet,0}]) of
+ {ok, L} ->
+ p("[server] listen socket created"),
+ {ok, Port} = inet:port(L),
+ Master ! {self(), listen_port, Port},
+ p("[server] await continue"),
+ receive
+ {Master, continue} ->
+ p("[server] continue"),
+ busy_send_srv(L, Master, Msg)
+ end;
+ {error, Reason} ->
+ p("[server] UNEXPECTED: ~w", [Reason]),
+ exit({skip, listen_failed_str(Reason)})
+ end
+ end,
+ Server = spawn_link(ServerF),
+ p("[master] server: ~p", [Server]),
+ ListenPort =
+ receive
+ {'EXIT', Server, {skip, _} = SKIP} ->
+ throw(SKIP);
+
+ {'EXIT', Server, Reason} ->
+ exit({server, Reason});
+
+ {Server, listen_port, LP} ->
+ p("listen port: ~p", [LP]),
+ LP
+ end,
+ p("[master] start client"),
+ ClientF =
+ fun () ->
+ p("[client] await (connect) server port"),
+ Port =
+ receive
+ {Master, connect, P} ->
+ P
+ end,
+ p("[client] connect to ~w", [Port]),
+ case gen_tcp:connect("localhost", Port,
+ [{active,false},binary,{packet,0}]) of
+ {ok, Socket} ->
+ Master ! {self(), connected},
+ p("[client] connected - await recv"),
+ receive
+ {Master, recv, N} ->
+ p("[client] received recv:~w", [N]),
+ busy_send_client_loop(Socket, Master, Msg, N)
+ end;
+ {error, eaddrnotavail = CReason} ->
+ p("[client] UNEXPECTED: ~w", [CReason]),
+ exit({skip, connect_failed_str(CReason)})
+ end
+ end,
+ Client = spawn_link(ClientF),
+ p("[master] client: ~p", [Client]),
+ Server ! {self(), continue},
+ Client ! {self(), connect, ListenPort},
+ receive
+ {Client, connected} ->
+ p("[master] client connected"),
+ ok
+ end,
+ busy_send_loop(Server, Client, 0),
+ process_flag(trap_exit, OldFlag),
+ p("[master] done"),
+ ok.
+
busy_send_loop(Server, Client, N) ->
%% Master
%%
- receive {Server,send} ->
- busy_send_loop(Server, Client, N+1)
- after 2000 ->
- %% Send queue full, sender blocked
- %% -> stop sender and release client
- io:format("Send timeout, time to receive...~n", []),
- Server ! {self(),close},
- Client ! {self(),recv,N+1},
- receive
- {Server,send} ->
- busy_send_2(Server, Client, N+1)
- after 10000 ->
- %% If this happens, see busy_send_srv
- ct:fail({timeout,{server,not_send,flush([])}})
- end
+ receive
+ {Server, send} ->
+ busy_send_loop(Server, Client, N+1)
+
+ after 2000 ->
+ p("[master] send timeout: server send queue full (N = ~w+1)", [N]),
+ %% Send queue full, sender blocked
+ %% -> stop sender and release client
+ p("Send timeout, time to receive..."),
+ Server ! {self(), close},
+ Client ! {self(), recv, N+1},
+ receive
+ {Server, send} ->
+ busy_send_2(Server, Client, N+1)
+ after 10000 ->
+ %% If this happens, see busy_send_srv
+ p("UNEXPECTED: server send timeout"),
+ ct:fail({timeout,{server,not_send,flush([])}})
+ end
end.
busy_send_2(Server, Client, _N) ->
%% Master
%%
receive
- {Server,[closed]} ->
- receive {Client,[0,{error,closed}]} -> ok end
+ {Server, [closed]} ->
+ p("[master] received expected (server) closed"),
+ receive
+ {Client, [0,{error,closed}]} ->
+ p("[master] received expected (client) closed"),
+ ok
+ end
after 10000 ->
- ct:fail({timeout,{server,not_closed,flush([])}})
+ p("UNEXPECTED: server closed timeout"),
+ ct:fail({timeout, {server, not_closed, flush([])}})
end.
busy_send_srv(L, Master, Msg) ->
@@ -1769,45 +1844,52 @@ busy_send_srv(L, Master, Msg) ->
%% Sometimes this accept does not return, do not really know why
%% but is causes the timeout error in busy_send_loop to be
%% triggered. Only happens on OS X Leopard?!?
- {ok,Socket} = gen_tcp:accept(L),
- busy_send_srv_loop(Socket, Master, Msg).
+ case gen_tcp:accept(L) of
+ {ok, Socket} ->
+ p("[server] accepted"),
+ busy_send_srv_loop(Socket, Master, Msg);
+ {error, Reason} ->
+ p("UNEXPECTED: server accept failure: ~p", [Reason]),
+ exit({skip, accept_failed_str(Reason)})
+ end.
busy_send_srv_loop(Socket, Master, Msg) ->
%% Server
%%
receive
- {Master,close} ->
+ {Master, close} ->
+ p("[server] received close"),
ok = gen_tcp:close(Socket),
Master ! {self(),flush([closed])}
after 0 ->
ok = gen_tcp:send(Socket, Msg),
- Master ! {self(),send},
+ Master ! {self(), send},
busy_send_srv_loop(Socket, Master, Msg)
end.
-busy_send_client(Port, Master, Msg) ->
- %% Client
- %%
- spawn_link(
- fun () ->
- {ok,Socket} = gen_tcp:connect(
- "localhost", Port,
- [{active,false},binary,{packet,0}]),
- receive
- {Master,recv, N} ->
- busy_send_client_loop(Socket, Master, Msg, N)
- end
- end).
+%% busy_send_client(Port, Master, Msg) ->
+%% %% Client
+%% %%
+%% spawn_link(
+%% fun () ->
+%% {ok,Socket} = gen_tcp:connect(
+%% "localhost", Port,
+%% [{active,false},binary,{packet,0}]),
+%% receive
+%% {Master,recv, N} ->
+%% busy_send_client_loop(Socket, Master, Msg, N)
+%% end
+%% end).
busy_send_client_loop(Socket, Master, Msg, N) ->
%% Client
%%
Size = byte_size(Msg),
case gen_tcp:recv(Socket, Size) of
- {ok,Msg} ->
+ {ok, Msg} ->
busy_send_client_loop(Socket, Master, Msg, N-1);
Other ->
- Master ! {self(),flush([Other,N])}
+ Master ! {self(), flush([Other,N])}
end.
%%%
@@ -3929,6 +4011,12 @@ f(F, A) ->
connect_failed_str(Reason) ->
f("Connect failed: ~w", [Reason]).
+listen_failed_str(Reason) ->
+ f("Listen failed: ~w", [Reason]).
+
+accept_failed_str(Reason) ->
+ f("Accept failed: ~w", [Reason]).
+
formated_timestamp() ->
format_timestamp(os:timestamp()).
--
2.26.2