test_echo_tcp_sendmsg_recvmsg_fd: split out test_tcp_sendmsg_recvmsg_fd_same()
[socket_wrapper.git] / tests / test_max_sockets.c
1 #include "torture.h"
2
3 #include <errno.h>
4 #include <stdio.h>
5 #include <cmocka.h>
6 #include <unistd.h>
7 #include <stdlib.h>
8
9 #define MAX_SOCKETS 4
10
11 static int setup(void **state)
12 {
13         int ret;
14         char str[10];
15
16         torture_setup_socket_dir(state);
17
18         ret = snprintf(str, 10, "%d", MAX_SOCKETS);
19         if (ret < 0) {
20                 return ret;
21         }
22
23         ret = setenv("SOCKET_WRAPPER_MAX_SOCKETS", str, 1);
24
25         return ret;
26 }
27
28 static int teardown(void **state)
29 {
30         torture_teardown_socket_dir(state);
31
32         return 0;
33 }
34
35 static int _socket(int *_s)
36 {
37         int s;
38
39         s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
40
41         if (s < 0) {
42                 return -1;
43         }
44
45         *_s = s;
46
47         return 0;
48 }
49
50 static void test_max_sockets(void **state)
51 {
52         int rc;
53         int s[MAX_SOCKETS+1] = { 0 };
54         int i;
55
56         (void) state; /* unused */
57
58         for (i = 0; i < MAX_SOCKETS; i++) {
59                 rc = _socket(&s[i]);
60                 assert_return_code(rc, errno);
61         }
62
63         /* no free space for sockets left */
64         rc = _socket(&s[MAX_SOCKETS]);
65         assert_int_equal(rc, -1);
66         assert_int_equal(errno, ENFILE);
67
68         /* closing a socket frees up space */
69         close(s[0]);
70         rc = _socket(&s[0]);
71         assert_return_code(rc, errno);
72
73         /* but just one */
74         rc = _socket(&s[MAX_SOCKETS]);
75         assert_int_equal(rc, -1);
76         assert_int_equal(errno, ENFILE);
77
78         for (i = 0; i < MAX_SOCKETS; i++) {
79                 close(s[i]);
80         }
81 }
82
83 int main(void) {
84         int rc;
85
86         const struct CMUnitTest max_sockets_tests[] = {
87                 cmocka_unit_test_setup_teardown(test_max_sockets,
88                                                 setup, teardown),
89         };
90
91         rc = cmocka_run_group_tests(max_sockets_tests, NULL, NULL);
92
93         return rc;
94 }