From 014da8599ff039761de8b9bd26c335c21c0f8f15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Mon, 19 Sep 2022 11:40:15 +0200 Subject: [PATCH] Improve the udp_shutdown_read and udp_cancel_read tests In the udp_shutdown_read unit test, delay the isc_loopmgr_shutdown() to the send callback, and in the udp_cancel_read test wait for a single timed out test, then read again, send an UDP packet and cancel the read from the send callback. --- tests/isc/udp_test.c | 163 +++++++++++++++++++++++++------------------ 1 file changed, 94 insertions(+), 69 deletions(-) diff --git a/tests/isc/udp_test.c b/tests/isc/udp_test.c index fb60f1ba1c..0cfd4e62a9 100644 --- a/tests/isc/udp_test.c +++ b/tests/isc/udp_test.c @@ -306,7 +306,6 @@ udp_noresponse_recv_cb(isc_nmhandle_t *handle, isc_result_t eresult, static void udp_noresponse_read_cb(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region, void *cbarg) { - UNUSED(handle); UNUSED(region); UNUSED(cbarg); @@ -339,9 +338,6 @@ udp_noresponse_connect_cb(isc_nmhandle_t *handle, isc_result_t eresult, isc_nmhandle_t *readhandle = NULL; isc_nmhandle_t *sendhandle = NULL; - UNUSED(handle); - UNUSED(cbarg); - isc_refcount_decrement(&active_cconnects); assert_int_equal(eresult, ISC_R_SUCCESS); @@ -463,8 +459,6 @@ udp_timeout_recovery_connect_cb(isc_nmhandle_t *handle, isc_result_t eresult, isc_nmhandle_t *readhandle = NULL; isc_nmhandle_t *sendhandle = NULL; - UNUSED(cbarg); - F(); isc_refcount_decrement(&active_cconnects); @@ -557,14 +551,50 @@ ISC_LOOP_TEST_IMPL(udp_shutdown_connect) { isc_job_run(loopmgr, udp_connect_udpconnect, netmgr); } +static void +udp_shutdown_read_recv_cb(isc_nmhandle_t *handle, isc_result_t eresult, + isc_region_t *region, void *cbarg) { + uint64_t magic = 0; + + UNUSED(cbarg); + + assert_non_null(handle); + + F(); + + assert_int_equal(eresult, ISC_R_SUCCESS); + + assert_true(region->length == sizeof(magic)); + + memmove(&magic, region->base, sizeof(magic)); + assert_true(magic == send_magic); +} + +static void +udp_shutdown_read_send_cb(isc_nmhandle_t *handle, isc_result_t eresult, + void *cbarg) { + UNUSED(cbarg); + + F(); + + assert_non_null(handle); + assert_int_equal(eresult, ISC_R_SUCCESS); + + atomic_fetch_add(&csends, 1); + + isc_loopmgr_shutdown(loopmgr); + + isc_nmhandle_detach(&handle); + isc_refcount_decrement(&active_csends); +} + static void udp_shutdown_read_read_cb(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region, void *cbarg) { - UNUSED(handle); UNUSED(region); UNUSED(cbarg); - assert_int_equal(eresult, ISC_R_SHUTTINGDOWN); + assert_true(eresult == ISC_R_SHUTTINGDOWN || eresult == ISC_R_TIMEDOUT); isc_refcount_decrement(&active_creads); @@ -577,21 +607,25 @@ static void udp_shutdown_read_connect_cb(isc_nmhandle_t *handle, isc_result_t eresult, void *cbarg) { isc_nmhandle_t *readhandle = NULL; - - UNUSED(handle); - UNUSED(cbarg); + isc_nmhandle_t *sendhandle = NULL; isc_refcount_decrement(&active_cconnects); assert_int_equal(eresult, ISC_R_SUCCESS); + /* Read */ isc_refcount_increment0(&active_creads); isc_nmhandle_attach(handle, &readhandle); isc_nm_read(handle, udp_shutdown_read_read_cb, cbarg); - atomic_fetch_add(&cconnects, 1); + /* Send */ + isc_refcount_increment0(&active_csends); + isc_nmhandle_attach(handle, &sendhandle); + isc_nmhandle_setwritetimeout(handle, T_IDLE); + isc_nm_send(sendhandle, (isc_region_t *)&send_msg, + udp_shutdown_read_send_cb, cbarg); - isc_loopmgr_shutdown(loopmgr); + atomic_fetch_add(&cconnects, 1); } ISC_SETUP_TEST_IMPL(udp_shutdown_read) { @@ -609,6 +643,8 @@ ISC_TEARDOWN_TEST_IMPL(udp_shutdown_read) { } ISC_LOOP_TEST_IMPL(udp_shutdown_read) { + start_listening(ISC_NM_LISTEN_ONE, udp_shutdown_read_recv_cb); + isc_refcount_increment0(&active_cconnects); isc_nm_udpconnect(netmgr, &udp_connect_addr, &udp_listen_addr, udp_shutdown_read_connect_cb, NULL, T_SOFT); @@ -618,7 +654,8 @@ static void udp_cancel_read_recv_cb(isc_nmhandle_t *handle, isc_result_t eresult, isc_region_t *region, void *cbarg) { uint64_t magic = 0; - isc_nmhandle_t *sendhandle = NULL; + + UNUSED(cbarg); assert_non_null(handle); @@ -630,38 +667,6 @@ udp_cancel_read_recv_cb(isc_nmhandle_t *handle, isc_result_t eresult, memmove(&magic, region->base, sizeof(magic)); assert_true(magic == send_magic); - - isc_nmhandle_attach(handle, &sendhandle); - isc_refcount_increment0(&active_ssends); - isc_nmhandle_setwritetimeout(sendhandle, T_IDLE); - isc_nm_send(sendhandle, (isc_region_t *)&send_msg, listen_send_cb, - cbarg); -} - -static void -udp_cancel_read_read_cb(isc_nmhandle_t *handle, isc_result_t eresult, - isc_region_t *region, void *cbarg) { - UNUSED(handle); - UNUSED(region); - UNUSED(cbarg); - - F(); - - switch (eresult) { - case ISC_R_TIMEDOUT: - case ISC_R_EOF: - break; - default: - UNREACHABLE(); - } - - isc_refcount_decrement(&active_creads); - - atomic_fetch_add(&creads, 1); - - isc_nmhandle_detach(&handle); - - isc_loopmgr_shutdown(loopmgr); } static void @@ -676,18 +681,56 @@ udp_cancel_read_send_cb(isc_nmhandle_t *handle, isc_result_t eresult, atomic_fetch_add(&csends, 1); + isc_nm_cancelread(handle); + isc_nmhandle_detach(&handle); isc_refcount_decrement(&active_csends); } +static void +udp_cancel_read_read_cb(isc_nmhandle_t *handle, isc_result_t eresult, + isc_region_t *region, void *cbarg) { + isc_nmhandle_t *sendhandle = NULL; + isc_nmhandle_t *readhandle = NULL; + + UNUSED(region); + + F(); + + switch (eresult) { + case ISC_R_TIMEDOUT: + + /* Read again */ + isc_refcount_increment0(&active_creads); + isc_nmhandle_attach(handle, &readhandle); + isc_nm_read(handle, udp_cancel_read_read_cb, cbarg); + + /* Send */ + isc_refcount_increment0(&active_csends); + isc_nmhandle_attach(handle, &sendhandle); + isc_nmhandle_setwritetimeout(handle, T_IDLE); + isc_nm_send(sendhandle, (isc_region_t *)&send_msg, + udp_cancel_read_send_cb, cbarg); + break; + case ISC_R_EOF: + /* The read has been canceled */ + isc_loopmgr_shutdown(loopmgr); + break; + default: + UNREACHABLE(); + } + + isc_refcount_decrement(&active_creads); + + atomic_fetch_add(&creads, 1); + + isc_nmhandle_detach(&handle); +} + static void udp_cancel_read_connect_cb(isc_nmhandle_t *handle, isc_result_t eresult, void *cbarg) { isc_nmhandle_t *readhandle = NULL; - isc_nmhandle_t *sendhandle = NULL; - - UNUSED(handle); - UNUSED(cbarg); isc_refcount_decrement(&active_cconnects); @@ -697,22 +740,13 @@ udp_cancel_read_connect_cb(isc_nmhandle_t *handle, isc_result_t eresult, isc_nmhandle_attach(handle, &readhandle); isc_nm_read(handle, udp_cancel_read_read_cb, cbarg); - /* Send */ - isc_refcount_increment0(&active_csends); - isc_nmhandle_attach(handle, &sendhandle); - isc_nmhandle_setwritetimeout(handle, T_IDLE); - isc_nm_send(sendhandle, (isc_region_t *)&send_msg, - udp_cancel_read_send_cb, readhandle); - - isc_nm_cancelread(readhandle); - atomic_fetch_add(&cconnects, 1); } ISC_SETUP_TEST_IMPL(udp_cancel_read) { setup_test(state); expected_cconnects = 1; - expected_creads = 1; + expected_creads = 2; return (0); } @@ -735,8 +769,6 @@ static void udp__send_cb(isc_nmhandle_t *handle, isc_result_t eresult, void *cbarg) { isc_nmhandle_t *sendhandle = handle; - UNUSED(cbarg); - assert_non_null(sendhandle); F(); @@ -782,8 +814,6 @@ udp__connect_cb(isc_nmhandle_t *handle, isc_result_t eresult, void *cbarg) { isc_nmhandle_t *readhandle = NULL; isc_nmhandle_t *sendhandle = NULL; - UNUSED(cbarg); - F(); isc_refcount_decrement(&active_cconnects); @@ -935,9 +965,6 @@ ISC_LOOP_TEST_IMPL(udp_recv_send) { static void double_read_send_cb(isc_nmhandle_t *handle, isc_result_t eresult, void *cbarg) { - UNUSED(cbarg); - UNUSED(eresult); - assert_non_null(handle); F(); @@ -1015,8 +1042,6 @@ double_read_cb(isc_nmhandle_t *handle, isc_result_t eresult, uint64_t magic = 0; bool detach = false; - UNUSED(cbarg); - assert_non_null(handle); F();