blob: 042890bb96ab239b2b916641b8faa17f8849ece5 [file] [log] [blame]
%% @copyright 2014, Takeru Ohta <phjgt308@gmail.com>
%%
-module(local_tests).
-on_load(init/0).
-include_lib("eunit/include/eunit.hrl").
%%----------------------------------------------------------------------------------------------------------------------
%% Macros
%%----------------------------------------------------------------------------------------------------------------------
-define(NS, test_name_server). % Name Server
-define(NAME(Name), {?NS, Name}).
%%----------------------------------------------------------------------------------------------------------------------
%% Unit Tests
%%----------------------------------------------------------------------------------------------------------------------
start_and_stop_name_server_test_() ->
[
{"start and stop",
fun () ->
?assertEqual([], local:which_name_servers()),
?assertEqual(ok, local:start_name_server(?NS)),
?assertEqual([?NS], local:which_name_servers()),
?assertEqual(ok, local:stop_name_server(?NS)),
?assertEqual([], local:which_name_servers())
end},
{"duplicated start",
fun () ->
?assertEqual(ok, local:start_name_server(?NS)),
?assertMatch({error, already_present}, local:start_name_server(?NS)),
?assertEqual(ok, local:stop_name_server(?NS))
end},
{"delete not-started server",
fun () ->
?assertEqual({error, not_found}, local:stop_name_server(?NS))
end}
].
register_and_unregister_test_() ->
{foreach,
fun () -> ok = local:start_name_server(?NS) end,
fun (_) -> ok = local:stop_name_server(?NS) end,
[
{"register process name",
fun () ->
?assertEqual(yes, local:register_name(?NAME(hoge), self())),
?assertEqual(self(), local:whereis_name(?NAME(hoge)))
end},
{"duplicated registration",
fun () ->
yes = local:register_name(?NAME(hoge), self()),
?assertEqual(no, local:register_name(?NAME(hoge), self())),
?assertEqual(no, local:register_name(?NAME(fuga), self()))
end},
{"unregister process name",
fun () ->
yes = local:register_name(?NAME(hoge), self()),
?assertEqual(ok, local:unregister_name(?NAME(hoge))),
?assertEqual(yes, local:register_name(?NAME(hoge), self())),
?assertEqual(ok, local:unregister_name(?NAME(hoge))),
?assertEqual(yes, local:register_name(?NAME(fuga), self()))
end},
{"unregister not-registered name",
fun () ->
?assertEqual(ok, local:unregister_name(?NAME(hoge)))
end}
]}.
whereis_test_() ->
{foreach,
fun () -> ok = local:start_name_server(?NS) end,
fun (_) -> ok = local:stop_name_server(?NS) end,
[
{"resolve name",
fun () ->
yes = local:register_name(?NAME(hoge), self()),
?assertEqual(self(), local:whereis_name(?NAME(hoge)))
end},
{"resolve not-registered name",
fun () ->
?assertEqual(undefined, local:whereis_name(?NAME(hoge)))
end},
{"resolve unregistered name",
fun () ->
yes = local:register_name(?NAME(hoge), self()),
ok = local:unregister_name(?NAME(hoge)),
?assertEqual(undefined, local:whereis_name(?NAME(hoge)))
end}
]}.
send_test_() ->
{foreach,
fun () -> ok = local:start_name_server(?NS) end,
fun (_) -> ok = local:stop_name_server(?NS) end,
[
{"send message to registered process",
fun () ->
yes = local:register_name(?NAME(hoge), self()),
?assertEqual(self(), local:send(?NAME(hoge), hello)),
receive
hello -> ?assert(true)
after 10 -> ?assert(timeout)
end
end},
{"send message to not-registered process",
fun () ->
?assertError({badarg, _}, local:send(?NAME(hoge), hello))
end}
]}.
process_down_test_() ->
{foreach,
fun () -> ok = local:start_name_server(?NS) end,
fun (_) -> ok = local:stop_name_server(?NS) end,
[
{"register downed process",
fun () ->
process_flag(trap_exit, true),
Pid = spawn_link(fun () -> ok end),
receive {'EXIT', Pid, _} -> ok end,
yes = local:register_name(?NAME(hoge), Pid),
?assertEqual(undefined, local:whereis_name(?NAME(hoge))),
yes = local:register_name(?NAME(hoge), self()),
?assertEqual(self(), local:whereis_name(?NAME(hoge)))
end},
{"register then process down",
fun () ->
process_flag(trap_exit, true),
Pid = spawn_link(timer, sleep, [infinity]),
yes = local:register_name(?NAME(hoge), Pid),
?assertEqual(Pid, local:whereis_name(?NAME(hoge))),
exit(Pid, shutdown),
receive {'EXIT', Pid, _} -> ok end,
?assertEqual(undefined, local:whereis_name(?NAME(hoge)))
end},
{"name server down",
fun () ->
process_flag(trap_exit, true),
yes = local:register_name(?NAME(hoge), self()),
?assertEqual(self(), local:whereis_name(?NAME(hoge))),
Ns = whereis(?NS),
exit(Ns, kill),
receive {'EXIT', Ns, Reason} -> ?assertEqual(killed, Reason) after 50 -> ?assert(timeout) end,
?assertEqual(undefined, local:whereis_name(?NAME(hoge))),
timer:sleep(20), % wait restarting
yes = local:register_name(?NAME(hoge), self()),
?assertEqual(self(), local:whereis_name(?NAME(hoge)))
end},
{"other linked process down",
fun () ->
Ns = whereis(?NS),
Monitor = monitor(process, Ns),
spawn(fun () ->
link(Ns),
exit(abort)
end),
receive
{'DOWN', Monitor, _, Ns, Reason} -> ?assertEqual(abort, Reason)
after 50 -> ?assert(timeout)
end,
timer:sleep(20), % wait restarting
yes = local:register_name(?NAME(hoge), self()),
?assertEqual(self(), local:whereis_name(?NAME(hoge)))
end}
]}.
gen_server_test_() ->
{foreach,
fun () -> ok = local:start_name_server(?NS) end,
fun (_) -> ok = local:stop_name_server(?NS) end,
[
{"gen_server via name",
fun() ->
Result = echo_gen_server:start_link({via, local, ?NAME(hoge)}),
?assertMatch({ok, _}, Result),
?assertEqual({echo, hello}, echo_gen_server:call({via, local, ?NAME(hoge)}, hello))
end}
]}.
%%----------------------------------------------------------------------------------------------------------------------
%% Internal Functions
%%----------------------------------------------------------------------------------------------------------------------
init() ->
{ok, _} = application:ensure_all_started(local),
_ = error_logger:tty(false),
ok.