tests: Try larger writes and reads
authorJakub Jelen <jjelen@redhat.com>
Thu, 23 Feb 2023 13:55:02 +0000 (14:55 +0100)
committerAndreas Schneider <asn@samba.org>
Wed, 12 Apr 2023 13:33:21 +0000 (15:33 +0200)
Signed-off-by: Jakub Jelen <jjelen@redhat.com>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
tests/test_echo_tcp_write_read.c

index 9129022a7b8d47cf74853e0f0f839a7969ac2fa5..e5940112cfbed344746df85ae45a3e17c01645c3 100644 (file)
@@ -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
        };