mirror of
https://github.com/espressif/esp-lwip.git
synced 2026-06-05 21:04:45 +00:00
test: Add tcp alloc limitation test
This commit is contained in:
committed by
David Čermák
parent
9cb96ac151
commit
0c9c39a957
@@ -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)
|
||||
|
||||
@@ -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 */
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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 ] &&
|
||||
|
||||
Reference in New Issue
Block a user