Browse Source

Improve tests stability.

Roberto Ostinelli 3 years ago
parent
commit
5a3c71535a
4 changed files with 78 additions and 88 deletions
  1. 5 0
      src/syn_pg.erl
  2. 19 27
      test/syn_pg_SUITE.erl
  3. 13 34
      test/syn_registry_SUITE.erl
  4. 41 27
      test/syn_test_suite_helper.erl

+ 5 - 0
src/syn_pg.erl

@@ -54,6 +54,11 @@
 %% internal
 -export([multi_call_and_receive/5]).
 
+%% tests
+-ifdef(TEST).
+-export([add_to_local_table/7]).
+-endif.
+
 %% includes
 -include("syn.hrl").
 

+ 19 - 27
test/syn_pg_SUITE.erl

@@ -1110,7 +1110,6 @@ three_nodes_custom_event_handler_joined_left(Config) ->
         {on_process_joined, SlaveNode1, scope_all, "my-group", Pid, <<"meta">>, normal},
         {on_process_joined, SlaveNode2, scope_all, "my-group", Pid, <<"meta">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% join from another node
     ok = rpc:call(SlaveNode1, syn, join, [scope_all, "my-group", Pid2, {recipient, self(), <<"meta-for-2">>}]),
@@ -1121,7 +1120,6 @@ three_nodes_custom_event_handler_joined_left(Config) ->
         {on_process_joined, SlaveNode1, scope_all, "my-group", Pid2, <<"meta-for-2">>, normal},
         {on_process_joined, SlaveNode2, scope_all, "my-group", Pid2, <<"meta-for-2">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> on meta update
     ok = syn:join(scope_all, "my-group", Pid, {recipient, self(), <<"new-meta-0">>}),
@@ -1132,7 +1130,6 @@ three_nodes_custom_event_handler_joined_left(Config) ->
         {on_group_process_updated, SlaveNode1, scope_all, "my-group", Pid, <<"new-meta-0">>, normal},
         {on_group_process_updated, SlaveNode2, scope_all, "my-group", Pid, <<"new-meta-0">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% update meta from another node
     ok = rpc:call(SlaveNode1, syn, join, [scope_all, "my-group", Pid, {recipient, self(), <<"new-meta">>}]),
@@ -1143,7 +1140,6 @@ three_nodes_custom_event_handler_joined_left(Config) ->
         {on_group_process_updated, SlaveNode1, scope_all, "my-group", Pid, <<"new-meta">>, normal},
         {on_group_process_updated, SlaveNode2, scope_all, "my-group", Pid, <<"new-meta">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> on left
     ok = syn:leave(scope_all, "my-group", Pid),
@@ -1154,7 +1150,6 @@ three_nodes_custom_event_handler_joined_left(Config) ->
         {on_process_left, SlaveNode1, scope_all, "my-group", Pid, <<"new-meta">>, normal},
         {on_process_left, SlaveNode2, scope_all, "my-group", Pid, <<"new-meta">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% leave from another node
     ok = rpc:call(SlaveNode1, syn, leave, [scope_all, "my-group", Pid2]),
@@ -1165,11 +1160,10 @@ three_nodes_custom_event_handler_joined_left(Config) ->
         {on_process_left, SlaveNode1, scope_all, "my-group", Pid2, <<"meta-for-2">>, normal},
         {on_process_left, SlaveNode2, scope_all, "my-group", Pid2, <<"meta-for-2">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% clean & check (no callbacks since process has left)
     syn_test_suite_helper:kill_process(Pid),
-    syn_test_suite_helper:assert_empty_queue(self()),
+    syn_test_suite_helper:assert_empty_queue(),
 
     %% ---> after a netsplit
     PidRemoteOn1 = syn_test_suite_helper:start_process(SlaveNode1),
@@ -1181,7 +1175,6 @@ three_nodes_custom_event_handler_joined_left(Config) ->
         {on_process_joined, SlaveNode1, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal},
         {on_process_joined, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% partial netsplit (1 cannot see 2)
     rpc:call(SlaveNode1, syn_test_suite_helper, disconnect_node, [SlaveNode2]),
@@ -1193,7 +1186,6 @@ three_nodes_custom_event_handler_joined_left(Config) ->
     syn_test_suite_helper:assert_received_messages([
         {on_process_left, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, {syn_remote_scope_node_down, scope_all, SlaveNode1}}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> after a re-join
     %% re-join
@@ -1206,7 +1198,6 @@ three_nodes_custom_event_handler_joined_left(Config) ->
     syn_test_suite_helper:assert_received_messages([
         {on_process_joined, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, {syn_remote_scope_node_up, scope_all, SlaveNode1}}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% clean
     syn_test_suite_helper:kill_process(PidRemoteOn1),
@@ -1217,7 +1208,6 @@ three_nodes_custom_event_handler_joined_left(Config) ->
         {on_process_left, SlaveNode1, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed},
         {on_process_left, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> don't call on monitor rebuild
     %% crash the scope process on local
@@ -1225,10 +1215,7 @@ three_nodes_custom_event_handler_joined_left(Config) ->
     syn_test_suite_helper:wait_process_name_ready(syn_pg_scope_all),
 
     %% no messages
-    syn_test_suite_helper:assert_wait(
-        ok,
-        fun() -> syn_test_suite_helper:assert_empty_queue(self()) end
-    ),
+    syn_test_suite_helper:assert_empty_queue(),
 
     %% ---> call if process died during the scope process crash
     TransientPid = syn_test_suite_helper:start_process(),
@@ -1240,19 +1227,20 @@ three_nodes_custom_event_handler_joined_left(Config) ->
         {on_process_joined, SlaveNode1, scope_all, "transient-group", TransientPid, "transient-meta", normal},
         {on_process_joined, SlaveNode2, scope_all, "transient-group", TransientPid, "transient-meta", normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
-    %% crash the scope process & transient process on local
+    %% crash the scope process & fake a died process on local
+    InvalidPid = list_to_pid("<0.9999.0>"),
+    add_to_local_table(scope_all, "invalid-group", InvalidPid, {recipient, self(), "invalid-meta"}, 0, undefined),
     syn_test_suite_helper:kill_process(syn_pg_scope_all),
-    syn_test_suite_helper:kill_process(TransientPid),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_left, LocalNode, scope_all, "transient-group", TransientPid, "transient-meta", undefined},
+        {on_process_left, LocalNode, scope_all, "invalid-group", InvalidPid, "invalid-meta", undefined},
         {on_process_left, SlaveNode1, scope_all, "transient-group", TransientPid, "transient-meta", {syn_remote_scope_node_down, scope_all, LocalNode}},
-        {on_process_left, SlaveNode2, scope_all, "transient-group", TransientPid, "transient-meta", {syn_remote_scope_node_down, scope_all, LocalNode}}
-    ]),
-    syn_test_suite_helper:assert_empty_queue(self()).
+        {on_process_left, SlaveNode2, scope_all, "transient-group", TransientPid, "transient-meta", {syn_remote_scope_node_down, scope_all, LocalNode}},
+        {on_process_joined, SlaveNode1, scope_all, "transient-group", TransientPid, "transient-meta", {syn_remote_scope_node_up, scope_all, LocalNode}},
+        {on_process_joined, SlaveNode2, scope_all, "transient-group", TransientPid, "transient-meta", {syn_remote_scope_node_up, scope_all, LocalNode}}
+    ]).
 
 three_nodes_publish(Config) ->
     %% get slaves
@@ -1293,7 +1281,6 @@ three_nodes_publish(Config) ->
         {done, Pid},
         {done, PidRemoteOn1}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% errors
     {'EXIT', {{invalid_scope, scope_bc}, _}} = (catch syn:publish(scope_bc, <<"subscribers">>, TestMessage)),
@@ -1305,11 +1292,11 @@ three_nodes_publish(Config) ->
         {done, PidRemoteOn1},
         {done, PidRemoteOn2}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% non-existant
     {ok, 0} = syn:publish(scope_ab, <<"non-existant">>, TestMessage),
-    syn_test_suite_helper:assert_empty_queue(self()),
+    %% no messages
+    syn_test_suite_helper:assert_empty_queue(),
 
     %% ---> publish local
     {ok, 1} = syn:local_publish(scope_ab, <<"subscribers">>, test_message),
@@ -1317,11 +1304,11 @@ three_nodes_publish(Config) ->
     syn_test_suite_helper:assert_received_messages([
         {done, Pid}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% non-existant
     {ok, 0} = syn:local_publish(scope_ab, <<"non-existant">>, TestMessage),
-    syn_test_suite_helper:assert_empty_queue(self()).
+    %% no messages
+    syn_test_suite_helper:assert_empty_queue().
 
 three_nodes_multi_call(Config) ->
     %% get slaves
@@ -1717,6 +1704,11 @@ four_nodes_concurrency(Config) ->
 %% ===================================================================
 %% Internal
 %% ===================================================================
+add_to_local_table(Scope, GroupName, Pid, Meta, Time, MRef) ->
+    TableByName = syn_backbone:get_table_name(syn_pg_by_name, Scope),
+    TableByPid = syn_backbone:get_table_name(syn_pg_by_pid, Scope),
+    syn_pg:add_to_local_table(GroupName, Pid, Meta, Time, MRef, TableByName, TableByPid).
+
 subscriber_loop(TestPid, TestMessage) ->
     receive
         TestMessage ->

+ 13 - 34
test/syn_registry_SUITE.erl

@@ -910,8 +910,8 @@ three_nodes_cluster_conflicts(Config) ->
         {PidOnMaster, "meta-1"},
         fun() -> rpc:call(SlaveNode2, syn, lookup, [scope_all, <<"my proc">>]) end
     ).
-%% NB: we can't check for process alive here because we injected the conflicting process in the DB
-%% -> it's not actually monitored
+    %% NB: we can't check for process alive here because we injected the conflicting process in the DB
+    %% -> it's not actually monitored
 
 three_nodes_custom_event_handler_reg_unreg(Config) ->
     %% get slaves
@@ -949,7 +949,6 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
         {on_process_registered, SlaveNode1, scope_all, "proc-handler", Pid, <<"meta">>, normal},
         {on_process_registered, SlaveNode2, scope_all, "proc-handler", Pid, <<"meta">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% registration from another node
     ok = rpc:call(SlaveNode1, syn, register, [scope_all, "proc-handler-2", Pid2, {recipient, self(), <<"meta-for-2">>}]),
@@ -960,7 +959,6 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
         {on_process_registered, SlaveNode1, scope_all, "proc-handler-2", Pid2, <<"meta-for-2">>, normal},
         {on_process_registered, SlaveNode2, scope_all, "proc-handler-2", Pid2, <<"meta-for-2">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> on meta update
     ok = syn:register(scope_all, "proc-handler", Pid, {recipient, self(), <<"new-meta">>}),
@@ -971,7 +969,6 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
         {on_registry_process_updated, SlaveNode1, scope_all, "proc-handler", Pid, <<"new-meta">>, normal},
         {on_registry_process_updated, SlaveNode2, scope_all, "proc-handler", Pid, <<"new-meta">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% meta update from another node
     ok = rpc:call(SlaveNode1, syn, register, [scope_all, "proc-handler-2", Pid2, {recipient, self(), <<"meta-for-2-update">>}]),
@@ -982,7 +979,6 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
         {on_registry_process_updated, SlaveNode1, scope_all, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal},
         {on_registry_process_updated, SlaveNode2, scope_all, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> on unregister
     ok = syn:unregister(scope_all, "proc-handler"),
@@ -993,7 +989,6 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
         {on_process_unregistered, SlaveNode1, scope_all, "proc-handler", Pid, <<"new-meta">>, normal},
         {on_process_unregistered, SlaveNode2, scope_all, "proc-handler", Pid, <<"new-meta">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% unregister from another node
     ok = rpc:call(SlaveNode1, syn, unregister, [scope_all, "proc-handler-2"]),
@@ -1004,11 +999,11 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
         {on_process_unregistered, SlaveNode1, scope_all, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal},
         {on_process_unregistered, SlaveNode2, scope_all, "proc-handler-2", Pid2, <<"meta-for-2-update">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% clean & check
     syn_test_suite_helper:kill_process(Pid),
-    syn_test_suite_helper:assert_empty_queue(self()),
+    %% no messages
+    syn_test_suite_helper:assert_empty_queue(),
 
     %% ---> after a netsplit
     PidRemoteOn1 = syn_test_suite_helper:start_process(SlaveNode1),
@@ -1020,7 +1015,6 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
         {on_process_registered, SlaveNode1, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal},
         {on_process_registered, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% partial netsplit (1 cannot see 2)
     rpc:call(SlaveNode1, syn_test_suite_helper, disconnect_node, [SlaveNode2]),
@@ -1032,7 +1026,6 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
     syn_test_suite_helper:assert_received_messages([
         {on_process_unregistered, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, {syn_remote_scope_node_down, scope_all, SlaveNode1}}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> after a re-join
     %% re-join
@@ -1045,7 +1038,6 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
     syn_test_suite_helper:assert_received_messages([
         {on_process_registered, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, {syn_remote_scope_node_up, scope_all, SlaveNode1}}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% clean
     syn_test_suite_helper:kill_process(PidRemoteOn1),
@@ -1056,7 +1048,6 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
         {on_process_unregistered, SlaveNode1, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed},
         {on_process_unregistered, SlaveNode2, scope_all, remote_on_1, PidRemoteOn1, <<"netsplit">>, killed}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> after a conflict resolution
     %% partial netsplit (1 cannot see 2)
@@ -1080,7 +1071,6 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
         {on_process_registered, SlaveNode1, scope_all, "proc-confict", Pid2RemoteOn1, <<"meta-1">>, normal},
         {on_process_registered, SlaveNode2, scope_all, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% re-join
     rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
@@ -1093,7 +1083,6 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
         {on_process_unregistered, SlaveNode1, scope_all, "proc-confict", Pid2RemoteOn1, <<"meta-1">>, syn_conflict_resolution},
         {on_process_registered, SlaveNode1, scope_all, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, syn_conflict_resolution}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% kill
     syn_test_suite_helper:kill_process(Pid2RemoteOn1),
@@ -1105,7 +1094,6 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
         {on_process_unregistered, SlaveNode1, scope_all, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, killed},
         {on_process_unregistered, SlaveNode2, scope_all, "proc-confict", Pid2RemoteOn2, <<"meta-2">>, killed}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% ---> don't call on monitor rebuild
     %% crash the scope process on local
@@ -1113,10 +1101,7 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
     syn_test_suite_helper:wait_process_name_ready(syn_registry_scope_all),
 
     %% no messages
-    syn_test_suite_helper:assert_wait(
-        ok,
-        fun() -> syn_test_suite_helper:assert_empty_queue(self()) end
-    ),
+    syn_test_suite_helper:assert_empty_queue(),
 
     %% ---> call if process died during the scope process crash
     TransientPid = syn_test_suite_helper:start_process(),
@@ -1128,19 +1113,20 @@ three_nodes_custom_event_handler_reg_unreg(Config) ->
         {on_process_registered, SlaveNode1, scope_all, "transient-pid", TransientPid, "transient-meta", normal},
         {on_process_registered, SlaveNode2, scope_all, "transient-pid", TransientPid, "transient-meta", normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
-    %% crash the scope process & transient process on local
+    %% crash the scope process & fake a died process on local
+    InvalidPid = list_to_pid("<0.9999.0>"),
+    add_to_local_table(scope_all, "invalid-pid", InvalidPid, {recipient, self(), "invalid-meta"}, 0, undefined),
     syn_test_suite_helper:kill_process(syn_registry_scope_all),
-    syn_test_suite_helper:kill_process(TransientPid),
 
     %% check callbacks called
     syn_test_suite_helper:assert_received_messages([
-        {on_process_unregistered, LocalNode, scope_all, "transient-pid", TransientPid, "transient-meta", undefined},
+        {on_process_unregistered, LocalNode, scope_all, "invalid-pid", InvalidPid, "invalid-meta", undefined},
         {on_process_unregistered, SlaveNode1, scope_all, "transient-pid", TransientPid, "transient-meta", {syn_remote_scope_node_down, scope_all, LocalNode}},
-        {on_process_unregistered, SlaveNode2, scope_all, "transient-pid", TransientPid, "transient-meta", {syn_remote_scope_node_down, scope_all, LocalNode}}
-    ]),
-    syn_test_suite_helper:assert_empty_queue(self()).
+        {on_process_unregistered, SlaveNode2, scope_all, "transient-pid", TransientPid, "transient-meta", {syn_remote_scope_node_down, scope_all, LocalNode}},
+        {on_process_registered, SlaveNode1, scope_all, "transient-pid", TransientPid, "transient-meta", {syn_remote_scope_node_up, scope_all, LocalNode}},
+        {on_process_registered, SlaveNode2, scope_all, "transient-pid", TransientPid, "transient-meta", {syn_remote_scope_node_up, scope_all, LocalNode}}
+    ]).
 
 three_nodes_custom_event_handler_conflict_resolution(Config) ->
     %% get slaves
@@ -1193,7 +1179,6 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
         {on_process_registered, SlaveNode1, scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, keepthis, normal},
         {on_process_registered, SlaveNode2, scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn2, "meta-2", normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% re-join
     rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
@@ -1252,7 +1237,6 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
         {on_process_unregistered, SlaveNode2, scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn2, "meta-2", syn_conflict_resolution},
         {on_process_registered, SlaveNode2, scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, keepthis, syn_conflict_resolution}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% process alive (discarded process does not get killed with a custom handler)
     syn_test_suite_helper:assert_wait(
@@ -1298,7 +1282,6 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
         {on_process_unregistered, SlaveNode1, scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, keepthis, normal},
         {on_process_unregistered, SlaveNode2, scope_bc, "proc-confict-by-netsplit-scoped-custom", PidOn1, keepthis, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% --> conflict by netsplit, which returns invalid pid
     %% partial netsplit (1 cannot see 2)
@@ -1320,7 +1303,6 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
         {on_process_registered, SlaveNode1, scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn1, "meta-1", normal},
         {on_process_registered, SlaveNode2, scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn2, "meta-2", normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% re-join
     rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
@@ -1360,7 +1342,6 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
         {on_process_unregistered, SlaveNode1, scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn1, "meta-1", syn_conflict_resolution},
         {on_process_unregistered, SlaveNode2, scope_all, "proc-confict-by-netsplit-custom-other-pid", PidOn2, "meta-2", syn_conflict_resolution}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% process alive (discarded process does not get killed with a custom handler)
     syn_test_suite_helper:assert_wait(
@@ -1393,7 +1374,6 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
         {on_process_registered, SlaveNode1, scope_all, "proc-confict-by-netsplit-custom-crash", PidOn1, crash, normal},
         {on_process_registered, SlaveNode2, scope_all, "proc-confict-by-netsplit-custom-crash", PidOn2, crash, normal}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% re-join
     rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
@@ -1433,7 +1413,6 @@ three_nodes_custom_event_handler_conflict_resolution(Config) ->
         {on_process_unregistered, SlaveNode1, scope_all, "proc-confict-by-netsplit-custom-crash", PidOn1, crash, syn_conflict_resolution},
         {on_process_unregistered, SlaveNode2, scope_all, "proc-confict-by-netsplit-custom-crash", PidOn2, crash, syn_conflict_resolution}
     ]),
-    syn_test_suite_helper:assert_empty_queue(self()),
 
     %% process alive (discarded process does not get killed with a custom handler)
     syn_test_suite_helper:assert_wait(

+ 41 - 27
test/syn_test_suite_helper.erl

@@ -38,7 +38,7 @@
 -export([assert_cluster/2]).
 -export([assert_registry_scope_subcluster/3, assert_pg_scope_subcluster/3]).
 -export([assert_received_messages/1]).
--export([assert_empty_queue/1]).
+-export([assert_empty_queue/0]).
 -export([assert_wait/2]).
 -export([send_error_logger_to_disk/0]).
 
@@ -46,7 +46,8 @@
 -export([process_main/0]).
 
 %% macro
--define(TIMEOUT, 5000).
+-define(DEFAULT_WAIT_TIMEOUT, 5000).
+-define(UNEXPECTED_MESSAGES_WAIT_TIMEOUT, 1000).
 
 %% ===================================================================
 %% API
@@ -123,7 +124,9 @@ clean_after_test() ->
         %% close syn
         rpc:call(Node, application, stop, [syn]),
         %% clean env
-        rpc:call(Node, application, unset_env, [syn, event_handler])
+        rpc:call(Node, application, unset_env, [syn, event_handler]),
+        %% messages
+        flush_inbox()
     end, Nodes).
 
 start_process() ->
@@ -151,7 +154,7 @@ kill_process(Pid) when is_pid(Pid) ->
             exit(Pid, kill),
             receive
                 {'DOWN', MRef, process, Pid, _Reason} -> ok
-            after ?TIMEOUT ->
+            after ?DEFAULT_WAIT_TIMEOUT ->
                 ct:fail("~n\tCould not kill process ~p~n", [Pid])
             end;
 
@@ -173,7 +176,7 @@ wait_cluster_mesh_connected(Nodes, StartAt) ->
             ok;
 
         false ->
-            case os:system_time(millisecond) - StartAt > ?TIMEOUT of
+            case os:system_time(millisecond) - StartAt > ?DEFAULT_WAIT_TIMEOUT of
                 true ->
                     {error, {could_not_init_cluster, Nodes}};
 
@@ -189,7 +192,7 @@ wait_process_name_ready(Name, StartAt) ->
     timer:sleep(50),
     case whereis(Name) of
         undefined ->
-            case os:system_time(millisecond) - StartAt > ?TIMEOUT of
+            case os:system_time(millisecond) - StartAt > ?DEFAULT_WAIT_TIMEOUT of
                 true ->
                     ct:fail("~n\tProcess with name ~p didn't come alive~n", [Name]);
 
@@ -204,7 +207,7 @@ wait_process_name_ready(Name, StartAt) ->
                     ok;
 
                 Other ->
-                    case os:system_time(millisecond) - StartAt > ?TIMEOUT of
+                    case os:system_time(millisecond) - StartAt > ?DEFAULT_WAIT_TIMEOUT of
                         true ->
                             ct:fail("~n\tProcess with name ~p didn't come ready~n\tStatus: ~p~n", [Name, Other]);
 
@@ -242,7 +245,7 @@ assert_pg_scope_subcluster(Node, Scope, ExpectedNodes) ->
 assert_received_messages(Messages) ->
     assert_received_messages(Messages, []).
 assert_received_messages([], UnexpectedMessages) ->
-    do_assert_received_messages([], UnexpectedMessages);
+    assert_received_messages_wait([], UnexpectedMessages);
 assert_received_messages(Messages, UnexpectedMessages) ->
     receive
         Message ->
@@ -254,18 +257,36 @@ assert_received_messages(Messages, UnexpectedMessages) ->
                 false ->
                     assert_received_messages(Messages, [Message | UnexpectedMessages])
             end
-    after ?TIMEOUT ->
-        do_assert_received_messages(Messages, UnexpectedMessages)
+    after ?DEFAULT_WAIT_TIMEOUT ->
+        assert_received_messages_evaluate(Messages, UnexpectedMessages)
     end.
 
-assert_empty_queue(Pid) when is_pid(Pid) ->
-    case process_info(Pid, message_queue_len) of
-        {message_queue_len, 0} ->
-            ok;
+assert_received_messages_wait(MissingMessages, UnexpectedMessages) ->
+    receive
+        Message ->
+            assert_received_messages_wait(MissingMessages, [Message | UnexpectedMessages])
+    after ?UNEXPECTED_MESSAGES_WAIT_TIMEOUT ->
+        assert_received_messages_evaluate(MissingMessages, UnexpectedMessages)
+    end.
 
-        _ ->
-            {messages, Messages} = process_info(Pid, messages),
-            ct:fail("~n\tMessage queue was not empty, got:~n\t~p~n", [Messages])
+assert_received_messages_evaluate([], []) ->
+    ok;
+assert_received_messages_evaluate(MissingMessages, UnexpectedMessages) ->
+    ct:fail("~n\tReceive messages error (line ~p)~n\tMissing: ~p~n\tUnexpected: ~p~n",
+        [get_line_from_stacktrace(), lists:reverse(MissingMessages), lists:reverse(UnexpectedMessages)]
+    ).
+
+assert_empty_queue() ->
+    assert_empty_queue([]).
+assert_empty_queue(UnexpectedMessages) ->
+    receive
+        Message ->
+            assert_empty_queue([Message | UnexpectedMessages])
+    after ?UNEXPECTED_MESSAGES_WAIT_TIMEOUT ->
+        case UnexpectedMessages of
+            [] -> ok;
+            _ -> ct:fail("~n\tMessage queue was not empty, got:~n\t~p~n", [UnexpectedMessages])
+        end
     end.
 
 assert_wait(ExpectedResult, Fun) ->
@@ -276,7 +297,7 @@ assert_wait(ExpectedResult, Fun, StartAt) ->
             ok;
 
         Result ->
-            case os:system_time(millisecond) - StartAt > ?TIMEOUT of
+            case os:system_time(millisecond) - StartAt > ?DEFAULT_WAIT_TIMEOUT of
                 true ->
                     ct:fail("~n\tExpected: ~p~n\tActual: ~p~n", [ExpectedResult, Result]);
 
@@ -318,7 +339,7 @@ do_assert_cluster(Nodes, ExpectedNodes, StartAt) ->
                     ok;
 
                 _ ->
-                    case os:system_time(millisecond) - StartAt > ?TIMEOUT of
+                    case os:system_time(millisecond) - StartAt > ?DEFAULT_WAIT_TIMEOUT of
                         true ->
                             ct:fail("~n\tInvalid subcluster~n\tExpected: ~p~n\tActual: ~p~n\tLine: ~p~n",
                                 [ExpectedNodes, Nodes, get_line_from_stacktrace()]
@@ -331,7 +352,7 @@ do_assert_cluster(Nodes, ExpectedNodes, StartAt) ->
             end;
 
         _ ->
-            case os:system_time(millisecond) - StartAt > ?TIMEOUT of
+            case os:system_time(millisecond) - StartAt > ?DEFAULT_WAIT_TIMEOUT of
                 true ->
                     ct:fail("~n\tInvalid subcluster~n\tExpected: ~p~n\tActual: ~p~n\tLine: ~p~n",
                         [ExpectedNodes, Nodes, get_line_from_stacktrace()]
@@ -343,13 +364,6 @@ do_assert_cluster(Nodes, ExpectedNodes, StartAt) ->
             end
     end.
 
-do_assert_received_messages([], []) ->
-    ok;
-do_assert_received_messages(MissingMessages, UnexpectedMessages) ->
-    ct:fail("~n\tReceive messages error~n\tMissing: ~p~n\tUnexpected: ~p~n",
-        [lists:reverse(MissingMessages), lists:reverse(UnexpectedMessages)]
-    ).
-
 flush_inbox() ->
     receive
         _ -> flush_inbox()