This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
stellar-stellar/src/session/test/gtest_session_timer.cpp

202 lines
5.7 KiB
C++
Raw Normal View History

2023-12-12 18:41:53 +08:00
#include <gtest/gtest.h>
#include "session_timer.h"
#include "session_private.h"
2023-12-13 19:20:34 +08:00
static void session_expire(struct session *sess, void *arg)
2023-12-12 18:41:53 +08:00
{
printf("=== session %lu expired ===\n", session_get_id(sess));
}
TEST(SESSION_TIMER, ADD_DEL)
{
struct session sess;
struct session_timer *timer = session_timer_new();
2023-12-12 18:41:53 +08:00
EXPECT_TRUE(timer != NULL);
session_init(&sess);
session_set_id(&sess, 1);
2023-12-13 19:20:34 +08:00
session_set_expirecb(&sess, session_expire, NULL, 1000);
2023-12-12 18:41:53 +08:00
session_timer_add(timer, &sess);
session_timer_del(timer, &sess);
2023-12-12 18:41:53 +08:00
session_timer_free(timer);
2023-12-12 18:41:53 +08:00
}
TEST(SESSION_TIMER, EXPIRE)
{
struct session *sess = NULL;
struct session sess1;
struct session sess2;
struct session sess3;
struct session_timer *timer = session_timer_new();
2023-12-12 18:41:53 +08:00
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);
2023-12-13 19:20:34 +08:00
session_set_expirecb(&sess1, session_expire, NULL, 5);
session_set_expirecb(&sess2, session_expire, NULL, 5);
session_set_expirecb(&sess3, session_expire, NULL, 10);
2023-12-12 18:41:53 +08:00
session_timer_add(timer, &sess1);
session_timer_add(timer, &sess2);
session_timer_add(timer, &sess3);
2023-12-12 18:41:53 +08:00
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(timer, abs_current_ts);
2023-12-12 18:41:53 +08:00
if (sess != NULL)
{
session_run_expirecb(sess);
}
} while (sess);
}
session_timer_free(timer);
2023-12-12 18:41:53 +08:00
}
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_new();
2023-12-12 18:41:53 +08:00
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);
2023-12-13 19:20:34 +08:00
session_set_expirecb(&sess1, session_expire, NULL, 5);
session_set_expirecb(&sess2, session_expire, NULL, 5);
session_set_expirecb(&sess3, session_expire, NULL, 10);
2023-12-12 18:41:53 +08:00
session_timer_add(timer, &sess1);
session_timer_add(timer, &sess2);
session_timer_add(timer, &sess3);
2023-12-12 18:41:53 +08:00
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(timer, &sess2);
2023-12-12 18:41:53 +08:00
}
do
{
sess = session_timer_expire(timer, abs_current_ts);
2023-12-12 18:41:53 +08:00
if (sess != NULL)
{
session_run_expirecb(sess);
}
} while (sess);
}
session_timer_free(timer);
2023-12-12 18:41:53 +08:00
}
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_new();
2023-12-12 18:41:53 +08:00
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);
2023-12-13 19:20:34 +08:00
session_set_expirecb(&sess1, session_expire, NULL, 5);
session_set_expirecb(&sess2, session_expire, NULL, 5);
session_set_expirecb(&sess3, session_expire, NULL, 10);
2023-12-12 18:41:53 +08:00
session_timer_add(timer, &sess1);
session_timer_add(timer, &sess2);
session_timer_add(timer, &sess3);
2023-12-12 18:41:53 +08:00
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(timer, &sess2);
2023-12-13 19:20:34 +08:00
session_set_expirecb(&sess2, session_expire, NULL, 8);
session_timer_add(timer, &sess2);
2023-12-12 18:41:53 +08:00
}
do
{
sess = session_timer_expire(timer, abs_current_ts);
2023-12-12 18:41:53 +08:00
if (sess != NULL)
{
session_run_expirecb(sess);
}
} while (sess);
}
session_timer_free(timer);
2023-12-12 18:41:53 +08:00
}
TEST(SESSION_TIMER, NEXT_EXPIRE_INTERVAL)
{
struct session sess1;
struct session sess2;
struct session_timer *timer = session_timer_new();
EXPECT_TRUE(timer != NULL);
session_init(&sess1);
session_init(&sess2);
session_set_id(&sess1, 1);
session_set_id(&sess2, 2);
session_set_expirecb(&sess1, session_expire, NULL, 1000);
session_set_expirecb(&sess2, session_expire, NULL, 1000);
EXPECT_TRUE(session_timer_next_expire_interval(timer) == UINT64_MAX);
session_timer_add(timer, &sess1);
session_timer_add(timer, &sess2);
EXPECT_TRUE(session_timer_next_expire_interval(timer) < UINT64_MAX);
EXPECT_TRUE(session_timer_expire(timer, 900) == NULL);
EXPECT_TRUE(session_timer_next_expire_interval(timer) <= 1000 - 900);
EXPECT_TRUE(session_timer_expire(timer, 950) == NULL);
EXPECT_TRUE(session_timer_next_expire_interval(timer) <= 1000 - 950);
EXPECT_TRUE(session_timer_expire(timer, 980) == NULL);
EXPECT_TRUE(session_timer_next_expire_interval(timer) <= 1000 - 980);
EXPECT_TRUE(session_timer_expire(timer, 990) == NULL);
EXPECT_TRUE(session_timer_next_expire_interval(timer) <= 1000 - 990);
EXPECT_TRUE(session_timer_expire(timer, 1010));
EXPECT_TRUE(session_timer_next_expire_interval(timer) == 0);
EXPECT_TRUE(session_timer_expire(timer, 1010));
EXPECT_TRUE(session_timer_next_expire_interval(timer) == UINT64_MAX);
session_timer_free(timer);
}
2023-12-12 18:41:53 +08:00
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}