diff --git a/test/apps/CMakeLists.txt b/test/apps/CMakeLists.txt index 5112ef44..081a2628 100644 --- a/test/apps/CMakeLists.txt +++ b/test/apps/CMakeLists.txt @@ -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) diff --git a/test/apps/Filelists.cmake b/test/apps/Filelists.cmake index 1e17f282..b6442801 100644 --- a/test/apps/Filelists.cmake +++ b/test/apps/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() diff --git a/test/apps/tcp_socket_reuse/lwipopts_test.h b/test/apps/tcp_socket_reuse/lwipopts_test.h new file mode 100644 index 00000000..d665f973 --- /dev/null +++ b/test/apps/tcp_socket_reuse/lwipopts_test.h @@ -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 */ diff --git a/test/apps/tcp_socket_reuse/test_sockets.c b/test/apps/tcp_socket_reuse/test_sockets.c new file mode 100644 index 00000000..6523d9cb --- /dev/null +++ b/test/apps/tcp_socket_reuse/test_sockets.c @@ -0,0 +1,119 @@ +#include +#include + +#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); +} diff --git a/test/ci/test_apps.sh b/test/ci/test_apps.sh index 09b75401..abd18e20 100755 --- a/test/ci/test_apps.sh +++ b/test/ci/test_apps.sh @@ -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 ] &&