1 /* Copyright (C) 2014 Trend Micro Inc.
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
14 #include "../os_net/os_net.h"
15 #include "../headers/os_err.h"
17 #define LOCALHOST4 "127.0.0.1"
18 #define LOCALHOST6 "::1"
20 #define SENDSTRING "Hello World!\n"
21 #define BUFFERSIZE 1024
23 Suite *test_suite(void);
26 START_TEST(test_tcpv4_local)
28 int server_root_socket, server_client_socket, client_socket;
29 char buffer[BUFFERSIZE];
31 char ipbuffer[BUFFERSIZE];
33 ck_assert_int_ge((server_root_socket = OS_Bindporttcp(PORT, LOCALHOST4)), 0);
35 ck_assert_int_ge((client_socket = OS_ConnectTCP(PORT, LOCALHOST4)) , 0);
37 ck_assert_int_ge((server_client_socket = OS_AcceptTCP(server_root_socket, ipbuffer, BUFFERSIZE)), 0);
39 ck_assert_str_eq(ipbuffer, LOCALHOST4);
41 ck_assert_int_eq(OS_SendTCP(client_socket, SENDSTRING), 0);
43 ck_assert_int_eq(OS_RecvTCPBuffer(server_client_socket, buffer, BUFFERSIZE), 0);
45 ck_assert_str_eq(buffer, SENDSTRING);
47 ck_assert_int_eq(OS_SendTCPbySize(server_client_socket, 5, SENDSTRING), 0);
49 ck_assert_ptr_ne((msg = OS_RecvTCP(client_socket, BUFFERSIZE)), NULL);
51 ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
55 OS_CloseSocket(client_socket);
56 OS_CloseSocket(server_client_socket);
57 OS_CloseSocket(server_root_socket);
61 START_TEST(test_tcpv4_inet)
63 int server_root_socket, server_client_socket, client_socket;
64 char buffer[BUFFERSIZE];
66 char ipbuffer[BUFFERSIZE];
68 ck_assert_int_ge((server_root_socket = OS_Bindporttcp(PORT, NULL)), 0);
70 ck_assert_int_ge((client_socket = OS_ConnectTCP(PORT, LOCALHOST4)) , 0);
72 ck_assert_int_ge((server_client_socket = OS_AcceptTCP(server_root_socket, ipbuffer, BUFFERSIZE)), 0);
74 ck_assert_str_eq(ipbuffer, LOCALHOST4);
76 ck_assert_int_eq(OS_SendTCP(client_socket, SENDSTRING), 0);
78 ck_assert_int_eq(OS_RecvTCPBuffer(server_client_socket, buffer, BUFFERSIZE), 0);
80 ck_assert_str_eq(buffer, SENDSTRING);
82 ck_assert_int_eq(OS_SendTCPbySize(server_client_socket, 5, SENDSTRING), 0);
84 ck_assert_ptr_ne((msg = OS_RecvTCP(client_socket, BUFFERSIZE)), NULL);
86 ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
90 OS_CloseSocket(client_socket);
91 OS_CloseSocket(server_client_socket);
92 OS_CloseSocket(server_root_socket);
96 START_TEST(test_tcpv6_local)
98 int server_root_socket, server_client_socket, client_socket;
99 char buffer[BUFFERSIZE];
101 char ipbuffer[BUFFERSIZE];
103 ck_assert_int_ge((server_root_socket = OS_Bindporttcp(PORT, LOCALHOST6)), 0);
105 ck_assert_int_ge((client_socket = OS_ConnectTCP(PORT, LOCALHOST6)) , 0);
107 ck_assert_int_ge((server_client_socket = OS_AcceptTCP(server_root_socket, ipbuffer, BUFFERSIZE)), 0);
109 ck_assert_str_eq(ipbuffer, LOCALHOST6);
111 ck_assert_int_eq(OS_SendTCP(client_socket, SENDSTRING), 0);
113 ck_assert_int_eq(OS_RecvTCPBuffer(server_client_socket, buffer, BUFFERSIZE), 0);
115 ck_assert_str_eq(buffer, SENDSTRING);
117 ck_assert_int_eq(OS_SendTCPbySize(server_client_socket, 5, SENDSTRING), 0);
119 ck_assert_ptr_ne((msg = OS_RecvTCP(client_socket, BUFFERSIZE)), NULL);
121 ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
125 OS_CloseSocket(client_socket);
126 OS_CloseSocket(server_client_socket);
127 OS_CloseSocket(server_root_socket);
131 START_TEST(test_tcpv6_inet)
133 int server_root_socket, server_client_socket, client_socket;
134 char buffer[BUFFERSIZE];
136 char ipbuffer[BUFFERSIZE];
138 ck_assert_int_ge((server_root_socket = OS_Bindporttcp(PORT, NULL)), 0);
140 ck_assert_int_ge((client_socket = OS_ConnectTCP(PORT, LOCALHOST6)) , 0);
142 ck_assert_int_ge((server_client_socket = OS_AcceptTCP(server_root_socket, ipbuffer, BUFFERSIZE)), 0);
144 ck_assert_str_eq(ipbuffer, LOCALHOST6);
146 ck_assert_int_eq(OS_SendTCP(client_socket, SENDSTRING), 0);
148 ck_assert_int_eq(OS_RecvTCPBuffer(server_client_socket, buffer, BUFFERSIZE), 0);
150 ck_assert_str_eq(buffer, SENDSTRING);
152 ck_assert_int_eq(OS_SendTCPbySize(server_client_socket, 5, SENDSTRING), 0);
154 ck_assert_ptr_ne((msg = OS_RecvTCP(client_socket, BUFFERSIZE)), NULL);
156 ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
160 OS_CloseSocket(client_socket);
161 OS_CloseSocket(server_client_socket);
162 OS_CloseSocket(server_root_socket);
166 START_TEST(test_tcpinvalidsockets)
168 char buffer[BUFFERSIZE];
170 ck_assert_int_eq(OS_SendTCP(-1, SENDSTRING), OS_SOCKTERR);
172 ck_assert_int_eq(OS_SendTCPbySize(-1, strlen(SENDSTRING), SENDSTRING), OS_SOCKTERR);
174 ck_assert_ptr_eq(OS_RecvTCP(-1, BUFFERSIZE), NULL);
176 ck_assert_int_eq(OS_RecvTCPBuffer(-1, buffer, BUFFERSIZE), -1);
178 ck_assert_int_eq(OS_AcceptTCP(-1, buffer, BUFFERSIZE), -1);
182 START_TEST(test_udpv4)
184 int server_socket, client_socket;
185 char buffer[BUFFERSIZE];
188 ck_assert_int_ge((server_socket = OS_Bindportudp(PORT, LOCALHOST4)), 0);
190 ck_assert_int_ge((client_socket = OS_ConnectUDP(PORT, LOCALHOST4)) , 0);
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);
195 //TODO: not null-terminated
196 ck_assert_int_eq(OS_RecvConnUDP(server_socket, buffer, BUFFERSIZE), strlen(SENDSTRING));
198 ck_assert_str_eq(buffer, SENDSTRING);
200 ck_assert_int_eq(OS_SendUDPbySize(client_socket, 5, SENDSTRING), 0);
202 ck_assert_ptr_ne((msg = OS_RecvUDP(server_socket, BUFFERSIZE)), NULL);
204 ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
208 OS_CloseSocket(client_socket);
209 OS_CloseSocket(server_socket);
213 START_TEST(test_udpv6)
215 int server_socket, client_socket;
216 char buffer[BUFFERSIZE];
219 ck_assert_int_ge((server_socket = OS_Bindportudp(PORT, LOCALHOST6)), 0);
221 ck_assert_int_ge((client_socket = OS_ConnectUDP(PORT, LOCALHOST6)) , 0);
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);
226 //TODO: not null-terminated
227 ck_assert_int_eq(OS_RecvConnUDP(server_socket, buffer, BUFFERSIZE), strlen(SENDSTRING));
229 ck_assert_str_eq(buffer, SENDSTRING);
231 ck_assert_int_eq(OS_SendUDPbySize(client_socket, 5, SENDSTRING), 0);
233 ck_assert_ptr_ne((msg = OS_RecvUDP(server_socket, BUFFERSIZE)), NULL);
235 ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
239 OS_CloseSocket(client_socket);
240 OS_CloseSocket(server_socket);
244 START_TEST(test_udpinvalidsockets)
246 char buffer[BUFFERSIZE];
248 //TODO: ck_assert_int_eq(OS_SendUDP(-1, SENDSTRING), OS_SOCKTERR);
250 ck_assert_int_eq(OS_SendUDPbySize(-1, strlen(SENDSTRING), SENDSTRING), OS_SOCKTERR);
252 ck_assert_ptr_eq(OS_RecvUDP(-1, BUFFERSIZE), NULL);
254 ck_assert_int_eq(OS_RecvConnUDP(-1, buffer, BUFFERSIZE), 0);
258 START_TEST(test_unix)
262 /* create socket path */
263 char socket_path[256];
264 strncpy(socket_path, "/tmp/tmp_file-XXXXXX", 256);
265 fd = mkstemp(socket_path);
268 int server_socket, client_socket;
269 const int msg_size = 2048;
270 char buffer[BUFFERSIZE];
272 ck_assert_int_ge((server_socket = OS_BindUnixDomain(socket_path, 0660, msg_size)), 0);
274 ck_assert_int_ge(OS_getsocketsize(server_socket), msg_size);
276 ck_assert_int_ge((client_socket = OS_ConnectUnixDomain(socket_path, msg_size)), 0);
278 ck_assert_int_eq(OS_SendUnix(client_socket, SENDSTRING, 5), 0);
280 ck_assert_int_eq(OS_RecvUnix(server_socket, BUFFERSIZE, buffer), 5);
282 ck_assert_str_eq(buffer, "Hello");
284 ck_assert_int_eq(OS_SendUnix(client_socket, SENDSTRING, 0), 0);
286 ck_assert_int_eq(OS_RecvUnix(server_socket, BUFFERSIZE, buffer), strlen(SENDSTRING) + 1);
288 ck_assert_str_eq(buffer, SENDSTRING);
290 OS_CloseSocket(client_socket);
291 OS_CloseSocket(server_socket);
297 START_TEST(test_unixinvalidsockets)
299 char buffer[BUFFERSIZE];
301 ck_assert_int_eq(OS_SendUnix(-1, SENDSTRING, strlen(SENDSTRING)), OS_SOCKTERR);
303 ck_assert_int_eq(OS_RecvUnix(-1, BUFFERSIZE, buffer), 0);
307 START_TEST(test_gethost_success_ipv4)
311 ck_assert_str_eq((ret = OS_GetHost("ipv4.test-ipv6.com", 2)), "216.218.228.119");
317 START_TEST(test_gethost_success_ipv6)
321 ck_assert_str_eq((ret = OS_GetHost("ipv6.test-ipv6.com", 2)), "2001:470:1:18::119");
327 START_TEST(test_gethost_fail1)
329 ck_assert_ptr_eq(OS_GetHost(NULL, 2), NULL);
333 START_TEST(test_gethost_fail2)
335 ck_assert_ptr_eq(OS_GetHost("this.should.not.exist", 2), NULL);
339 Suite *test_suite(void)
341 Suite *s = suite_create("os_net");
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);
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);
355 TCase *tc_unix = tcase_create("Unix");
356 tcase_add_test(tc_unix, test_unix);
357 tcase_add_test(tc_unix, test_unixinvalidsockets);
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);
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);
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);
382 return ((number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE);