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/tcp_reassembly/test/gtest_tcp_reassembly.cpp

303 lines
8.5 KiB
C++
Raw Normal View History

2024-03-21 19:27:41 +08:00
#include <gtest/gtest.h>
#include "tcp_reassembly.h"
#if 0
const char *session_peek_tcp_payload(struct session *session, uint32_t *len)
{
struct session_dir *dir = session_get_cur_dir(session);
struct tcp_reassembly *assembler = session_get_tcp_reassembly(session);
return tcp_reassembly_peek(assembler, dir, len);
}
void session_consume_tcp_payload(struct session *session, uint32_t len)
{
struct session_dir *dir = session_get_cur_dir(session);
struct tcp_reassembly *assembler = session_get_tcp_reassembly(session);
tcp_reassembly_consume(assembler, dir, len);
}
#endif
#if 1
TEST(TCP_REASSEMBLY, TEST_C2S)
{
uint32_t len;
int dir = 1;
const char *ptr;
struct tcp_reassembly *assembler;
assembler = tcp_reassembly_new(1, 10, 16, 1500);
EXPECT_TRUE(assembler != NULL);
tcp_reassembly_init(assembler, 99, 199);
/*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|g|h|i|j|A|B|C|D|E|F|G|H|I|J|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | | |
* +---> 90 +---> 100 +---> 110
*/
// C2S
tcp_reassembly_update(assembler, dir, 90, (const char *)"0123456789", 10, 0);
tcp_reassembly_update(assembler, dir, 100, (const char *)"abcdefghij", 10, 0);
tcp_reassembly_update(assembler, dir, 110, (const char *)"ABCDEFGHIJ", 10, 0);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr != NULL);
EXPECT_TRUE(len == 10);
EXPECT_TRUE(memcmp(ptr, "abcdefghij", len) == 0);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr != NULL);
EXPECT_TRUE(len == 10);
EXPECT_TRUE(memcmp(ptr, "abcdefghij", len) == 0);
tcp_reassembly_consume(assembler, dir, len);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr != NULL);
EXPECT_TRUE(len == 10);
EXPECT_TRUE(memcmp(ptr, "ABCDEFGHIJ", len) == 0);
tcp_reassembly_consume(assembler, dir, len);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr == NULL);
tcp_reassembly_free(assembler);
}
#endif
#if 1
TEST(TCP_REASSEMBLY, TEST_S2C)
{
uint32_t len;
int dir = 2;
const char *ptr;
struct tcp_reassembly *assembler;
assembler = tcp_reassembly_new(1, 10, 16, 1500);
EXPECT_TRUE(assembler != NULL);
tcp_reassembly_init(assembler, 199, 99);
/*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|g|h|i|j|A|B|C|D|E|F|G|H|I|J|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | | |
* +---> 90 +---> 100 +---> 110
*/
// C2S
tcp_reassembly_update(assembler, dir, 90, (const char *)"0123456789", 10, 0);
tcp_reassembly_update(assembler, dir, 100, (const char *)"abcdefghij", 10, 0);
tcp_reassembly_update(assembler, dir, 110, (const char *)"ABCDEFGHIJ", 10, 0);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr != NULL);
EXPECT_TRUE(len == 10);
EXPECT_TRUE(memcmp(ptr, "abcdefghij", len) == 0);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr != NULL);
EXPECT_TRUE(len == 10);
EXPECT_TRUE(memcmp(ptr, "abcdefghij", len) == 0);
tcp_reassembly_consume(assembler, dir, len);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr != NULL);
EXPECT_TRUE(len == 10);
EXPECT_TRUE(memcmp(ptr, "ABCDEFGHIJ", len) == 0);
tcp_reassembly_consume(assembler, dir, len);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr == NULL);
tcp_reassembly_free(assembler);
}
#endif
#if 1
TEST(TCP_REASSEMBLY, REPEAT1)
{
uint32_t len;
int dir = 1;
const char *ptr;
struct tcp_reassembly *assembler;
assembler = tcp_reassembly_new(1, 10, 16, 1500);
EXPECT_TRUE(assembler != NULL);
tcp_reassembly_init(assembler, 99, 199);
/*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|g|h|i|j|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | |A|B|C|D|E|F|G|H|I|J|
* | +-+-+-+-+-+-+-+-+-+-+
* | | |
* +---> 90 +---> 100 +---> 109
*/
// C2S
tcp_reassembly_update(assembler, dir, 90, (const char *)"0123456789", 10, 0);
tcp_reassembly_update(assembler, dir, 100, (const char *)"abcdefghij", 10, 0);
tcp_reassembly_update(assembler, dir, 100, (const char *)"ABCDEFGHIJ", 10, 0);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr != NULL);
EXPECT_TRUE(len == 10);
EXPECT_TRUE(memcmp(ptr, "abcdefghij", len) == 0);
tcp_reassembly_consume(assembler, dir, len);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr == NULL);
tcp_reassembly_free(assembler);
}
#endif
#if 1
TEST(TCP_REASSEMBLY, REPEAT2)
{
uint32_t len;
int dir = 1;
const char *ptr;
struct tcp_reassembly *assembler;
assembler = tcp_reassembly_new(1, 10, 16, 1500);
EXPECT_TRUE(assembler != NULL);
tcp_reassembly_init(assembler, 99, 199);
/*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |0|1|2|3|4|5|6|7|8|9|A|B|C|D|E|F|G|H|I|J|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* | |a|b|c|d|e|f|g|h|i|j|
* | +-+-+-+-+-+-+-+-+-+-+
* | | |
* +---> 90 +---> 100 +---> 109
*/
// C2S
tcp_reassembly_update(assembler, dir, 90, (const char *)"0123456789", 10, 0);
tcp_reassembly_update(assembler, dir, 100, (const char *)"ABCDEFGHIJ", 10, 0);
tcp_reassembly_update(assembler, dir, 100, (const char *)"abcdefghij", 10, 0);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr != NULL);
EXPECT_TRUE(len == 10);
EXPECT_TRUE(memcmp(ptr, "ABCDEFGHIJ", len) == 0);
tcp_reassembly_consume(assembler, dir, len);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr == NULL);
tcp_reassembly_free(assembler);
}
#endif
#if 1
TEST(TCP_REASSEMBLY, OVERLAP)
{
uint32_t len;
int dir = 1;
const char *ptr;
struct tcp_reassembly *assembler;
assembler = tcp_reassembly_new(1, 10, 16, 1500);
EXPECT_TRUE(assembler != NULL);
tcp_reassembly_init(assembler, 89, 199);
/*
* +-+-+-+-+-+-+-+-+-+-+
* |0|1|2|3|4|5|6|7|8|9|
* +-+-+-+-+-+-+-+-+-+-+
* | +-+-+-+-+-+-+-+-+-+-+
* | |a|b|c|d|e|f|g|h|i|j|
* | +-+-+-+-+-+-+-+-+-+-+
* | | | +-+-+-+-+-+-+-+-+-+-+
* | | | |A|B|C|D|E|F|G|H|I|J|
* | | | +-+-+-+-+-+-+-+-+-+-+
* | | | | | |
* | | | | | +---> 111
* | | | | +---> 105
* | | | +---> 102
* | | +---> 99
* | +---> 96
* +---> 90
*
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
* |0|1|2|3|4|5|6|7|8|9|e|f|g|h|i|j|E|F|G|H|I|J|
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*/
// C2S
tcp_reassembly_update(assembler, dir, 90, (const char *)"0123456789", 10, 0);
tcp_reassembly_update(assembler, dir, 96, (const char *)"abcdefghij", 10, 0);
tcp_reassembly_update(assembler, dir, 102, (const char *)"ABCDEFGHIJ", 10, 0);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr != NULL);
EXPECT_TRUE(len == 10);
EXPECT_TRUE(memcmp(ptr, "0123456789", len) == 0);
tcp_reassembly_consume(assembler, dir, len);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr != NULL);
EXPECT_TRUE(len == 6);
EXPECT_TRUE(memcmp(ptr, "efghij", len) == 0);
tcp_reassembly_consume(assembler, dir, len);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr != NULL);
EXPECT_TRUE(len == 6);
EXPECT_TRUE(memcmp(ptr, "EFGHIJ", len) == 0);
tcp_reassembly_consume(assembler, dir, len);
ptr = tcp_reassembly_peek(assembler, dir, &len);
EXPECT_TRUE(ptr == NULL);
tcp_reassembly_free(assembler);
}
#endif
#if 1
TEST(TCP_REASSEMBLY, MAX_TIMEOUT)
{
// TODO
}
#endif
#if 1
TEST(TCP_REASSEMBLY, MAX_PACKETS)
{
// TODO
}
#endif
#if 1
TEST(TCP_REASSEMBLY, MAX_BYTES)
{
// TODO
}
#endif
#if 1
TEST(TCP_REASSEMBLY, SEQ_WRAPAROUND)
{
// TODO
}
#endif
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}