olaf@108: /* olaf@108: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. olaf@108: * olaf@108: * Copyright 2013 Olaf Wintermann. All rights reserved. olaf@108: * olaf@108: * Redistribution and use in source and binary forms, with or without olaf@108: * modification, are permitted provided that the following conditions are met: olaf@108: * olaf@108: * 1. Redistributions of source code must retain the above copyright olaf@108: * notice, this list of conditions and the following disclaimer. olaf@108: * olaf@108: * 2. Redistributions in binary form must reproduce the above copyright olaf@108: * notice, this list of conditions and the following disclaimer in the olaf@108: * documentation and/or other materials provided with the distribution. olaf@108: * olaf@108: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" olaf@108: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE olaf@108: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE olaf@108: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE olaf@108: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR olaf@108: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF olaf@108: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS olaf@108: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN olaf@108: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) olaf@108: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE olaf@108: * POSSIBILITY OF SUCH DAMAGE. olaf@108: */ olaf@108: olaf@108: #include "prop_tests.h" olaf@108: olaf@108: UCX_TEST_IMPLEMENT(test_ucx_prop_new) { olaf@108: UcxPropParser *parser = ucx_prop_new(); olaf@108: olaf@108: UCX_TEST_BEGIN olaf@108: olaf@108: UCX_TEST_ASSERT(parser != NULL, "failed"); olaf@108: UCX_TEST_ASSERT(parser->buffer == NULL, "parser has buffer"); olaf@108: UCX_TEST_ASSERT(parser->tmp == NULL, "parser has tmp buffer"); olaf@108: olaf@108: UCX_TEST_END olaf@108: olaf@108: ucx_prop_free(parser); olaf@108: } olaf@108: olaf@108: UCX_TEST_IMPLEMENT(test_ucx_prop_parse) { olaf@108: char *tests[] = { olaf@108: "name = value\n", olaf@108: "name=value\n", olaf@108: "n=value\n", olaf@108: "name=v\n", olaf@108: "n=v\n", olaf@108: "name = value # comment\n", olaf@108: "#comment\nn=v\n", olaf@108: "# comment1\n# comment2\n\n \n\nname = value\n", olaf@108: " name = value\n", olaf@108: "name = value\n\n" olaf@108: }; olaf@108: olaf@108: char *names[] = { olaf@108: "name", olaf@108: "name", olaf@108: "n", olaf@108: "name", olaf@108: "n", olaf@108: "name", olaf@108: "n", olaf@108: "name", olaf@108: "name", olaf@108: "name" olaf@108: }; olaf@108: olaf@108: char *values[] = { olaf@108: "value", olaf@108: "value", olaf@108: "value", olaf@108: "v", olaf@108: "v", olaf@108: "value", olaf@108: "v", olaf@108: "value", olaf@108: "value", olaf@108: "value" olaf@108: }; olaf@108: olaf@108: UCX_TEST_BEGIN olaf@108: olaf@108: sstr_t name; olaf@108: sstr_t value; olaf@108: olaf@108: for(int i=0;i<10;i++) { olaf@108: UcxPropParser *parser = ucx_prop_new(); olaf@108: olaf@108: ucx_prop_fill(parser, tests[i], strlen(tests[i])); olaf@108: UCX_TEST_ASSERT(parser->buffer == tests[i], "fill failed"); olaf@108: UCX_TEST_ASSERT(parser->buflen == strlen(tests[i]), "wrong buflen"); olaf@108: olaf@108: int r = ucx_prop_parse(parser, &name, &value); olaf@108: sstr_t n = sstr(names[i]); olaf@108: sstr_t v = sstr(values[i]); olaf@108: UCX_TEST_ASSERT(r == 1, "parse returned 0"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(name, n)), "wrong property name"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(value, v)), "wrong property value"); olaf@108: olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: UCX_TEST_ASSERT(parser->tmp == NULL, "tmp not NULL"); olaf@108: UCX_TEST_ASSERT(parser->tmpcap == 0, "tmpcap not NULL"); olaf@108: UCX_TEST_ASSERT(parser->tmplen == 0, "tmplen not NULL"); olaf@108: olaf@108: ucx_prop_free(parser); olaf@108: } olaf@108: olaf@108: UCX_TEST_END olaf@108: } olaf@108: olaf@108: UCX_TEST_IMPLEMENT(test_ucx_prop_parse_multi) { olaf@108: char *names[] = { olaf@108: "a", olaf@108: "b", olaf@108: "c", olaf@108: "uap", olaf@108: "name", olaf@108: "key1", olaf@108: "key2", olaf@108: "key3" olaf@108: }; olaf@108: olaf@108: char *values[] = { olaf@108: "a value", olaf@108: "b value", olaf@108: "core", olaf@108: "core", olaf@108: "ucx", olaf@108: "value1", olaf@108: "value2", olaf@108: "value3" olaf@108: }; olaf@108: olaf@108: char *str = "#\n" olaf@108: "# properties\n" olaf@108: "# contains key/value pairs\n" olaf@108: "#\n" olaf@108: "a = a value\n" olaf@108: "b = b value\n" olaf@108: "c = core\n" olaf@108: "\n# test\n" olaf@108: "uap = core\n" olaf@108: "name = ucx\n" olaf@108: "# no = property\n" olaf@108: "key1 = value1\n" olaf@108: "#key1 = wrong value\n" olaf@108: "#key2 = not value 2\n" olaf@108: "key2 = value2\n" olaf@108: "\n\n\n \n key3=value3\n"; olaf@108: olaf@108: UcxPropParser *parser = ucx_prop_new(); olaf@108: olaf@108: UCX_TEST_BEGIN olaf@108: olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: olaf@108: sstr_t name; olaf@108: sstr_t value; olaf@108: for(int i=0;i<8;i++) { olaf@108: int r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 1, "parse returned 0"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(name, sstr(names[i]))), "wrong name"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(value, sstr(values[i]))), "wrong value"); olaf@108: } olaf@108: int r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: UCX_TEST_END olaf@108: olaf@108: ucx_prop_free(parser); olaf@108: } olaf@108: olaf@108: UCX_TEST_IMPLEMENT(test_ucx_prop_parse_part) { olaf@108: UcxPropParser *parser = ucx_prop_new(); olaf@108: char *str; olaf@108: int r; olaf@108: sstr_t name; olaf@108: sstr_t value; olaf@108: olaf@108: UCX_TEST_BEGIN olaf@108: olaf@108: str = ""; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: str = " \n"; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: str = "name"; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: str = " "; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: str = "= "; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: str = "value"; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: str = "\n"; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 1, "parse returned 0"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(name, sstr("name"))), "wrong name"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(value, sstr("value"))), "wrong value"); olaf@108: olaf@108: // second round olaf@108: str = "#comment\n"; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: str = "#comment\nname = "; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: str = "value\na = b\n"; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 1, "parse returned 0"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(name, sstr("name"))), "wrong name"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(value, sstr("value"))), "wrong value"); olaf@108: olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 1, "parse returned 0"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(name, sstr("a"))), "wrong name"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(value, sstr("b"))), "wrong value"); olaf@108: olaf@108: str = "# comment\n#\n#\ntests = "; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: str = "test1 "; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: str = "test2 test3 test4\n"; olaf@108: sstr_t testv = sstr("test1 test2 test3 test4"); olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 1, "parse returned 0"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(name, sstr("tests"))), "wrong name"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(value, testv)), "wrong value"); olaf@108: olaf@108: // test if parse finds a name/value after a tmp comment olaf@108: str = "# just a comment"; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: str = " in 3"; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: str = " parts\na = 1\n"; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 1, "parse returned 0"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(name, sstr("a"))), "wrong name"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(value, sstr("1"))), "wrong value"); olaf@108: olaf@108: UCX_TEST_END olaf@108: olaf@108: ucx_prop_free(parser); olaf@108: } olaf@108: olaf@108: UCX_TEST_IMPLEMENT(test_ucx_prop_parse_long) { olaf@108: UcxPropParser *parser = ucx_prop_new(); olaf@108: int r; olaf@108: size_t name_len = 512; olaf@108: char *long_name = (char*)malloc(name_len); olaf@108: memset(long_name, 'a', 70); olaf@108: memset(long_name+70, 'b', 242); olaf@108: memset(long_name+312, 'c', 200); olaf@108: olaf@108: size_t value_len = 2048; olaf@108: char *long_value = (char*)malloc(value_len); olaf@108: memset(long_value, 'x', 1024); olaf@108: memset(long_value+1024, 'y', 1024); olaf@108: olaf@108: UCX_TEST_BEGIN olaf@108: olaf@108: sstr_t name; olaf@108: sstr_t value; olaf@108: olaf@108: ucx_prop_fill(parser, long_name, 10); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: ucx_prop_fill(parser, long_name+10, 202); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: ucx_prop_fill(parser, long_name+212, 200); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: ucx_prop_fill(parser, long_name+412, 100); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: char *str = " = "; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: ucx_prop_fill(parser, long_value, 512); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: ucx_prop_fill(parser, long_value+512, 1024); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: ucx_prop_fill(parser, long_value+1536, 512); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: str = "\n#comment\nkey = value\n"; olaf@108: ucx_prop_fill(parser, str, strlen(str)); olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: sstr_t n = sstrn(long_name, name_len); olaf@108: sstr_t v = sstrn(long_value, value_len); olaf@108: UCX_TEST_ASSERT(r == 1, "parse returned 0"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(name, n)), "wrong name"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(value, v)), "wrong value"); olaf@108: olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 1, "parse returned 0"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(name, sstr("key"))), "wrong name"); olaf@108: UCX_TEST_ASSERT((!sstrcmp(value, sstr("value"))), "wrong value"); olaf@108: olaf@108: r = ucx_prop_parse(parser, &name, &value); olaf@108: UCX_TEST_ASSERT(r == 0, "parse returned 1"); olaf@108: olaf@108: UCX_TEST_END olaf@108: olaf@108: free(long_name); olaf@108: free(long_value); olaf@108: ucx_prop_free(parser); olaf@108: }