Browse Source

Add unregister and clean tests.

Roberto Ostinelli 10 years ago
parent
commit
b51114736e

+ 5 - 1
src/syn.erl

@@ -30,7 +30,7 @@
 
 
 %% API
 %% API
 -export([start/0, stop/0]).
 -export([start/0, stop/0]).
--export([register/2]).
+-export([register/2, unregister/1]).
 -export([find_by_key/1, find_by_pid/1]).
 -export([find_by_key/1, find_by_pid/1]).
 
 
 
 
@@ -51,6 +51,10 @@ stop() ->
 register(Key, Pid) ->
 register(Key, Pid) ->
     syn_backbone:register(Key, Pid).
     syn_backbone:register(Key, Pid).
 
 
+-spec unregister(Key :: any()) -> ok | {error, undefined}.
+unregister(Key) ->
+    syn_backbone:unregister(Key).
+
 -spec find_by_key(Key :: any()) -> pid() | undefined.
 -spec find_by_key(Key :: any()) -> pid() | undefined.
 find_by_key(Key) ->
 find_by_key(Key) ->
     syn_backbone:find_by_key(Key).
     syn_backbone:find_by_key(Key).

+ 18 - 3
src/syn_backbone.erl

@@ -31,7 +31,7 @@
 
 
 %% API
 %% API
 -export([start_link/0]).
 -export([start_link/0]).
--export([register/2]).
+-export([register/2, unregister/1]).
 -export([find_by_key/1, find_by_pid/1]).
 -export([find_by_key/1, find_by_pid/1]).
 
 
 %% gen_server callbacks
 %% gen_server callbacks
@@ -66,7 +66,7 @@ find_by_pid(Pid) ->
         _ -> undefined
         _ -> undefined
     end.
     end.
 
 
--spec register(Key :: any(), Pid :: pid()) -> ok | {error, already_taken}.
+-spec register(Key :: any(), Pid :: pid()) -> ok | {error, taken}.
 register(Key, Pid) ->
 register(Key, Pid) ->
     case find_by_key(Key) of
     case find_by_key(Key) of
         undefined ->
         undefined ->
@@ -79,7 +79,18 @@ register(Key, Pid) ->
             %% link
             %% link
             gen_server:call(?MODULE, {link_process, Pid});
             gen_server:call(?MODULE, {link_process, Pid});
         _ ->
         _ ->
-            {error, already_taken}
+            {error, taken}
+    end.
+
+-spec unregister(Key :: any()) -> ok | {error, undefined}.
+unregister(Key) ->
+    case find_by_key(Key) of
+        undefined ->
+            {error, undefined};
+        Pid ->
+            remove_process_by_key(Key),
+            %% unlink
+            gen_server:call(?MODULE, {unlink_process, Pid})
     end.
     end.
 
 
 %% ===================================================================
 %% ===================================================================
@@ -120,6 +131,10 @@ handle_call({link_process, Pid}, _From, State) ->
     erlang:link(Pid),
     erlang:link(Pid),
     {reply, ok, State};
     {reply, ok, State};
 
 
+handle_call({unlink_process, Pid}, _From, State) ->
+    erlang:unlink(Pid),
+    {reply, ok, State};
+
 handle_call(Request, From, State) ->
 handle_call(Request, From, State) ->
     error_logger:warning_msg("Received from ~p an unknown call message: ~p", [Request, From]),
     error_logger:warning_msg("Received from ~p an unknown call message: ~p", [Request, From]),
     {reply, undefined, State}.
     {reply, undefined, State}.

+ 28 - 5
test/syn_create_mnesia_SUITE.erl

@@ -32,6 +32,7 @@
 -export([all/0]).
 -export([all/0]).
 -export([init_per_suite/1, end_per_suite/1]).
 -export([init_per_suite/1, end_per_suite/1]).
 -export([groups/0, init_per_group/2, end_per_group/2]).
 -export([groups/0, init_per_group/2, end_per_group/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
 
 
 %% tests
 %% tests
 -export([
 -export([
@@ -142,13 +143,35 @@ init_per_group(_GroupName, Config) -> Config.
 %% -------------------------------------------------------------------
 %% -------------------------------------------------------------------
 end_per_group(two_nodes_mnesia_creation, Config) ->
 end_per_group(two_nodes_mnesia_creation, Config) ->
     %% get slave node name
     %% get slave node name
-    SlaveNodeName = proplists:get_value(slave_node_name, Config),
-    %% clean
-    syn_test_suite_helper:clean_after_test(SlaveNodeName),
+    SlaveNodeShortName = proplists:get_value(slave_node_short_name, Config),
     %% stop slave
     %% stop slave
-    syn_test_suite_helper:stop_slave(SlaveNodeName);
+    syn_test_suite_helper:stop_slave(SlaveNodeShortName);
 end_per_group(_GroupName, _Config) ->
 end_per_group(_GroupName, _Config) ->
-    syn_test_suite_helper:clean_after_test().
+    ok.
+
+% ----------------------------------------------------------------------------------------------------------
+% Function: init_per_testcase(TestCase, Config0) ->
+%				Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}
+% TestCase = atom()
+% Config0 = Config1 = [tuple()]
+% Reason = term()
+% ----------------------------------------------------------------------------------------------------------
+init_per_testcase(_TestCase, Config) ->
+    Config.
+
+% ----------------------------------------------------------------------------------------------------------
+% Function: end_per_testcase(TestCase, Config0) ->
+%				void() | {save_config,Config1} | {fail,Reason}
+% TestCase = atom()
+% Config0 = Config1 = [tuple()]
+% Reason = term()
+% ----------------------------------------------------------------------------------------------------------
+end_per_testcase(_TestCase, Config) ->
+    %% get slave
+    case proplists:get_value(slave_node_name, Config) of
+        undefined -> syn_test_suite_helper:clean_after_test();
+        SlaveNodeName -> syn_test_suite_helper:clean_after_test(SlaveNodeName)
+    end.
 
 
 %% ===================================================================
 %% ===================================================================
 %% Tests
 %% Tests

+ 52 - 6
test/syn_register_processes_SUITE.erl

@@ -32,6 +32,7 @@
 -export([all/0]).
 -export([all/0]).
 -export([init_per_suite/1, end_per_suite/1]).
 -export([init_per_suite/1, end_per_suite/1]).
 -export([groups/0, init_per_group/2, end_per_group/2]).
 -export([groups/0, init_per_group/2, end_per_group/2]).
+-export([init_per_testcase/2, end_per_testcase/2]).
 
 
 %% internal
 %% internal
 -export([process_main/0]).
 -export([process_main/0]).
@@ -41,6 +42,7 @@
     single_node_when_mnesia_is_ram_find_by_key/1,
     single_node_when_mnesia_is_ram_find_by_key/1,
     single_node_when_mnesia_is_ram_find_by_pid/1,
     single_node_when_mnesia_is_ram_find_by_pid/1,
     single_node_when_mnesia_is_ram_re_register_error/1,
     single_node_when_mnesia_is_ram_re_register_error/1,
+    single_node_when_mnesia_is_ram_unregister/1,
     single_node_when_mnesia_is_disc_find_by_key/1
     single_node_when_mnesia_is_disc_find_by_key/1
 ]).
 ]).
 -export([
 -export([
@@ -87,6 +89,7 @@ groups() ->
             single_node_when_mnesia_is_ram_find_by_key,
             single_node_when_mnesia_is_ram_find_by_key,
             single_node_when_mnesia_is_ram_find_by_pid,
             single_node_when_mnesia_is_ram_find_by_pid,
             single_node_when_mnesia_is_ram_re_register_error,
             single_node_when_mnesia_is_ram_re_register_error,
+            single_node_when_mnesia_is_ram_unregister,
             single_node_when_mnesia_is_disc_find_by_key
             single_node_when_mnesia_is_disc_find_by_key
         ]},
         ]},
         {two_nodes_process_registration, [shuffle], [
         {two_nodes_process_registration, [shuffle], [
@@ -141,13 +144,35 @@ init_per_group(_GroupName, Config) -> Config.
 %% -------------------------------------------------------------------
 %% -------------------------------------------------------------------
 end_per_group(two_nodes_mnesia_creation, Config) ->
 end_per_group(two_nodes_mnesia_creation, Config) ->
     %% get slave node name
     %% get slave node name
-    SlaveNodeName = proplists:get_value(slave_node_name, Config),
-    %% clean
-    syn_test_suite_helper:clean_after_test(SlaveNodeName),
+    SlaveNodeShortName = proplists:get_value(slave_node_short_name, Config),
     %% stop slave
     %% stop slave
-    syn_test_suite_helper:stop_slave(SlaveNodeName);
+    syn_test_suite_helper:stop_slave(SlaveNodeShortName);
 end_per_group(_GroupName, _Config) ->
 end_per_group(_GroupName, _Config) ->
-    syn_test_suite_helper:clean_after_test().
+    ok.
+
+% ----------------------------------------------------------------------------------------------------------
+% Function: init_per_testcase(TestCase, Config0) ->
+%				Config1 | {skip,Reason} | {skip_and_save,Reason,Config1}
+% TestCase = atom()
+% Config0 = Config1 = [tuple()]
+% Reason = term()
+% ----------------------------------------------------------------------------------------------------------
+init_per_testcase(_TestCase, Config) ->
+    Config.
+
+% ----------------------------------------------------------------------------------------------------------
+% Function: end_per_testcase(TestCase, Config0) ->
+%				void() | {save_config,Config1} | {fail,Reason}
+% TestCase = atom()
+% Config0 = Config1 = [tuple()]
+% Reason = term()
+% ----------------------------------------------------------------------------------------------------------
+end_per_testcase(_TestCase, Config) ->
+    %% get slave
+    case proplists:get_value(slave_node_name, Config) of
+        undefined -> syn_test_suite_helper:clean_after_test();
+        SlaveNodeName -> syn_test_suite_helper:clean_after_test(SlaveNodeName)
+    end.
 
 
 %% ===================================================================
 %% ===================================================================
 %% Tests
 %% Tests
@@ -198,7 +223,7 @@ single_node_when_mnesia_is_ram_re_register_error(_Config) ->
     Pid2 = start_process(),
     Pid2 = start_process(),
     %% register
     %% register
     ok = syn:register(<<"my proc">>, Pid),
     ok = syn:register(<<"my proc">>, Pid),
-    {error, already_taken} = syn:register(<<"my proc">>, Pid2),
+    {error, taken} = syn:register(<<"my proc">>, Pid2),
     %% retrieve
     %% retrieve
     Pid = syn:find_by_key(<<"my proc">>),
     Pid = syn:find_by_key(<<"my proc">>),
     %% kill process
     %% kill process
@@ -216,6 +241,27 @@ single_node_when_mnesia_is_ram_re_register_error(_Config) ->
     %% retrieve
     %% retrieve
     undefined = syn:find_by_pid(Pid).
     undefined = syn:find_by_pid(Pid).
 
 
+single_node_when_mnesia_is_ram_unregister(_Config) ->
+    %% set schema location
+    application:set_env(mnesia, schema_location, ram),
+    %% start
+    ok = syn:start(),
+    %% start process
+    Pid = start_process(),
+    %% unregister
+    {error, undefined} = syn:unregister(<<"my proc">>),
+    %% register
+    ok = syn:register(<<"my proc">>, Pid),
+    %% retrieve
+    Pid = syn:find_by_key(<<"my proc">>),
+    %% unregister
+    ok = syn:unregister(<<"my proc">>),
+    %% retrieve
+    undefined = syn:find_by_key(<<"my proc">>),
+    undefined = syn:find_by_pid(Pid),
+    %% kill process
+    kill_process(Pid).
+
 single_node_when_mnesia_is_disc_find_by_key(_Config) ->
 single_node_when_mnesia_is_disc_find_by_key(_Config) ->
     %% set schema location
     %% set schema location
     application:set_env(mnesia, schema_location, disc),
     application:set_env(mnesia, schema_location, disc),

+ 9 - 4
test/syn_test_suite_helper.erl

@@ -46,10 +46,12 @@ start_slave(NodeShortName) ->
     ]),
     ]),
     {ok, NodeName}.
     {ok, NodeName}.
 
 
-stop_slave(NodeName) ->
-    ct_slave:stop(NodeName).
+stop_slave(NodeShortName) ->
+    {ok, _} = ct_slave:stop(NodeShortName).
 
 
 clean_after_test() ->
 clean_after_test() ->
+    %% delete table
+    {atomic, ok} = mnesia:delete_table(syn_processes_table),
     %% stop mnesia
     %% stop mnesia
     mnesia:stop(),
     mnesia:stop(),
     %% delete schema
     %% delete schema
@@ -58,10 +60,13 @@ clean_after_test() ->
     syn:stop().
     syn:stop().
 
 
 clean_after_test(NodeName) ->
 clean_after_test(NodeName) ->
-    clean_after_test(),
+    %% delete table
+    {atomic, ok} = mnesia:delete_table(syn_processes_table),
     %% stop mnesia
     %% stop mnesia
+    mnesia:stop(),
     rpc:call(NodeName, mnesia, stop, []),
     rpc:call(NodeName, mnesia, stop, []),
     %% delete schema
     %% delete schema
-    rpc:call(NodeName, mnesia, delete_schema, [NodeName]),
+    mnesia:delete_schema([node(), NodeName]),
     %% stop syn
     %% stop syn
+    syn:stop(),
     rpc:call(NodeName, syn, stop, []).
     rpc:call(NodeName, syn, stop, []).