File 4321-kernel-tcp-misc-test-Adjust-fill-sendq-test-case.patch of Package erlang
From 504c976bcbf0331f1d1e6763ac8fa484def9ba1a Mon Sep 17 00:00:00 2001
From: Micael Karlberg <bmk@erlang.org>
Date: Mon, 25 May 2020 12:49:08 +0200
Subject: [PATCH 21/35] [kernel|tcp|misc-test] Adjust fill-sendq test case
Add a skip clause (eaddrnotavail on connect).
---
lib/kernel/test/gen_tcp_misc_SUITE.erl | 186 ++++++++++++++++---------
1 file changed, 123 insertions(+), 63 deletions(-)
diff --git a/lib/kernel/test/gen_tcp_misc_SUITE.erl b/lib/kernel/test/gen_tcp_misc_SUITE.erl
index 9b346ad51a..a63931ee01 100644
--- a/lib/kernel/test/gen_tcp_misc_SUITE.erl
+++ b/lib/kernel/test/gen_tcp_misc_SUITE.erl
@@ -1891,7 +1891,7 @@ busy_disconnect_passive(Config) when is_list(Config) ->
SKIP
end.
-do_busy_disconnect_passive(Config) ->
+do_busy_disconnect_passive(_Config) ->
MuchoData = list_to_binary(ones(64*1024)),
[do_busy_disconnect_passive2(MuchoData) || _ <- lists:seq(1, 10)],
ok.
@@ -1980,117 +1980,174 @@ busy_disconnect_server_wait_for_busy(Sender, S) ->
%%% Fill send queue
%%%
fill_sendq(Config) when is_list(Config) ->
- Master = self(),
- 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,
- fill_sendq_client(Port, Master)},
- fill_sendq_srv(L, Master)
- end),
- io:format("~p Server~n", [Server]),
- receive
- {Server,client,Client} ->
- io:format("~p Client~n", [Client]),
- receive
- {Server,reader,Reader} ->
- io:format("~p Reader~n", [Reader]),
- fill_sendq_loop(Server, Client, Reader)
- end
+ try do_fill_sendq(Config)
+ catch
+ exit:{skip, _} = SKIP ->
+ SKIP
end.
+do_fill_sendq(_Config) ->
+ OldFlag = process_flag(trap_exit, true),
+ Master = self(),
+ ServerF =
+ fun () ->
+ p("[server] try listen"),
+ case gen_tcp:listen(0, [{active,false},binary,
+ {reuseaddr,true},{packet,0}]) of
+ {ok, L} ->
+ p("[server] try port"),
+ case inet:port(L) of
+ {ok, Port} ->
+ Master ! {self(), listen_port, Port},
+ fill_sendq_srv(L, Master);
+ {error, PReason} ->
+ exit({skip, port_failed_str(PReason)})
+ end;
+ {error, LReason} ->
+ exit({skip, listen_failed_str(LReason)})
+ end
+ end,
+ Server = spawn_link(ServerF),
+ p("[master] server: ~p", [Server]),
+ ClientF =
+ fun () ->
+ p("[client] await server port"),
+ ServerPort =
+ receive
+ {Master, server_port, SP} ->
+ p("[client] server port: ~w", [SP]),
+ SP
+ end,
+ %% Just close on order
+ p("[client] try connect"),
+ case gen_tcp:connect(
+ "localhost", ServerPort,
+ [{active,false},binary,{packet,0}]) of
+ {ok, S} ->
+ p("[client] connected"),
+ Master ! {self(), connected},
+ receive
+ {Master, close} ->
+ p("[client] received close"),
+ ok = gen_tcp:close(S)
+ end;
+ {error, eaddrnotavail = Reason} ->
+ exit({skip, connect_failed_str(Reason)})
+ end
+ end,
+ Client = spawn_link(ClientF),
+ p("[master] client: ~p", [client]),
+ ListenPort =
+ receive
+ {Server, listen_port, LP} ->
+ p("[master] listen port: ~w", [LP]),
+ LP
+ end,
+ Client ! {self(), server_port, ListenPort},
+ p("[master] await client connected"),
+ receive {Client, connected} -> ok end,
+ p("[master] await reader"),
+ Res = receive
+ {Server, reader, Reader} ->
+ p("[master] reader: ~p", [Reader]),
+ fill_sendq_loop(Server, Client, Reader)
+ end,
+ process_flag(trap_exit, OldFlag),
+ p("[master] done"),
+ Res.
+
fill_sendq_loop(Server, Client, Reader) ->
%% Master
%%
receive
- {Server,send} ->
+ {Server, send} ->
fill_sendq_loop(Server, Client, Reader)
after 2000 ->
%% Send queue full, sender blocked -> close client.
- io:format("Send timeout, closing Client...~n", []),
- Client ! {self(),close},
+ p("[master] send timeout, closing client"),
+ Client ! {self(), close},
receive
- {Server,[{error,closed}]} ->
- io:format("Got server closed.~n"),
+ {Server, [{error,closed}] = SErrors} ->
+ p("[master] got expected server closed"),
receive
- {Reader,[{error,closed}]} ->
- io:format("Got reader closed.~n"),
- ok
+ {Reader, [{error,closed}]} ->
+ p("[master] got expected reader closed"),
+ ok;
+ {Reader, RErrors} ->
+ ct:fail([{server, SErrors}, {reader, RErrors}])
after 3000 ->
ct:fail({timeout,{closed,reader}})
end;
- {Reader,[{error,closed}]} ->
- io:format("Got reader closed.~n"),
+
+ {Server, SErrors} ->
+ ct:fail([{server, SErrors}, {reader, []}]);
+
+ {Reader, [{error,closed}] = RErrors} ->
+ p("[master] got expected reader closed"),
receive
- {Server,[{error,closed}]} ->
- io:format("Got server closed~n"),
- ok
+ {Server, [{error,closed}]} ->
+ p("[master] got expected server closed"),
+ ok;
+ {Server, SErrors} ->
+ ct:fail([{server, SErrors}, {reader, RErrors}])
after 3000 ->
ct:fail({timeout,{closed,server}})
- end
+ end;
+
+ {Reader, RErrors} ->
+ ct:fail([{server, []}, {reader, RErrors}])
+
after 3000 ->
- ct:fail({timeout,{closed,[server,reader]}})
+ Msgs = flush([]),
+ ct:fail({timeout,{closed,[server,reader]}, Msgs})
end
end.
fill_sendq_srv(L, Master) ->
%% Server
%%
+ p("[server] await accept"),
case gen_tcp:accept(L) of
- {ok,S} ->
+ {ok, S} ->
Master ! {self(),reader,
spawn_link(fun () -> fill_sendq_read(S, Master) end)},
Msg = "the quick brown fox jumps over a lazy dog~n",
fill_sendq_write(S, Master, [Msg,Msg,Msg,Msg,Msg,Msg,Msg,Msg]);
- Error ->
- io:format("~p accept error: ~p.~n", [self(),Error]),
- Master ! {self(),flush([Error])}
+ E ->
+ Error = flush([E]),
+ p("[server] accept error: ~p", [E]),
+ Master ! {self(), Error}
end.
fill_sendq_write(S, Master, Msg) ->
%% Server
%%
- %%io:format("~p sending...~n", [self()]),
- Master ! {self(),send},
+ %% p("[server] sending..."),
+ Master ! {self(), send},
case gen_tcp:send(S, Msg) of
ok ->
- %%io:format("~p ok.~n", [self()]),
+ %% p("[server] ok."),
fill_sendq_write(S, Master, Msg);
- E ->
+ {error, _} = E ->
Error = flush([E]),
- io:format("~p send error: ~p.~n", [self(),Error]),
- Master ! {self(),Error}
+ p("[server] send error: ~p", [Error]),
+ Master ! {self(), Error}
end.
fill_sendq_read(S, Master) ->
%% Reader
%%
- io:format("~p read infinity...~n", [self()]),
+ p("[reader] read infinity..."),
case gen_tcp:recv(S, 0, infinity) of
- {ok,Data} ->
- io:format("~p recv: ~p.~n", [self(),Data]),
+ {ok, Data} ->
+ p("[reader] recv: ~p", [Data]),
fill_sendq_read(S, Master);
E ->
Error = flush([E]),
- io:format("~p recv error: ~p.~n", [self(),Error]),
- Master ! {self(),Error}
+ p("[reader] recv error: ~p", [Error]),
+ Master ! {self(), Error}
end.
-fill_sendq_client(Port, Master) ->
- %% Client
- %%
- spawn_link(fun () ->
- %% Just close on order
- {ok,S} = gen_tcp:connect(
- "localhost", Port,
- [{active,false},binary,{packet,0}]),
- receive
- {Master,close} ->
- ok = gen_tcp:close(S)
- end
- end).
%%% Try to receive more than available number of bytes from
%%% a closed socket.
@@ -4021,6 +4078,9 @@ listen_failed_str(Reason) ->
accept_failed_str(Reason) ->
f("Accept failed: ~w", [Reason]).
+port_failed_str(Reason) ->
+ f("Port failed: ~w", [Reason]).
+
formated_timestamp() ->
format_timestamp(os:timestamp()).
--
2.26.2