fixeria submitted this change.
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(-)
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),
To view, visit change 38781. To unsubscribe, or for help writing mail filters, visit settings.