test: Add tcp alloc limitation test

This commit is contained in:
David Cermak
2024-10-23 12:03:35 +02:00
committed by David Čermák
parent 9cb96ac151
commit 0c9c39a957
5 changed files with 169 additions and 5 deletions
+1 -1
View File
@@ -30,7 +30,7 @@ set (LWIP_INCLUDE_DIRS
"${LWIP_DIR}/src/include"
"${LWIP_CONTRIB_DIR}/"
"${CMAKE_CURRENT_SOURCE_DIR}/"
"${CMAKE_CURRENT_SOURCE_DIR}/${TEST_CONFIG}"
"${CMAKE_CURRENT_SOURCE_DIR}/${TEST_APP}"
)
include(${LWIP_CONTRIB_DIR}/ports/unix/Filelists.cmake)
+8 -2
View File
@@ -1,4 +1,4 @@
# This file is indended to be included in end-user CMakeLists.txt
# This file is indented to be included in end-user CMakeLists.txt
# include(/path/to/Filelists.cmake)
# It assumes the variable LWIP_DIR is defined pointing to the
# root path of lwIP sources.
@@ -11,6 +11,12 @@
set(LWIP_TESTDIR ${LWIP_DIR}/test/apps)
set(LWIP_TESTFILES
${LWIP_TESTDIR}/test_apps.c
${LWIP_TESTDIR}/test_sockets.c
${LWIP_CONTRIB_DIR}/ports/unix/port/sys_arch.c
)
if("${TEST_APP}" MATCHES "^socket_")
list(APPEND LWIP_TESTFILES ${LWIP_TESTDIR}/test_sockets.c)
elseif("${TEST_APP}" STREQUAL "tcp_socket_reuse")
list(APPEND LWIP_TESTFILES ${LWIP_TESTDIR}/tcp_socket_reuse/test_sockets.c)
list(APPEND LWIP_TESTFILES ${LWIP_DIR}/test/unit/tcp/tcp_helper.c)
endif()
@@ -0,0 +1,39 @@
#ifndef LWIP_HDR_TEST_APPS_LWIPOPTS_TEST_H
#define LWIP_HDR_TEST_APPS_LWIPOPTS_TEST_H
#define LWIP_SO_LINGER 0
#define MEMP_MEM_MALLOC 1
#define MEM_LIBC_MALLOC 1
#ifdef LWIP_DEBUG
#define LWIP_DBG_MIN_LEVEL 0
#define PPP_DEBUG LWIP_DBG_OFF
#define MEM_DEBUG LWIP_DBG_OFF
#define MEMP_DEBUG LWIP_DBG_OFF
#define PBUF_DEBUG LWIP_DBG_OFF
#define API_LIB_DEBUG LWIP_DBG_OFF
#define API_MSG_DEBUG LWIP_DBG_OFF
#define TCPIP_DEBUG LWIP_DBG_OFF
#define NETIF_DEBUG LWIP_DBG_OFF
#define SOCKETS_DEBUG LWIP_DBG_OFF
#define DNS_DEBUG LWIP_DBG_OFF
#define AUTOIP_DEBUG LWIP_DBG_OFF
#define DHCP_DEBUG LWIP_DBG_OFF
#define IP_DEBUG LWIP_DBG_OFF
#define IP_REASS_DEBUG LWIP_DBG_OFF
#define ICMP_DEBUG LWIP_DBG_OFF
#define IGMP_DEBUG LWIP_DBG_OFF
#define UDP_DEBUG LWIP_DBG_OFF
#define TCP_DEBUG LWIP_DBG_OFF
#define TCP_INPUT_DEBUG LWIP_DBG_OFF
#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF
#define TCP_RTO_DEBUG LWIP_DBG_OFF
#define TCP_CWND_DEBUG LWIP_DBG_OFF
#define TCP_WND_DEBUG LWIP_DBG_OFF
#define TCP_FR_DEBUG LWIP_DBG_OFF
#define TCP_QLEN_DEBUG LWIP_DBG_OFF
#define TCP_RST_DEBUG LWIP_DBG_OFF
#endif
#endif /* LWIP_HDR_TEST_APPS_LWIPOPTS_TEST_H */
+119
View File
@@ -0,0 +1,119 @@
#include <pthread.h>
#include <tcp/tcp_helper.h>
#include "lwip_check.h"
#include "lwip/opt.h"
#include "lwip/sockets.h"
#include "lwip/priv/sockets_priv.h"
#include "lwip/priv/tcp_priv.h"
#include "lwip/api.h"
Suite *sockets_suite(void);
static int
test_sockets_get_used_count(void)
{
int used = 0;
int i;
for (i = 0; i < NUM_SOCKETS; i++) {
struct lwip_sock* s = lwip_socket_dbg_get_socket(i);
if (s != NULL) {
if (s->fd_used) {
used++;
}
}
}
return used;
}
#if 0
static int
wait_for_pcbs_to_cleanup(void)
{
struct tcp_pcb *pcb = tcp_active_pcbs;
while (pcb != NULL) {
if (pcb->state == TIME_WAIT || pcb->state == LAST_ACK) {
return -1;
}
pcb = pcb->next;
}
return 0;
}
#endif
/* Setups/teardown functions */
static void
sockets_setup(void)
{
fail_unless(test_sockets_get_used_count() == 0);
}
static void
sockets_teardown(void)
{
fail_unless(test_sockets_get_used_count() == 0);
/* poll until all memory is released... */
while (tcp_tw_pcbs) {
tcp_abort(tcp_tw_pcbs);
}
}
START_TEST(test_tcp_active_socket_limit)
{
int i;
int sock;
LWIP_UNUSED_ARG(_i);
for (i = 0; i < MEMP_NUM_TCP_PCB; i++) {
sock = lwip_socket(AF_INET, SOCK_STREAM, 0);
fail_unless(sock != -1);
}
sock = lwip_socket(AF_INET, SOCK_STREAM, 0);
fail_unless(sock == -1);
for (i = 0; i < MEMP_NUM_TCP_PCB; i++) {
lwip_close(i + LWIP_SOCKET_OFFSET);
}
}
END_TEST
START_TEST(test_tcp_new_max_num)
{
struct tcp_pcb* pcb[MEMP_NUM_TCP_PCB + 1];
int i;
mem_size_t prev_used, one_pcb_size;
LWIP_UNUSED_ARG(_i);
prev_used = lwip_stats.mem.used;
pcb[0] = tcp_new();
fail_unless(pcb[0] != NULL);
one_pcb_size = lwip_stats.mem.used - prev_used;
for(i = 1; i < MEMP_NUM_TCP_PCB; i++) {
prev_used = lwip_stats.mem.used;
pcb[i] = tcp_new();
fail_unless(pcb[i] != NULL);
fail_unless(one_pcb_size == lwip_stats.mem.used - prev_used);
}
/* Trying to remove the oldest pcb in TIME_WAIT,LAST_ACK,CLOSING state when pcb full */
pcb[MEMP_NUM_TCP_PCB] = tcp_new();
fail_unless(pcb[MEMP_NUM_TCP_PCB] == NULL);
tcp_set_state(pcb[0], TIME_WAIT, &test_local_ip, &test_remote_ip, TEST_LOCAL_PORT, TEST_REMOTE_PORT);
pcb[MEMP_NUM_TCP_PCB] = tcp_new();
fail_unless(pcb[MEMP_NUM_TCP_PCB] != NULL);
for (i = 1; i <= MEMP_NUM_TCP_PCB; i++)
{
tcp_abort(pcb[i]);
}
}
END_TEST
/** Create the suite including all tests for this module */
Suite *
sockets_suite(void)
{
testfunc tests[] = {
TESTFUNC(test_tcp_active_socket_limit),
TESTFUNC(test_tcp_new_max_num),
};
return create_suite("TCP_ACTIVE_SOCKETS", tests, sizeof(tests)/sizeof(testfunc), sockets_setup, sockets_teardown);
}
+2 -2
View File
@@ -4,14 +4,14 @@ set -e
export LWIP_DIR=`pwd`
export LWIP_CONTRIB_DIR=`pwd`/contrib
TEST_APPS="socket_no_linger socket_linger socket_linger_reuse"
TEST_APPS="socket_no_linger socket_linger socket_linger_reuse tcp_socket_reuse"
STRESS_TEST_APPS="socket_linger"
cd test/apps
# Prepare a failing report in case we get stuck (check in no-fork mode)
python socket_linger_stress_test.py failed > ${LWIP_DIR}/socket_linger_stress_test.xml
for app in $TEST_APPS; do
cmake -DCI_BUILD=1 -DTEST_CONFIG=${app} -B ${app} -G Ninja .
cmake -DCI_BUILD=1 -DTEST_APP=${app} -B ${app} -G Ninja .
cmake --build ${app}/
timeout 10 ./${app}/lwip_test_apps
[ -f check2junit.py ] &&