-module(mme_registry_test). -include_lib("eunit/include/eunit.hrl"). %% ------------------------------------------------------------------ %% setup functions %% ------------------------------------------------------------------ %% default set of MMEs -define(MMEs, [#{name => "mme0", raddr => "127.0.0.10"}, #{name => "mme1", raddr => "127.0.0.11"}]). -define(TC(Fun, MMEs), {setup, fun() -> start(MMEs) end, fun stop/1, Fun}). start(MMEs) -> osmo_s1gw:set_env(mme_pool, MMEs), {ok, _} = mme_registry:start_link(). stop(_) -> mme_registry:shutdown(). %% ------------------------------------------------------------------ %% testcase descriptions %% ------------------------------------------------------------------ mme_registry_test_() -> [{"Test adding and deleting MMEs", ?TC(fun test_add_del/1, ?MMEs)}, {"Test fetching MME info", ?TC(fun test_fetch/1, ?MMEs)}, {"Test MME selection", ?TC(fun test_select/1, ?MMEs)}, {"Test MME selection (empty pool)", ?TC(fun test_select_empty/1, [])}, {"Test MME selection (TAC list)", ?TC(fun test_select_tac_list/1, [])} ]. %% ------------------------------------------------------------------ %% actual testcases %% ------------------------------------------------------------------ test_add_del(_) -> [%% "mme0" and "mme1" come pre-registered, register "mme2" ?_assertEqual(ok, mme_registry:mme_register(#{name => "mme2", raddr => "127.0.0.12"})), %% duplicate name ?_assertEqual({error, already_registered}, mme_registry:mme_register(#{name => "mme2", raddr => "127.0.0.13"})), %% duplicate raddr:rport ?_assertEqual({error, already_registered}, mme_registry:mme_register(#{name => "mme3", raddr => "127.0.0.12"})), %% deleting previously registered MMEs ?_assertEqual(ok, mme_registry:mme_unregister("mme0")), ?_assertEqual(ok, mme_registry:mme_unregister("mme1")), ?_assertEqual(ok, mme_registry:mme_unregister("mme2")), %% deleting non-existent MMEs ?_assertEqual({error, not_registered}, mme_registry:mme_unregister("mme0")), ?_assertEqual({error, not_registered}, mme_registry:mme_unregister("mme1")), ?_assertEqual({error, not_registered}, mme_registry:mme_unregister("mme42"))]. test_fetch(_) -> [%% "mme0" and "mme1" come pre-registered, register "mme2" ?_assertEqual(ok, mme_registry:mme_register(#{name => "mme2", laddr => "192.168.1.100", raddr => "192.168.1.101", rport => 1337})), %% test fetching a list of MMEs ?_assertMatch([#{name := "mme0", raddr := {127,0,0,10}}, #{name := "mme1", raddr := {127,0,0,11}}, #{name := "mme2", raddr := {192,168,1,101}}], mme_registry:fetch_mme_list()), %% test fetching MMEs by name ?_assertMatch({ok, #{name := "mme0", laddr := {0,0,0,0,0,0,0,0}, %% "::" raddr := {127,0,0,10}, rport := 36412}}, mme_registry:fetch_mme_info("mme0")), ?_assertMatch({ok, #{name := "mme1", laddr := {0,0,0,0,0,0,0,0}, %% "::" raddr := {127,0,0,11}, rport := 36412}}, mme_registry:fetch_mme_info("mme1")), ?_assertMatch({ok, #{name := "mme2", laddr := {192,168,1,100}, raddr := {192,168,1,101}, rport := 1337}}, mme_registry:fetch_mme_info("mme2")), %% "mme3" is not registered ?_assertEqual(error, mme_registry:fetch_mme_info("mme3"))]. test_select(_) -> [%% "mme0" and "mme1" come pre-registered, register "mme2" ?_assertEqual(ok, mme_registry:mme_register(#{name => "mme2", raddr => "127.0.0.12"})), %% old MME unknown, fall back to the first entry ("mme0") ?_assertMatch({ok, #{name := "mme0"}}, mme_registry:mme_select(#{ })), ?_assertMatch({ok, #{name := "mme0"}}, mme_registry:mme_select(#{prev_mme => "mme3"})), %% old MME known, expect the next MME to be selected ?_assertMatch({ok, #{name := "mme1"}}, mme_registry:mme_select(#{prev_mme => "mme0"})), ?_assertMatch({ok, #{name := "mme2"}}, mme_registry:mme_select(#{prev_mme => "mme1"})), ?_assertMatch({ok, #{name := "mme0"}}, mme_registry:mme_select(#{prev_mme => "mme2"}))]. test_select_empty(_) -> [%% the MME pool is empty, expect errors ?_assertEqual(error, mme_registry:mme_select(#{ })), ?_assertEqual(error, mme_registry:mme_select(#{prev_mme => "mme0"})), ?_assertEqual(error, mme_registry:mme_select(#{prev_mme => "mme1"})), ?_assertEqual(error, mme_registry:mme_select(#{prev_mme => "mme2"}))]. test_select_tac_list(_) -> [%% the MME pool is empty, add MMEs with allowed TACs ?_assertEqual(ok, mme_registry:mme_register(#{name => "mme0", raddr => "127.0.0.10", tac_list => [1337]})), ?_assertEqual(ok, mme_registry:mme_register(#{name => "mme1", raddr => "127.0.0.11", tac_list => [4242]})), ?_assertEqual(ok, mme_registry:mme_register(#{name => "mme2", raddr => "127.0.0.12", tac_list => [1337, 4242, 9999]})), %% eNB serving TAC=1337 => "mme0" and "mme2" are allowed ?_assertMatch({ok, #{name := "mme0"}}, mme_registry:mme_select(#{enb_tacs => [1337]})), ?_assertMatch({ok, #{name := "mme2"}}, mme_registry:mme_select(#{prev_mme => "mme0", enb_tacs => [1337]})), ?_assertMatch({ok, #{name := "mme0"}}, mme_registry:mme_select(#{prev_mme => "mme2", enb_tacs => [1337]})), %% eNB serving TAC=4242 => "mme1" and "mme2" are allowed ?_assertMatch({ok, #{name := "mme1"}}, mme_registry:mme_select(#{enb_tacs => [4242]})), ?_assertMatch({ok, #{name := "mme2"}}, mme_registry:mme_select(#{prev_mme => "mme1", enb_tacs => [4242]})), %% eNB serving TAC=9999 => only "mme2" is allowed ?_assertMatch({ok, #{name := "mme2"}}, mme_registry:mme_select(#{enb_tacs => [9999]})), ?_assertMatch({ok, #{name := "mme2"}}, mme_registry:mme_select(#{prev_mme => "mme2", enb_tacs => [9999]})), %% eNB serving TACs=[1337, 4242] => only "mme2" is allowed ?_assertMatch({ok, #{name := "mme2"}}, mme_registry:mme_select(#{enb_tacs => [1337, 4242]})), %% eNB serving TACs=[1337, 4242, 9999] => only "mme2" is allowed ?_assertMatch({ok, #{name := "mme2"}}, mme_registry:mme_select(#{enb_tacs => [1337, 4242, 9999]})), %% eNB serving TAC=1111 => not allowed ?_assertMatch(error, mme_registry:mme_select(#{enb_tacs => [1111]})), %% eNB serving TACs=[1111, 1337] => not allowed ?_assertMatch(error, mme_registry:mme_select(#{enb_tacs => [1111, 1337]})), %% add another MME that permits all TACs ?_assertEqual(ok, mme_registry:mme_register(#{name => "mme3", raddr => "127.0.0.13"})), %% eNB serving TAC=1111 => only "mme3" is allowed ?_assertMatch({ok, #{name := "mme3"}}, mme_registry:mme_select(#{enb_tacs => [1111]})), %% eNB serving TACs=[1111, 1337] => only "mme3" is allowed ?_assertMatch({ok, #{name := "mme3"}}, mme_registry:mme_select(#{enb_tacs => [1111, 1337]}))]. %% vim:set ts=4 sw=4 et: