Roberto Ostinelli 3 лет назад
Родитель
Сommit
41ea1c4f3f
4 измененных файлов с 250 добавлено и 2 удалено
  1. 18 0
      src/syn.erl
  2. 36 0
      src/syn_groups.erl
  3. 194 0
      test/syn_groups_SUITE.erl
  4. 2 2
      test/syn_registry_SUITE.erl

+ 18 - 0
src/syn.erl

@@ -39,7 +39,9 @@
 -export([register_name/2, unregister_name/1, whereis_name/1, send/2]).
 %% groups
 -export([get_members/1, get_members/2]).
+-export([is_member/2, is_member/3]).
 -export([get_local_members/1, get_local_members/2]).
+-export([is_local_member/2, is_local_member/3]).
 -export([join/2, join/3, join/4]).
 -export([leave/2, leave/3]).
 -export([groups_count/1, groups_count/2]).
@@ -153,6 +155,14 @@ get_members(GroupName) ->
 get_members(Scope, GroupName) ->
     syn_groups:get_members(Scope, GroupName).
 
+-spec is_member(GroupName :: any(), Pid :: pid()) -> boolean().
+is_member(GroupName, Pid) ->
+    syn_groups:is_member(GroupName, Pid).
+
+-spec is_member(Scope :: atom(), GroupName :: any(), Pid :: pid()) -> boolean().
+is_member(Scope, GroupName, Pid) ->
+    syn_groups:is_member(Scope, GroupName, Pid).
+
 -spec get_local_members(GroupName :: term()) -> [{Pid :: pid(), Meta :: term()}].
 get_local_members(GroupName) ->
     syn_groups:get_local_members(GroupName).
@@ -161,6 +171,14 @@ get_local_members(GroupName) ->
 get_local_members(Scope, GroupName) ->
     syn_groups:get_local_members(Scope, GroupName).
 
+-spec is_local_member(GroupName :: any(), Pid :: pid()) -> boolean().
+is_local_member(GroupName, Pid) ->
+    syn_groups:is_local_member(GroupName, Pid).
+
+-spec is_local_member(Scope :: atom(), GroupName :: any(), Pid :: pid()) -> boolean().
+is_local_member(Scope, GroupName, Pid) ->
+    syn_groups:is_local_member(Scope, GroupName, Pid).
+
 -spec join(GroupName :: any(), Pid :: pid()) -> ok | {error, Reason :: any()}.
 join(GroupName, Pid) ->
     syn_groups:join(GroupName, Pid).

+ 36 - 0
src/syn_groups.erl

@@ -32,7 +32,9 @@
 -export([join/2, join/3, join/4]).
 -export([leave/2, leave/3]).
 -export([get_members/1, get_members/2]).
+-export([is_member/2, is_member/3]).
 -export([get_local_members/1, get_local_members/2]).
+-export([is_local_member/2, is_local_member/3]).
 -export([count/1, count/2]).
 
 %% syn_gen_scope callbacks
@@ -68,6 +70,23 @@ get_members(GroupName) ->
 get_members(Scope, GroupName) ->
     do_get_members(Scope, GroupName, '_').
 
+-spec is_member(GroupName :: any(), Pid :: pid()) -> boolean().
+is_member(GroupName, Pid) ->
+    is_member(default, GroupName, Pid).
+
+-spec is_member(Scope :: atom(), GroupName :: any(), Pid :: pid()) -> boolean().
+is_member(Scope, GroupName, Pid) ->
+    case syn_backbone:get_table_name(syn_groups_by_name, Scope) of
+        undefined ->
+            error({invalid_scope, Scope});
+
+        TableByName ->
+            case find_groups_entry_by_name_and_pid(GroupName, Pid, TableByName) of
+                undefined -> false;
+                _ -> true
+            end
+    end.
+
 -spec get_local_members(GroupName :: term()) -> [{Pid :: pid(), Meta :: term()}].
 get_local_members(GroupName) ->
     get_local_members(default, GroupName).
@@ -90,6 +109,23 @@ do_get_members(Scope, GroupName, NodeParam) ->
             }])
     end.
 
+-spec is_local_member(GroupName :: any(), Pid :: pid()) -> boolean().
+is_local_member(GroupName, Pid) ->
+    is_local_member(default, GroupName, Pid).
+
+-spec is_local_member(Scope :: atom(), GroupName :: any(), Pid :: pid()) -> boolean().
+is_local_member(Scope, GroupName, Pid) ->
+    case syn_backbone:get_table_name(syn_groups_by_name, Scope) of
+        undefined ->
+            error({invalid_scope, Scope});
+
+        TableByName ->
+            case find_groups_entry_by_name_and_pid(GroupName, Pid, TableByName) of
+                {{_, _}, _, _, _, Node} when Node =:= node() -> true;
+                _ -> false
+            end
+    end.
+
 -spec join(GroupName :: term(), Pid :: pid()) -> ok.
 join(GroupName, Pid) ->
     join(GroupName, Pid, undefined).

+ 194 - 0
test/syn_groups_SUITE.erl

@@ -365,16 +365,54 @@ three_nodes_join_leave_and_monitor_default_scope(Config) ->
     [] = syn:get_members({group, "one"}),
     [] = rpc:call(SlaveNode1, syn, get_members, [{group, "one"}]),
     [] = rpc:call(SlaveNode2, syn, get_members, [{group, "one"}]),
+    false = syn:is_member({group, "one"}, Pid),
+    false = syn:is_member({group, "one"}, PidWithMeta),
+    false = syn:is_member({group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, PidRemoteOn1]),
+    false = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, Pid]),
+    false = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, PidRemoteOn1]),
+
     [] = syn:get_members({group, "two"}),
     [] = rpc:call(SlaveNode1, syn, get_members, [{group, "two"}]),
     [] = rpc:call(SlaveNode2, syn, get_members, [{group, "two"}]),
+    false = syn:is_member({group, "two"}, Pid),
+    false = syn:is_member({group, "two"}, PidWithMeta),
+    false = syn:is_member({group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, PidRemoteOn1]),
+    false = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, Pid]),
+    false = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, PidRemoteOn1]),
 
     [] = syn:get_local_members({group, "one"}),
     [] = rpc:call(SlaveNode1, syn, get_local_members, [{group, "one"}]),
     [] = rpc:call(SlaveNode2, syn, get_local_members, [{group, "one"}]),
+    false = syn:is_local_member({group, "one"}, Pid),
+    false = syn:is_local_member({group, "one"}, PidWithMeta),
+    false = syn:is_local_member({group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, PidRemoteOn1]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, Pid]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, PidRemoteOn1]),
+
     [] = syn:get_local_members({group, "two"}),
     [] = rpc:call(SlaveNode1, syn, get_local_members, [{group, "two"}]),
     [] = rpc:call(SlaveNode2, syn, get_local_members, [{group, "two"}]),
+    false = syn:is_local_member({group, "two"}, Pid),
+    false = syn:is_local_member({group, "two"}, PidWithMeta),
+    false = syn:is_local_member({group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, PidRemoteOn1]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, Pid]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, PidRemoteOn1]),
 
     0 = syn:groups_count(default),
     0 = syn:groups_count(default, node()),
@@ -405,6 +443,15 @@ three_nodes_join_leave_and_monitor_default_scope(Config) ->
         lists:sort([{Pid, undefined}, {PidWithMeta, <<"with meta">>}, {PidRemoteOn1, undefined}]),
         fun() -> lists:sort(rpc:call(SlaveNode2, syn, get_members, [{group, "one"}])) end
     ),
+    true = syn:is_member({group, "one"}, Pid),
+    true = syn:is_member({group, "one"}, PidWithMeta),
+    true = syn:is_member({group, "one"}, PidRemoteOn1),
+    true = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, Pid]),
+    true = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, PidWithMeta]),
+    true = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, PidRemoteOn1]),
+    true = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, Pid]),
+    true = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, PidWithMeta]),
+    true = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, PidRemoteOn1]),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, <<"with meta">>}]),
@@ -418,6 +465,15 @@ three_nodes_join_leave_and_monitor_default_scope(Config) ->
         [],
         fun() -> lists:sort(rpc:call(SlaveNode2, syn, get_local_members, [{group, "one"}])) end
     ),
+    true = syn:is_local_member({group, "one"}, Pid),
+    true = syn:is_local_member({group, "one"}, PidWithMeta),
+    false = syn:is_local_member({group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, PidWithMeta]),
+    true = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, PidRemoteOn1]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, Pid]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, PidRemoteOn1]),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
@@ -431,6 +487,15 @@ three_nodes_join_leave_and_monitor_default_scope(Config) ->
         lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
         fun() -> lists:sort(rpc:call(SlaveNode2, syn, get_members, [{group, "two"}])) end
     ),
+    true = syn:is_member({group, "two"}, Pid),
+    true = syn:is_member({group, "two"}, PidWithMeta),
+    false = syn:is_member({group, "two"}, PidRemoteOn1),
+    true = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, Pid]),
+    true = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, PidRemoteOn1]),
+    true = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, Pid]),
+    true = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, PidRemoteOn1]),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
@@ -444,6 +509,15 @@ three_nodes_join_leave_and_monitor_default_scope(Config) ->
         [],
         fun() -> lists:sort(rpc:call(SlaveNode2, syn, get_local_members, [{group, "two"}])) end
     ),
+    true = syn:is_local_member({group, "two"}, Pid),
+    true = syn:is_local_member({group, "two"}, PidWithMeta),
+    false = syn:is_local_member({group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, PidRemoteOn1]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, Pid]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, PidRemoteOn1]),
 
     2 = syn:groups_count(default),
     2 = syn:groups_count(default, node()),
@@ -535,6 +609,15 @@ three_nodes_join_leave_and_monitor_default_scope(Config) ->
         [],
         fun() -> lists:sort(rpc:call(SlaveNode2, syn, get_members, [{group, "one"}])) end
     ),
+    false = syn:is_member({group, "one"}, Pid),
+    false = syn:is_member({group, "one"}, PidWithMeta),
+    false = syn:is_member({group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [{group, "one"}, PidRemoteOn1]),
+    false = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, Pid]),
+    false = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode2, syn, is_member, [{group, "one"}, PidRemoteOn1]),
 
     syn_test_suite_helper:assert_wait(
         [],
@@ -548,6 +631,15 @@ three_nodes_join_leave_and_monitor_default_scope(Config) ->
         [],
         fun() -> lists:sort(rpc:call(SlaveNode2, syn, get_local_members, [{group, "one"}])) end
     ),
+    false = syn:is_local_member({group, "one"}, Pid),
+    false = syn:is_local_member({group, "one"}, PidWithMeta),
+    false = syn:is_local_member({group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "one"}, PidRemoteOn1]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, Pid]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "one"}, PidRemoteOn1]),
 
     syn_test_suite_helper:assert_wait(
         [{PidWithMeta, "with-meta-2"}],
@@ -561,6 +653,15 @@ three_nodes_join_leave_and_monitor_default_scope(Config) ->
         [{PidWithMeta, "with-meta-2"}],
         fun() -> lists:sort(rpc:call(SlaveNode2, syn, get_members, [{group, "two"}])) end
     ),
+    false = syn:is_member({group, "two"}, Pid),
+    true = syn:is_member({group, "two"}, PidWithMeta),
+    false = syn:is_member({group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, Pid]),
+    true = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [{group, "two"}, PidRemoteOn1]),
+    false = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, Pid]),
+    true = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode2, syn, is_member, [{group, "two"}, PidRemoteOn1]),
 
     syn_test_suite_helper:assert_wait(
         [{PidWithMeta, "with-meta-2"}],
@@ -574,6 +675,15 @@ three_nodes_join_leave_and_monitor_default_scope(Config) ->
         [],
         fun() -> lists:sort(rpc:call(SlaveNode2, syn, get_local_members, [{group, "two"}])) end
     ),
+    false = syn:is_local_member({group, "two"}, Pid),
+    true = syn:is_local_member({group, "two"}, PidWithMeta),
+    false = syn:is_local_member({group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [{group, "two"}, PidRemoteOn1]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, Pid]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode2, syn, is_local_member, [{group, "two"}, PidRemoteOn1]),
 
     1 = syn:groups_count(default),
     1 = syn:groups_count(default, node()),
@@ -608,10 +718,24 @@ three_nodes_join_leave_and_monitor_custom_scope(Config) ->
     [] = syn:get_members(custom_scope_ab, {group, "one"}),
     [] = rpc:call(SlaveNode1, syn, get_members, [custom_scope_ab, {group, "one"}]),
     {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, get_members, [custom_scope_ab, {group, "one"}]),
+    false = syn:is_member(custom_scope_ab, {group, "one"}, Pid),
+    false = syn:is_member(custom_scope_ab, {group, "one"}, PidWithMeta),
+    false = syn:is_member(custom_scope_ab, {group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [custom_scope_ab, {group, "one"}, Pid]),
 
     [] = syn:get_local_members(custom_scope_ab, {group, "one"}),
     [] = rpc:call(SlaveNode1, syn, get_local_members, [custom_scope_ab, {group, "one"}]),
     {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, get_local_members, [custom_scope_ab, {group, "one"}]),
+    false = syn:is_local_member(custom_scope_ab, {group, "one"}, Pid),
+    false = syn:is_local_member(custom_scope_ab, {group, "one"}, PidWithMeta),
+    false = syn:is_local_member(custom_scope_ab, {group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [custom_scope_ab, {group, "one"}, Pid]),
 
     {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:get_members(custom_scope_bc, {group, "one"}),
     [] = rpc:call(SlaveNode1, syn, get_members, [custom_scope_bc, {group, "one"}]),
@@ -624,10 +748,24 @@ three_nodes_join_leave_and_monitor_custom_scope(Config) ->
     [] = syn:get_members(custom_scope_ab, {group, "two"}),
     [] = rpc:call(SlaveNode1, syn, get_members, [custom_scope_ab, {group, "two"}]),
     {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, get_members, [custom_scope_ab, {group, "two"}]),
+    false = syn:is_member(custom_scope_ab, {group, "two"}, Pid),
+    false = syn:is_member(custom_scope_ab, {group, "two"}, PidWithMeta),
+    false = syn:is_member(custom_scope_ab, {group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [custom_scope_ab, {group, "two"}, Pid]),
 
     [] = syn:get_local_members(custom_scope_ab, {group, "two"}),
     [] = rpc:call(SlaveNode1, syn, get_local_members, [custom_scope_ab, {group, "two"}]),
     {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, get_local_members, [custom_scope_ab, {group, "two"}]),
+    false = syn:is_local_member(custom_scope_ab, {group, "two"}, Pid),
+    false = syn:is_local_member(custom_scope_ab, {group, "two"}, PidWithMeta),
+    false = syn:is_local_member(custom_scope_ab, {group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [custom_scope_ab, {group, "two"}, Pid]),
 
     {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:get_members(custom_scope_bc, {group, "two"}),
     [] = rpc:call(SlaveNode1, syn, get_members, [custom_scope_bc, {group, "two"}]),
@@ -659,6 +797,13 @@ three_nodes_join_leave_and_monitor_custom_scope(Config) ->
         fun() -> lists:sort(rpc:call(SlaveNode1, syn, get_members, [custom_scope_ab, {group, "one"}])) end
     ),
     {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, get_members, [custom_scope_ab, {group, "one"}]),
+    true = syn:is_member(custom_scope_ab, {group, "one"}, Pid),
+    true = syn:is_member(custom_scope_ab, {group, "one"}, PidWithMeta),
+    false = syn:is_member(custom_scope_ab, {group, "one"}, PidRemoteOn1),
+    true = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, Pid]),
+    true = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [custom_scope_ab, {group, "one"}, Pid]),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, <<"with meta">>}]),
@@ -669,6 +814,13 @@ three_nodes_join_leave_and_monitor_custom_scope(Config) ->
         fun() -> lists:sort(rpc:call(SlaveNode1, syn, get_local_members, [custom_scope_ab, {group, "one"}])) end
     ),
     {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, get_local_members, [custom_scope_ab, {group, "one"}]),
+    true = syn:is_local_member(custom_scope_ab, {group, "one"}, Pid),
+    true = syn:is_local_member(custom_scope_ab, {group, "one"}, PidWithMeta),
+    false = syn:is_local_member(custom_scope_ab, {group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [custom_scope_ab, {group, "one"}, Pid]),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
@@ -679,6 +831,13 @@ three_nodes_join_leave_and_monitor_custom_scope(Config) ->
         fun() -> lists:sort(rpc:call(SlaveNode1, syn, get_members, [custom_scope_ab, {group, "two"}])) end
     ),
     {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, get_members, [custom_scope_ab, {group, "two"}]),
+    true = syn:is_member(custom_scope_ab, {group, "two"}, Pid),
+    true = syn:is_member(custom_scope_ab, {group, "two"}, PidWithMeta),
+    false = syn:is_member(custom_scope_ab, {group, "two"}, PidRemoteOn1),
+    true = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, Pid]),
+    true = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [custom_scope_ab, {group, "two"}, Pid]),
 
     syn_test_suite_helper:assert_wait(
         lists:sort([{Pid, undefined}, {PidWithMeta, "with-meta-2"}]),
@@ -689,6 +848,13 @@ three_nodes_join_leave_and_monitor_custom_scope(Config) ->
         fun() -> lists:sort(rpc:call(SlaveNode1, syn, get_local_members, [custom_scope_ab, {group, "two"}])) end
     ),
     {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, get_local_members, [custom_scope_ab, {group, "two"}]),
+    true = syn:is_local_member(custom_scope_ab, {group, "two"}, Pid),
+    true = syn:is_local_member(custom_scope_ab, {group, "two"}, PidWithMeta),
+    false = syn:is_local_member(custom_scope_ab, {group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [custom_scope_ab, {group, "two"}, Pid]),
 
     {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:get_members(custom_scope_bc, {group, "two"}),
     syn_test_suite_helper:assert_wait(
@@ -845,6 +1011,13 @@ three_nodes_join_leave_and_monitor_custom_scope(Config) ->
         fun() -> lists:sort(rpc:call(SlaveNode1, syn, get_members, [custom_scope_ab, {group, "one"}])) end
     ),
     {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, get_members, [custom_scope_ab, {group, "one"}]),
+    false = syn:is_member(custom_scope_ab, {group, "one"}, Pid),
+    false = syn:is_member(custom_scope_ab, {group, "one"}, PidWithMeta),
+    false = syn:is_member(custom_scope_ab, {group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "one"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [custom_scope_ab, {group, "one"}, Pid]),
 
     syn_test_suite_helper:assert_wait(
         [],
@@ -855,6 +1028,13 @@ three_nodes_join_leave_and_monitor_custom_scope(Config) ->
         fun() -> lists:sort(rpc:call(SlaveNode1, syn, get_local_members, [custom_scope_ab, {group, "one"}])) end
     ),
     {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, get_local_members, [custom_scope_ab, {group, "one"}]),
+    false = syn:is_local_member(custom_scope_ab, {group, "one"}, Pid),
+    false = syn:is_local_member(custom_scope_ab, {group, "one"}, PidWithMeta),
+    false = syn:is_local_member(custom_scope_ab, {group, "one"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "one"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [custom_scope_ab, {group, "one"}, Pid]),
 
     syn_test_suite_helper:assert_wait(
         [{PidWithMeta, "with-meta-2"}],
@@ -865,6 +1045,13 @@ three_nodes_join_leave_and_monitor_custom_scope(Config) ->
         fun() -> lists:sort(rpc:call(SlaveNode1, syn, get_members, [custom_scope_ab, {group, "two"}])) end
     ),
     {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, get_members, [custom_scope_ab, {group, "two"}]),
+    false = syn:is_member(custom_scope_ab, {group, "two"}, Pid),
+    true = syn:is_member(custom_scope_ab, {group, "two"}, PidWithMeta),
+    false = syn:is_member(custom_scope_ab, {group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, Pid]),
+    true = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_member, [custom_scope_ab, {group, "two"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_member, [custom_scope_ab, {group, "two"}, Pid]),
 
     syn_test_suite_helper:assert_wait(
         [{PidWithMeta, "with-meta-2"}],
@@ -875,6 +1062,13 @@ three_nodes_join_leave_and_monitor_custom_scope(Config) ->
         fun() -> lists:sort(rpc:call(SlaveNode1, syn, get_local_members, [custom_scope_ab, {group, "two"}])) end
     ),
     {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, get_local_members, [custom_scope_ab, {group, "two"}]),
+    false = syn:is_local_member(custom_scope_ab, {group, "two"}, Pid),
+    true = syn:is_local_member(custom_scope_ab, {group, "two"}, PidWithMeta),
+    false = syn:is_local_member(custom_scope_ab, {group, "two"}, PidRemoteOn1),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, Pid]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, PidWithMeta]),
+    false = rpc:call(SlaveNode1, syn, is_local_member, [custom_scope_ab, {group, "two"}, PidRemoteOn1]),
+    {badrpc, {'EXIT', {{invalid_scope, custom_scope_ab}, _}}} = catch rpc:call(SlaveNode2, syn, is_local_member, [custom_scope_ab, {group, "two"}, Pid]),
 
     {'EXIT', {{invalid_scope, custom_scope_bc}, _}} = catch syn:get_members(custom_scope_bc, {group, "two"}),
     syn_test_suite_helper:assert_wait(

+ 2 - 2
test/syn_registry_SUITE.erl

@@ -63,7 +63,7 @@
 %% -------------------------------------------------------------------
 all() ->
     [
-        {group, one_process_registration},
+        {group, one_node_process_registration},
         {group, three_nodes_process_registration}
     ].
 
@@ -81,7 +81,7 @@ all() ->
 %% -------------------------------------------------------------------
 groups() ->
     [
-        {one_process_registration, [shuffle], [
+        {one_node_process_registration, [shuffle], [
             one_node_via_register_unregister
         ]},
         {three_nodes_process_registration, [shuffle], [