summaryrefslogtreecommitdiff
path: root/lib/kernel/test/erl_distribution_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kernel/test/erl_distribution_SUITE.erl')
-rw-r--r--lib/kernel/test/erl_distribution_SUITE.erl169
1 files changed, 145 insertions, 24 deletions
diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl
index 2b84a68c52..310b94bddf 100644
--- a/lib/kernel/test/erl_distribution_SUITE.erl
+++ b/lib/kernel/test/erl_distribution_SUITE.erl
@@ -24,7 +24,7 @@
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2]).
--export([tick/1, tick_change/1,
+-export([tick/1, tick_intensity/1, tick_change/1,
connect_node/1,
nodenames/1, hostnames/1,
illegal_nodenames/1, hidden_node/1,
@@ -41,16 +41,19 @@
monitor_nodes_combinations/1,
monitor_nodes_cleanup/1,
monitor_nodes_many/1,
- dist_ctrl_proc_smoke/1]).
+ dist_ctrl_proc_smoke/1,
+ net_kernel_start/1]).
%% Performs the test at another node.
-export([get_socket_priorities/0,
- tick_cli_test/1, tick_cli_test1/1,
+ tick_cli_test/3, tick_cli_test1/3,
tick_serv_test/2, tick_serv_test1/1,
run_remote_test/1,
setopts_do/2,
keep_conn/1, time_ping/1]).
+-export([net_kernel_start_do_test/1]).
+
-export([init_per_testcase/2, end_per_testcase/2]).
-export([dist_cntrlr_output_test/2]).
@@ -72,11 +75,12 @@ suite() ->
all() ->
[dist_ctrl_proc_smoke,
- tick, tick_change, nodenames, hostnames, illegal_nodenames,
- connect_node,
+ tick, tick_intensity, tick_change, nodenames, hostnames,
+ illegal_nodenames, connect_node,
hidden_node, setopts,
table_waste, net_setuptime, inet_dist_options_options,
- {group, monitor_nodes}].
+ {group, monitor_nodes},
+ net_kernel_start].
groups() ->
[{monitor_nodes, [],
@@ -120,26 +124,45 @@ connect_node(Config) when is_list(Config) ->
tick(Config) when is_list(Config) ->
run_dist_configs(fun tick/2, Config).
-tick(DCfg, _Config) ->
+tick(DCfg, Config) ->
+ tick_test(DCfg, Config, false).
+
+tick_intensity(Config) when is_list(Config) ->
+ run_dist_configs(fun tick_intensity/2, Config).
+
+tick_intensity(DCfg, Config) ->
+ tick_test(DCfg, Config, true).
+
+tick_test(DCfg, _Config, CheckIntensityArg) ->
%%
%% This test case use disabled "connect all" so that
%% global wont interfere...
%%
- %% First check that the normal case is OK!
[Name1, Name2] = get_nodenames(2, dist_test),
+
{ok, Node} = start_node(DCfg, Name1),
- rpc:call(Node, erl_distribution_SUITE, tick_cli_test, [node()]),
- erlang:monitor_node(Node, true),
- receive
- {nodedown, Node} ->
- ct:fail("nodedown from other node")
- after 30000 ->
- erlang:monitor_node(Node, false),
- stop_node(Node)
+ case CheckIntensityArg of
+ true ->
+ %% Not for intensity test...
+ ok;
+ false ->
+ %% First check that the normal case is OK!
+ rpc:call(Node, erl_distribution_SUITE, tick_cli_test, [node(), 8000, 16000]),
+
+ erlang:monitor_node(Node, true),
+ receive
+ {nodedown, Node} ->
+ ct:fail("nodedown from other node")
+ after 30000 ->
+ erlang:monitor_node(Node, false)
+ end,
+ ok
end,
+ stop_node(Node),
+
%% Now, set the net_ticktime for the other node to 12 secs.
%% After the sleep(2sec) and cast the other node shall destroy
%% the connection as it has not received anything on the connection.
@@ -156,9 +179,20 @@ tick(DCfg, _Config) ->
"-kernel net_ticktime 100 -connect_all false"),
rpc:call(ServNode, erl_distribution_SUITE, tick_serv_test, [Node, node()]),
+ %% We set min/max half a second lower/higher than expected since it
+ %% takes time for termination dist controller, delivery of messages
+ %% scheduling of process receiving nodedown, etc...
+ {IArg, Min, Max} = case CheckIntensityArg of
+ false ->
+ {"", 7500, 16500};
+ true ->
+ {" -kernel net_tickintensity 24", 11000, 13000}
+ end,
+
{ok, Node} = start_node(DCfg, Name1,
- "-kernel net_ticktime 12 -connect_all false"),
- rpc:call(Node, erl_distribution_SUITE, tick_cli_test, [ServNode]),
+ "-kernel net_ticktime 12 -connect_all false" ++ IArg),
+
+ rpc:call(Node, erl_distribution_SUITE, tick_cli_test, [ServNode, Min, Max]),
spawn_link(erl_distribution_SUITE, keep_conn, [Node]),
@@ -171,6 +205,7 @@ tick(DCfg, _Config) ->
{tick_test, T} when is_integer(T) ->
stop_node(ServNode),
stop_node(Node),
+ io:format("Result: ~p~n", [T]),
T;
{tick_test, Error} ->
stop_node(ServNode),
@@ -393,10 +428,10 @@ tick_serv_test1(Node) ->
end
end.
-tick_cli_test(Node) ->
- spawn(erl_distribution_SUITE, tick_cli_test1, [Node]).
+tick_cli_test(Node, Min, Max) ->
+ spawn(erl_distribution_SUITE, tick_cli_test1, [Node, Min, Max]).
-tick_cli_test1(Node) ->
+tick_cli_test1(Node, Min, Max) ->
register(tick_test, self()),
erlang:monitor_node(Node, true),
sleep(2),
@@ -410,11 +445,14 @@ tick_cli_test1(Node) ->
Diff = erlang:convert_time_unit(T2-T1, native,
millisecond),
case Diff of
- T when T > 8000, T < 16000 ->
+ T when Min =< T, T =< Max ->
From ! {tick_test, T};
T ->
From ! {tick_test,
- {"T not in interval 8000 < T < 16000",
+ {"T not in interval "
+ ++ integer_to_list(Min)
+ ++ " =< T =< "
+ ++ integer_to_list(Max),
T}}
end
end
@@ -1532,6 +1570,89 @@ dist_ctrl_proc_smoke(Config) when is_list(Config) ->
stop_node(Node2),
ok.
+net_kernel_start(Config) when is_list(Config) ->
+ MyName = net_kernel_start_tester,
+ register(MyName, self()),
+ net_kernel_start_test(MyName, 120, 8),
+ net_kernel_start_test(MyName, undefined, undefined).
+
+net_kernel_start_test(MyName, NetTickTime, NetTickIntesity) ->
+ TestNameStr = "net_kernel_start_test_node-"
+ ++ integer_to_list(erlang:system_time(seconds))
+ ++ "-" ++ integer_to_list(erlang:unique_integer([monotonic,positive])),
+ TestNode = list_to_atom(TestNameStr ++ "@" ++ atom_to_list(gethostname())),
+ CmdLine = net_kernel_start_cmdline(MyName, list_to_atom(TestNameStr),
+ NetTickTime, NetTickIntesity),
+ io:format("Starting test node ~p: ~s~n", [TestNode, CmdLine]),
+ case open_port({spawn, CmdLine}, []) of
+ Port when is_port(Port) ->
+ receive
+ {i_am_alive, Pid, Node, NTT} = Msg ->
+ io:format("Response from ~p: ~p~n", [Node, Msg]),
+ rpc:cast(Node, erlang, halt, []),
+ catch erlang:port_close(Port),
+ TestNode = node(Pid),
+ TestNode = Node,
+ case NetTickTime == undefined of
+ true ->
+ {ok, DefNTT} = application:get_env(kernel, net_ticktime),
+ DefNTT = NTT;
+ false ->
+ NetTickTime = NTT
+ end
+ end,
+ ok;
+ Error ->
+ error({open_port_failed, TestNode, Error})
+ end.
+
+net_kernel_start_cmdline(TestName, Name, NetTickTime, NetTickIntensity) ->
+ Pa = filename:dirname(code:which(?MODULE)),
+ Prog = case catch init:get_argument(progname) of
+ {ok, [[Prg]]} -> Prg;
+ _ -> error(missing_progname)
+ end,
+ NameDomain = case net_kernel:longnames() of
+ false -> "shortnames";
+ true -> "longnames"
+ end,
+ {ok, Pwd} = file:get_cwd(),
+ NameStr = atom_to_list(Name),
+ Prog ++ " -noinput -noshell -detached -pa " ++ Pa
+ ++ " -env ERL_CRASH_DUMP " ++ Pwd ++ "/erl_crash_dump." ++ NameStr
+ ++ " -setcookie " ++ atom_to_list(erlang:get_cookie())
+ ++ " -run " ++ atom_to_list(?MODULE) ++ " net_kernel_start_do_test "
+ ++ atom_to_list(TestName) ++ " " ++ atom_to_list(node()) ++ " "
+ ++ NameStr ++ " " ++ NameDomain
+ ++ case NetTickTime == undefined of
+ true ->
+ "";
+ false ->
+ " " ++ integer_to_list(NetTickTime) ++
+ " " ++ integer_to_list(NetTickIntensity)
+ end.
+
+net_kernel_start_do_test([TestName, TestNode, Name, NameDomain]) ->
+ net_kernel_start_do_test(TestName, TestNode, list_to_atom(Name),
+ #{name_domain => list_to_atom(NameDomain)});
+
+net_kernel_start_do_test([TestName, TestNode, Name, NameDomain, NetTickTime, NetTickIntensity]) ->
+ net_kernel_start_do_test(TestName, TestNode, list_to_atom(Name),
+ #{net_ticktime => list_to_integer(NetTickTime),
+ name_domain => list_to_atom(NameDomain),
+ net_tickintensity => list_to_integer(NetTickIntensity)}).
+
+net_kernel_start_do_test(TestName, TestNode, Name, Options) ->
+ case net_kernel:start(Name, Options) of
+ {ok, _Pid} ->
+ Tester = {list_to_atom(TestName), list_to_atom(TestNode)},
+ Tester ! {i_am_alive, self(), node(), net_kernel:get_net_ticktime()},
+ receive after 60000 -> ok end,
+ erlang:halt();
+ Error ->
+ erlang:halt(lists:flatten(io_lib:format("~p", [Error])))
+ end.
+
%% Misc. functions
run_dist_configs(Func, Config) ->
@@ -1602,7 +1723,7 @@ print_my_messages() ->
sleep(T) -> receive after T * 1000 -> ok end.
-start_node(DCfg, Name, Param, this) ->
+start_node(_DCfg, Name, Param, this) ->
NewParam = Param ++ " -pa " ++ filename:dirname(code:which(?MODULE)),
test_server:start_node(Name, peer, [{args, NewParam}, {erl, [this]}]);
start_node(DCfg, Name, Param, "this") ->