summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/gm_tests.erl30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/gm_tests.erl b/src/gm_tests.erl
index 8724415326..65e9cff041 100644
--- a/src/gm_tests.erl
+++ b/src/gm_tests.erl
@@ -20,6 +20,7 @@
test_broadcast/0,
test_confirmed_broadcast/0,
test_member_death/0,
+ test_receive_in_order/0,
all_tests/0]).
-export([joined/2, members_changed/3, handle_msg/3, terminate/2]).
@@ -60,6 +61,7 @@ all_tests() ->
passed = test_broadcast(),
passed = test_confirmed_broadcast(),
passed = test_member_death(),
+ passed = test_receive_in_order(),
passed.
test_join_leave() ->
@@ -83,6 +85,8 @@ test_member_death() ->
unlink(Pid3),
exit(Pid3, kill),
+ %% Have to do some broadcasts to ensure that all members
+ %% find out about the death.
passed = (test_broadcast_fun(fun gm:confirmed_broadcast/2))(
Pid, Pid2),
@@ -92,6 +96,23 @@ test_member_death() ->
passed
end).
+test_receive_in_order() ->
+ with_two_members(
+ fun (Pid, Pid2) ->
+ Numbers = lists:seq(1,1000),
+ [begin ok = gm:broadcast(Pid, N), ok = gm:broadcast(Pid2, N) end
+ || N <- Numbers],
+ passed = receive_numbers(
+ Pid, Pid, {timeout_for_msgs, Pid, Pid}, Numbers),
+ passed = receive_numbers(
+ Pid, Pid2, {timeout_for_msgs, Pid, Pid2}, Numbers),
+ passed = receive_numbers(
+ Pid2, Pid, {timeout_for_msgs, Pid2, Pid}, Numbers),
+ passed = receive_numbers(
+ Pid2, Pid2, {timeout_for_msgs, Pid2, Pid2}, Numbers),
+ passed
+ end).
+
test_broadcast(Fun) ->
with_two_members(test_broadcast_fun(Fun)).
@@ -112,7 +133,6 @@ with_two_members(Fun) ->
{ok, Pid2} = gm:start_link(?MODULE, ?MODULE, self()),
passed = receive_joined(Pid2, [Pid, Pid2], timeout_joining_gm_group_2),
-
passed = receive_birth(Pid, Pid2, timeout_waiting_for_birth_2),
passed = Fun(Pid, Pid2),
@@ -152,3 +172,11 @@ receive_termination(From, Reason, Error) ->
?RECEIVE_OR_THROW({termination, From, Reason1},
Reason == Reason1,
Error).
+
+receive_numbers(_Pid, _Sender, _Error, []) ->
+ passed;
+receive_numbers(Pid, Sender, Error, [N | Numbers]) ->
+ ?RECEIVE_OR_THROW({msg, Pid, Sender, M},
+ M == N,
+ Error),
+ receive_numbers(Pid, Sender, Error, Numbers).