12 #include <sys/types.h>
13 #include <sys/socket.h>
14 #include <netinet/in.h>
15 #include <arpa/inet.h>
20 #define NUM_THREADS 10
22 static int setup_echo_srv_tcp_ipv4(void **state)
24 torture_setup_echo_srv_tcp_ipv4(state);
29 static int teardown(void **state)
31 torture_teardown_echo_srv(state);
36 static void *thread_worker(void *arg)
38 struct torture_address addr = {
39 .sa_socklen = sizeof(struct sockaddr_in),
46 (void) arg; /* unused */
48 s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
49 assert_int_not_equal(s, -1);
51 addr.sa.in.sin_family = AF_INET;
52 addr.sa.in.sin_port = htons(torture_server_port());
54 rc = inet_pton(addr.sa.in.sin_family,
55 torture_server_address(AF_INET),
56 &addr.sa.in.sin_addr);
57 assert_int_equal(rc, 1);
59 rc = connect(s, &addr.sa.s, addr.sa_socklen);
60 assert_return_code(rc, errno);
62 for (i = 0; i < 10; i++) {
63 char send_buf[64] = {0};
64 char recv_buf[64] = {0};
66 snprintf(send_buf, sizeof(send_buf), "packet.%d", i);
71 assert_return_code(ret, errno);
76 assert_int_not_equal(ret, -1);
78 assert_memory_equal(send_buf, recv_buf, sizeof(send_buf));
85 static void test_write_read_ipv4(void **state)
87 pthread_attr_t pthread_custom_attr;
88 pthread_t threads[NUM_THREADS];
91 (void) state; /* unused */
93 pthread_attr_init(&pthread_custom_attr);
95 for (i = 0; i < NUM_THREADS; i++) {
96 pthread_create(&threads[i],
102 for (i = 0; i < NUM_THREADS; i++) {
103 pthread_join(threads[i], NULL);
106 pthread_attr_destroy(&pthread_custom_attr);
112 const struct CMUnitTest tcp_write_tests[] = {
113 cmocka_unit_test_setup_teardown(test_write_read_ipv4,
114 setup_echo_srv_tcp_ipv4,
118 rc = cmocka_run_group_tests(tcp_write_tests, NULL, NULL);