diff options
author | Rickard Green <rickard@erlang.org> | 2020-02-11 18:04:49 +0100 |
---|---|---|
committer | Rickard Green <rickard@erlang.org> | 2020-02-11 18:04:49 +0100 |
commit | 83564c66a4b3aa464b49b5aeab86cca19dc303ab (patch) | |
tree | a49229ccaa6c08a2bcb7c9ca2fc02b604d7a73ac /erts/emulator | |
parent | 23008d97fd0087c51aa3f92872ae109c0601296f (diff) | |
parent | 6c336ea59d172afcbb73bcc248ab14794432f27f (diff) | |
download | erlang-83564c66a4b3aa464b49b5aeab86cca19dc303ab.tar.gz |
Merge branch 'rickard/kill2killed-test' into maint
* rickard/kill2killed-test:
Test case verifying exit signal kill to killed mapping
Diffstat (limited to 'erts/emulator')
-rw-r--r-- | erts/emulator/test/signal_SUITE.erl | 65 |
1 files changed, 64 insertions, 1 deletions
diff --git a/erts/emulator/test/signal_SUITE.erl b/erts/emulator/test/signal_SUITE.erl index 4e6baa9e0e..016e035991 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]. @@ -89,6 +90,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 -------------------------------------------------------- %% |