10 #include <sys/types.h>
11 #include <sys/socket.h>
13 #include <netinet/in.h>
14 #include <arpa/inet.h>
19 static int setup_echo_srv_tcp_ipv4(void **state)
21 torture_setup_echo_srv_tcp_ipv4(state);
27 static int setup_echo_srv_tcp_ipv6(void **state)
29 torture_setup_echo_srv_tcp_ipv6(state);
35 static int teardown(void **state)
37 torture_teardown_echo_srv(state);
42 static void test_writev_readv_ipv4(void **state)
44 struct torture_address addr = {
45 .sa_socklen = sizeof(struct sockaddr_in),
52 (void) state; /* unused */
54 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
55 assert_int_not_equal(s, -1);
57 addr.sa.in.sin_family = AF_INET;
58 addr.sa.in.sin_port = htons(torture_server_port());
60 rc = inet_pton(addr.sa.in.sin_family,
61 torture_server_address(AF_INET),
62 &addr.sa.in.sin_addr);
63 assert_int_equal(rc, 1);
65 rc = connect(s, &addr.sa.s, addr.sa_socklen);
66 assert_int_equal(rc, 0);
68 for (i = 1; i < 10; i++) {
69 char send_buf[10][64];
70 char recv_buf[10][64];
71 struct iovec iov_send[10];
72 struct iovec iov_recv[10];
75 for (j = 0; j < i; j++) {
76 memset(send_buf[j], 0, 64);
77 snprintf(send_buf[j], sizeof(send_buf[j]),
80 iov_send[j].iov_base = send_buf[j];
81 iov_send[j].iov_len = strlen(send_buf[j]);
83 iov_recv[j].iov_base = recv_buf[j];
84 iov_recv[j].iov_len = strlen(send_buf[j]);
87 ret = writev(s, iov_send, j);
88 assert_int_not_equal(ret, -1);
90 ret = readv(s, iov_recv, j);
91 assert_int_not_equal(ret, -1);
93 for (j = 0; j < i; j++) {
94 assert_int_equal(iov_send[j].iov_len,
97 assert_memory_equal(iov_send[j].iov_base,
107 static void test_writev_readv_ipv6(void **state)
109 struct torture_address addr = {
110 .sa_socklen = sizeof(struct sockaddr_in6),
117 (void) state; /* unused */
119 s = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
120 assert_int_not_equal(s, -1);
122 addr.sa.in6.sin6_family = AF_INET6;
123 addr.sa.in6.sin6_port = htons(torture_server_port());
125 rc = inet_pton(AF_INET6,
126 torture_server_address(AF_INET6),
127 &addr.sa.in6.sin6_addr);
128 assert_int_equal(rc, 1);
130 rc = connect(s, &addr.sa.s, addr.sa_socklen);
131 assert_int_equal(rc, 0);
133 for (i = 1; i < 10; i++) {
134 char send_buf[10][64];
135 char recv_buf[10][64];
136 struct iovec iov_send[10];
137 struct iovec iov_recv[10];
140 for (j = 0; j < i; j++) {
141 memset(send_buf[j], 0, 64);
142 snprintf(send_buf[j], sizeof(send_buf[j]),
145 iov_send[j].iov_base = send_buf[j];
146 iov_send[j].iov_len = strlen(send_buf[j]);
148 iov_recv[j].iov_base = recv_buf[j];
149 iov_recv[j].iov_len = strlen(send_buf[j]);
152 ret = writev(s, iov_send, j);
153 assert_int_not_equal(ret, -1);
155 ret = readv(s, iov_recv, j);
156 assert_int_not_equal(ret, -1);
158 for (j = 0; j < i; j++) {
159 assert_int_equal(iov_send[j].iov_len,
160 iov_recv[j].iov_len);
162 assert_memory_equal(iov_send[j].iov_base,
163 iov_recv[j].iov_base,
164 iov_send[j].iov_len);
175 const struct CMUnitTest tcp_writev_tests[] = {
176 cmocka_unit_test_setup_teardown(test_writev_readv_ipv4,
177 setup_echo_srv_tcp_ipv4,
180 cmocka_unit_test_setup_teardown(test_writev_readv_ipv6,
181 setup_echo_srv_tcp_ipv6,
186 rc = cmocka_run_group_tests(tcp_writev_tests, NULL, NULL);