diff options
Diffstat (limited to 'src/rabbit_tests.erl')
-rw-r--r-- | src/rabbit_tests.erl | 113 |
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). |