2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 14:35:26 +00:00

add TCP and TLS timeout recovery tests

NOTE: currently these tests fail
This commit is contained in:
Evan Hunt
2021-04-21 10:27:09 -07:00
parent 52f256f9ae
commit 25ef0547a9

View File

@@ -453,7 +453,7 @@ connect_read_cb(isc_nmhandle_t *handle, isc_result_t eresult,
goto unref;
}
assert_int_equal(region->length, sizeof(magic));
assert_true(region->length >= sizeof(magic));
atomic_fetch_add(&creads, 1);
@@ -530,21 +530,22 @@ listen_read_cb(isc_nmhandle_t *handle, isc_result_t eresult,
atomic_fetch_add(&sreads, 1);
assert_int_equal(region->length, sizeof(magic));
assert_true(region->length >= sizeof(magic));
memmove(&magic, region->base, sizeof(magic));
assert_true(magic == stop_magic || magic == send_magic);
if (magic == send_magic && !noanswer) {
isc_nmhandle_t *sendhandle = NULL;
isc_nmhandle_attach(handle, &sendhandle);
isc_refcount_increment0(&active_ssends);
isc_nm_send(sendhandle, (isc_region_t *)&send_msg,
listen_send_cb, cbarg);
if (magic == send_magic) {
if (!noanswer) {
isc_nmhandle_t *sendhandle = NULL;
isc_nmhandle_attach(handle, &sendhandle);
isc_refcount_increment0(&active_ssends);
isc_nm_send(sendhandle, (isc_region_t *)&send_msg,
listen_send_cb, cbarg);
}
return;
}
/* close the connection on stop_magic */
unref:
if (handle == cbarg) {
isc_refcount_decrement(&active_sreads);
@@ -1191,12 +1192,12 @@ stream_connect(isc_nm_cb_t cb, void *cbarg, unsigned int timeout,
(isc_nmiface_t *)&tcp_connect_addr,
(isc_nmiface_t *)&tcp_listen_addr, cb, cbarg,
tcp_connect_tlsctx, timeout, extrahandlesize);
return;
} else {
isc_nm_tcpconnect(connect_nm,
(isc_nmiface_t *)&tcp_connect_addr,
(isc_nmiface_t *)&tcp_listen_addr, cb, cbarg,
timeout, extrahandlesize);
}
isc_nm_tcpconnect(connect_nm, (isc_nmiface_t *)&tcp_connect_addr,
(isc_nmiface_t *)&tcp_listen_addr, cb, cbarg, timeout,
extrahandlesize);
}
static void
@@ -1255,6 +1256,44 @@ stream_noresponse(void **state __attribute__((unused))) {
atomic_assert_int_eq(ssends, 0);
}
static void
stream_timeout_recovery(void **state __attribute__((unused))) {
isc_result_t result = ISC_R_SUCCESS;
isc_nmsocket_t *listen_sock = NULL;
SKIP_IN_CI;
/*
* Accept connections but don't send responses, forcing client
* reads to time out.
*/
noanswer = true;
result = stream_listen(stream_accept_cb, NULL, 0, 0, NULL,
&listen_sock);
assert_int_equal(result, ISC_R_SUCCESS);
/*
* Shorten all the client timeouts to 0.05 seconds.
*/
isc_nm_settimeouts(connect_nm, 50, 50, 50, 50);
connect_readcb = timeout_retry_cb;
isc_refcount_increment0(&active_cconnects);
stream_connect(connect_connect_cb, NULL, 50, 0);
WAIT_FOR_EQ(cconnects, 1);
WAIT_FOR_GE(csends, 1);
WAIT_FOR_GE(csends, 2);
WAIT_FOR_GE(csends, 3);
WAIT_FOR_GE(csends, 4);
WAIT_FOR_EQ(csends, 5);
WAIT_FOR_EQ(ctimeouts, 1);
isc_nm_stoplistening(listen_sock);
isc_nmsocket_close(&listen_sock);
assert_null(listen_sock);
isc_nm_closedown(connect_nm);
}
static void
stream_recv_one(void **state __attribute__((unused))) {
isc_result_t result = ISC_R_SUCCESS;
@@ -1560,6 +1599,11 @@ tcp_noresponse(void **state) {
stream_noresponse(state);
}
static void
tcp_timeout_recovery(void **state) {
stream_timeout_recovery(state);
}
static void
tcp_recv_one(void **state) {
stream_recv_one(state);
@@ -2114,6 +2158,12 @@ tls_noresponse(void **state) {
stream_noresponse(state);
}
static void
tls_timeout_recovery(void **state) {
stream_use_TLS = true;
stream_timeout_recovery(state);
}
static void
tls_recv_one(void **state) {
stream_use_TLS = true;
@@ -2739,6 +2789,8 @@ main(void) {
nm_teardown),
cmocka_unit_test_setup_teardown(tcp_noresponse, nm_setup,
nm_teardown),
cmocka_unit_test_setup_teardown(tcp_timeout_recovery, nm_setup,
nm_teardown),
cmocka_unit_test_setup_teardown(tcp_recv_one, nm_setup,
nm_teardown),
cmocka_unit_test_setup_teardown(tcp_recv_two, nm_setup,
@@ -2811,6 +2863,8 @@ main(void) {
nm_teardown),
cmocka_unit_test_setup_teardown(tls_noresponse, nm_setup,
nm_teardown),
cmocka_unit_test_setup_teardown(tls_timeout_recovery, nm_setup,
nm_teardown),
cmocka_unit_test_setup_teardown(tls_recv_one, nm_setup,
nm_teardown),
cmocka_unit_test_setup_teardown(tls_recv_two, nm_setup,