test/prop_tests.c

Fri, 12 Jul 2013 20:50:18 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Fri, 12 Jul 2013 20:50:18 +0200
changeset 108
d2b1e67b2b48
child 109
75cb6590358b
permissions
-rw-r--r--

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 }

mercurial