summaryrefslogtreecommitdiff
path: root/src/rabbit_tests.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/rabbit_tests.erl')
-rw-r--r--src/rabbit_tests.erl113
1 files changed, 112 insertions, 1 deletions
diff --git a/src/rabbit_tests.erl b/src/rabbit_tests.erl
index d645d183..5ed7d64c 100644
--- a/src/rabbit_tests.erl
+++ b/src/rabbit_tests.erl
@@ -61,7 +61,32 @@ all_tests() ->
passed = test_cluster_management(),
passed = test_user_management(),
passed = test_server_status(),
- passed = test_hooks(),
+ passed = maybe_run_cluster_dependent_tests(),
+ passed.
+
+
+maybe_run_cluster_dependent_tests() ->
+ SecondaryNode = rabbit_misc:makenode("hare"),
+
+ case net_adm:ping(SecondaryNode) of
+ pong -> passed = run_cluster_dependent_tests(SecondaryNode);
+ pang -> io:format("Skipping cluster dependent tests with node ~p~n",
+ [SecondaryNode])
+ end,
+ passed.
+
+run_cluster_dependent_tests(SecondaryNode) ->
+ SecondaryNodeS = atom_to_list(SecondaryNode),
+
+ ok = control_action(stop_app, []),
+ ok = control_action(reset, []),
+ ok = control_action(cluster, [SecondaryNodeS]),
+ ok = control_action(start_app, []),
+
+ io:format("Running cluster dependent tests with node ~p~n", [SecondaryNode]),
+ passed = test_delegates_async(SecondaryNode),
+ passed = test_delegates_sync(SecondaryNode),
+
passed.
test_priority_queue() ->
@@ -815,6 +840,92 @@ test_hooks() ->
end,
passed.
+test_delegates_async(SecondaryNode) ->
+ Self = self(),
+ Sender = fun(Pid) -> Pid ! {invoked, Self} end,
+
+ Responder = make_responder(fun({invoked, Pid}) -> Pid ! response end),
+
+ ok = delegate:cast(spawn(Responder), Sender),
+ ok = delegate:cast(spawn(SecondaryNode, Responder), Sender),
+ await_response(2),
+
+ LocalPids = spawn_responders(node(), Responder, 10),
+ RemotePids = spawn_responders(SecondaryNode, Responder, 10),
+ ok = delegate:cast(LocalPids ++ RemotePids, Sender),
+ await_response(20),
+
+ passed.
+
+make_responder(FMsg) ->
+ fun() ->
+ receive
+ Msg ->
+ FMsg(Msg)
+ after 100 ->
+ throw(timeout)
+ end
+ end.
+
+spawn_responders(Node, Responder, Count) ->
+ [spawn(Node, Responder) || _ <- lists:seq(1, Count)].
+
+await_response(0) ->
+ ok;
+
+await_response(Count) ->
+ receive
+ response -> ok,
+ await_response(Count - 1)
+ after 100 ->
+ io:format("Async reply not received~n"),
+ throw(timeout)
+ end.
+
+test_delegates_sync(SecondaryNode) ->
+ Sender = fun(Pid) ->
+ gen_server2:call(Pid, invoked)
+ end,
+
+ Responder = make_responder(fun({'$gen_call', From, invoked}) ->
+ gen_server2:reply(From, response)
+ end),
+
+ BadResponder = make_responder(fun({'$gen_call', _From, invoked}) ->
+ throw(exception)
+ end),
+
+ {ok, response} = delegate:call(spawn(Responder), Sender),
+ {ok, response} = delegate:call(spawn(SecondaryNode, Responder), Sender),
+
+ {error, _} = delegate:call(spawn(BadResponder), Sender),
+ {error, _} = delegate:call(spawn(SecondaryNode, BadResponder), Sender),
+
+ LocalGoodPids = spawn_responders(node(), Responder, 2),
+ RemoteGoodPids = spawn_responders(SecondaryNode, Responder, 2),
+ LocalBadPids = spawn_responders(node(), BadResponder, 2),
+ RemoteBadPids = spawn_responders(SecondaryNode, BadResponder, 2),
+
+ GoodRes = delegate:call(LocalGoodPids ++ RemoteGoodPids, Sender),
+ [{ok, response, _}, {ok, response, _},
+ {ok, response, _}, {ok, response, _}] = GoodRes,
+
+ BadRes = delegate:call(LocalBadPids ++ RemoteBadPids, Sender),
+ [{error, _, _}, {error, _, _},
+ {error, _, _}, {error, _, _}] = BadRes,
+
+ GoodResPids = [Pid || {_, _, Pid} <- GoodRes],
+ BadResPids = [Pid || {_, _, Pid} <- BadRes],
+
+ Good = ordsets:from_list(LocalGoodPids ++ RemoteGoodPids),
+ Good = ordsets:from_list(GoodResPids),
+
+ Bad = ordsets:from_list(LocalBadPids ++ RemoteBadPids),
+ Bad = ordsets:from_list(BadResPids),
+
+ passed.
+
+
%---------------------------------------------------------------------
control_action(Command, Args) -> control_action(Command, node(), Args).