Fri, 12 Jul 2013 20:50:18 +0200
new properties parser
olaf@108 | 1 | /* |
olaf@108 | 2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
olaf@108 | 3 | * |
olaf@108 | 4 | * Copyright 2013 Olaf Wintermann. All rights reserved. |
olaf@108 | 5 | * |
olaf@108 | 6 | * Redistribution and use in source and binary forms, with or without |
olaf@108 | 7 | * modification, are permitted provided that the following conditions are met: |
olaf@108 | 8 | * |
olaf@108 | 9 | * 1. Redistributions of source code must retain the above copyright |
olaf@108 | 10 | * notice, this list of conditions and the following disclaimer. |
olaf@108 | 11 | * |
olaf@108 | 12 | * 2. Redistributions in binary form must reproduce the above copyright |
olaf@108 | 13 | * notice, this list of conditions and the following disclaimer in the |
olaf@108 | 14 | * documentation and/or other materials provided with the distribution. |
olaf@108 | 15 | * |
olaf@108 | 16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
olaf@108 | 17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
olaf@108 | 18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
olaf@108 | 19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
olaf@108 | 20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
olaf@108 | 21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
olaf@108 | 22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
olaf@108 | 23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
olaf@108 | 24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
olaf@108 | 25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
olaf@108 | 26 | * POSSIBILITY OF SUCH DAMAGE. |
olaf@108 | 27 | */ |
olaf@108 | 28 | |
olaf@108 | 29 | #include "prop_tests.h" |
olaf@108 | 30 | |
olaf@108 | 31 | UCX_TEST_IMPLEMENT(test_ucx_prop_new) { |
olaf@108 | 32 | UcxPropParser *parser = ucx_prop_new(); |
olaf@108 | 33 | |
olaf@108 | 34 | UCX_TEST_BEGIN |
olaf@108 | 35 | |
olaf@108 | 36 | UCX_TEST_ASSERT(parser != NULL, "failed"); |
olaf@108 | 37 | UCX_TEST_ASSERT(parser->buffer == NULL, "parser has buffer"); |
olaf@108 | 38 | UCX_TEST_ASSERT(parser->tmp == NULL, "parser has tmp buffer"); |
olaf@108 | 39 | |
olaf@108 | 40 | UCX_TEST_END |
olaf@108 | 41 | |
olaf@108 | 42 | ucx_prop_free(parser); |
olaf@108 | 43 | } |
olaf@108 | 44 | |
olaf@108 | 45 | UCX_TEST_IMPLEMENT(test_ucx_prop_parse) { |
olaf@108 | 46 | char *tests[] = { |
olaf@108 | 47 | "name = value\n", |
olaf@108 | 48 | "name=value\n", |
olaf@108 | 49 | "n=value\n", |
olaf@108 | 50 | "name=v\n", |
olaf@108 | 51 | "n=v\n", |
olaf@108 | 52 | "name = value # comment\n", |
olaf@108 | 53 | "#comment\nn=v\n", |
olaf@108 | 54 | "# comment1\n# comment2\n\n \n\nname = value\n", |
olaf@108 | 55 | " name = value\n", |
olaf@108 | 56 | "name = value\n\n" |
olaf@108 | 57 | }; |
olaf@108 | 58 | |
olaf@108 | 59 | char *names[] = { |
olaf@108 | 60 | "name", |
olaf@108 | 61 | "name", |
olaf@108 | 62 | "n", |
olaf@108 | 63 | "name", |
olaf@108 | 64 | "n", |
olaf@108 | 65 | "name", |
olaf@108 | 66 | "n", |
olaf@108 | 67 | "name", |
olaf@108 | 68 | "name", |
olaf@108 | 69 | "name" |
olaf@108 | 70 | }; |
olaf@108 | 71 | |
olaf@108 | 72 | char *values[] = { |
olaf@108 | 73 | "value", |
olaf@108 | 74 | "value", |
olaf@108 | 75 | "value", |
olaf@108 | 76 | "v", |
olaf@108 | 77 | "v", |
olaf@108 | 78 | "value", |
olaf@108 | 79 | "v", |
olaf@108 | 80 | "value", |
olaf@108 | 81 | "value", |
olaf@108 | 82 | "value" |
olaf@108 | 83 | }; |
olaf@108 | 84 | |
olaf@108 | 85 | UCX_TEST_BEGIN |
olaf@108 | 86 | |
olaf@108 | 87 | sstr_t name; |
olaf@108 | 88 | sstr_t value; |
olaf@108 | 89 | |
olaf@108 | 90 | for(int i=0;i<10;i++) { |
olaf@108 | 91 | UcxPropParser *parser = ucx_prop_new(); |
olaf@108 | 92 | |
olaf@108 | 93 | ucx_prop_fill(parser, tests[i], strlen(tests[i])); |
olaf@108 | 94 | UCX_TEST_ASSERT(parser->buffer == tests[i], "fill failed"); |
olaf@108 | 95 | UCX_TEST_ASSERT(parser->buflen == strlen(tests[i]), "wrong buflen"); |
olaf@108 | 96 | |
olaf@108 | 97 | int r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 98 | sstr_t n = sstr(names[i]); |
olaf@108 | 99 | sstr_t v = sstr(values[i]); |
olaf@108 | 100 | UCX_TEST_ASSERT(r == 1, "parse returned 0"); |
olaf@108 | 101 | UCX_TEST_ASSERT((!sstrcmp(name, n)), "wrong property name"); |
olaf@108 | 102 | UCX_TEST_ASSERT((!sstrcmp(value, v)), "wrong property value"); |
olaf@108 | 103 | |
olaf@108 | 104 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 105 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 106 | UCX_TEST_ASSERT(parser->tmp == NULL, "tmp not NULL"); |
olaf@108 | 107 | UCX_TEST_ASSERT(parser->tmpcap == 0, "tmpcap not NULL"); |
olaf@108 | 108 | UCX_TEST_ASSERT(parser->tmplen == 0, "tmplen not NULL"); |
olaf@108 | 109 | |
olaf@108 | 110 | ucx_prop_free(parser); |
olaf@108 | 111 | } |
olaf@108 | 112 | |
olaf@108 | 113 | UCX_TEST_END |
olaf@108 | 114 | } |
olaf@108 | 115 | |
olaf@108 | 116 | UCX_TEST_IMPLEMENT(test_ucx_prop_parse_multi) { |
olaf@108 | 117 | char *names[] = { |
olaf@108 | 118 | "a", |
olaf@108 | 119 | "b", |
olaf@108 | 120 | "c", |
olaf@108 | 121 | "uap", |
olaf@108 | 122 | "name", |
olaf@108 | 123 | "key1", |
olaf@108 | 124 | "key2", |
olaf@108 | 125 | "key3" |
olaf@108 | 126 | }; |
olaf@108 | 127 | |
olaf@108 | 128 | char *values[] = { |
olaf@108 | 129 | "a value", |
olaf@108 | 130 | "b value", |
olaf@108 | 131 | "core", |
olaf@108 | 132 | "core", |
olaf@108 | 133 | "ucx", |
olaf@108 | 134 | "value1", |
olaf@108 | 135 | "value2", |
olaf@108 | 136 | "value3" |
olaf@108 | 137 | }; |
olaf@108 | 138 | |
olaf@108 | 139 | char *str = "#\n" |
olaf@108 | 140 | "# properties\n" |
olaf@108 | 141 | "# contains key/value pairs\n" |
olaf@108 | 142 | "#\n" |
olaf@108 | 143 | "a = a value\n" |
olaf@108 | 144 | "b = b value\n" |
olaf@108 | 145 | "c = core\n" |
olaf@108 | 146 | "\n# test\n" |
olaf@108 | 147 | "uap = core\n" |
olaf@108 | 148 | "name = ucx\n" |
olaf@108 | 149 | "# no = property\n" |
olaf@108 | 150 | "key1 = value1\n" |
olaf@108 | 151 | "#key1 = wrong value\n" |
olaf@108 | 152 | "#key2 = not value 2\n" |
olaf@108 | 153 | "key2 = value2\n" |
olaf@108 | 154 | "\n\n\n \n key3=value3\n"; |
olaf@108 | 155 | |
olaf@108 | 156 | UcxPropParser *parser = ucx_prop_new(); |
olaf@108 | 157 | |
olaf@108 | 158 | UCX_TEST_BEGIN |
olaf@108 | 159 | |
olaf@108 | 160 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 161 | |
olaf@108 | 162 | sstr_t name; |
olaf@108 | 163 | sstr_t value; |
olaf@108 | 164 | for(int i=0;i<8;i++) { |
olaf@108 | 165 | int r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 166 | UCX_TEST_ASSERT(r == 1, "parse returned 0"); |
olaf@108 | 167 | UCX_TEST_ASSERT((!sstrcmp(name, sstr(names[i]))), "wrong name"); |
olaf@108 | 168 | UCX_TEST_ASSERT((!sstrcmp(value, sstr(values[i]))), "wrong value"); |
olaf@108 | 169 | } |
olaf@108 | 170 | int r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 171 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 172 | |
olaf@108 | 173 | UCX_TEST_END |
olaf@108 | 174 | |
olaf@108 | 175 | ucx_prop_free(parser); |
olaf@108 | 176 | } |
olaf@108 | 177 | |
olaf@108 | 178 | UCX_TEST_IMPLEMENT(test_ucx_prop_parse_part) { |
olaf@108 | 179 | UcxPropParser *parser = ucx_prop_new(); |
olaf@108 | 180 | char *str; |
olaf@108 | 181 | int r; |
olaf@108 | 182 | sstr_t name; |
olaf@108 | 183 | sstr_t value; |
olaf@108 | 184 | |
olaf@108 | 185 | UCX_TEST_BEGIN |
olaf@108 | 186 | |
olaf@108 | 187 | str = ""; |
olaf@108 | 188 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 189 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 190 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 191 | |
olaf@108 | 192 | str = " \n"; |
olaf@108 | 193 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 194 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 195 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 196 | |
olaf@108 | 197 | str = "name"; |
olaf@108 | 198 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 199 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 200 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 201 | |
olaf@108 | 202 | str = " "; |
olaf@108 | 203 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 204 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 205 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 206 | |
olaf@108 | 207 | str = "= "; |
olaf@108 | 208 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 209 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 210 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 211 | |
olaf@108 | 212 | str = "value"; |
olaf@108 | 213 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 214 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 215 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 216 | |
olaf@108 | 217 | str = "\n"; |
olaf@108 | 218 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 219 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 220 | UCX_TEST_ASSERT(r == 1, "parse returned 0"); |
olaf@108 | 221 | UCX_TEST_ASSERT((!sstrcmp(name, sstr("name"))), "wrong name"); |
olaf@108 | 222 | UCX_TEST_ASSERT((!sstrcmp(value, sstr("value"))), "wrong value"); |
olaf@108 | 223 | |
olaf@108 | 224 | // second round |
olaf@108 | 225 | str = "#comment\n"; |
olaf@108 | 226 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 227 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 228 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 229 | |
olaf@108 | 230 | str = "#comment\nname = "; |
olaf@108 | 231 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 232 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 233 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 234 | |
olaf@108 | 235 | str = "value\na = b\n"; |
olaf@108 | 236 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 237 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 238 | UCX_TEST_ASSERT(r == 1, "parse returned 0"); |
olaf@108 | 239 | UCX_TEST_ASSERT((!sstrcmp(name, sstr("name"))), "wrong name"); |
olaf@108 | 240 | UCX_TEST_ASSERT((!sstrcmp(value, sstr("value"))), "wrong value"); |
olaf@108 | 241 | |
olaf@108 | 242 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 243 | UCX_TEST_ASSERT(r == 1, "parse returned 0"); |
olaf@108 | 244 | UCX_TEST_ASSERT((!sstrcmp(name, sstr("a"))), "wrong name"); |
olaf@108 | 245 | UCX_TEST_ASSERT((!sstrcmp(value, sstr("b"))), "wrong value"); |
olaf@108 | 246 | |
olaf@108 | 247 | str = "# comment\n#\n#\ntests = "; |
olaf@108 | 248 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 249 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 250 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 251 | |
olaf@108 | 252 | str = "test1 "; |
olaf@108 | 253 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 254 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 255 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 256 | |
olaf@108 | 257 | str = "test2 test3 test4\n"; |
olaf@108 | 258 | sstr_t testv = sstr("test1 test2 test3 test4"); |
olaf@108 | 259 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 260 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 261 | UCX_TEST_ASSERT(r == 1, "parse returned 0"); |
olaf@108 | 262 | UCX_TEST_ASSERT((!sstrcmp(name, sstr("tests"))), "wrong name"); |
olaf@108 | 263 | UCX_TEST_ASSERT((!sstrcmp(value, testv)), "wrong value"); |
olaf@108 | 264 | |
olaf@108 | 265 | // test if parse finds a name/value after a tmp comment |
olaf@108 | 266 | str = "# just a comment"; |
olaf@108 | 267 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 268 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 269 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 270 | |
olaf@108 | 271 | str = " in 3"; |
olaf@108 | 272 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 273 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 274 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 275 | |
olaf@108 | 276 | str = " parts\na = 1\n"; |
olaf@108 | 277 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 278 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 279 | UCX_TEST_ASSERT(r == 1, "parse returned 0"); |
olaf@108 | 280 | UCX_TEST_ASSERT((!sstrcmp(name, sstr("a"))), "wrong name"); |
olaf@108 | 281 | UCX_TEST_ASSERT((!sstrcmp(value, sstr("1"))), "wrong value"); |
olaf@108 | 282 | |
olaf@108 | 283 | UCX_TEST_END |
olaf@108 | 284 | |
olaf@108 | 285 | ucx_prop_free(parser); |
olaf@108 | 286 | } |
olaf@108 | 287 | |
olaf@108 | 288 | UCX_TEST_IMPLEMENT(test_ucx_prop_parse_long) { |
olaf@108 | 289 | UcxPropParser *parser = ucx_prop_new(); |
olaf@108 | 290 | int r; |
olaf@108 | 291 | size_t name_len = 512; |
olaf@108 | 292 | char *long_name = (char*)malloc(name_len); |
olaf@108 | 293 | memset(long_name, 'a', 70); |
olaf@108 | 294 | memset(long_name+70, 'b', 242); |
olaf@108 | 295 | memset(long_name+312, 'c', 200); |
olaf@108 | 296 | |
olaf@108 | 297 | size_t value_len = 2048; |
olaf@108 | 298 | char *long_value = (char*)malloc(value_len); |
olaf@108 | 299 | memset(long_value, 'x', 1024); |
olaf@108 | 300 | memset(long_value+1024, 'y', 1024); |
olaf@108 | 301 | |
olaf@108 | 302 | UCX_TEST_BEGIN |
olaf@108 | 303 | |
olaf@108 | 304 | sstr_t name; |
olaf@108 | 305 | sstr_t value; |
olaf@108 | 306 | |
olaf@108 | 307 | ucx_prop_fill(parser, long_name, 10); |
olaf@108 | 308 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 309 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 310 | |
olaf@108 | 311 | ucx_prop_fill(parser, long_name+10, 202); |
olaf@108 | 312 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 313 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 314 | |
olaf@108 | 315 | ucx_prop_fill(parser, long_name+212, 200); |
olaf@108 | 316 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 317 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 318 | |
olaf@108 | 319 | ucx_prop_fill(parser, long_name+412, 100); |
olaf@108 | 320 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 321 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 322 | |
olaf@108 | 323 | char *str = " = "; |
olaf@108 | 324 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 325 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 326 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 327 | |
olaf@108 | 328 | ucx_prop_fill(parser, long_value, 512); |
olaf@108 | 329 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 330 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 331 | |
olaf@108 | 332 | ucx_prop_fill(parser, long_value+512, 1024); |
olaf@108 | 333 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 334 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 335 | |
olaf@108 | 336 | ucx_prop_fill(parser, long_value+1536, 512); |
olaf@108 | 337 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 338 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 339 | |
olaf@108 | 340 | str = "\n#comment\nkey = value\n"; |
olaf@108 | 341 | ucx_prop_fill(parser, str, strlen(str)); |
olaf@108 | 342 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 343 | sstr_t n = sstrn(long_name, name_len); |
olaf@108 | 344 | sstr_t v = sstrn(long_value, value_len); |
olaf@108 | 345 | UCX_TEST_ASSERT(r == 1, "parse returned 0"); |
olaf@108 | 346 | UCX_TEST_ASSERT((!sstrcmp(name, n)), "wrong name"); |
olaf@108 | 347 | UCX_TEST_ASSERT((!sstrcmp(value, v)), "wrong value"); |
olaf@108 | 348 | |
olaf@108 | 349 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 350 | UCX_TEST_ASSERT(r == 1, "parse returned 0"); |
olaf@108 | 351 | UCX_TEST_ASSERT((!sstrcmp(name, sstr("key"))), "wrong name"); |
olaf@108 | 352 | UCX_TEST_ASSERT((!sstrcmp(value, sstr("value"))), "wrong value"); |
olaf@108 | 353 | |
olaf@108 | 354 | r = ucx_prop_parse(parser, &name, &value); |
olaf@108 | 355 | UCX_TEST_ASSERT(r == 0, "parse returned 1"); |
olaf@108 | 356 | |
olaf@108 | 357 | UCX_TEST_END |
olaf@108 | 358 | |
olaf@108 | 359 | free(long_name); |
olaf@108 | 360 | free(long_value); |
olaf@108 | 361 | ucx_prop_free(parser); |
olaf@108 | 362 | } |