new upstream release (3.3.0); modify package compatibility for Stretch
[ossec-hids.git] / src / tests / test_os_net.c
1 /* Copyright (C) 2014 Trend Micro Inc.
2  * All rights reserved.
3  *
4  * This program is a free software; you can redistribute it
5  * and/or modify it under the terms of the GNU General Public
6  * License (version 2) as published by the FSF - Free Software
7  * Foundation
8  */
9
10 #include <check.h>
11 #include <stdlib.h>
12 #include <unistd.h>
13
14 #include "../os_net/os_net.h"
15 #include "../headers/os_err.h"
16
17 #define LOCALHOST4 "127.0.0.1"
18 #define LOCALHOST6 "::1"
19 #define PORT "4321"
20 #define SENDSTRING "Hello World!\n"
21 #define BUFFERSIZE 1024
22
23 Suite *test_suite(void);
24
25
26 START_TEST(test_tcpv4_local)
27 {
28     int server_root_socket, server_client_socket, client_socket;
29     char buffer[BUFFERSIZE];
30     char *msg;
31     char ipbuffer[BUFFERSIZE];
32
33     ck_assert_int_ge((server_root_socket = OS_Bindporttcp(PORT, LOCALHOST4)), 0);
34
35     ck_assert_int_ge((client_socket = OS_ConnectTCP(PORT, LOCALHOST4)) , 0);
36
37     ck_assert_int_ge((server_client_socket = OS_AcceptTCP(server_root_socket, ipbuffer, BUFFERSIZE)), 0);
38
39     ck_assert_str_eq(ipbuffer, LOCALHOST4);
40
41     ck_assert_int_eq(OS_SendTCP(client_socket, SENDSTRING), 0);
42
43     ck_assert_int_eq(OS_RecvTCPBuffer(server_client_socket, buffer, BUFFERSIZE), 0);
44
45     ck_assert_str_eq(buffer, SENDSTRING);
46
47     ck_assert_int_eq(OS_SendTCPbySize(server_client_socket, 5, SENDSTRING), 0);
48
49     ck_assert_ptr_ne((msg = OS_RecvTCP(client_socket, BUFFERSIZE)), NULL);
50
51     ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
52
53     free(msg);
54
55     OS_CloseSocket(client_socket);
56     OS_CloseSocket(server_client_socket);
57     OS_CloseSocket(server_root_socket);
58 }
59 END_TEST
60
61 START_TEST(test_tcpv4_inet)
62 {
63     int server_root_socket, server_client_socket, client_socket;
64     char buffer[BUFFERSIZE];
65     char *msg;
66     char ipbuffer[BUFFERSIZE];
67
68     ck_assert_int_ge((server_root_socket = OS_Bindporttcp(PORT, NULL)), 0);
69
70     ck_assert_int_ge((client_socket = OS_ConnectTCP(PORT, LOCALHOST4)) , 0);
71
72     ck_assert_int_ge((server_client_socket = OS_AcceptTCP(server_root_socket, ipbuffer, BUFFERSIZE)), 0);
73
74     ck_assert_str_eq(ipbuffer, LOCALHOST4);
75
76     ck_assert_int_eq(OS_SendTCP(client_socket, SENDSTRING), 0);
77
78     ck_assert_int_eq(OS_RecvTCPBuffer(server_client_socket, buffer, BUFFERSIZE), 0);
79
80     ck_assert_str_eq(buffer, SENDSTRING);
81
82     ck_assert_int_eq(OS_SendTCPbySize(server_client_socket, 5, SENDSTRING), 0);
83
84     ck_assert_ptr_ne((msg = OS_RecvTCP(client_socket, BUFFERSIZE)), NULL);
85
86     ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
87
88     free(msg);
89
90     OS_CloseSocket(client_socket);
91     OS_CloseSocket(server_client_socket);
92     OS_CloseSocket(server_root_socket);
93 }
94 END_TEST
95
96 START_TEST(test_tcpv6_local)
97 {
98     int server_root_socket, server_client_socket, client_socket;
99     char buffer[BUFFERSIZE];
100     char *msg;
101     char ipbuffer[BUFFERSIZE];
102
103     ck_assert_int_ge((server_root_socket = OS_Bindporttcp(PORT, LOCALHOST6)), 0);
104
105     ck_assert_int_ge((client_socket = OS_ConnectTCP(PORT, LOCALHOST6)) , 0);
106
107     ck_assert_int_ge((server_client_socket = OS_AcceptTCP(server_root_socket, ipbuffer, BUFFERSIZE)), 0);
108
109     ck_assert_str_eq(ipbuffer, LOCALHOST6);
110
111     ck_assert_int_eq(OS_SendTCP(client_socket, SENDSTRING), 0);
112
113     ck_assert_int_eq(OS_RecvTCPBuffer(server_client_socket, buffer, BUFFERSIZE), 0);
114
115     ck_assert_str_eq(buffer, SENDSTRING);
116
117     ck_assert_int_eq(OS_SendTCPbySize(server_client_socket, 5, SENDSTRING), 0);
118
119     ck_assert_ptr_ne((msg = OS_RecvTCP(client_socket, BUFFERSIZE)), NULL);
120
121     ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
122
123     free(msg);
124
125     OS_CloseSocket(client_socket);
126     OS_CloseSocket(server_client_socket);
127     OS_CloseSocket(server_root_socket);
128 }
129 END_TEST
130
131 START_TEST(test_tcpv6_inet)
132 {
133     int server_root_socket, server_client_socket, client_socket;
134     char buffer[BUFFERSIZE];
135     char *msg;
136     char ipbuffer[BUFFERSIZE];
137
138     ck_assert_int_ge((server_root_socket = OS_Bindporttcp(PORT, NULL)), 0);
139
140     ck_assert_int_ge((client_socket = OS_ConnectTCP(PORT, LOCALHOST6)) , 0);
141
142     ck_assert_int_ge((server_client_socket = OS_AcceptTCP(server_root_socket, ipbuffer, BUFFERSIZE)), 0);
143
144     ck_assert_str_eq(ipbuffer, LOCALHOST6);
145
146     ck_assert_int_eq(OS_SendTCP(client_socket, SENDSTRING), 0);
147
148     ck_assert_int_eq(OS_RecvTCPBuffer(server_client_socket, buffer, BUFFERSIZE), 0);
149
150     ck_assert_str_eq(buffer, SENDSTRING);
151
152     ck_assert_int_eq(OS_SendTCPbySize(server_client_socket, 5, SENDSTRING), 0);
153
154     ck_assert_ptr_ne((msg = OS_RecvTCP(client_socket, BUFFERSIZE)), NULL);
155
156     ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
157
158     free(msg);
159
160     OS_CloseSocket(client_socket);
161     OS_CloseSocket(server_client_socket);
162     OS_CloseSocket(server_root_socket);
163 }
164 END_TEST
165
166 START_TEST(test_tcpinvalidsockets)
167 {
168     char buffer[BUFFERSIZE];
169
170     ck_assert_int_eq(OS_SendTCP(-1, SENDSTRING), OS_SOCKTERR);
171
172     ck_assert_int_eq(OS_SendTCPbySize(-1, strlen(SENDSTRING), SENDSTRING), OS_SOCKTERR);
173
174     ck_assert_ptr_eq(OS_RecvTCP(-1, BUFFERSIZE), NULL);
175
176     ck_assert_int_eq(OS_RecvTCPBuffer(-1, buffer, BUFFERSIZE), -1);
177
178     ck_assert_int_eq(OS_AcceptTCP(-1, buffer, BUFFERSIZE), -1);
179 }
180 END_TEST
181
182 START_TEST(test_udpv4)
183 {
184     int server_socket, client_socket;
185     char buffer[BUFFERSIZE];
186     char *msg;
187
188     ck_assert_int_ge((server_socket = OS_Bindportudp(PORT, LOCALHOST4)), 0);
189
190     ck_assert_int_ge((client_socket = OS_ConnectUDP(PORT, LOCALHOST4)) , 0);
191
192     //TODO: ck_assert_int_eq(OS_SendUDP(client_socket, SENDSTRING), 0);
193     ck_assert_int_eq(OS_SendUDPbySize(client_socket, strlen(SENDSTRING), SENDSTRING), 0);
194
195     //TODO: not null-terminated
196     ck_assert_int_eq(OS_RecvConnUDP(server_socket, buffer, BUFFERSIZE), strlen(SENDSTRING));
197
198     ck_assert_str_eq(buffer, SENDSTRING);
199
200     ck_assert_int_eq(OS_SendUDPbySize(client_socket, 5, SENDSTRING), 0);
201
202     ck_assert_ptr_ne((msg = OS_RecvUDP(server_socket, BUFFERSIZE)), NULL);
203
204     ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
205
206     free(msg);
207
208     OS_CloseSocket(client_socket);
209     OS_CloseSocket(server_socket);
210 }
211 END_TEST
212
213 START_TEST(test_udpv6)
214 {
215     int server_socket, client_socket;
216     char buffer[BUFFERSIZE];
217     char *msg;
218
219     ck_assert_int_ge((server_socket = OS_Bindportudp(PORT, LOCALHOST6)), 0);
220
221     ck_assert_int_ge((client_socket = OS_ConnectUDP(PORT, LOCALHOST6)) , 0);
222
223     //TODO: ck_assert_int_eq(OS_SendUDP(client_socket, SENDSTRING), 0);
224     ck_assert_int_eq(OS_SendUDPbySize(client_socket, strlen(SENDSTRING), SENDSTRING), 0);
225
226     //TODO: not null-terminated
227     ck_assert_int_eq(OS_RecvConnUDP(server_socket, buffer, BUFFERSIZE), strlen(SENDSTRING));
228
229     ck_assert_str_eq(buffer, SENDSTRING);
230
231     ck_assert_int_eq(OS_SendUDPbySize(client_socket, 5, SENDSTRING), 0);
232
233     ck_assert_ptr_ne((msg = OS_RecvUDP(server_socket, BUFFERSIZE)), NULL);
234
235     ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
236
237     free(msg);
238
239     OS_CloseSocket(client_socket);
240     OS_CloseSocket(server_socket);
241 }
242 END_TEST
243
244 START_TEST(test_udpinvalidsockets)
245 {
246     char buffer[BUFFERSIZE];
247
248     //TODO: ck_assert_int_eq(OS_SendUDP(-1, SENDSTRING), OS_SOCKTERR);
249
250     ck_assert_int_eq(OS_SendUDPbySize(-1, strlen(SENDSTRING), SENDSTRING), OS_SOCKTERR);
251
252     ck_assert_ptr_eq(OS_RecvUDP(-1, BUFFERSIZE), NULL);
253
254     ck_assert_int_eq(OS_RecvConnUDP(-1, buffer, BUFFERSIZE), 0);
255 }
256 END_TEST
257
258 START_TEST(test_unix)
259 {
260     int fd;
261
262     /* create socket path */
263     char socket_path[256];
264     strncpy(socket_path, "/tmp/tmp_file-XXXXXX", 256);
265     fd = mkstemp(socket_path);
266     close(fd);
267
268     int server_socket, client_socket;
269     const int msg_size = 2048;
270     char buffer[BUFFERSIZE];
271
272     ck_assert_int_ge((server_socket = OS_BindUnixDomain(socket_path, 0660, msg_size)), 0);
273
274     ck_assert_int_ge(OS_getsocketsize(server_socket), msg_size);
275
276     ck_assert_int_ge((client_socket = OS_ConnectUnixDomain(socket_path, msg_size)), 0);
277
278     ck_assert_int_eq(OS_SendUnix(client_socket, SENDSTRING, 5), 0);
279
280     ck_assert_int_eq(OS_RecvUnix(server_socket, BUFFERSIZE, buffer), 5);
281
282     ck_assert_str_eq(buffer, "Hello");
283
284     ck_assert_int_eq(OS_SendUnix(client_socket, SENDSTRING, 0), 0);
285
286     ck_assert_int_eq(OS_RecvUnix(server_socket, BUFFERSIZE, buffer), strlen(SENDSTRING) + 1);
287
288     ck_assert_str_eq(buffer, SENDSTRING);
289
290     OS_CloseSocket(client_socket);
291     OS_CloseSocket(server_socket);
292
293     unlink(socket_path);
294 }
295 END_TEST
296
297 START_TEST(test_unixinvalidsockets)
298 {
299     char buffer[BUFFERSIZE];
300
301     ck_assert_int_eq(OS_SendUnix(-1, SENDSTRING, strlen(SENDSTRING)), OS_SOCKTERR);
302
303     ck_assert_int_eq(OS_RecvUnix(-1, BUFFERSIZE, buffer), 0);
304 }
305 END_TEST
306
307 START_TEST(test_gethost_success_ipv4)
308 {
309     char *ret;
310
311     ck_assert_str_eq((ret = OS_GetHost("ipv4.test-ipv6.com", 2)), "216.218.228.119");
312
313     free(ret);
314 }
315 END_TEST
316
317 START_TEST(test_gethost_success_ipv6)
318 {
319     char *ret;
320
321     ck_assert_str_eq((ret = OS_GetHost("ipv6.test-ipv6.com", 2)), "2001:470:1:18::119");
322
323     free(ret);
324 }
325 END_TEST
326
327 START_TEST(test_gethost_fail1)
328 {
329     ck_assert_ptr_eq(OS_GetHost(NULL, 2), NULL);
330 }
331 END_TEST
332
333 START_TEST(test_gethost_fail2)
334 {
335     ck_assert_ptr_eq(OS_GetHost("this.should.not.exist", 2), NULL);
336 }
337 END_TEST
338
339 Suite *test_suite(void)
340 {
341     Suite *s = suite_create("os_net");
342
343     TCase *tc_tcp = tcase_create("TCP");
344     tcase_add_test(tc_tcp, test_tcpv4_local);
345     tcase_add_test(tc_tcp, test_tcpv4_inet);
346     tcase_add_test(tc_tcp, test_tcpv6_local);
347     tcase_add_test(tc_tcp, test_tcpv6_inet);
348     tcase_add_test(tc_tcp, test_tcpinvalidsockets);
349
350     TCase *tc_udp = tcase_create("UDP");
351     tcase_add_test(tc_udp, test_udpv4);
352     tcase_add_test(tc_udp, test_udpv6);
353     tcase_add_test(tc_udp, test_udpinvalidsockets);
354
355     TCase *tc_unix = tcase_create("Unix");
356     tcase_add_test(tc_unix, test_unix);
357     tcase_add_test(tc_unix, test_unixinvalidsockets);
358
359     TCase *tc_gethost = tcase_create("GetHost");
360     tcase_add_test(tc_gethost, test_gethost_success_ipv4);
361     tcase_add_test(tc_gethost, test_gethost_success_ipv6);
362     tcase_add_test(tc_gethost, test_gethost_fail1);
363     tcase_add_test(tc_gethost, test_gethost_fail2);
364     tcase_set_timeout(tc_gethost, 10);
365
366     suite_add_tcase(s, tc_tcp);
367     suite_add_tcase(s, tc_udp);
368     suite_add_tcase(s, tc_unix);
369     suite_add_tcase(s, tc_gethost);
370
371     return (s);
372 }
373
374 int main(void)
375 {
376     Suite *s = test_suite();
377     SRunner *sr = srunner_create(s);
378     srunner_run_all(sr, CK_NORMAL);
379     int number_failed = srunner_ntests_failed(sr);
380     srunner_free(sr);
381
382     return ((number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE);
383 }