diff options
Diffstat (limited to 'tests/fsm/fsm_test.c')
-rw-r--r-- | tests/fsm/fsm_test.c | 82 |
1 files changed, 77 insertions, 5 deletions
diff --git a/tests/fsm/fsm_test.c b/tests/fsm/fsm_test.c index fe48b2ba..960042c7 100644 --- a/tests/fsm/fsm_test.c +++ b/tests/fsm/fsm_test.c @@ -172,7 +172,7 @@ static struct osmo_fsm_inst *foo(void) return fi; } -static void test_id_api() +static void test_id_api(void) { struct osmo_fsm_inst *fi; @@ -280,7 +280,7 @@ const struct timeval fake_time_start_time = { 123, 456 }; osmo_timers_update(); \ } while (0) -void fake_time_start() +void fake_time_start(void) { struct timespec *clock_override; @@ -301,7 +301,7 @@ static int timer_cb(struct osmo_fsm_inst *fi) return 0; } -static void test_state_chg_keep_timer() +static void test_state_chg_keep_timer(void) { struct osmo_fsm_inst *fi; @@ -349,7 +349,7 @@ static void test_state_chg_keep_timer() fprintf(stderr, "--- %s() done\n", __func__); } -static void test_state_chg_T() +static void test_state_chg_T(void) { struct osmo_fsm_inst *fi; @@ -386,6 +386,74 @@ static void test_state_chg_T() fprintf(stderr, "--- %s() done\n", __func__); } +/* Test setting a state timeout with second granularity */ +static void test_state_chg_Ts(void) +{ + struct osmo_fsm_inst *fi; + + fprintf(stderr, "\n--- %s()\n", __func__); + + fsm.timer_cb = &timer_cb; + timeout_fired = -1; + fake_time_start(); + + fi = osmo_fsm_inst_alloc(&fsm, g_ctx, NULL, LOGL_DEBUG, NULL); + OSMO_ASSERT(fi); + + osmo_fsm_inst_state_chg(fi, ST_ONE, 8, 4242); + OSMO_ASSERT(timeout_fired == -1); + + fake_time_passes(3, 0); /* +3s */ + OSMO_ASSERT(timeout_fired == -1); + + fake_time_passes(2, 500000); /* +2.5s */ + OSMO_ASSERT(timeout_fired == -1); + + fake_time_passes(2, 500000); /* +2.5s */ + OSMO_ASSERT(timeout_fired == 4242); + + osmo_fsm_inst_term(fi, OSMO_FSM_TERM_REQUEST, NULL); + + fprintf(stderr, "--- %s() done\n", __func__); +} + +/* Test setting a state timeout with millisecond granularity */ +static void test_state_chg_Tms(void) +{ + struct osmo_fsm_inst *fi; + + fprintf(stderr, "\n--- %s()\n", __func__); + + fsm.timer_cb = &timer_cb; + timeout_fired = -1; + fake_time_start(); + + fi = osmo_fsm_inst_alloc(&fsm, g_ctx, NULL, LOGL_DEBUG, NULL); + OSMO_ASSERT(fi); + + osmo_fsm_inst_state_chg_ms(fi, ST_ONE, 1337, 4242); /* 1s 337ms */ + OSMO_ASSERT(timeout_fired == -1); + + fake_time_passes(0, 500000); /* +500ms, 500ms total */ + OSMO_ASSERT(timeout_fired == -1); + + fake_time_passes(0, 250000); /* +250ms, 750ms total */ + OSMO_ASSERT(timeout_fired == -1); + + fake_time_passes(0, 350000); /* +350ms, 1s 100ms total */ + OSMO_ASSERT(timeout_fired == -1); + + fake_time_passes(0, 200000); /* +200ms, 1s 300ms total */ + OSMO_ASSERT(timeout_fired == -1); + + fake_time_passes(0, 37000); /* +37ms, 1s 337ms total */ + OSMO_ASSERT(timeout_fired == 4242); + + osmo_fsm_inst_term(fi, OSMO_FSM_TERM_REQUEST, NULL); + + fprintf(stderr, "--- %s() done\n", __func__); +} + static const struct log_info_cat default_categories[] = { [DMAIN] = { .name = "DMAIN", @@ -412,8 +480,10 @@ int main(int argc, char **argv) log_init(&log_info, NULL); stderr_target = log_target_create_stderr(); log_add_target(stderr_target); - log_set_print_filename(stderr_target, 0); + log_set_print_filename2(stderr_target, LOG_FILENAME_NONE); log_set_use_color(stderr_target, 0); + log_set_print_category(stderr_target, 0); + log_set_print_category_hex(stderr_target, 0); g_ctrl = ctrl_handle_alloc(NULL, NULL, NULL); g_ctx = NULL; @@ -432,6 +502,8 @@ int main(int argc, char **argv) test_id_api(); test_state_chg_keep_timer(); test_state_chg_T(); + test_state_chg_Ts(); + test_state_chg_Tms(); osmo_fsm_unregister(&fsm); exit(0); |