libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit c36ac56f38a798c1ae162590de0c9ef17e8a1f3d
parent fa330be735a39d30f4e025c3afdba192e6c2b1bb
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date:   Sun, 25 Oct 2020 19:10:38 +0300

test_add_conn_cleanup: check whether client connection
sockets were closed by MHD as part of cleanup process

Diffstat:
Msrc/testcurl/test_add_conn.c | 31+++++++++++++++++++++++++++----
1 file changed, 27 insertions(+), 4 deletions(-)

diff --git a/src/testcurl/test_add_conn.c b/src/testcurl/test_add_conn.c @@ -314,6 +314,7 @@ struct addConnParam MHD_socket lstn_sk; + MHD_socket clent_sk; /* Non-zero indicate error */ volatile int result; @@ -325,13 +326,13 @@ struct addConnParam static int doAcceptAndAddConnInThread (struct addConnParam *p) { - MHD_socket newConn; struct sockaddr addr; socklen_t addr_len = sizeof(addr); - newConn = acceptTimeLimited (p->lstn_sk, &addr, &addr_len); + p->clent_sk = acceptTimeLimited (p->lstn_sk, &addr, &addr_len); - p->result = (MHD_YES == MHD_add_connection (p->d, newConn, &addr, addr_len)) ? + p->result = (MHD_YES == MHD_add_connection (p->d, p->clent_sk, + &addr, addr_len)) ? 0 : 1; if (p->result) fprintf (stderr, "MHD_add_connection() failed, errno=%d.\n", errno); @@ -577,6 +578,7 @@ performTestCleanup (struct MHD_Daemon *d, int num_queries) struct curlQueryParams *qParamList; struct addConnParam aParam; MHD_socket lstn_sk; /* Additional listening socket */ + MHD_socket *clntSkList; int a_port; /* Additional listening socket port */ int i; int ret = 0; /* Return value */ @@ -589,7 +591,8 @@ performTestCleanup (struct MHD_Daemon *d, int num_queries) lstn_sk = createListeningSocket (&a_port); /* Sets a_port */ qParamList = malloc (sizeof(struct curlQueryParams) * num_queries); - if (NULL == qParamList) + clntSkList = malloc (sizeof(MHD_socket) * num_queries); + if ((NULL == qParamList) || (NULL == clntSkList)) externalErrorExitDesc ("malloc failed"); /* Start CURL queries */ @@ -606,13 +609,32 @@ performTestCleanup (struct MHD_Daemon *d, int num_queries) aParam.d = d; aParam.lstn_sk = lstn_sk; for (i = 0; i < num_queries; i++) + { + aParam.clent_sk = MHD_INVALID_SOCKET; ret |= doAcceptAndAddConnInThread (&aParam); + clntSkList[i] = aParam.clent_sk; + } /* Stop daemon while some of new connection are not yet * processed because of slow response to the first queries. */ MHD_stop_daemon (d); (void) MHD_socket_close_ (aParam.lstn_sk); + /* Check whether all client sockets were closed by MHD. + * Closure of socket by MHD indicate valid cleanup performed. */ + for (i = 0; i < num_queries; i++) + { + if (MHD_INVALID_SOCKET != clntSkList[i]) + { /* Check whether socket could be closed one more time. */ + if (MHD_socket_close_ (clntSkList[i])) + { + ret |= 2; + fprintf (stderr, "Client socket was not closed by MHD during" \ + "cleanup process.\n"); + } + } + } + /* Wait for CURL threads to complete. */ /* Ignore soft CURL errors as many connection shouldn't get any response. * Hard failures are detected in processing function. */ @@ -1031,6 +1053,7 @@ main (int argc, char *const *argv) cleanup_test = has_in_name (argv[0], "_cleanup"); /* There are almost nothing that could be tested externally * for final cleanup. Cleanup test actually just tests that + * all added client connections were closed by MHD and * nothing fails or crashes when final cleanup is performed. * Mostly useful when configured with '--enable-asserts. */ slow_reply = cleanup_test;