From 477d99f7c9f30bf485abe72e119bb1a1bd1e6157 Mon Sep 17 00:00:00 2001 From: Vadim Yanitskiy Date: Wed, 27 Dec 2023 04:46:51 +0700 Subject: tests/fsm: also test .onenter and .onleave callbacks Extend the existing testing coverage to check per-state enter/leave callbacks. An interesting behavior can be seen from the test output: when allocating an FSM instance, the .onenter callback is not being called for the initial FSM state (ST_NULL). Likewise, the .onleave callback is not being called when free()ing an FSM instance. Change-Id: I22edcf91375a09854f0dab1e2e02e034629310f7 --- tests/fsm/fsm_test.c | 18 ++++++++++++++++++ tests/fsm/fsm_test.err | 24 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/tests/fsm/fsm_test.c b/tests/fsm/fsm_test.c index 960042c7..3b839412 100644 --- a/tests/fsm/fsm_test.c +++ b/tests/fsm/fsm_test.c @@ -41,6 +41,18 @@ static const struct value_string test_fsm_event_names[] = { { 0, NULL } }; +static void test_fsm_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state) +{ + LOGPFSM(fi, "%s() prev_state=%s\n", + __func__, osmo_fsm_state_name(fi->fsm, prev_state)); +} + +static void test_fsm_onleave(struct osmo_fsm_inst *fi, uint32_t next_state) +{ + LOGPFSM(fi, "%s() next_state=%s\n", + __func__, osmo_fsm_state_name(fi->fsm, next_state)); +} + static void test_fsm_null(struct osmo_fsm_inst *fi, uint32_t event, void *data) { switch (event) { @@ -86,17 +98,23 @@ static struct osmo_fsm_state test_fsm_states[] = { .out_state_mask = (1 << ST_ONE), .name = "NULL", .action = test_fsm_null, + .onenter = test_fsm_onenter, + .onleave = test_fsm_onleave, }, [ST_ONE]= { .in_event_mask = (1 << EV_B), .out_state_mask = (1 << ST_TWO), .name = "ONE", .action= test_fsm_one, + .onenter = test_fsm_onenter, + .onleave = test_fsm_onleave, }, [ST_TWO]= { .in_event_mask = 0, .name = "TWO", .action = NULL, + .onenter = test_fsm_onenter, + .onleave = test_fsm_onleave, }, }; diff --git a/tests/fsm/fsm_test.err b/tests/fsm/fsm_test.err index 51bf5da3..fffb9136 100644 --- a/tests/fsm/fsm_test.err +++ b/tests/fsm/fsm_test.err @@ -3,9 +3,13 @@ Test_FSM(my_id){NULL}: Allocated Test_FSM(my_id){NULL}: Received Event EV_B Test_FSM(my_id){NULL}: Event EV_B not permitted Test_FSM(my_id){NULL}: Received Event EV_A +Test_FSM(my_id){NULL}: test_fsm_onleave() next_state=ONE Test_FSM(my_id){NULL}: State change to ONE (no timeout) +Test_FSM(my_id){ONE}: test_fsm_onenter() prev_state=NULL Test_FSM(my_id){ONE}: Received Event EV_B +Test_FSM(my_id){ONE}: test_fsm_onleave() next_state=TWO Test_FSM(my_id){ONE}: State change to TWO (T2342, 1s) +Test_FSM(my_id){TWO}: test_fsm_onenter() prev_state=ONE Test_FSM(my_id){TWO}: Timeout of T2342 Timer Test_FSM(my_id){TWO}: Deallocated @@ -83,16 +87,24 @@ Test_FSM(arbitrary_id){NULL}: Deallocated --- test_state_chg_keep_timer() Test_FSM{NULL}: Allocated +Test_FSM{NULL}: test_fsm_onleave() next_state=ONE Test_FSM{NULL}: State change to ONE (no timeout) +Test_FSM{ONE}: test_fsm_onenter() prev_state=NULL +Test_FSM{ONE}: test_fsm_onleave() next_state=TWO Test_FSM{ONE}: State change to TWO (no timeout) +Test_FSM{TWO}: test_fsm_onenter() prev_state=ONE Test_FSM{TWO}: Terminating (cause = OSMO_FSM_TERM_REQUEST) Test_FSM{TWO}: Freeing instance Test_FSM{TWO}: Deallocated Total time passed: 0.000000 s Test_FSM{NULL}: Allocated +Test_FSM{NULL}: test_fsm_onleave() next_state=ONE Test_FSM{NULL}: State change to ONE (T10, 10s) +Test_FSM{ONE}: test_fsm_onenter() prev_state=NULL Total time passed: 2.000342 s +Test_FSM{ONE}: test_fsm_onleave() next_state=TWO Test_FSM{ONE}: State change to TWO (keeping T10, 7.999s remaining) +Test_FSM{TWO}: test_fsm_onenter() prev_state=ONE Total time passed: 2.000342 s Total time passed: 9.999999 s Total time passed: 10.000000 s @@ -104,14 +116,22 @@ Test_FSM{TWO}: Deallocated --- test_state_chg_T() Test_FSM{NULL}: Allocated +Test_FSM{NULL}: test_fsm_onleave() next_state=ONE Test_FSM{NULL}: State change to ONE (T42, 23s) +Test_FSM{ONE}: test_fsm_onenter() prev_state=NULL +Test_FSM{ONE}: test_fsm_onleave() next_state=TWO Test_FSM{ONE}: State change to TWO (no timeout) +Test_FSM{TWO}: test_fsm_onenter() prev_state=ONE Test_FSM{TWO}: Terminating (cause = OSMO_FSM_TERM_REQUEST) Test_FSM{TWO}: Freeing instance Test_FSM{TWO}: Deallocated Test_FSM{NULL}: Allocated +Test_FSM{NULL}: test_fsm_onleave() next_state=ONE Test_FSM{NULL}: State change to ONE (T42, 23s) +Test_FSM{ONE}: test_fsm_onenter() prev_state=NULL +Test_FSM{ONE}: test_fsm_onleave() next_state=TWO Test_FSM{ONE}: State change to TWO (no timeout) +Test_FSM{TWO}: test_fsm_onenter() prev_state=ONE Test_FSM{TWO}: Terminating (cause = OSMO_FSM_TERM_REQUEST) Test_FSM{TWO}: Freeing instance Test_FSM{TWO}: Deallocated @@ -120,7 +140,9 @@ Test_FSM{TWO}: Deallocated --- test_state_chg_Ts() Total time passed: 0.000000 s Test_FSM{NULL}: Allocated +Test_FSM{NULL}: test_fsm_onleave() next_state=ONE Test_FSM{NULL}: State change to ONE (T4242, 8s) +Test_FSM{ONE}: test_fsm_onenter() prev_state=NULL Total time passed: 3.000000 s Total time passed: 5.500000 s Total time passed: 8.000000 s @@ -133,7 +155,9 @@ Test_FSM{ONE}: Deallocated --- test_state_chg_Tms() Total time passed: 0.000000 s Test_FSM{NULL}: Allocated +Test_FSM{NULL}: test_fsm_onleave() next_state=ONE Test_FSM{NULL}: State change to ONE (T4242, 1337ms) +Test_FSM{ONE}: test_fsm_onenter() prev_state=NULL Total time passed: 0.500000 s Total time passed: 0.750000 s Total time passed: 1.100000 s -- cgit v1.2.3