%% @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.
