10 #include <sys/types.h>
11 #include <sys/socket.h>
12 #include <netinet/in.h>
13 #include <arpa/inet.h>
18 static int setup_echo_srv_udp_ipv4(void **state)
20 torture_setup_echo_srv_udp_ipv4(state);
26 static int setup_echo_srv_udp_ipv6(void **state)
28 torture_setup_echo_srv_udp_ipv6(state);
34 static int teardown(void **state)
36 torture_teardown_echo_srv(state);
41 static void test_sendto_recvfrom_ipv4(void **state)
43 struct torture_address addr = {
44 .sa_socklen = sizeof(struct sockaddr_in),
46 char send_buf[64] = {0};
47 char recv_buf[64] = {0};
53 (void) state; /* unused */
55 s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
56 assert_int_not_equal(s, -1);
58 addr.sa.in.sin_family = AF_INET;
59 addr.sa.in.sin_port = htons(torture_server_port());
61 rc = inet_pton(AF_INET,
62 torture_server_address(AF_INET),
63 &addr.sa.in.sin_addr);
64 assert_int_equal(rc, 1);
66 for (i = 0; i < 10; i++) {
67 char ip[INET_ADDRSTRLEN] = {0};
69 struct torture_address srv_in = {
70 .sa_socklen = sizeof(struct sockaddr_in),
73 snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
81 assert_return_code(ret, errno);
89 assert_return_code(ret, errno);
91 a = inet_ntop(AF_INET, &srv_in.sa.in.sin_addr, ip, sizeof(ip));
93 assert_string_equal(a, torture_server_address(AF_INET));
95 assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
104 assert_return_code(ret, errno);
112 assert_return_code(ret, errno);
118 static void test_sendto_recvfrom_ipv6(void **state)
120 struct torture_address addr = {
121 .sa_socklen = sizeof(struct sockaddr_in6),
123 char send_buf[64] = {0};
124 char recv_buf[64] = {0};
130 (void) state; /* unused */
132 s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
133 assert_int_not_equal(s, -1);
135 addr.sa.in6.sin6_family = AF_INET6;
136 addr.sa.in6.sin6_port = htons(torture_server_port());
138 rc = inet_pton(AF_INET6,
139 torture_server_address(AF_INET6),
140 &addr.sa.in6.sin6_addr);
141 assert_int_equal(rc, 1);
143 for (i = 0; i < 10; i++) {
144 char ip[INET6_ADDRSTRLEN] = {0};
146 struct torture_address srv_in6 = {
147 .sa_socklen = sizeof(struct sockaddr_in6),
150 snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
158 assert_return_code(ret, errno);
165 &srv_in6.sa_socklen);
166 assert_return_code(ret, errno);
168 a = inet_ntop(AF_INET6, &srv_in6.sa.in6.sin6_addr, ip, sizeof(ip));
170 assert_string_equal(a, torture_server_address(AF_INET6));
172 assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
181 assert_return_code(ret, errno);
189 assert_return_code(ret, errno);
195 static void test_connect_sendto_ipv4(void **state)
197 struct torture_address addr = {
198 .sa_socklen = sizeof(struct sockaddr_in),
200 char send_buf[] = "packet.0";
201 char recv_buf[64] = {0};
206 (void) state; /* unused */
208 addr.sa.in.sin_family = AF_INET;
209 addr.sa.in.sin_port = htons(torture_server_port());
211 rc = inet_pton(AF_INET,
212 torture_server_address(AF_INET),
213 &addr.sa.in.sin_addr);
214 assert_int_equal(rc, 1);
216 s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
217 assert_int_not_equal(s, -1);
220 rc = connect(s, &addr.sa.s, addr.sa_socklen);
221 assert_return_code(rc, errno);
229 assert_return_code(ret, errno);
237 assert_return_code(ret, errno);
239 assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
244 static void test_connect_sendto_null_ipv4(void **state)
246 struct torture_address addr = {
247 .sa_socklen = sizeof(struct sockaddr_in),
249 char send_buf[] = "packet.0";
250 char recv_buf[64] = {0};
255 (void) state; /* unused */
257 addr.sa.in.sin_family = AF_INET;
258 addr.sa.in.sin_port = htons(torture_server_port());
260 rc = inet_pton(AF_INET,
261 torture_server_address(AF_INET),
262 &addr.sa.in.sin_addr);
263 assert_int_equal(rc, 1);
265 s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
266 assert_int_not_equal(s, -1);
269 rc = connect(s, &addr.sa.s, addr.sa_socklen);
270 assert_return_code(rc, errno);
278 assert_return_code(ret, errno);
286 assert_return_code(ret, errno);
288 assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
296 const struct CMUnitTest sendto_tests[] = {
297 cmocka_unit_test_setup_teardown(test_sendto_recvfrom_ipv4,
298 setup_echo_srv_udp_ipv4,
301 cmocka_unit_test_setup_teardown(test_sendto_recvfrom_ipv6,
302 setup_echo_srv_udp_ipv6,
305 cmocka_unit_test_setup_teardown(test_connect_sendto_ipv4,
306 setup_echo_srv_udp_ipv4,
308 cmocka_unit_test_setup_teardown(test_connect_sendto_null_ipv4,
309 setup_echo_srv_udp_ipv4,
313 rc = cmocka_run_group_tests(sendto_tests, NULL, NULL);