From 8b1b82567794470e829bd0a34e99eeec397c7e6d Mon Sep 17 00:00:00 2001 From: Jakub Jelen Date: Thu, 23 Feb 2023 14:55:02 +0100 Subject: [PATCH] tests: Try larger writes and reads Signed-off-by: Jakub Jelen Reviewed-by: Stefan Metzmacher Reviewed-by: Andreas Schneider --- tests/test_echo_tcp_write_read.c | 93 ++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 28 deletions(-) diff --git a/tests/test_echo_tcp_write_read.c b/tests/test_echo_tcp_write_read.c index 9129022..e594011 100644 --- a/tests/test_echo_tcp_write_read.c +++ b/tests/test_echo_tcp_write_read.c @@ -38,11 +38,13 @@ static int teardown(void **state) return 0; } -static void test_write_read_ipv4(void **state) +static void test_write_read_ipv4_size(void **state, size_t size) { struct torture_address addr = { .sa_socklen = sizeof(struct sockaddr_in), }; + char send_buf[size]; + char recv_buf[size]; ssize_t ret; int rc; int i; @@ -64,34 +66,49 @@ static void test_write_read_ipv4(void **state) rc = connect(s, &addr.sa.s, addr.sa_socklen); assert_int_equal(rc, 0); + memset(send_buf, 0, sizeof(send_buf)); for (i = 0; i < 10; i++) { - char send_buf[64] = {0}; - char recv_buf[64] = {0}; - + size_t nread = 0, nwrote = 0; snprintf(send_buf, sizeof(send_buf), "packet.%d", i); - ret = write(s, - send_buf, - sizeof(send_buf)); - assert_int_not_equal(ret, -1); - - ret = read(s, - recv_buf, - sizeof(recv_buf)); - assert_int_not_equal(ret, -1); - + do { + ret = write(s, + send_buf + nwrote, + sizeof(send_buf) - nwrote); + assert_int_not_equal(ret, -1); + nwrote += ret; + + ret = read(s, + recv_buf + nread, + sizeof(recv_buf) - nread); + assert_int_not_equal(ret, -1); + nread += ret; + } while (nread < sizeof(recv_buf) && nwrote < sizeof(send_buf)); + + assert_int_equal(nread, sizeof(send_buf)); assert_memory_equal(send_buf, recv_buf, sizeof(send_buf)); } close(s); } +static void test_write_read_ipv4(void **state) +{ + test_write_read_ipv4_size(state, 64); +} + +static void test_write_read_ipv4_large(void **state) +{ + test_write_read_ipv4_size(state, 2000); +} #ifdef HAVE_IPV6 -static void test_write_read_ipv6(void **state) +static void test_write_read_ipv6_size(void **state, size_t size) { struct torture_address addr = { .sa_socklen = sizeof(struct sockaddr_in6), }; + char send_buf[size]; + char recv_buf[size]; ssize_t ret; int rc; int i; @@ -113,27 +130,41 @@ static void test_write_read_ipv6(void **state) rc = connect(s, &addr.sa.s, addr.sa_socklen); assert_int_equal(rc, 0); + memset(send_buf, 0, sizeof(send_buf)); for (i = 0; i < 10; i++) { - char send_buf[64] = {0}; - char recv_buf[64] = {0}; - + size_t nread = 0, nwrote = 0; snprintf(send_buf, sizeof(send_buf), "packet.%d", i); - ret = write(s, - send_buf, - sizeof(send_buf)); - assert_int_not_equal(ret, -1); - - ret = read(s, - recv_buf, - sizeof(recv_buf)); - assert_int_not_equal(ret, -1); - + do { + ret = write(s, + send_buf + nwrote, + sizeof(send_buf) - nwrote); + assert_int_not_equal(ret, -1); + nwrote += ret; + + ret = read(s, + recv_buf + nread, + sizeof(recv_buf) - nread); + assert_int_not_equal(ret, -1); + nread += ret; + } while (nread < sizeof(recv_buf) && nwrote < sizeof(send_buf)); + + assert_int_equal(nread, sizeof(send_buf)); assert_memory_equal(send_buf, recv_buf, sizeof(send_buf)); } close(s); } + +static void test_write_read_ipv6(void **state) +{ + test_write_read_ipv6_size(state, 64); +} + +static void test_write_read_ipv6_large(void **state) +{ + test_write_read_ipv6_size(state, 2000); +} #endif int main(void) { @@ -143,10 +174,16 @@ int main(void) { cmocka_unit_test_setup_teardown(test_write_read_ipv4, setup_echo_srv_tcp_ipv4, teardown), + cmocka_unit_test_setup_teardown(test_write_read_ipv4_large, + setup_echo_srv_tcp_ipv4, + teardown), #ifdef HAVE_IPV6 cmocka_unit_test_setup_teardown(test_write_read_ipv6, setup_echo_srv_tcp_ipv6, teardown), + cmocka_unit_test_setup_teardown(test_write_read_ipv6_large, + setup_echo_srv_tcp_ipv6, + teardown), #endif }; -- 2.34.1