File 4298-Test-differing-cookies-with-dynamic-node-names.patch of Package erlang
From fdbf76925736c831925c4a8d9e67e92e6170a8da Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Wed, 11 Aug 2021 17:28:56 +0200
Subject: [PATCH 8/9] Test differing cookies with dynamic node names
---
lib/kernel/test/erl_distribution_SUITE.erl | 125 +++++++++++++++++----
1 file changed, 106 insertions(+), 19 deletions(-)
diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl
index 6443189a7c..aa1a6d6a27 100644
--- a/lib/kernel/test/erl_distribution_SUITE.erl
+++ b/lib/kernel/test/erl_distribution_SUITE.erl
@@ -49,7 +49,8 @@
dist_ctrl_proc_reject/1,
erl_uds_dist_smoke_test/1,
erl_1424/1, net_kernel_start/1, differing_cookies/1,
- cmdline_setcookie_2/1, connection_cookie/1]).
+ cmdline_setcookie_2/1, connection_cookie/1,
+ dyn_differing_cookies/1]).
%% Performs the test at another node.
-export([get_socket_priorities/0,
@@ -59,7 +60,8 @@
epmd_reconnect_do/2,
setopts_do/2,
setopts_deadlock_test/2,
- keep_conn/1, time_ping/1]).
+ keep_conn/1, time_ping/1,
+ dyn_differing_cookies/2]).
-export([net_kernel_start_do_test/1]).
@@ -95,8 +97,8 @@ all() ->
table_waste, net_setuptime, inet_dist_options_options,
{group, monitor_nodes},
erl_uds_dist_smoke_test,
- erl_1424, net_kernel_start, differing_cookies,
- cmdline_setcookie_2, connection_cookie].
+ erl_1424, net_kernel_start,
+ {group, differing_cookies}].
groups() ->
[{monitor_nodes, [],
@@ -106,7 +108,12 @@ groups() ->
monitor_nodes_otp_6481, monitor_nodes_errors,
monitor_nodes_combinations, monitor_nodes_cleanup,
monitor_nodes_many,
- monitor_nodes_down_up]}].
+ monitor_nodes_down_up]},
+ {differing_cookies, [],
+ [differing_cookies,
+ cmdline_setcookie_2,
+ connection_cookie,
+ dyn_differing_cookies]}].
init_per_suite(Config) ->
start_gen_tcp_dist_test_type_server(),
@@ -698,9 +705,14 @@ opt_from_nr("2") -> {nodelay, false}.
change_val(true) -> false;
change_val(false) -> true.
+
start_node_unconnected(DCfg, Name, Mod, Func, Args) ->
+ start_node_unconnected(DCfg, Name, erlang:get_cookie(), Mod, Func, Args).
+
+start_node_unconnected(DCfg, Name, Cookie, Mod, Func, Args) ->
FullName = full_node_name(Name),
- CmdLine = mk_node_cmdline(DCfg, Name,Mod,Func,Args),
+ CmdLine =
+ mk_node_cmdline(DCfg, Name, Cookie, Mod, Func, Args),
io:format("Starting node ~p: ~s~n", [FullName, CmdLine]),
case open_port({spawn, CmdLine}, [exit_status]) of
Port when is_port(Port) ->
@@ -709,12 +721,14 @@ start_node_unconnected(DCfg, Name, Mod, Func, Args) ->
exit({failed_to_start_node, FullName, Error})
end.
-full_node_name(PreName) ->
+full_node_name(PreName) when is_atom(PreName) ->
+ full_node_name(atom_to_list(PreName));
+full_node_name(PreNameL) when is_list(PreNameL) ->
HostSuffix = lists:dropwhile(fun ($@) -> false; (_) -> true end,
atom_to_list(node())),
- list_to_atom(atom_to_list(PreName) ++ HostSuffix).
+ list_to_atom(PreNameL ++ HostSuffix).
-mk_node_cmdline(DCfg, Name,Mod,Func,Args) ->
+mk_node_cmdline(DCfg, Name, Cookie, Mod, Func, Args) ->
Static = "-noinput",
Pa = filename:dirname(code:which(?MODULE)),
Prog = case catch init:get_argument(progname) of
@@ -734,7 +748,7 @@ mk_node_cmdline(DCfg, Name,Mod,Func,Args) ->
++ " " ++ DCfg
++ " -pa " ++ Pa
++ " -env ERL_CRASH_DUMP " ++ Pwd ++ "/erl_crash_dump." ++ NameStr
- ++ " -setcookie " ++ atom_to_list(erlang:get_cookie())
+ ++ " -setcookie " ++ atom_to_list(Cookie)
++ " -run " ++ atom_to_list(Mod) ++ " " ++ atom_to_list(Func)
++ " " ++ string:join(Args, " ").
@@ -1983,17 +1997,17 @@ erl_1424(Config) when is_list(Config) ->
end.
differing_cookies(Config) when is_list(Config) ->
+ test_server:timetrap({minutes, 1}),
Node = node(),
true = Node =/= nonode@nohost,
- NodeL = atom_to_list(Node),
- [ _, HostL ] = string:lexemes(NodeL, "@"),
+ [] = nodes(),
BaseName = atom_to_list(?FUNCTION_NAME),
%% Use -hidden nodes to avoid global connecting all nodes
%% Start node A with different cookie
NodeAName = BaseName++"_nodeA",
- NodeA = list_to_atom(NodeAName++"@"++HostL),
+ NodeA = full_node_name(NodeAName),
NodeACookieL = BaseName++"_cookieA",
NodeACookie = list_to_atom(NodeACookieL),
true = erlang:set_cookie( NodeA, NodeACookie ),
@@ -2007,7 +2021,7 @@ differing_cookies(Config) when is_list(Config) ->
%% Start node B with another different cookie
NodeBName = BaseName++"_nodeB",
- NodeB = list_to_atom(NodeBName++"@"++HostL),
+ NodeB = full_node_name(NodeBName),
NodeBCookieL = BaseName++"_cookieB",
NodeBCookie = list_to_atom(NodeBCookieL),
true = erlang:set_cookie( NodeB, NodeBCookie ),
@@ -2066,10 +2080,11 @@ differing_cookies(Config) when is_list(Config) ->
ok.
cmdline_setcookie_2(Config) when is_list(Config) ->
+ test_server:timetrap({minutes, 1}),
Node = node(),
true = Node =/= nonode@nohost,
+ [] = nodes(),
NodeL = atom_to_list(Node),
- [ _, HostL ] = string:lexemes(NodeL, "@"),
BaseName = atom_to_list(?FUNCTION_NAME),
NodeCookie = erlang:get_cookie(),
NodeCookieL = atom_to_list(NodeCookie),
@@ -2079,7 +2094,7 @@ cmdline_setcookie_2(Config) when is_list(Config) ->
%% Start node A with different cookie
%% and cookie configuration of mother node
NodeAName = BaseName++"_nodeA",
- NodeA = list_to_atom(NodeAName++"@"++HostL),
+ NodeA = full_node_name(NodeAName),
NodeACookieL = BaseName++"_cookieA",
NodeACookie = list_to_atom(NodeACookieL),
{ ok, NodeA } =
@@ -2099,7 +2114,7 @@ cmdline_setcookie_2(Config) when is_list(Config) ->
%% Start node B with different cookie
%% and cookie configuration of mother node and node A
NodeBName = BaseName++"_nodeB",
- NodeB = list_to_atom(NodeBName++"@"++HostL),
+ NodeB = full_node_name(NodeBName),
NodeBCookieL = BaseName++"_cookieB",
NodeBCookie = list_to_atom(NodeBCookieL),
{ ok, NodeB } =
@@ -2140,15 +2155,16 @@ cmdline_setcookie_2(Config) when is_list(Config) ->
ok.
connection_cookie(Config) when is_list(Config) ->
+ test_server:timetrap({minutes, 1}),
Node = node(),
true = Node =/= nonode@nohost,
+ [] = nodes(),
NodeL = atom_to_list(Node),
- [ _, HostL ] = string:lexemes(NodeL, "@"),
BaseName = atom_to_list(?FUNCTION_NAME),
%% Start node A with dedicated connection cookie
NodeAName = BaseName++"_nodeA",
- NodeA = list_to_atom(NodeAName++"@"++HostL),
+ NodeA = full_node_name(NodeAName),
NodeACookieL = BaseName++"_cookieA",
NodeACookie = list_to_atom(NodeACookieL),
true = NodeACookie =/= erlang:get_cookie(),
@@ -2176,6 +2192,77 @@ connection_cookie(Config) when is_list(Config) ->
[] = nodes(),
ok.
+dyn_differing_cookies(Config) when is_list(Config) ->
+ test_server:timetrap({minutes, 1}),
+ MotherNode = node(),
+ true = MotherNode =/= nonode@nohost,
+ [] = nodes(hidden),
+ MotherNodeL = atom_to_list(MotherNode),
+ BaseName = atom_to_list(?FUNCTION_NAME),
+ MotherNodeCookie = erlang:get_cookie(),
+ MotherNodeCookieL = atom_to_list(MotherNodeCookie),
+ register(?FUNCTION_NAME, self()),
+
+ %% Start node A with different cookie
+ %% and cookie configuration of mother node
+ DynNodeCookieL = BaseName++"_cookieA",
+ DynNodeCookie = list_to_atom(DynNodeCookieL),
+ {_NF, Port} =
+ start_node_unconnected(
+ "-setcookie "++MotherNodeL++" "++MotherNodeCookieL,
+ undefined, DynNodeCookie,
+ ?MODULE, run_remote_test,
+ [atom_to_list(?FUNCTION_NAME), MotherNodeL] ),
+
+ dyn_differing_cookies(MotherNode, MotherNodeCookie, DynNodeCookie, Port).
+
+dyn_differing_cookies(MotherNode, MotherNodeCookie, DynNodeCookie, Port) ->
+ receive
+ { MotherNode, MotherNodeCookie, DynNodeCookie, DynNode } ->
+ [ DynNode ] = nodes(hidden),
+ [ MotherNode ] = rpc:call( DynNode, erlang, nodes, [hidden] ),
+ DynNodeCookie = rpc:call( DynNode, erlang, get_cookie, [] ),
+ MotherNodeCookie =
+ rpc:call( DynNode, erlang, get_cookie, [MotherNode] ),
+ {?FUNCTION_NAME, DynNode} !
+ {MotherNode, MotherNodeCookie, DynNode},
+
+ 0 = wait_for_port_exit(Port),
+
+ [] = nodes(hidden),
+ ok;
+ {Port, {data, Data}} ->
+ io:format("~p: ~s", [Port, Data]),
+ dyn_differing_cookies(
+ MotherNode, MotherNodeCookie, DynNodeCookie, Port);
+ Other ->
+ error({unexpected, Other})
+ end.
+
+dyn_differing_cookies(MotherNode, _Args) ->
+ nonode@nohost = node(),
+ [] = nodes(hidden),
+ true = net_kernel:connect_node( MotherNode ),
+ [ MotherNode ] = nodes(hidden),
+ DynNode = node(),
+ [ DynNode ] = rpc:call( MotherNode, erlang, nodes, [hidden] ),
+ MotherNodeCookie = erlang:get_cookie( MotherNode ),
+ MotherNodeCookie = rpc:call( MotherNode, erlang, get_cookie, [] ),
+ %% Here we get the mother node's default cookie
+ MotherNodeCookie = rpc:call( MotherNode, erlang, get_cookie, [DynNode] ),
+ DynNodeCookie = erlang:get_cookie(),
+ register( ?FUNCTION_NAME, self() ),
+ {?FUNCTION_NAME, MotherNode} !
+ {MotherNode, MotherNodeCookie, DynNodeCookie, DynNode},
+ receive
+ { MotherNode, MotherNodeCookie, DynNode } ->
+ true = disconnect_node( MotherNode ),
+ [] = nodes(hidden),
+ ok;
+ Other ->
+ error({unexpected, Other})
+ end.
+
%% Misc. functions
--
2.31.1