File 4291-Test-differing-cookies.patch of Package erlang
From c22c1ae262e13bdaabee44debd637c83dc1a7d65 Mon Sep 17 00:00:00 2001
From: Raimo Niskanen <raimo@erlang.org>
Date: Tue, 10 Aug 2021 18:02:02 +0200
Subject: [PATCH 1/9] Test differing cookies
---
lib/kernel/test/erl_distribution_SUITE.erl | 99 +++++++++++++++++++++-
1 file changed, 96 insertions(+), 3 deletions(-)
diff --git a/lib/kernel/test/erl_distribution_SUITE.erl b/lib/kernel/test/erl_distribution_SUITE.erl
index 4f2d4d393d..d8be4d523c 100644
--- a/lib/kernel/test/erl_distribution_SUITE.erl
+++ b/lib/kernel/test/erl_distribution_SUITE.erl
@@ -48,8 +48,7 @@
dist_ctrl_proc_smoke/1,
dist_ctrl_proc_reject/1,
erl_uds_dist_smoke_test/1,
- erl_1424/1,
- net_kernel_start/1]).
+ erl_1424/1, net_kernel_start/1, differing_cookies/1]).
%% Performs the test at another node.
-export([get_socket_priorities/0,
@@ -94,7 +94,7 @@ all() ->
table_waste, net_setuptime, inet_dist_options_options,
{group, monitor_nodes},
erl_uds_dist_smoke_test,
- erl_1424, net_kernel_start].
+ erl_1424, net_kernel_start, differing_cookies].
groups() ->
[{monitor_nodes, [],
@@ -1980,8 +1980,101 @@ erl_1424(Config) when is_list(Config) ->
erlang:halt(lists:flatten(io_lib:format("~p", [Error])))
end.
+differing_cookies(Config) when is_list(Config) ->
+ Node = node(),
+ true = Node =/= nonode@nohost,
+ NodeL = atom_to_list(Node),
+ [ _, HostL ] = string:lexemes(NodeL, "@"),
+
+ %% Use -hidden nodes to avoid global connecting all nodes
+
+ %% Start node A with different cookie
+ NodeAName = "nodeA",
+ NodeA = list_to_atom(NodeAName++"@"++HostL),
+ NodeACookie = nodeAcookie,
+ true = erlang:set_cookie( NodeA, NodeACookie ),
+ { ok, NodeA } =
+ start_node(
+ "-hidden", NodeAName,
+ "-setcookie "++atom_to_list(NodeACookie) ),
+ try
+
+ %% Verify the cluster
+ [ NodeA ] = nodes(hidden),
+ [ Node ] = rpc:call( NodeA, erlang, nodes, [hidden] ),
+
+ %% Start node B with another different cookie
+ NodeBName = "nodeB",
+ NodeB = list_to_atom(NodeBName++"@"++HostL),
+ NodeBCookie = nodeBcookie,
+ true = erlang:set_cookie( NodeB, NodeBCookie ),
+ { ok, NodeB } =
+ start_node(
+ "-hidden", NodeBName,
+ "-setcookie "++atom_to_list(NodeBCookie) ),
+ try
+
+ %% Verify the cluster
+ equal_sets( [NodeA, NodeB], nodes(hidden) ),
+ [ Node ] = rpc:call( NodeA, erlang, nodes, [hidden] ),
+ [ Node ] = rpc:call( NodeB, erlang, nodes, [hidden] ),
+
+ %% Verify that the nodes can not connect
+ %% before correcting the cookie configuration
+ pang = rpc:call( NodeA, net_adm, ping, [NodeB] ),
+ pang = rpc:call( NodeB, net_adm, ping, [NodeA] ),
+
+ %% Configure cookie and connect node A -> B
+ true = rpc:call( NodeA, erlang, set_cookie, [NodeB, NodeBCookie] ),
+ pong = rpc:call( NodeA, net_adm, ping, [NodeB] ),
+
+ %% Verify the cluster
+ NodeACookie = rpc:call( NodeA, erlang, get_cookie, []),
+ NodeBCookie = rpc:call( NodeB, erlang, get_cookie, []),
+ equal_sets( [NodeA, NodeB], nodes(hidden) ),
+ equal_sets( [Node, NodeB],
+ rpc:call( NodeA, erlang, nodes, [hidden] )),
+ equal_sets( [Node, NodeA],
+ rpc:call( NodeB, erlang, nodes, [hidden] )),
+
+ %% Disconnect node A from B
+ true = rpc:call( NodeB, net_kernel, disconnect, [NodeA] ),
+
+ %% Verify the cluster
+ equal_sets( [NodeA, NodeB], nodes(hidden) ),
+ [ Node ] = rpc:call( NodeA, erlang, nodes, [hidden] ),
+ [ Node ] = rpc:call( NodeB, erlang, nodes, [hidden] ),
+
+ %% Reconnect, now node B -> A
+ pong = rpc:call( NodeB, net_adm, ping, [NodeA] ),
+
+ %% Verify the cluster
+ equal_sets( [NodeA, NodeB], nodes(hidden) ),
+ equal_sets( [Node, NodeB],
+ rpc:call( NodeA, erlang, nodes, [hidden] )),
+ equal_sets( [Node, NodeA],
+ rpc:call( NodeB, erlang, nodes, [hidden] ))
+
+ after
+ _ = stop_node(NodeB)
+ end
+ after
+ _ = stop_node(NodeA)
+ end,
+ [] = nodes(hidden),
+ ok.
+
%% Misc. functions
+equal_sets(A, B) ->
+ S = lists:sort(A),
+ case lists:sort(B) of
+ S ->
+ ok;
+ _ ->
+ erlang:error({not_equal_sets, A, B})
+ end.
+
run_dist_configs(Func, Config) ->
GetOptProlog = "-proto_dist gen_tcp -gen_tcp_dist_output_loop "
++ atom_to_list(?MODULE) ++ " ",
--
2.31.1