fixeria has submitted this change. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/38781?usp=email )
Change subject: erab_fsm: add fetch_info/1 for state introspection ......................................................................
erab_fsm: add fetch_info/1 for state introspection
This API will be used by the upcoming interactive VTY interface.
Change-Id: I02d5d043d6eda67c5bf2a6cf6ec1b863030a05a9 Related: SYS#7066 --- M src/erab_fsm.erl M test/erab_fsm_test.erl 2 files changed, 58 insertions(+), 3 deletions(-)
Approvals: Jenkins Builder: Verified fixeria: Looks good to me, approved laforge: Looks good to me, but someone else must approve pespin: Looks good to me, but someone else must approve
diff --git a/src/erab_fsm.erl b/src/erab_fsm.erl index 736a2ce..2998c53 100644 --- a/src/erab_fsm.erl +++ b/src/erab_fsm.erl @@ -53,6 +53,7 @@ erab_release_cmd/1, erab_release_rsp/1, erab_release_ind/1, + fetch_info/1, shutdown/1]).
-include_lib("kernel/include/logger.hrl"). @@ -147,6 +148,11 @@ gen_statem:call(Pid, ?FUNCTION_NAME).
+-spec fetch_info(pid()) -> proplists:proplist(). +fetch_info(Pid) -> + gen_statem:call(Pid, ?FUNCTION_NAME). + + -spec shutdown(pid()) -> ok. shutdown(Pid) -> gen_statem:stop(Pid). @@ -382,9 +388,22 @@
%% Event handler for all states -handle_event(State, Event, EventData, S) -> +handle_event(State, {call, From}, fetch_info, + #erab_state{} = S) -> + Info = [{state, State}, + {f_teid_u2c, S#erab_state.u2c}, + {f_teid_c2u, S#erab_state.c2u}, + {f_teid_a2u, S#erab_state.a2u}, + {f_teid_u2a, S#erab_state.u2a}, + {seid_loc, S#erab_state.seid_loc}, + {seid_rem, S#erab_state.seid_rem}], + %% omit props with Value =:= undefined + Reply = lists:filter(fun({_, V}) -> V =/= undefined end, Info), + {keep_state_and_data, {reply, From, Reply}}; + +handle_event(State, Event, EventData, _S) -> ?LOG_ERROR("Unexpected event ~p in state ~p: ~p", [Event, State, EventData]), - {keep_state, S}. + {keep_state_and_data}.
code_change(_Vsn, State, S, _Extra) -> diff --git a/test/erab_fsm_test.erl b/test/erab_fsm_test.erl index 0bd6b8b..e406e88 100644 --- a/test/erab_fsm_test.erl +++ b/test/erab_fsm_test.erl @@ -9,7 +9,7 @@ -define(U2A, {?TEID_U2A, ?ADDR_U2A}).
%% ------------------------------------------------------------------ -%% setup functions +%% setup/misc functions %% ------------------------------------------------------------------
-define(TC(Fun), {setup, @@ -30,6 +30,11 @@ pfcp_mock:unmock_all().
+erab_fsm_info(Pid, Key) -> + Info = erab_fsm:fetch_info(Pid), + proplists:get_value(Key, Info). + + %% ------------------------------------------------------------------ %% testcase descriptions %% ------------------------------------------------------------------ @@ -52,6 +57,13 @@ ?TC(fun test_erab_release_pfcp_delete_error/1)}].
+erab_info_test_() -> + [{"E-RAB info :: state", + ?TC(fun test_erab_info_state/1)}, + {"E-RAB info :: F-TEIDs", + ?TC(fun test_erab_info_f_teid/1)}]. + + erab_shutdown_test_() -> [{"E-RAB shutdown (no session)", ?TC(fun test_erab_shutdown_no_session/1)}, @@ -120,6 +132,30 @@ ?_assertNot(erlang:is_process_alive(Pid))].
+test_erab_info_state(Pid) -> + [?_assertEqual(erab_wait_setup_req, erab_fsm_info(Pid, state)), + ?_assertEqual({ok, ?A2U}, erab_fsm:erab_setup_req(Pid, ?U2C)), + ?_assertEqual(erab_wait_setup_rsp, erab_fsm_info(Pid, state)), + ?_assertEqual({ok, ?C2U}, erab_fsm:erab_setup_rsp(Pid, ?U2A)), + ?_assertEqual(erab_setup, erab_fsm_info(Pid, state)), + ?_assertEqual(ok, erab_fsm:erab_release_cmd(Pid)), + ?_assertEqual(erab_wait_release_rsp, erab_fsm_info(Pid, state)), + ?_assertEqual(ok, erab_fsm:erab_release_rsp(Pid)), + ?_assertNot(erlang:is_process_alive(Pid))]. + + +test_erab_info_f_teid(Pid) -> + [?_assertEqual({ok, ?A2U}, erab_fsm:erab_setup_req(Pid, ?U2C)), + ?_assertEqual(?U2C, erab_fsm_info(Pid, f_teid_u2c)), + ?_assertEqual(?A2U, erab_fsm_info(Pid, f_teid_a2u)), + ?_assertEqual({ok, ?C2U}, erab_fsm:erab_setup_rsp(Pid, ?U2A)), + ?_assertEqual(?U2A, erab_fsm_info(Pid, f_teid_u2a)), + ?_assertEqual(?C2U, erab_fsm_info(Pid, f_teid_c2u)), + ?_assertEqual(ok, erab_fsm:erab_release_cmd(Pid)), + ?_assertEqual(ok, erab_fsm:erab_release_rsp(Pid)), + ?_assertNot(erlang:is_process_alive(Pid))]. + + test_erab_shutdown_no_session(Pid) -> %% pfcp_peer:session_delete_req/1 shall not be called ok = pfcp_mock:unmock_req(session_delete_req, 1),