#include #include "session_timer.h" #include "session_private.h" static void session_expire(struct session *sess, void *arg) { printf("=== session %lu expired ===\n", session_get_id(sess)); } TEST(SESSION_TIMER, ADD_DEL) { struct session sess; struct session_timer *timer = session_timer_create(); EXPECT_TRUE(timer != NULL); session_init(&sess); session_set_id(&sess, 1); session_set_expirecb(&sess, session_expire, NULL, 1000); session_timer_add_session(timer, &sess); session_timer_del_session(timer, &sess); session_timer_destroy(timer); } TEST(SESSION_TIMER, EXPIRE) { struct session *sess = NULL; struct session sess1; struct session sess2; struct session sess3; struct session_timer *timer = session_timer_create(); EXPECT_TRUE(timer != NULL); session_init(&sess1); session_init(&sess2); session_init(&sess3); session_set_id(&sess1, 1); session_set_id(&sess2, 2); session_set_id(&sess3, 3); session_set_expirecb(&sess1, session_expire, NULL, 5); session_set_expirecb(&sess2, session_expire, NULL, 5); session_set_expirecb(&sess3, session_expire, NULL, 10); session_timer_add_session(timer, &sess1); session_timer_add_session(timer, &sess2); session_timer_add_session(timer, &sess3); for (uint64_t abs_current_ts = 0; abs_current_ts < 15; abs_current_ts++) { printf("current timestamp %lu\n", abs_current_ts); do { sess = session_timer_expire_session(timer, abs_current_ts); if (sess != NULL) { session_run_expirecb(sess); } } while (sess); } session_timer_destroy(timer); } TEST(SESSION_TIMER, BEFORE_EXPIRE_DEL) { struct session *sess = NULL; struct session sess1; struct session sess2; struct session sess3; struct session_timer *timer = session_timer_create(); EXPECT_TRUE(timer != NULL); session_init(&sess1); session_init(&sess2); session_init(&sess3); session_set_id(&sess1, 1); session_set_id(&sess2, 2); session_set_id(&sess3, 3); session_set_expirecb(&sess1, session_expire, NULL, 5); session_set_expirecb(&sess2, session_expire, NULL, 5); session_set_expirecb(&sess3, session_expire, NULL, 10); session_timer_add_session(timer, &sess1); session_timer_add_session(timer, &sess2); session_timer_add_session(timer, &sess3); for (uint64_t abs_current_ts = 0; abs_current_ts < 15; abs_current_ts++) { printf("current timestamp %lu\n", abs_current_ts); if (abs_current_ts == 2) { printf("delete timer 2\n"); session_timer_del_session(timer, &sess2); } do { sess = session_timer_expire_session(timer, abs_current_ts); if (sess != NULL) { session_run_expirecb(sess); } } while (sess); } session_timer_destroy(timer); } TEST(SESSION_TIMER, BEFORE_EXPIRE_UPDATE) { struct session *sess = NULL; struct session sess1; struct session sess2; struct session sess3; struct session_timer *timer = session_timer_create(); EXPECT_TRUE(timer != NULL); session_init(&sess1); session_init(&sess2); session_init(&sess3); session_set_id(&sess1, 1); session_set_id(&sess2, 2); session_set_id(&sess3, 3); session_set_expirecb(&sess1, session_expire, NULL, 5); session_set_expirecb(&sess2, session_expire, NULL, 5); session_set_expirecb(&sess3, session_expire, NULL, 10); session_timer_add_session(timer, &sess1); session_timer_add_session(timer, &sess2); session_timer_add_session(timer, &sess3); for (uint64_t abs_current_ts = 0; abs_current_ts < 15; abs_current_ts++) { printf("current timestamp %lu\n", abs_current_ts); if (abs_current_ts == 2) { printf("update timer 2\n"); session_timer_del_session(timer, &sess2); session_set_expirecb(&sess2, session_expire, NULL, 8); session_timer_add_session(timer, &sess2); } do { sess = session_timer_expire_session(timer, abs_current_ts); if (sess != NULL) { session_run_expirecb(sess); } } while (sess); } session_timer_destroy(timer); } int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }