X-Git-Url: http://ftp.carnet.hr/carnet-debian/scm?p=ossec-hids.git;a=blobdiff_plain;f=src%2Ftests%2Ftest_os_xml.c;fp=src%2Ftests%2Ftest_os_xml.c;h=1c6fa9468004bb624f1e7883bfe94293901bb68f;hp=0000000000000000000000000000000000000000;hb=789cbc8e52da68eba3517b920ef22e000cf3c9fd;hpb=ef70704f0b31b59bb719b884d6a99cb9e3e2044a diff --git a/src/tests/test_os_xml.c b/src/tests/test_os_xml.c new file mode 100644 index 0000000..1c6fa94 --- /dev/null +++ b/src/tests/test_os_xml.c @@ -0,0 +1,973 @@ +/* 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 +#include +#include +#include + +#include "../os_xml/os_xml.h" +#include "../os_xml/os_xml_internal.h" + +Suite *test_suite(void); + +static void create_xml_file(const char *str, char file_name[], size_t length) +{ + strncpy(file_name, "/tmp/tmp_file-XXXXXX", length); + int fd = mkstemp(file_name); + + write(fd, str, strlen(str)); + close(fd); +} + +static void nodecat(XML_NODE node, OS_XML *xml, char *buffer) { + int i = 0; + /* write node */ + while(node[i]) + { + strncat(buffer, "<", 1); + ck_assert_ptr_ne(node[i]->element, NULL); + strncat(buffer, node[i]->element, strlen(node[i]->element)); + /* write attributes */ + if(node[i]->attributes) + { + ck_assert_ptr_ne(node[i]->values, NULL); + int j = 0; + while(node[i]->attributes[j]) + { + strncat(buffer, " ", 1); + ck_assert_ptr_ne(node[i]->values[j], NULL); + strncat(buffer, node[i]->attributes[j], strlen(node[i]->attributes[j])); + strncat(buffer, "=", 1); + strncat(buffer, "\"", 1); + strncat(buffer, node[i]->values[j], strlen(node[i]->values[j])); + strncat(buffer, "\"", 1); + j++; + } + ck_assert_ptr_eq(node[i]->values[j], NULL); + } + else + { + ck_assert_ptr_eq(node[i]->values, NULL); + } + strncat(buffer, ">", 1); + ck_assert_ptr_ne(node[i]->content, NULL); + strncat(buffer, node[i]->content, strlen(node[i]->content)); + + /* write children */ + XML_NODE child = OS_GetElementsbyNode(xml, node[i]); + if(child != NULL) + { + nodecat(child, xml, buffer); + OS_ClearNode(child); + } + + /* close node */ + strncat(buffer, "element, strlen(node[i]->element)); + strncat(buffer, ">", 1); + i++; + } +} + +static void assert_os_xml_eq_str(OS_XML *xml, const char *xml_str) +{ + XML_NODE node = OS_GetElementsbyNode(xml, NULL); + if(node == NULL) + { + ck_assert_str_eq(xml_str, ""); + return; + } + + char *buffer = (char *) malloc(6144 * sizeof(char)); + buffer[0] = '\0'; + nodecat(node, xml, buffer); + OS_ClearNode(node); + + ck_assert_str_eq(buffer, xml_str); + + free(buffer); +} + +#define assert_os_xml_eq(PARSE_STR, XML_STR) do { \ + char _ck_xml_file_name[256]; \ + create_xml_file(PARSE_STR, _ck_xml_file_name, 256); \ + OS_XML _ck_xml; \ + ck_assert_int_eq(OS_ReadXML(_ck_xml_file_name, &_ck_xml), 0); \ + ck_assert_int_eq(OS_ApplyVariables(&_ck_xml), 0); \ + assert_os_xml_eq_str(&_ck_xml, XML_STR); \ + OS_ClearXML(&_ck_xml); \ + unlink(_ck_xml_file_name); \ +} while (0) + +START_TEST(test_simplenodes) +{ + assert_os_xml_eq("", ""); + assert_os_xml_eq("", ""); + assert_os_xml_eq("", ""); + assert_os_xml_eq("", ""); +} +END_TEST + + +START_TEST(test_multiplenodes) +{ + assert_os_xml_eq( + "" + "" + "", + "" + "" + ""); +} +END_TEST + +START_TEST(test_children) +{ + assert_os_xml_eq( + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + "", + "" + "" + "" + "" + "" + "" + "" + "" + "" + "" + ""); +} +END_TEST + +START_TEST(test_multiplecontent) +{ + assert_os_xml_eq( + "" + "value1" + "" + "", + ""); + assert_os_xml_eq( + "" + "value1" + "" + "value2" + "", + "value2"); +} +END_TEST + + +START_TEST(test_attributes) +{ + assert_os_xml_eq( + "", + ""); + + assert_os_xml_eq( + "", + ""); + + assert_os_xml_eq( + "", + ""); + + assert_os_xml_eq( + "", + ""); + + assert_os_xml_eq( + "", + ""); + + assert_os_xml_eq( + "", + ""); + + assert_os_xml_eq( + "", + ""); + + assert_os_xml_eq( + "", + ""); + + assert_os_xml_eq( + "", + ""); +} +END_TEST + +START_TEST(test_variables) +{ + assert_os_xml_eq( + "value1" + "value2" + "$var2" + "blah$var2" + "blah$var2$var1 blah", + "value2" + "blahvalue2" + "blahvalue2value1 blah"); +} +END_TEST + +START_TEST(test_comments) +{ + assert_os_xml_eq( + "", + ""); + assert_os_xml_eq( + "", + ""); + + assert_os_xml_eq( + "", + ""); + + assert_os_xml_eq( + "", + ""); +} +END_TEST + +START_TEST(test_specialchars) +{ + assert_os_xml_eq( + "value1" + "\\", + "\\"); +} +END_TEST + +START_TEST(test_linecounter) +{ + char xml_file_name[256]; + create_xml_file("\n\n" , xml_file_name, 256); + OS_XML xml; + XML_NODE node; + ck_assert_int_eq(OS_ReadXML(xml_file_name, &xml), 0); + ck_assert_int_eq(OS_ApplyVariables(&xml), 0); + ck_assert_ptr_ne(node = OS_GetElementsbyNode(&xml, NULL), NULL); + ck_assert_int_eq(xml.ln[0], 1); + ck_assert_int_eq(xml.ln[1], 2); + ck_assert_int_eq(xml.ln[2], 3); + + OS_ClearNode(node); + OS_ClearXML(&xml); + unlink(xml_file_name); +} +END_TEST + +START_TEST(test_invalidfile) +{ + OS_XML xml; + ck_assert_int_ne(OS_ReadXML("invalid_file.inv", &xml), 0); + ck_assert_str_eq(xml.err, "XMLERR: File 'invalid_file.inv' not found."); + ck_assert_int_eq(xml.err_line, 0); + + OS_ClearXML(&xml); +} +END_TEST + +START_TEST(test_unclosednode) +{ + char xml_file_name[256]; + create_xml_file("", xml_file_name, 256); + OS_XML xml; + ck_assert_int_ne(OS_ReadXML(xml_file_name, &xml), 0); + ck_assert_str_eq(xml.err, "XMLERR: End of file and some elements were not closed."); + ck_assert_int_eq(xml.err_line, 1); + + OS_ClearXML(&xml); + unlink(xml_file_name); +} +END_TEST + +START_TEST(test_unclosednode2) +{ + char xml_file_name[256]; + create_xml_file("", xml_file_name, 256); + OS_XML xml; + ck_assert_int_ne(OS_ReadXML(xml_file_name, &xml), 0); + ck_assert_str_eq(xml.err, "XMLERR: Element 'root' not closed."); + ck_assert_int_eq(xml.err_line, 1); + + OS_ClearXML(&xml); + unlink(xml_file_name); +} +END_TEST + +START_TEST(test_unclosedcomment) +{ + char xml_file_name[256]; + create_xml_file("