1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/test/prop_tests.c Fri Jul 12 20:50:18 2013 +0200 1.3 @@ -0,0 +1,362 @@ 1.4 +/* 1.5 + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 1.6 + * 1.7 + * Copyright 2013 Olaf Wintermann. All rights reserved. 1.8 + * 1.9 + * Redistribution and use in source and binary forms, with or without 1.10 + * modification, are permitted provided that the following conditions are met: 1.11 + * 1.12 + * 1. Redistributions of source code must retain the above copyright 1.13 + * notice, this list of conditions and the following disclaimer. 1.14 + * 1.15 + * 2. Redistributions in binary form must reproduce the above copyright 1.16 + * notice, this list of conditions and the following disclaimer in the 1.17 + * documentation and/or other materials provided with the distribution. 1.18 + * 1.19 + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 1.20 + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1.21 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1.22 + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 1.23 + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1.24 + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 1.25 + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 1.26 + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 1.27 + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 1.28 + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 1.29 + * POSSIBILITY OF SUCH DAMAGE. 1.30 + */ 1.31 + 1.32 +#include "prop_tests.h" 1.33 + 1.34 +UCX_TEST_IMPLEMENT(test_ucx_prop_new) { 1.35 + UcxPropParser *parser = ucx_prop_new(); 1.36 + 1.37 + UCX_TEST_BEGIN 1.38 + 1.39 + UCX_TEST_ASSERT(parser != NULL, "failed"); 1.40 + UCX_TEST_ASSERT(parser->buffer == NULL, "parser has buffer"); 1.41 + UCX_TEST_ASSERT(parser->tmp == NULL, "parser has tmp buffer"); 1.42 + 1.43 + UCX_TEST_END 1.44 + 1.45 + ucx_prop_free(parser); 1.46 +} 1.47 + 1.48 +UCX_TEST_IMPLEMENT(test_ucx_prop_parse) { 1.49 + char *tests[] = { 1.50 + "name = value\n", 1.51 + "name=value\n", 1.52 + "n=value\n", 1.53 + "name=v\n", 1.54 + "n=v\n", 1.55 + "name = value # comment\n", 1.56 + "#comment\nn=v\n", 1.57 + "# comment1\n# comment2\n\n \n\nname = value\n", 1.58 + " name = value\n", 1.59 + "name = value\n\n" 1.60 + }; 1.61 + 1.62 + char *names[] = { 1.63 + "name", 1.64 + "name", 1.65 + "n", 1.66 + "name", 1.67 + "n", 1.68 + "name", 1.69 + "n", 1.70 + "name", 1.71 + "name", 1.72 + "name" 1.73 + }; 1.74 + 1.75 + char *values[] = { 1.76 + "value", 1.77 + "value", 1.78 + "value", 1.79 + "v", 1.80 + "v", 1.81 + "value", 1.82 + "v", 1.83 + "value", 1.84 + "value", 1.85 + "value" 1.86 + }; 1.87 + 1.88 + UCX_TEST_BEGIN 1.89 + 1.90 + sstr_t name; 1.91 + sstr_t value; 1.92 + 1.93 + for(int i=0;i<10;i++) { 1.94 + UcxPropParser *parser = ucx_prop_new(); 1.95 + 1.96 + ucx_prop_fill(parser, tests[i], strlen(tests[i])); 1.97 + UCX_TEST_ASSERT(parser->buffer == tests[i], "fill failed"); 1.98 + UCX_TEST_ASSERT(parser->buflen == strlen(tests[i]), "wrong buflen"); 1.99 + 1.100 + int r = ucx_prop_parse(parser, &name, &value); 1.101 + sstr_t n = sstr(names[i]); 1.102 + sstr_t v = sstr(values[i]); 1.103 + UCX_TEST_ASSERT(r == 1, "parse returned 0"); 1.104 + UCX_TEST_ASSERT((!sstrcmp(name, n)), "wrong property name"); 1.105 + UCX_TEST_ASSERT((!sstrcmp(value, v)), "wrong property value"); 1.106 + 1.107 + r = ucx_prop_parse(parser, &name, &value); 1.108 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.109 + UCX_TEST_ASSERT(parser->tmp == NULL, "tmp not NULL"); 1.110 + UCX_TEST_ASSERT(parser->tmpcap == 0, "tmpcap not NULL"); 1.111 + UCX_TEST_ASSERT(parser->tmplen == 0, "tmplen not NULL"); 1.112 + 1.113 + ucx_prop_free(parser); 1.114 + } 1.115 + 1.116 + UCX_TEST_END 1.117 +} 1.118 + 1.119 +UCX_TEST_IMPLEMENT(test_ucx_prop_parse_multi) { 1.120 + char *names[] = { 1.121 + "a", 1.122 + "b", 1.123 + "c", 1.124 + "uap", 1.125 + "name", 1.126 + "key1", 1.127 + "key2", 1.128 + "key3" 1.129 + }; 1.130 + 1.131 + char *values[] = { 1.132 + "a value", 1.133 + "b value", 1.134 + "core", 1.135 + "core", 1.136 + "ucx", 1.137 + "value1", 1.138 + "value2", 1.139 + "value3" 1.140 + }; 1.141 + 1.142 + char *str = "#\n" 1.143 + "# properties\n" 1.144 + "# contains key/value pairs\n" 1.145 + "#\n" 1.146 + "a = a value\n" 1.147 + "b = b value\n" 1.148 + "c = core\n" 1.149 + "\n# test\n" 1.150 + "uap = core\n" 1.151 + "name = ucx\n" 1.152 + "# no = property\n" 1.153 + "key1 = value1\n" 1.154 + "#key1 = wrong value\n" 1.155 + "#key2 = not value 2\n" 1.156 + "key2 = value2\n" 1.157 + "\n\n\n \n key3=value3\n"; 1.158 + 1.159 + UcxPropParser *parser = ucx_prop_new(); 1.160 + 1.161 + UCX_TEST_BEGIN 1.162 + 1.163 + ucx_prop_fill(parser, str, strlen(str)); 1.164 + 1.165 + sstr_t name; 1.166 + sstr_t value; 1.167 + for(int i=0;i<8;i++) { 1.168 + int r = ucx_prop_parse(parser, &name, &value); 1.169 + UCX_TEST_ASSERT(r == 1, "parse returned 0"); 1.170 + UCX_TEST_ASSERT((!sstrcmp(name, sstr(names[i]))), "wrong name"); 1.171 + UCX_TEST_ASSERT((!sstrcmp(value, sstr(values[i]))), "wrong value"); 1.172 + } 1.173 + int r = ucx_prop_parse(parser, &name, &value); 1.174 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.175 + 1.176 + UCX_TEST_END 1.177 + 1.178 + ucx_prop_free(parser); 1.179 +} 1.180 + 1.181 +UCX_TEST_IMPLEMENT(test_ucx_prop_parse_part) { 1.182 + UcxPropParser *parser = ucx_prop_new(); 1.183 + char *str; 1.184 + int r; 1.185 + sstr_t name; 1.186 + sstr_t value; 1.187 + 1.188 + UCX_TEST_BEGIN 1.189 + 1.190 + str = ""; 1.191 + ucx_prop_fill(parser, str, strlen(str)); 1.192 + r = ucx_prop_parse(parser, &name, &value); 1.193 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.194 + 1.195 + str = " \n"; 1.196 + ucx_prop_fill(parser, str, strlen(str)); 1.197 + r = ucx_prop_parse(parser, &name, &value); 1.198 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.199 + 1.200 + str = "name"; 1.201 + ucx_prop_fill(parser, str, strlen(str)); 1.202 + r = ucx_prop_parse(parser, &name, &value); 1.203 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.204 + 1.205 + str = " "; 1.206 + ucx_prop_fill(parser, str, strlen(str)); 1.207 + r = ucx_prop_parse(parser, &name, &value); 1.208 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.209 + 1.210 + str = "= "; 1.211 + ucx_prop_fill(parser, str, strlen(str)); 1.212 + r = ucx_prop_parse(parser, &name, &value); 1.213 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.214 + 1.215 + str = "value"; 1.216 + ucx_prop_fill(parser, str, strlen(str)); 1.217 + r = ucx_prop_parse(parser, &name, &value); 1.218 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.219 + 1.220 + str = "\n"; 1.221 + ucx_prop_fill(parser, str, strlen(str)); 1.222 + r = ucx_prop_parse(parser, &name, &value); 1.223 + UCX_TEST_ASSERT(r == 1, "parse returned 0"); 1.224 + UCX_TEST_ASSERT((!sstrcmp(name, sstr("name"))), "wrong name"); 1.225 + UCX_TEST_ASSERT((!sstrcmp(value, sstr("value"))), "wrong value"); 1.226 + 1.227 + // second round 1.228 + str = "#comment\n"; 1.229 + ucx_prop_fill(parser, str, strlen(str)); 1.230 + r = ucx_prop_parse(parser, &name, &value); 1.231 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.232 + 1.233 + str = "#comment\nname = "; 1.234 + ucx_prop_fill(parser, str, strlen(str)); 1.235 + r = ucx_prop_parse(parser, &name, &value); 1.236 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.237 + 1.238 + str = "value\na = b\n"; 1.239 + ucx_prop_fill(parser, str, strlen(str)); 1.240 + r = ucx_prop_parse(parser, &name, &value); 1.241 + UCX_TEST_ASSERT(r == 1, "parse returned 0"); 1.242 + UCX_TEST_ASSERT((!sstrcmp(name, sstr("name"))), "wrong name"); 1.243 + UCX_TEST_ASSERT((!sstrcmp(value, sstr("value"))), "wrong value"); 1.244 + 1.245 + r = ucx_prop_parse(parser, &name, &value); 1.246 + UCX_TEST_ASSERT(r == 1, "parse returned 0"); 1.247 + UCX_TEST_ASSERT((!sstrcmp(name, sstr("a"))), "wrong name"); 1.248 + UCX_TEST_ASSERT((!sstrcmp(value, sstr("b"))), "wrong value"); 1.249 + 1.250 + str = "# comment\n#\n#\ntests = "; 1.251 + ucx_prop_fill(parser, str, strlen(str)); 1.252 + r = ucx_prop_parse(parser, &name, &value); 1.253 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.254 + 1.255 + str = "test1 "; 1.256 + ucx_prop_fill(parser, str, strlen(str)); 1.257 + r = ucx_prop_parse(parser, &name, &value); 1.258 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.259 + 1.260 + str = "test2 test3 test4\n"; 1.261 + sstr_t testv = sstr("test1 test2 test3 test4"); 1.262 + ucx_prop_fill(parser, str, strlen(str)); 1.263 + r = ucx_prop_parse(parser, &name, &value); 1.264 + UCX_TEST_ASSERT(r == 1, "parse returned 0"); 1.265 + UCX_TEST_ASSERT((!sstrcmp(name, sstr("tests"))), "wrong name"); 1.266 + UCX_TEST_ASSERT((!sstrcmp(value, testv)), "wrong value"); 1.267 + 1.268 + // test if parse finds a name/value after a tmp comment 1.269 + str = "# just a comment"; 1.270 + ucx_prop_fill(parser, str, strlen(str)); 1.271 + r = ucx_prop_parse(parser, &name, &value); 1.272 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.273 + 1.274 + str = " in 3"; 1.275 + ucx_prop_fill(parser, str, strlen(str)); 1.276 + r = ucx_prop_parse(parser, &name, &value); 1.277 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.278 + 1.279 + str = " parts\na = 1\n"; 1.280 + ucx_prop_fill(parser, str, strlen(str)); 1.281 + r = ucx_prop_parse(parser, &name, &value); 1.282 + UCX_TEST_ASSERT(r == 1, "parse returned 0"); 1.283 + UCX_TEST_ASSERT((!sstrcmp(name, sstr("a"))), "wrong name"); 1.284 + UCX_TEST_ASSERT((!sstrcmp(value, sstr("1"))), "wrong value"); 1.285 + 1.286 + UCX_TEST_END 1.287 + 1.288 + ucx_prop_free(parser); 1.289 +} 1.290 + 1.291 +UCX_TEST_IMPLEMENT(test_ucx_prop_parse_long) { 1.292 + UcxPropParser *parser = ucx_prop_new(); 1.293 + int r; 1.294 + size_t name_len = 512; 1.295 + char *long_name = (char*)malloc(name_len); 1.296 + memset(long_name, 'a', 70); 1.297 + memset(long_name+70, 'b', 242); 1.298 + memset(long_name+312, 'c', 200); 1.299 + 1.300 + size_t value_len = 2048; 1.301 + char *long_value = (char*)malloc(value_len); 1.302 + memset(long_value, 'x', 1024); 1.303 + memset(long_value+1024, 'y', 1024); 1.304 + 1.305 + UCX_TEST_BEGIN 1.306 + 1.307 + sstr_t name; 1.308 + sstr_t value; 1.309 + 1.310 + ucx_prop_fill(parser, long_name, 10); 1.311 + r = ucx_prop_parse(parser, &name, &value); 1.312 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.313 + 1.314 + ucx_prop_fill(parser, long_name+10, 202); 1.315 + r = ucx_prop_parse(parser, &name, &value); 1.316 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.317 + 1.318 + ucx_prop_fill(parser, long_name+212, 200); 1.319 + r = ucx_prop_parse(parser, &name, &value); 1.320 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.321 + 1.322 + ucx_prop_fill(parser, long_name+412, 100); 1.323 + r = ucx_prop_parse(parser, &name, &value); 1.324 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.325 + 1.326 + char *str = " = "; 1.327 + ucx_prop_fill(parser, str, strlen(str)); 1.328 + r = ucx_prop_parse(parser, &name, &value); 1.329 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.330 + 1.331 + ucx_prop_fill(parser, long_value, 512); 1.332 + r = ucx_prop_parse(parser, &name, &value); 1.333 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.334 + 1.335 + ucx_prop_fill(parser, long_value+512, 1024); 1.336 + r = ucx_prop_parse(parser, &name, &value); 1.337 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.338 + 1.339 + ucx_prop_fill(parser, long_value+1536, 512); 1.340 + r = ucx_prop_parse(parser, &name, &value); 1.341 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.342 + 1.343 + str = "\n#comment\nkey = value\n"; 1.344 + ucx_prop_fill(parser, str, strlen(str)); 1.345 + r = ucx_prop_parse(parser, &name, &value); 1.346 + sstr_t n = sstrn(long_name, name_len); 1.347 + sstr_t v = sstrn(long_value, value_len); 1.348 + UCX_TEST_ASSERT(r == 1, "parse returned 0"); 1.349 + UCX_TEST_ASSERT((!sstrcmp(name, n)), "wrong name"); 1.350 + UCX_TEST_ASSERT((!sstrcmp(value, v)), "wrong value"); 1.351 + 1.352 + r = ucx_prop_parse(parser, &name, &value); 1.353 + UCX_TEST_ASSERT(r == 1, "parse returned 0"); 1.354 + UCX_TEST_ASSERT((!sstrcmp(name, sstr("key"))), "wrong name"); 1.355 + UCX_TEST_ASSERT((!sstrcmp(value, sstr("value"))), "wrong value"); 1.356 + 1.357 + r = ucx_prop_parse(parser, &name, &value); 1.358 + UCX_TEST_ASSERT(r == 0, "parse returned 1"); 1.359 + 1.360 + UCX_TEST_END 1.361 + 1.362 + free(long_name); 1.363 + free(long_value); 1.364 + ucx_prop_free(parser); 1.365 +}