diff options
author | Erlang/OTP <otp@erlang.org> | 2020-03-04 08:23:47 +0100 |
---|---|---|
committer | Erlang/OTP <otp@erlang.org> | 2020-03-04 08:23:47 +0100 |
commit | b782c794514ef154dac73959d60edc14452cffe1 (patch) | |
tree | f68b0bbc0d17fd22f431f654c74b97532b5e86d4 | |
parent | d9523afc8bb54fa9772462170018f982359c0e0d (diff) | |
parent | 02eb36c4a46815d3d9128fec9f57e823de54f1ed (diff) | |
download | erlang-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.erl | 68 |
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 -------------------------------------------------------- %% |