diff --git a/src/session/test/CMakeLists.txt b/src/session/test/CMakeLists.txt index fcd1cfa..c86773e 100644 --- a/src/session/test/CMakeLists.txt +++ b/src/session/test/CMakeLists.txt @@ -20,10 +20,14 @@ target_link_libraries(gtest_session_queue session_manager gtest) add_executable(gtest_tcp_init_to_opening gtest_tcp_init_to_opening.cpp) target_link_libraries(gtest_tcp_init_to_opening session_manager gtest) +add_executable(gtest_tcp_opening_to_active gtest_tcp_opening_to_active.cpp) +target_link_libraries(gtest_tcp_opening_to_active session_manager gtest) + include(GoogleTest) gtest_discover_tests(gtest_session) gtest_discover_tests(gtest_session_pool) gtest_discover_tests(gtest_session_table) gtest_discover_tests(gtest_session_timer) gtest_discover_tests(gtest_session_queue) -gtest_discover_tests(gtest_tcp_init_to_opening) \ No newline at end of file +gtest_discover_tests(gtest_tcp_init_to_opening) +gtest_discover_tests(gtest_tcp_opening_to_active) \ No newline at end of file diff --git a/src/session/test/gtest_tcp_init_to_opening.cpp b/src/session/test/gtest_tcp_init_to_opening.cpp index afe9024..6c8faea 100644 --- a/src/session/test/gtest_tcp_init_to_opening.cpp +++ b/src/session/test/gtest_tcp_init_to_opening.cpp @@ -1,5 +1,4 @@ // TCP state machine test: init -> opening -// TODO #include diff --git a/src/session/test/gtest_tcp_opening_to_active.cpp b/src/session/test/gtest_tcp_opening_to_active.cpp new file mode 100644 index 0000000..1e3e068 --- /dev/null +++ b/src/session/test/gtest_tcp_opening_to_active.cpp @@ -0,0 +1,283 @@ +// TCP state machine test: opening -> active + +#include + +#include "session_private.h" +#include "timestamp.h" +#include "session_manager.h" +#include "ipv4_helpers.h" +#include "test_packets.h" + +struct session_manager_config config = { + // max session number + .max_tcp_session_num = 3, + .max_udp_session_num = 3, + + // tcp timeout + .tcp_timeout_init = 2, + .tcp_timeout_handshake = 2, + .tcp_timeout_data = 2, + .tcp_timeout_half_closed = 2, + .tcp_timeout_time_wait = 2, + .tcp_timeout_discard = 2, + + // udp timeout + .udp_timeout_data = 1, + + // tcp duplicate packet filter + .tcp_dupkt_filter_enable = 1, + .tcp_dupkt_filter_capacity = 1000, + .tcp_dupkt_filter_timeout = 10, + .tcp_dupkt_filter_error_rate = 0.0001, + + // udp eviction filter + .udp_eviction_filter_enable = 1, + .udp_eviction_filter_capacity = 1000, + .udp_eviction_filter_timeout = 10, + .udp_eviction_filter_error_rate = 0.0001, +}; + +static void __session_dispatch(struct session *sess) +{ + if (sess == NULL) + { + return; + } + + printf("\n"); + printf("=> session dispatch: %p\n", sess); + session_dump(sess); + printf("<= session dispatch\n"); + printf("\n"); + + session_set0_cur_pkt(sess, NULL); + session_set_cur_dir(sess, SESSION_DIR_NONE); +} + +/****************************************************************************** + * case: TCP opening -> active (by C2S DATA) + ******************************************************************************/ + +#if 1 +TEST(TCP_OPENING_TO_ACTIVE, BY_SYN_C2S_DATA) +{ + char buffer[1024] = {0}; + struct packet pkt; + struct session *sess = NULL; + struct session_manager *mgr = NULL; + + timestamp_update(); + + mgr = session_manager_create(&config); + EXPECT_TRUE(mgr != NULL); + + // SYN Packet + printf("=> packet parse: TCP C2S SYN packet\n"); + packet_parse(&pkt, (const char *)tcp_pkt1_c2s_syn, sizeof(tcp_pkt1_c2s_syn)); + printf("<= packet parse\n\n"); + sess = session_manager_update_session(mgr, &pkt); + EXPECT_TRUE(sess); + + EXPECT_TRUE(session_get_id(sess) == 0); + tuple6_tostring(session_get0_key(sess), buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, domain: 0"); + EXPECT_TRUE(session_get_key_dir(sess) == SESSION_DIR_C2S); + EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_OPENING); + EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP); + EXPECT_TRUE(session_get_dup_traffic_flag(sess) == 0); + EXPECT_TRUE(session_get_closing_reasion(sess) == 0); + EXPECT_TRUE(session_get_c2s_bytes(sess) == 78); + EXPECT_TRUE(session_get_s2c_bytes(sess) == 0); + EXPECT_TRUE(session_get_c2s_packets(sess) == 1); + EXPECT_TRUE(session_get_s2c_packets(sess) == 0); + EXPECT_TRUE(session_get_create_time(sess) == timestamp_get_msec()); + EXPECT_TRUE(session_get_last_time(sess) == timestamp_get_msec()); + EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt); + EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S); + EXPECT_TRUE(session_get_tcp_state(sess) == TCP_SYN_RECVED); + EXPECT_TRUE(session_get0_c2s_1st_pkt(sess) != NULL); + EXPECT_TRUE(session_get0_s2c_1st_pkt(sess) == NULL); + EXPECT_TRUE(session_get0_1st_pkt(sess) == session_get0_c2s_1st_pkt(sess)); + + __session_dispatch(sess); + + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 1); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_CLOSING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_ACTIVE) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_OPENING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_CLOSING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_ACTIVE) == 0); + + sleep(1); + timestamp_update(); + + // C2S DATA Packet + printf("=> packet parse: TCP C2S DATA packet\n"); + packet_parse(&pkt, (const char *)tcp_pkt4_c2s_http_req, sizeof(tcp_pkt4_c2s_http_req)); + printf("<= packet parse\n\n"); + sess = session_manager_update_session(mgr, &pkt); + EXPECT_TRUE(sess); + + EXPECT_TRUE(session_get_id(sess) == 0); + tuple6_tostring(session_get0_key(sess), buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, domain: 0"); + EXPECT_TRUE(session_get_key_dir(sess) == SESSION_DIR_C2S); + EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE); + EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP); + EXPECT_TRUE(session_get_dup_traffic_flag(sess) == 0); + EXPECT_TRUE(session_get_closing_reasion(sess) == 0); + EXPECT_TRUE(session_get_c2s_bytes(sess) == 78 + 145); + EXPECT_TRUE(session_get_s2c_bytes(sess) == 0); + EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1); + EXPECT_TRUE(session_get_s2c_packets(sess) == 0); + EXPECT_TRUE(session_get_create_time(sess) < timestamp_get_msec()); + EXPECT_TRUE(session_get_last_time(sess) == timestamp_get_msec()); + EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt); + EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S); + EXPECT_TRUE(session_get_tcp_state(sess) == (TCP_SYN_RECVED | TCP_C2S_ACK_RECVED | TCP_C2S_DATA_RECVED)); + EXPECT_TRUE(session_get0_c2s_1st_pkt(sess) != NULL); + EXPECT_TRUE(session_get0_s2c_1st_pkt(sess) == NULL); + + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_CLOSING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_ACTIVE) == 1); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_OPENING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_CLOSING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_ACTIVE) == 0); + + for (int i = 0; i < 3; i++) + { + timestamp_update(); + __session_dispatch(session_manager_get_expired_session(mgr)); + __session_dispatch(session_manager_get_evicted_session(mgr)); + sleep(1); + } + + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_CLOSING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_ACTIVE) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_OPENING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_CLOSING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_ACTIVE) == 0); + + session_manager_destroy(mgr); +} +#endif + +/****************************************************************************** + * case: TCP opening -> active (by S2C DATA) + ******************************************************************************/ + +#if 1 +TEST(TCP_OPENING_TO_ACTIVE, BY_SYNACK_S2C_DATA) +{ + char buffer[1024] = {0}; + struct packet pkt; + struct session *sess = NULL; + struct session_manager *mgr = NULL; + + timestamp_update(); + + mgr = session_manager_create(&config); + EXPECT_TRUE(mgr != NULL); + + // SYNACK Packet + printf("=> packet parse: TCP S2C SYNACK packet\n"); + packet_parse(&pkt, (const char *)tcp_pkt2_s2c_syn_ack, sizeof(tcp_pkt2_s2c_syn_ack)); + printf("<= packet parse\n\n"); + sess = session_manager_update_session(mgr, &pkt); + EXPECT_TRUE(sess); + + EXPECT_TRUE(session_get_id(sess) == 0); + tuple6_tostring(session_get0_key(sess), buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "93.184.216.34:80 -> 192.168.38.105:60111, proto: 6, domain: 0"); + EXPECT_TRUE(session_get_key_dir(sess) == SESSION_DIR_S2C); + EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_OPENING); + EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP); + EXPECT_TRUE(session_get_dup_traffic_flag(sess) == 0); + EXPECT_TRUE(session_get_closing_reasion(sess) == 0); + EXPECT_TRUE(session_get_c2s_bytes(sess) == 0); + EXPECT_TRUE(session_get_s2c_bytes(sess) == 74); + EXPECT_TRUE(session_get_c2s_packets(sess) == 0); + EXPECT_TRUE(session_get_s2c_packets(sess) == 1); + EXPECT_TRUE(session_get_create_time(sess) == timestamp_get_msec()); + EXPECT_TRUE(session_get_last_time(sess) == timestamp_get_msec()); + EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt); + EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C); + EXPECT_TRUE(session_get_tcp_state(sess) == TCP_SYNACK_RECVED); + EXPECT_TRUE(session_get0_c2s_1st_pkt(sess) == NULL); + EXPECT_TRUE(session_get0_s2c_1st_pkt(sess) != NULL); + EXPECT_TRUE(session_get0_1st_pkt(sess) == session_get0_s2c_1st_pkt(sess)); + + __session_dispatch(sess); + + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 1); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_CLOSING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_ACTIVE) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_OPENING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_CLOSING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_ACTIVE) == 0); + + sleep(1); + timestamp_update(); + + // S2C DATA Packet + printf("=> packet parse: TCP S2C DATA packet\n"); + packet_parse(&pkt, (const char *)tcp_pkt6_s2c_http_resq_1, sizeof(tcp_pkt6_s2c_http_resq_1)); + printf("<= packet parse\n\n"); + sess = session_manager_update_session(mgr, &pkt); + EXPECT_TRUE(sess); + + EXPECT_TRUE(session_get_id(sess) == 0); + tuple6_tostring(session_get0_key(sess), buffer, sizeof(buffer)); + EXPECT_STREQ(buffer, "93.184.216.34:80 -> 192.168.38.105:60111, proto: 6, domain: 0"); + EXPECT_TRUE(session_get_key_dir(sess) == SESSION_DIR_S2C); + EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE); + EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP); + EXPECT_TRUE(session_get_dup_traffic_flag(sess) == 0); + EXPECT_TRUE(session_get_closing_reasion(sess) == 0); + EXPECT_TRUE(session_get_c2s_bytes(sess) == 0); + EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 1354); + EXPECT_TRUE(session_get_c2s_packets(sess) == 0); + EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1); + EXPECT_TRUE(session_get_create_time(sess) < timestamp_get_msec()); + EXPECT_TRUE(session_get_last_time(sess) == timestamp_get_msec()); + EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt); + EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C); + EXPECT_TRUE(session_get_tcp_state(sess) == (TCP_SYNACK_RECVED | TCP_S2C_ACK_RECVED | TCP_S2C_DATA_RECVED)); + EXPECT_TRUE(session_get0_c2s_1st_pkt(sess) == NULL); + EXPECT_TRUE(session_get0_s2c_1st_pkt(sess) != NULL); + + __session_dispatch(sess); + + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_CLOSING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_ACTIVE) == 1); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_OPENING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_CLOSING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_ACTIVE) == 0); + + for (int i = 0; i < 3; i++) + { + timestamp_update(); + __session_dispatch(session_manager_get_expired_session(mgr)); + __session_dispatch(session_manager_get_evicted_session(mgr)); + sleep(1); + } + + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_OPENING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_CLOSING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_TCP, SESSION_STATE_ACTIVE) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_OPENING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_CLOSING) == 0); + EXPECT_TRUE(session_manager_get_session_number(mgr, SESSION_TYPE_UDP, SESSION_STATE_ACTIVE) == 0); + + session_manager_destroy(mgr); +} +#endif + +int main(int argc, char **argv) +{ + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}