|
|
|
|
@ -91,15 +91,14 @@ static void test_basic_send_recv(void) {
|
|
|
|
|
ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0, "socketpair failed"); |
|
|
|
|
for (int i = 0; i < 2; i++) fcntl(sv[i], F_SETFL, fcntl(sv[i], F_GETFL, 0) | O_NONBLOCK); |
|
|
|
|
|
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, on_fin, on_error, NULL); |
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, 0, on_fin, on_error, NULL); |
|
|
|
|
ASSERT_TRUE(tc != NULL, "tcp_conn_create failed"); |
|
|
|
|
|
|
|
|
|
// Отправляем данные через tcp_conn
|
|
|
|
|
// push_write отправляет данные синхронно через write_queue_fetch_cb
|
|
|
|
|
uint8_t send_buf[3000]; |
|
|
|
|
memset(send_buf, 'A', sizeof(send_buf)); |
|
|
|
|
int ret = push_write(tc, send_buf, sizeof(send_buf)); |
|
|
|
|
ASSERT_EQ(ret, 0, "push_write first call failed"); |
|
|
|
|
uasync_poll(ua, 1); // write_cb должен отправить
|
|
|
|
|
|
|
|
|
|
// Читаем с другой стороны
|
|
|
|
|
uint8_t recv_buf[4096] = {0}; |
|
|
|
|
@ -111,7 +110,8 @@ static void test_basic_send_recv(void) {
|
|
|
|
|
} |
|
|
|
|
ASSERT_TRUE(memcmp(send_buf, recv_buf, sizeof(send_buf)) == 0, "received data mismatch"); |
|
|
|
|
|
|
|
|
|
// Отправляем с другой стороны — должно появиться в read_queue
|
|
|
|
|
// Отправляем с другой стороны ДО poll — данные попадут в буфер ядра,
|
|
|
|
|
// и при EPOLLHUP handle_error вычитает их дренажом в read_queue
|
|
|
|
|
uint8_t peer_data[500]; |
|
|
|
|
memset(peer_data, 'B', sizeof(peer_data)); |
|
|
|
|
ssize_t wret = send(sv[1], peer_data, sizeof(peer_data), MSG_NOSIGNAL); |
|
|
|
|
@ -125,11 +125,10 @@ static void test_basic_send_recv(void) {
|
|
|
|
|
queue_entry_free(e); |
|
|
|
|
queue_resume_callback(tc->read_queue); |
|
|
|
|
|
|
|
|
|
// Закрываем сокет — должен вызвать on_fin
|
|
|
|
|
// Закрываем peer — EPOLLHUP обработан через error_cb (handle_error)
|
|
|
|
|
close(sv[1]); |
|
|
|
|
uasync_poll(ua, 10); |
|
|
|
|
ASSERT_EQ(g_fin_count, 1, "on_fin not called"); |
|
|
|
|
ASSERT_EQ(tc->fin_remote, 1, "tc->fin_remote not set"); |
|
|
|
|
ASSERT_EQ(g_error_count, 1, "error_cb not called on peer close"); |
|
|
|
|
|
|
|
|
|
tcp_conn_destroy(tc); |
|
|
|
|
close(sv[0]); |
|
|
|
|
@ -148,7 +147,7 @@ static void test_partial_write(void) {
|
|
|
|
|
ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0, "socketpair failed"); |
|
|
|
|
for (int i = 0; i < 2; i++) fcntl(sv[i], F_SETFL, fcntl(sv[i], F_GETFL, 0) | O_NONBLOCK); |
|
|
|
|
|
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 4096, 32, 8, on_fin, on_error, NULL); |
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 4096, 32, 8, 0, on_fin, on_error, NULL); |
|
|
|
|
ASSERT_TRUE(tc != NULL, "tcp_conn_create failed"); |
|
|
|
|
|
|
|
|
|
// Заполняем приёмный буфер sv[1] маленькими чтениями, чтобы создать EAGAIN на sv[0]
|
|
|
|
|
@ -193,7 +192,7 @@ static void test_high_water_pause(void) {
|
|
|
|
|
for (int i = 0; i < 2; i++) fcntl(sv[i], F_SETFL, fcntl(sv[i], F_GETFL, 0) | O_NONBLOCK); |
|
|
|
|
|
|
|
|
|
// hw=2, lw=0 — пауза после 2 блоков, resume когда пусто
|
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 64, 8192, 2, 0, on_fin, on_error, NULL); |
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 64, 8192, 2, 0, 0, on_fin, on_error, NULL); |
|
|
|
|
ASSERT_TRUE(tc != NULL, "tcp_conn_create failed"); |
|
|
|
|
|
|
|
|
|
// Шлём 5 блоков по 64 байта с другой стороны
|
|
|
|
|
@ -263,7 +262,7 @@ static void test_connect_detection(void) {
|
|
|
|
|
ASSERT_TRUE(client_fd >= 0, "socket failed"); |
|
|
|
|
fcntl(client_fd, F_SETFL, fcntl(client_fd, F_GETFL, 0) | O_NONBLOCK); |
|
|
|
|
|
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, client_fd, 1500, 8192, 32, 8, on_fin, on_error, NULL); |
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, client_fd, 1500, 8192, 32, 8, 0, on_fin, on_error, NULL); |
|
|
|
|
ASSERT_TRUE(tc != NULL, "tcp_conn_create failed"); |
|
|
|
|
ASSERT_EQ(tc->connected, 0, "should not be connected yet"); |
|
|
|
|
|
|
|
|
|
@ -295,7 +294,7 @@ static void test_error_callback(void) {
|
|
|
|
|
ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0, "socketpair failed"); |
|
|
|
|
for (int i = 0; i < 2; i++) fcntl(sv[i], F_SETFL, fcntl(sv[i], F_GETFL, 0) | O_NONBLOCK); |
|
|
|
|
|
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, on_fin, on_error, NULL); |
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, 0, on_fin, on_error, NULL); |
|
|
|
|
ASSERT_TRUE(tc != NULL, "tcp_conn_create failed"); |
|
|
|
|
|
|
|
|
|
close(sv[1]); |
|
|
|
|
@ -323,7 +322,7 @@ static void test_push_fin(void) {
|
|
|
|
|
ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0, "socketpair failed"); |
|
|
|
|
for (int i = 0; i < 2; i++) fcntl(sv[i], F_SETFL, fcntl(sv[i], F_GETFL, 0) | O_NONBLOCK); |
|
|
|
|
|
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, on_fin, on_error, NULL); |
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, 0, on_fin, on_error, NULL); |
|
|
|
|
ASSERT_TRUE(tc != NULL, "tcp_conn_create failed"); |
|
|
|
|
tc->on_fin_sent = on_fin_sent_cb; |
|
|
|
|
|
|
|
|
|
@ -369,7 +368,7 @@ static void test_push_close(void) {
|
|
|
|
|
ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0, "socketpair failed"); |
|
|
|
|
for (int i = 0; i < 2; i++) fcntl(sv[i], F_SETFL, fcntl(sv[i], F_GETFL, 0) | O_NONBLOCK); |
|
|
|
|
|
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, on_fin, on_error, NULL); |
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, 0, on_fin, on_error, NULL); |
|
|
|
|
ASSERT_TRUE(tc != NULL, "tcp_conn_create failed"); |
|
|
|
|
tc->on_closed = on_closed_cb; |
|
|
|
|
|
|
|
|
|
@ -407,7 +406,7 @@ static void test_fin_data_ordering(void) {
|
|
|
|
|
ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0, "socketpair failed"); |
|
|
|
|
for (int i = 0; i < 2; i++) fcntl(sv[i], F_SETFL, fcntl(sv[i], F_GETFL, 0) | O_NONBLOCK); |
|
|
|
|
|
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, on_fin, on_error, NULL); |
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, 0, on_fin, on_error, NULL); |
|
|
|
|
ASSERT_TRUE(tc != NULL, "tcp_conn_create failed"); |
|
|
|
|
tc->on_fin_sent = on_fin_sent_cb; |
|
|
|
|
|
|
|
|
|
@ -455,7 +454,7 @@ static void test_double_push_fin(void) {
|
|
|
|
|
ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0, "socketpair failed"); |
|
|
|
|
for (int i = 0; i < 2; i++) fcntl(sv[i], F_SETFL, fcntl(sv[i], F_GETFL, 0) | O_NONBLOCK); |
|
|
|
|
|
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, on_fin, on_error, NULL); |
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, 0, on_fin, on_error, NULL); |
|
|
|
|
ASSERT_TRUE(tc != NULL, "tcp_conn_create failed"); |
|
|
|
|
tc->on_fin_sent = on_fin_sent_cb; |
|
|
|
|
|
|
|
|
|
@ -482,7 +481,7 @@ static void test_double_push_close(void) {
|
|
|
|
|
ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0, "socketpair failed"); |
|
|
|
|
for (int i = 0; i < 2; i++) fcntl(sv[i], F_SETFL, fcntl(sv[i], F_GETFL, 0) | O_NONBLOCK); |
|
|
|
|
|
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, on_fin, on_error, NULL); |
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, 0, on_fin, on_error, NULL); |
|
|
|
|
ASSERT_TRUE(tc != NULL, "tcp_conn_create failed"); |
|
|
|
|
tc->on_closed = on_closed_cb; |
|
|
|
|
|
|
|
|
|
@ -510,7 +509,7 @@ static void test_fin_before_close(void) {
|
|
|
|
|
ASSERT_EQ(socketpair(AF_UNIX, SOCK_STREAM, 0, sv), 0, "socketpair failed"); |
|
|
|
|
for (int i = 0; i < 2; i++) fcntl(sv[i], F_SETFL, fcntl(sv[i], F_GETFL, 0) | O_NONBLOCK); |
|
|
|
|
|
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, on_fin, on_error, NULL); |
|
|
|
|
struct tcp_conn* tc = tcp_conn_create(ua, sv[0], 1500, 8192, 32, 8, 0, on_fin, on_error, NULL); |
|
|
|
|
ASSERT_TRUE(tc != NULL, "tcp_conn_create failed"); |
|
|
|
|
tc->on_fin_sent = on_fin_sent_cb; |
|
|
|
|
tc->on_closed = on_closed_cb; |
|
|
|
|
|