summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErlang/OTP <otp@erlang.org>2020-03-04 08:23:47 +0100
committerErlang/OTP <otp@erlang.org>2020-03-04 08:23:47 +0100
commitb782c794514ef154dac73959d60edc14452cffe1 (patch)
treef68b0bbc0d17fd22f431f654c74b97532b5e86d4
parentd9523afc8bb54fa9772462170018f982359c0e0d (diff)
parent02eb36c4a46815d3d9128fec9f57e823de54f1ed (diff)
downloaderlang-b782c794514ef154dac73959d60edc14452cffe1.tar.gz
Merge branch 'rickard/kill2killed-test' into maint-21
* rickard/kill2killed-test: Activate test Test case verifying exit signal kill to killed mapping # Conflicts: # erts/emulator/test/signal_SUITE.erl
-rw-r--r--erts/emulator/test/signal_SUITE.erl68
1 files changed, 66 insertions, 2 deletions
diff --git a/erts/emulator/test/signal_SUITE.erl b/erts/emulator/test/signal_SUITE.erl
index 4e6baa9e0e..0bfe7539b4 100644
--- a/erts/emulator/test/signal_SUITE.erl
+++ b/erts/emulator/test/signal_SUITE.erl
@@ -34,7 +34,8 @@
-export([init_per_testcase/2, end_per_testcase/2]).
% Test cases
--export([xm_sig_order/1]).
+-export([xm_sig_order/1,
+ kill2killed/1]).
init_per_testcase(Func, Config) when is_atom(Func), is_list(Config) ->
[{testcase, Func}|Config].
@@ -53,7 +54,8 @@ suite() ->
{timetrap, {minutes, 2}}].
all() ->
- [xm_sig_order].
+ [xm_sig_order,
+ kill2killed].
%% Test that exit signals and messages are received in correct order
@@ -89,6 +91,68 @@ xm_sig_order_proc() ->
end,
xm_sig_order_proc().
+kill2killed(Config) when is_list(Config) ->
+ process_flag(trap_exit, true),
+ kill2killed_test(node()),
+ {ok, Node} = start_node(Config),
+ kill2killed_test(Node),
+ stop_node(Node),
+ ok.
+
+kill2killed_test(Node) ->
+ if Node == node() ->
+ io:format("Testing against local node", []);
+ true ->
+ io:format("Testing against remote node ~p", [Node])
+ end,
+ check_exit(Node, other_exit2, 1),
+ check_exit(Node, other_exit2, 2),
+ check_exit(Node, other_exit2, 9),
+ check_exit(Node, other_exit2, 10),
+ check_exit(Node, exit2, 1),
+ check_exit(Node, exit2, 2),
+ check_exit(Node, exit2, 9),
+ check_exit(Node, exit2, 10),
+ check_exit(Node, exit1, 1),
+ check_exit(Node, exit1, 2),
+ check_exit(Node, exit1, 9),
+ check_exit(Node, exit1, 10),
+ ok.
+
+check_exit(Node, Type, N) ->
+ io:format("Testing ~p length ~p~n", [Type, N]),
+ P = spawn_link_line(Node, node(), Type, N, self()),
+ if Type == other_exit2 ->
+ receive
+ {end_of_line, EOL} ->
+ exit(EOL, kill)
+ end;
+ true -> ok
+ end,
+ receive
+ {'EXIT', P, Reason} ->
+ if Type == exit1 ->
+ kill = Reason;
+ true ->
+ killed = Reason
+ end
+ end.
+
+spawn_link_line(_NodeA, _NodeB, other_exit2, 0, Tester) ->
+ Tester ! {end_of_line, self()},
+ receive after infinity -> ok end;
+spawn_link_line(_NodeA, _NodeB, exit1, 0, _Tester) ->
+ exit(kill);
+spawn_link_line(_NodeA, _NodeB, exit2, 0, _Tester) ->
+ exit(self(), kill);
+spawn_link_line(NodeA, NodeB, Type, N, Tester) ->
+ spawn_link(NodeA,
+ fun () ->
+ spawn_link_line(NodeB, NodeA, Type, N-1, Tester),
+ receive after infinity -> ok end
+ end).
+
+
%%
%% -- Internal utils --------------------------------------------------------
%%