new upstream release (3.3.0); modify package compatibility for Stretch
[ossec-hids.git] / src / tests / test_os_net.c
diff --git a/src/tests/test_os_net.c b/src/tests/test_os_net.c
new file mode 100644 (file)
index 0000000..997854f
--- /dev/null
@@ -0,0 +1,383 @@
+/* Copyright (C) 2014 Trend Micro Inc.
+ * All rights reserved.
+ *
+ * This program is a free software; you can redistribute it
+ * and/or modify it under the terms of the GNU General Public
+ * License (version 2) as published by the FSF - Free Software
+ * Foundation
+ */
+
+#include <check.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "../os_net/os_net.h"
+#include "../headers/os_err.h"
+
+#define LOCALHOST4 "127.0.0.1"
+#define LOCALHOST6 "::1"
+#define PORT "4321"
+#define SENDSTRING "Hello World!\n"
+#define BUFFERSIZE 1024
+
+Suite *test_suite(void);
+
+
+START_TEST(test_tcpv4_local)
+{
+    int server_root_socket, server_client_socket, client_socket;
+    char buffer[BUFFERSIZE];
+    char *msg;
+    char ipbuffer[BUFFERSIZE];
+
+    ck_assert_int_ge((server_root_socket = OS_Bindporttcp(PORT, LOCALHOST4)), 0);
+
+    ck_assert_int_ge((client_socket = OS_ConnectTCP(PORT, LOCALHOST4)) , 0);
+
+    ck_assert_int_ge((server_client_socket = OS_AcceptTCP(server_root_socket, ipbuffer, BUFFERSIZE)), 0);
+
+    ck_assert_str_eq(ipbuffer, LOCALHOST4);
+
+    ck_assert_int_eq(OS_SendTCP(client_socket, SENDSTRING), 0);
+
+    ck_assert_int_eq(OS_RecvTCPBuffer(server_client_socket, buffer, BUFFERSIZE), 0);
+
+    ck_assert_str_eq(buffer, SENDSTRING);
+
+    ck_assert_int_eq(OS_SendTCPbySize(server_client_socket, 5, SENDSTRING), 0);
+
+    ck_assert_ptr_ne((msg = OS_RecvTCP(client_socket, BUFFERSIZE)), NULL);
+
+    ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
+
+    free(msg);
+
+    OS_CloseSocket(client_socket);
+    OS_CloseSocket(server_client_socket);
+    OS_CloseSocket(server_root_socket);
+}
+END_TEST
+
+START_TEST(test_tcpv4_inet)
+{
+    int server_root_socket, server_client_socket, client_socket;
+    char buffer[BUFFERSIZE];
+    char *msg;
+    char ipbuffer[BUFFERSIZE];
+
+    ck_assert_int_ge((server_root_socket = OS_Bindporttcp(PORT, NULL)), 0);
+
+    ck_assert_int_ge((client_socket = OS_ConnectTCP(PORT, LOCALHOST4)) , 0);
+
+    ck_assert_int_ge((server_client_socket = OS_AcceptTCP(server_root_socket, ipbuffer, BUFFERSIZE)), 0);
+
+    ck_assert_str_eq(ipbuffer, LOCALHOST4);
+
+    ck_assert_int_eq(OS_SendTCP(client_socket, SENDSTRING), 0);
+
+    ck_assert_int_eq(OS_RecvTCPBuffer(server_client_socket, buffer, BUFFERSIZE), 0);
+
+    ck_assert_str_eq(buffer, SENDSTRING);
+
+    ck_assert_int_eq(OS_SendTCPbySize(server_client_socket, 5, SENDSTRING), 0);
+
+    ck_assert_ptr_ne((msg = OS_RecvTCP(client_socket, BUFFERSIZE)), NULL);
+
+    ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
+
+    free(msg);
+
+    OS_CloseSocket(client_socket);
+    OS_CloseSocket(server_client_socket);
+    OS_CloseSocket(server_root_socket);
+}
+END_TEST
+
+START_TEST(test_tcpv6_local)
+{
+    int server_root_socket, server_client_socket, client_socket;
+    char buffer[BUFFERSIZE];
+    char *msg;
+    char ipbuffer[BUFFERSIZE];
+
+    ck_assert_int_ge((server_root_socket = OS_Bindporttcp(PORT, LOCALHOST6)), 0);
+
+    ck_assert_int_ge((client_socket = OS_ConnectTCP(PORT, LOCALHOST6)) , 0);
+
+    ck_assert_int_ge((server_client_socket = OS_AcceptTCP(server_root_socket, ipbuffer, BUFFERSIZE)), 0);
+
+    ck_assert_str_eq(ipbuffer, LOCALHOST6);
+
+    ck_assert_int_eq(OS_SendTCP(client_socket, SENDSTRING), 0);
+
+    ck_assert_int_eq(OS_RecvTCPBuffer(server_client_socket, buffer, BUFFERSIZE), 0);
+
+    ck_assert_str_eq(buffer, SENDSTRING);
+
+    ck_assert_int_eq(OS_SendTCPbySize(server_client_socket, 5, SENDSTRING), 0);
+
+    ck_assert_ptr_ne((msg = OS_RecvTCP(client_socket, BUFFERSIZE)), NULL);
+
+    ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
+
+    free(msg);
+
+    OS_CloseSocket(client_socket);
+    OS_CloseSocket(server_client_socket);
+    OS_CloseSocket(server_root_socket);
+}
+END_TEST
+
+START_TEST(test_tcpv6_inet)
+{
+    int server_root_socket, server_client_socket, client_socket;
+    char buffer[BUFFERSIZE];
+    char *msg;
+    char ipbuffer[BUFFERSIZE];
+
+    ck_assert_int_ge((server_root_socket = OS_Bindporttcp(PORT, NULL)), 0);
+
+    ck_assert_int_ge((client_socket = OS_ConnectTCP(PORT, LOCALHOST6)) , 0);
+
+    ck_assert_int_ge((server_client_socket = OS_AcceptTCP(server_root_socket, ipbuffer, BUFFERSIZE)), 0);
+
+    ck_assert_str_eq(ipbuffer, LOCALHOST6);
+
+    ck_assert_int_eq(OS_SendTCP(client_socket, SENDSTRING), 0);
+
+    ck_assert_int_eq(OS_RecvTCPBuffer(server_client_socket, buffer, BUFFERSIZE), 0);
+
+    ck_assert_str_eq(buffer, SENDSTRING);
+
+    ck_assert_int_eq(OS_SendTCPbySize(server_client_socket, 5, SENDSTRING), 0);
+
+    ck_assert_ptr_ne((msg = OS_RecvTCP(client_socket, BUFFERSIZE)), NULL);
+
+    ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
+
+    free(msg);
+
+    OS_CloseSocket(client_socket);
+    OS_CloseSocket(server_client_socket);
+    OS_CloseSocket(server_root_socket);
+}
+END_TEST
+
+START_TEST(test_tcpinvalidsockets)
+{
+    char buffer[BUFFERSIZE];
+
+    ck_assert_int_eq(OS_SendTCP(-1, SENDSTRING), OS_SOCKTERR);
+
+    ck_assert_int_eq(OS_SendTCPbySize(-1, strlen(SENDSTRING), SENDSTRING), OS_SOCKTERR);
+
+    ck_assert_ptr_eq(OS_RecvTCP(-1, BUFFERSIZE), NULL);
+
+    ck_assert_int_eq(OS_RecvTCPBuffer(-1, buffer, BUFFERSIZE), -1);
+
+    ck_assert_int_eq(OS_AcceptTCP(-1, buffer, BUFFERSIZE), -1);
+}
+END_TEST
+
+START_TEST(test_udpv4)
+{
+    int server_socket, client_socket;
+    char buffer[BUFFERSIZE];
+    char *msg;
+
+    ck_assert_int_ge((server_socket = OS_Bindportudp(PORT, LOCALHOST4)), 0);
+
+    ck_assert_int_ge((client_socket = OS_ConnectUDP(PORT, LOCALHOST4)) , 0);
+
+    //TODO: ck_assert_int_eq(OS_SendUDP(client_socket, SENDSTRING), 0);
+    ck_assert_int_eq(OS_SendUDPbySize(client_socket, strlen(SENDSTRING), SENDSTRING), 0);
+
+    //TODO: not null-terminated
+    ck_assert_int_eq(OS_RecvConnUDP(server_socket, buffer, BUFFERSIZE), strlen(SENDSTRING));
+
+    ck_assert_str_eq(buffer, SENDSTRING);
+
+    ck_assert_int_eq(OS_SendUDPbySize(client_socket, 5, SENDSTRING), 0);
+
+    ck_assert_ptr_ne((msg = OS_RecvUDP(server_socket, BUFFERSIZE)), NULL);
+
+    ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
+
+    free(msg);
+
+    OS_CloseSocket(client_socket);
+    OS_CloseSocket(server_socket);
+}
+END_TEST
+
+START_TEST(test_udpv6)
+{
+    int server_socket, client_socket;
+    char buffer[BUFFERSIZE];
+    char *msg;
+
+    ck_assert_int_ge((server_socket = OS_Bindportudp(PORT, LOCALHOST6)), 0);
+
+    ck_assert_int_ge((client_socket = OS_ConnectUDP(PORT, LOCALHOST6)) , 0);
+
+    //TODO: ck_assert_int_eq(OS_SendUDP(client_socket, SENDSTRING), 0);
+    ck_assert_int_eq(OS_SendUDPbySize(client_socket, strlen(SENDSTRING), SENDSTRING), 0);
+
+    //TODO: not null-terminated
+    ck_assert_int_eq(OS_RecvConnUDP(server_socket, buffer, BUFFERSIZE), strlen(SENDSTRING));
+
+    ck_assert_str_eq(buffer, SENDSTRING);
+
+    ck_assert_int_eq(OS_SendUDPbySize(client_socket, 5, SENDSTRING), 0);
+
+    ck_assert_ptr_ne((msg = OS_RecvUDP(server_socket, BUFFERSIZE)), NULL);
+
+    ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */
+
+    free(msg);
+
+    OS_CloseSocket(client_socket);
+    OS_CloseSocket(server_socket);
+}
+END_TEST
+
+START_TEST(test_udpinvalidsockets)
+{
+    char buffer[BUFFERSIZE];
+
+    //TODO: ck_assert_int_eq(OS_SendUDP(-1, SENDSTRING), OS_SOCKTERR);
+
+    ck_assert_int_eq(OS_SendUDPbySize(-1, strlen(SENDSTRING), SENDSTRING), OS_SOCKTERR);
+
+    ck_assert_ptr_eq(OS_RecvUDP(-1, BUFFERSIZE), NULL);
+
+    ck_assert_int_eq(OS_RecvConnUDP(-1, buffer, BUFFERSIZE), 0);
+}
+END_TEST
+
+START_TEST(test_unix)
+{
+    int fd;
+
+    /* create socket path */
+    char socket_path[256];
+    strncpy(socket_path, "/tmp/tmp_file-XXXXXX", 256);
+    fd = mkstemp(socket_path);
+    close(fd);
+
+    int server_socket, client_socket;
+    const int msg_size = 2048;
+    char buffer[BUFFERSIZE];
+
+    ck_assert_int_ge((server_socket = OS_BindUnixDomain(socket_path, 0660, msg_size)), 0);
+
+    ck_assert_int_ge(OS_getsocketsize(server_socket), msg_size);
+
+    ck_assert_int_ge((client_socket = OS_ConnectUnixDomain(socket_path, msg_size)), 0);
+
+    ck_assert_int_eq(OS_SendUnix(client_socket, SENDSTRING, 5), 0);
+
+    ck_assert_int_eq(OS_RecvUnix(server_socket, BUFFERSIZE, buffer), 5);
+
+    ck_assert_str_eq(buffer, "Hello");
+
+    ck_assert_int_eq(OS_SendUnix(client_socket, SENDSTRING, 0), 0);
+
+    ck_assert_int_eq(OS_RecvUnix(server_socket, BUFFERSIZE, buffer), strlen(SENDSTRING) + 1);
+
+    ck_assert_str_eq(buffer, SENDSTRING);
+
+    OS_CloseSocket(client_socket);
+    OS_CloseSocket(server_socket);
+
+    unlink(socket_path);
+}
+END_TEST
+
+START_TEST(test_unixinvalidsockets)
+{
+    char buffer[BUFFERSIZE];
+
+    ck_assert_int_eq(OS_SendUnix(-1, SENDSTRING, strlen(SENDSTRING)), OS_SOCKTERR);
+
+    ck_assert_int_eq(OS_RecvUnix(-1, BUFFERSIZE, buffer), 0);
+}
+END_TEST
+
+START_TEST(test_gethost_success_ipv4)
+{
+    char *ret;
+
+    ck_assert_str_eq((ret = OS_GetHost("ipv4.test-ipv6.com", 2)), "216.218.228.119");
+
+    free(ret);
+}
+END_TEST
+
+START_TEST(test_gethost_success_ipv6)
+{
+    char *ret;
+
+    ck_assert_str_eq((ret = OS_GetHost("ipv6.test-ipv6.com", 2)), "2001:470:1:18::119");
+
+    free(ret);
+}
+END_TEST
+
+START_TEST(test_gethost_fail1)
+{
+    ck_assert_ptr_eq(OS_GetHost(NULL, 2), NULL);
+}
+END_TEST
+
+START_TEST(test_gethost_fail2)
+{
+    ck_assert_ptr_eq(OS_GetHost("this.should.not.exist", 2), NULL);
+}
+END_TEST
+
+Suite *test_suite(void)
+{
+    Suite *s = suite_create("os_net");
+
+    TCase *tc_tcp = tcase_create("TCP");
+    tcase_add_test(tc_tcp, test_tcpv4_local);
+    tcase_add_test(tc_tcp, test_tcpv4_inet);
+    tcase_add_test(tc_tcp, test_tcpv6_local);
+    tcase_add_test(tc_tcp, test_tcpv6_inet);
+    tcase_add_test(tc_tcp, test_tcpinvalidsockets);
+
+    TCase *tc_udp = tcase_create("UDP");
+    tcase_add_test(tc_udp, test_udpv4);
+    tcase_add_test(tc_udp, test_udpv6);
+    tcase_add_test(tc_udp, test_udpinvalidsockets);
+
+    TCase *tc_unix = tcase_create("Unix");
+    tcase_add_test(tc_unix, test_unix);
+    tcase_add_test(tc_unix, test_unixinvalidsockets);
+
+    TCase *tc_gethost = tcase_create("GetHost");
+    tcase_add_test(tc_gethost, test_gethost_success_ipv4);
+    tcase_add_test(tc_gethost, test_gethost_success_ipv6);
+    tcase_add_test(tc_gethost, test_gethost_fail1);
+    tcase_add_test(tc_gethost, test_gethost_fail2);
+    tcase_set_timeout(tc_gethost, 10);
+
+    suite_add_tcase(s, tc_tcp);
+    suite_add_tcase(s, tc_udp);
+    suite_add_tcase(s, tc_unix);
+    suite_add_tcase(s, tc_gethost);
+
+    return (s);
+}
+
+int main(void)
+{
+    Suite *s = test_suite();
+    SRunner *sr = srunner_create(s);
+    srunner_run_all(sr, CK_NORMAL);
+    int number_failed = srunner_ntests_failed(sr);
+    srunner_free(sr);
+
+    return ((number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE);
+}