Annotation of embedaddon/strongswan/src/starter/tests/suites/test_parser.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2014 Tobias Brunner
! 3: * HSR Hochschule fuer Technik Rapperswil
! 4: *
! 5: * This program is free software; you can redistribute it and/or modify it
! 6: * under the terms of the GNU General Public License as published by the
! 7: * Free Software Foundation; either version 2 of the License, or (at your
! 8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 9: *
! 10: * This program is distributed in the hope that it will be useful, but
! 11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 13: * for more details.
! 14: */
! 15:
! 16: #include <unistd.h>
! 17:
! 18: #include <test_suite.h>
! 19:
! 20: #include "../../parser/conf_parser.h"
! 21:
! 22: static char *path = "/tmp/strongswan-starter-parser-test";
! 23: static conf_parser_t *parser;
! 24:
! 25: static void create_parser(chunk_t contents)
! 26: {
! 27: ck_assert(chunk_write(contents, path, 0022, TRUE));
! 28: parser = conf_parser_create(path);
! 29: }
! 30:
! 31: START_TEARDOWN(teardown_parser)
! 32: {
! 33: parser->destroy(parser);
! 34: unlink(path);
! 35: }
! 36: END_TEARDOWN
! 37:
! 38: START_TEST(test_get_sections_config_setup)
! 39: {
! 40: enumerator_t *enumerator;
! 41:
! 42: create_parser(chunk_from_str(""));
! 43: ck_assert(parser->parse(parser));
! 44: enumerator = parser->get_sections(parser, CONF_PARSER_CONFIG_SETUP);
! 45: ck_assert(enumerator);
! 46: ck_assert(!enumerator->enumerate(enumerator, NULL));
! 47: enumerator->destroy(enumerator);
! 48: parser->destroy(parser);
! 49:
! 50: create_parser(chunk_from_str("config setup\n\tfoo=bar"));
! 51: ck_assert(parser->parse(parser));
! 52: enumerator = parser->get_sections(parser, CONF_PARSER_CONFIG_SETUP);
! 53: ck_assert(enumerator);
! 54: ck_assert(!enumerator->enumerate(enumerator, NULL));
! 55: enumerator->destroy(enumerator);
! 56: }
! 57: END_TEST
! 58:
! 59: START_TEST(test_get_sections_conn)
! 60: {
! 61: enumerator_t *enumerator;
! 62: char *name;
! 63:
! 64: create_parser(chunk_from_str(""));
! 65: ck_assert(parser->parse(parser));
! 66: enumerator = parser->get_sections(parser, CONF_PARSER_CONN);
! 67: ck_assert(enumerator);
! 68: ck_assert(!enumerator->enumerate(enumerator, NULL));
! 69: enumerator->destroy(enumerator);
! 70: parser->destroy(parser);
! 71:
! 72: create_parser(chunk_from_str(
! 73: "conn foo\n"
! 74: "conn bar\n"
! 75: "conn foo\n"));
! 76: ck_assert(parser->parse(parser));
! 77: enumerator = parser->get_sections(parser, CONF_PARSER_CONN);
! 78: ck_assert(enumerator);
! 79: ck_assert(enumerator->enumerate(enumerator, &name));
! 80: ck_assert_str_eq("foo", name);
! 81: ck_assert(enumerator->enumerate(enumerator, &name));
! 82: ck_assert_str_eq("bar", name);
! 83: ck_assert(!enumerator->enumerate(enumerator, &name));
! 84: enumerator->destroy(enumerator);
! 85: }
! 86: END_TEST
! 87:
! 88: START_TEST(test_get_section_config_setup)
! 89: {
! 90: dictionary_t *dict;
! 91:
! 92: create_parser(chunk_from_str(""));
! 93: ck_assert(parser->parse(parser));
! 94: dict = parser->get_section(parser, CONF_PARSER_CONFIG_SETUP, "foo");
! 95: ck_assert(dict);
! 96: dict->destroy(dict);
! 97: parser->destroy(parser);
! 98:
! 99: create_parser(chunk_from_str("config setup\n\tfoo=bar"));
! 100: ck_assert(parser->parse(parser));
! 101: dict = parser->get_section(parser, CONF_PARSER_CONFIG_SETUP, NULL);
! 102: ck_assert(dict);
! 103: dict->destroy(dict);
! 104: parser->destroy(parser);
! 105:
! 106: create_parser(chunk_from_str("config setup\n\tfoo=bar"));
! 107: ck_assert(parser->parse(parser));
! 108: dict = parser->get_section(parser, CONF_PARSER_CONFIG_SETUP, "foo");
! 109: ck_assert(dict);
! 110: dict->destroy(dict);
! 111: }
! 112: END_TEST
! 113:
! 114: START_TEST(test_get_section_conn)
! 115: {
! 116: dictionary_t *dict;
! 117:
! 118: create_parser(chunk_from_str(""));
! 119: ck_assert(parser->parse(parser));
! 120: dict = parser->get_section(parser, CONF_PARSER_CONN, "foo");
! 121: ck_assert(!dict);
! 122: parser->destroy(parser);
! 123:
! 124: create_parser(chunk_from_str("conn foo\n"));
! 125: ck_assert(parser->parse(parser));
! 126: dict = parser->get_section(parser, CONF_PARSER_CONN, "foo");
! 127: ck_assert(!parser->get_section(parser, CONF_PARSER_CONN, "bar"));
! 128: ck_assert(dict);
! 129: dict->destroy(dict);
! 130: parser->destroy(parser);
! 131:
! 132: create_parser(chunk_from_str("conn foo\n\tfoo=bar"));
! 133: ck_assert(parser->parse(parser));
! 134: dict = parser->get_section(parser, CONF_PARSER_CONN, "foo");
! 135: ck_assert(dict);
! 136: dict->destroy(dict);
! 137: }
! 138: END_TEST
! 139:
! 140: START_TEST(test_enumerate_values)
! 141: {
! 142: enumerator_t *enumerator;
! 143: dictionary_t *dict;
! 144: char *key, *value;
! 145: int i;
! 146:
! 147: create_parser(chunk_from_str(
! 148: "conn foo\n"
! 149: " foo=bar\n"
! 150: " bar=baz"));
! 151: ck_assert(parser->parse(parser));
! 152: dict = parser->get_section(parser, CONF_PARSER_CONN, "foo");
! 153: ck_assert(dict);
! 154: ck_assert_str_eq("bar", dict->get(dict, "foo"));
! 155: ck_assert_str_eq("baz", dict->get(dict, "bar"));
! 156: enumerator = dict->create_enumerator(dict);
! 157: for (i = 0; enumerator->enumerate(enumerator, &key, &value); i++)
! 158: {
! 159: if ((streq(key, "foo") && !streq(value, "bar")) ||
! 160: (streq(key, "bar") && !streq(value, "baz")))
! 161: {
! 162: fail("unexpected setting %s=%s", key, value);
! 163: }
! 164: }
! 165: enumerator->destroy(enumerator);
! 166: ck_assert_int_eq(i, 2);
! 167: dict->destroy(dict);
! 168: }
! 169: END_TEST
! 170:
! 171: #define extensibility_config(section) \
! 172: section "\n" \
! 173: " foo=bar\n" \
! 174: " dup=one\n" \
! 175: " dup=two\n" \
! 176: "\n" \
! 177: " nope=val\n" \
! 178: "\n" \
! 179: section "\n" \
! 180: " foo=baz\n" \
! 181: section "\n" \
! 182: " answer=42\n" \
! 183: " nope=\n"
! 184:
! 185: static struct {
! 186: char *conf;
! 187: conf_parser_section_t type;
! 188: char *name;
! 189: } extensibility_data[] = {
! 190: { extensibility_config("config setup"), CONF_PARSER_CONFIG_SETUP, NULL },
! 191: { extensibility_config("ca ca-foo"), CONF_PARSER_CA, "ca-foo" },
! 192: { extensibility_config("conn conn-foo"), CONF_PARSER_CONN, "conn-foo" },
! 193: };
! 194:
! 195: START_TEST(test_extensibility)
! 196: {
! 197: dictionary_t *dict;
! 198:
! 199: create_parser(chunk_from_str(extensibility_data[_i].conf));
! 200: ck_assert(parser->parse(parser));
! 201:
! 202: dict = parser->get_section(parser, extensibility_data[_i].type,
! 203: extensibility_data[_i].name);
! 204: ck_assert(dict);
! 205: ck_assert_str_eq("baz", dict->get(dict, "foo"));
! 206: ck_assert_str_eq("two", dict->get(dict, "dup"));
! 207: ck_assert_str_eq("42", dict->get(dict, "answer"));
! 208: ck_assert(!dict->get(dict, "nope"));
! 209: ck_assert(!dict->get(dict, "anything"));
! 210: dict->destroy(dict);
! 211: }
! 212: END_TEST
! 213:
! 214: static struct {
! 215: char *conf;
! 216: bool check_section;
! 217: char *value;
! 218: } comments_data[] = {
! 219: { "# conn foo", FALSE, NULL },
! 220: { "# conn foo\n", FALSE, NULL },
! 221: { "conn foo # asdf", TRUE, NULL },
! 222: { "conn foo # asdf", TRUE, NULL },
! 223: { "conn foo# asdf\n", TRUE, NULL },
! 224: { "conn foo # asdf\n\tkey=val", TRUE, "val" },
! 225: { "conn foo # asdf\n#\tkey=val", TRUE, NULL },
! 226: { "conn foo # asdf\n\t#key=val", TRUE, NULL },
! 227: { "conn foo # asdf\n\tkey=@#keyid", TRUE, "@#keyid" },
! 228: { "conn foo # asdf\n\tkey=\"@#keyid\"", TRUE, "@#keyid" },
! 229: { "conn foo # asdf\n\tkey=asdf@#keyid", TRUE, "asdf@" },
! 230: { "conn foo # asdf\n\tkey=#val", TRUE, NULL },
! 231: { "conn foo # asdf\n\tkey=val#asdf", TRUE, "val" },
! 232: { "conn foo # asdf\n\tkey=\"val#asdf\"", TRUE, "val#asdf" },
! 233: { "conn foo # asdf\n\tkey=val # asdf\n", TRUE, "val" },
! 234: { "conn foo # asdf\n# asdf\n\tkey=val\n", TRUE, "val" },
! 235: { "conn foo # asdf\n\t# asdf\n\tkey=val\n", TRUE, "val" },
! 236: };
! 237:
! 238: START_TEST(test_comments)
! 239: {
! 240: dictionary_t *dict;
! 241:
! 242: create_parser(chunk_from_str(comments_data[_i].conf));
! 243: ck_assert(parser->parse(parser));
! 244: if (comments_data[_i].check_section)
! 245: {
! 246: dict = parser->get_section(parser, CONF_PARSER_CONN, "foo");
! 247: ck_assert(dict);
! 248: if (comments_data[_i].value)
! 249: {
! 250: ck_assert_str_eq(comments_data[_i].value, dict->get(dict, "key"));
! 251: }
! 252: else
! 253: {
! 254: ck_assert(!dict->get(dict, "key"));
! 255: }
! 256: dict->destroy(dict);
! 257: }
! 258: else
! 259: {
! 260: ck_assert(!parser->get_section(parser, CONF_PARSER_CONN, "foo"));
! 261: }
! 262: }
! 263: END_TEST
! 264:
! 265: static struct {
! 266: char *conf;
! 267: bool check_section;
! 268: char *value;
! 269: } whitespace_data[] = {
! 270: { "conn foo ", FALSE, NULL },
! 271: { "conn foo", FALSE, NULL },
! 272: { "conn foo\n", FALSE, NULL },
! 273: { "conn foo \n", FALSE, NULL },
! 274: { "conn foo\n ", FALSE, NULL },
! 275: { "conn foo\n \n", FALSE, NULL },
! 276: { "conn foo\nconn bar", TRUE, NULL },
! 277: { "conn foo\n \nconn bar", TRUE, NULL },
! 278: { "conn foo\n key=val", FALSE, "val" },
! 279: { "conn foo\n\tkey=val", FALSE, "val" },
! 280: { "conn foo\n\t \tkey=val", FALSE, "val" },
! 281: { "conn foo\n\tkey = val ", FALSE, "val" },
! 282: };
! 283:
! 284: START_TEST(test_whitespace)
! 285: {
! 286: dictionary_t *dict;
! 287:
! 288: create_parser(chunk_from_str(whitespace_data[_i].conf));
! 289: ck_assert(parser->parse(parser));
! 290: dict = parser->get_section(parser, CONF_PARSER_CONN, "foo");
! 291: ck_assert(dict);
! 292: if (whitespace_data[_i].value)
! 293: {
! 294: ck_assert_str_eq(whitespace_data[_i].value, dict->get(dict, "key"));
! 295: }
! 296: else
! 297: {
! 298: ck_assert(!dict->get(dict, "key"));
! 299: }
! 300: dict->destroy(dict);
! 301: if (whitespace_data[_i].check_section)
! 302: {
! 303: dict = parser->get_section(parser, CONF_PARSER_CONN, "bar");
! 304: ck_assert(dict);
! 305: dict->destroy(dict);
! 306: }
! 307: else
! 308: {
! 309: ck_assert(!parser->get_section(parser, CONF_PARSER_CONN, "bar"));
! 310: }
! 311: }
! 312: END_TEST
! 313:
! 314: static struct {
! 315: bool valid;
! 316: char *conf;
! 317: char *section;
! 318: char *value;
! 319: } strings_data[] = {
! 320: { FALSE, "\"conn foo\"", NULL, NULL },
! 321: { TRUE, "conn \"foo\"", "foo", NULL },
! 322: { FALSE, "conn foo bar", NULL, NULL },
! 323: { TRUE, "conn \"foo bar\"", "foo bar", NULL },
! 324: { TRUE, "conn \"#foo\"", "#foo", NULL },
! 325: { FALSE, "conn foo\n\t\"key=val\"", "foo", NULL },
! 326: { TRUE, "conn foo\n\t\"key\"=val", "foo", "val" },
! 327: { TRUE, "conn foo\n\tkey=val ue", "foo", "val ue" },
! 328: { TRUE, "conn foo\n\tkey=val ue", "foo", "val ue" },
! 329: { TRUE, "conn foo\n\tkey=\"val ue\"", "foo", "val ue" },
! 330: { TRUE, "conn foo\n\tkey=\"val\\nue\"", "foo", "val\nue" },
! 331: { TRUE, "conn foo\n\tkey=\"val\nue\"", "foo", "val\nue" },
! 332: { TRUE, "conn foo\n\tkey=\"val\\\nue\"", "foo", "value" },
! 333: { FALSE, "conn foo\n\tkey=\"unterminated", "foo", NULL },
! 334: };
! 335:
! 336: START_TEST(test_strings)
! 337: {
! 338: dictionary_t *dict;
! 339:
! 340: create_parser(chunk_from_str(strings_data[_i].conf));
! 341: ck_assert(parser->parse(parser) == strings_data[_i].valid);
! 342: if (strings_data[_i].section)
! 343: {
! 344: dict = parser->get_section(parser, CONF_PARSER_CONN,
! 345: strings_data[_i].section);
! 346: ck_assert(dict);
! 347: if (strings_data[_i].value)
! 348: {
! 349: ck_assert_str_eq(strings_data[_i].value, dict->get(dict, "key"));
! 350: }
! 351: else
! 352: {
! 353: ck_assert(!dict->get(dict, "key"));
! 354: }
! 355: dict->destroy(dict);
! 356: }
! 357: }
! 358: END_TEST
! 359:
! 360: START_TEST(test_refcounting)
! 361: {
! 362: dictionary_t *dict;
! 363:
! 364: create_parser(chunk_from_str(
! 365: "conn foo\n"
! 366: " key=val"));
! 367:
! 368: ck_assert(parser->parse(parser));
! 369: dict = parser->get_section(parser, CONF_PARSER_CONN, "foo");
! 370: ck_assert(dict);
! 371: ck_assert_str_eq("val", dict->get(dict, "key"));
! 372: parser->destroy(parser);
! 373: ck_assert_str_eq("val", dict->get(dict, "key"));
! 374: dict->destroy(dict);
! 375: }
! 376: END_TEST
! 377:
! 378: START_TEST(test_default)
! 379: {
! 380: enumerator_t *enumerator;
! 381: dictionary_t *dict;
! 382: char *name;
! 383:
! 384: create_parser(chunk_from_str(
! 385: "conn %default\n"
! 386: " key=valdef\n"
! 387: " unset=set\n"
! 388: "conn A\n"
! 389: " key=vala\n"
! 390: " unset=\n"
! 391: "conn B\n"
! 392: " keyb=valb\n"
! 393: ""));
! 394:
! 395: ck_assert(parser->parse(parser));
! 396: dict = parser->get_section(parser, CONF_PARSER_CONN, "%default");
! 397: ck_assert(!dict);
! 398: enumerator = parser->get_sections(parser, CONF_PARSER_CONN);
! 399: ck_assert(enumerator);
! 400: ck_assert(enumerator->enumerate(enumerator, &name));
! 401: ck_assert_str_eq("A", name);
! 402: ck_assert(enumerator->enumerate(enumerator, &name));
! 403: ck_assert_str_eq("B", name);
! 404: ck_assert(!enumerator->enumerate(enumerator, &name));
! 405: enumerator->destroy(enumerator);
! 406:
! 407: dict = parser->get_section(parser, CONF_PARSER_CONN, "A");
! 408: ck_assert(dict);
! 409: ck_assert_str_eq("vala", dict->get(dict, "key"));
! 410: ck_assert(!dict->get(dict, "unset"));
! 411: dict->destroy(dict);
! 412: dict = parser->get_section(parser, CONF_PARSER_CONN, "B");
! 413: ck_assert(dict);
! 414: ck_assert_str_eq("valdef", dict->get(dict, "key"));
! 415: ck_assert_str_eq("valb", dict->get(dict, "keyb"));
! 416: ck_assert_str_eq("set", dict->get(dict, "unset"));
! 417: dict->destroy(dict);
! 418: }
! 419: END_TEST
! 420:
! 421: START_TEST(test_also)
! 422: {
! 423: dictionary_t *dict;
! 424:
! 425: create_parser(chunk_from_str(
! 426: "conn A\n"
! 427: " key=vala\n"
! 428: " keya=val1\n"
! 429: " unset=set\n"
! 430: "conn B\n"
! 431: " also=A\n"
! 432: " key=valb\n"
! 433: " keyb=val2\n"
! 434: " unset=\n"
! 435: "conn C\n"
! 436: " keyc=val3\n"
! 437: " unset=set again\n"
! 438: " also=B\n"
! 439: "conn D\n"
! 440: " keyd=val4\n"
! 441: " also=A\n"
! 442: " also=B\n"
! 443: "conn E\n"
! 444: " keye=val5\n"
! 445: " also=B\n"
! 446: " also=A\n"
! 447: ""));
! 448:
! 449: ck_assert(parser->parse(parser));
! 450: dict = parser->get_section(parser, CONF_PARSER_CONN, "B");
! 451: ck_assert(dict);
! 452: ck_assert_str_eq("valb", dict->get(dict, "key"));
! 453: ck_assert_str_eq("val1", dict->get(dict, "keya"));
! 454: ck_assert_str_eq("val2", dict->get(dict, "keyb"));
! 455: ck_assert(!dict->get(dict, "unset"));
! 456: dict->destroy(dict);
! 457: dict = parser->get_section(parser, CONF_PARSER_CONN, "C");
! 458: ck_assert(dict);
! 459: ck_assert_str_eq("valb", dict->get(dict, "key"));
! 460: ck_assert_str_eq("val1", dict->get(dict, "keya"));
! 461: ck_assert_str_eq("val2", dict->get(dict, "keyb"));
! 462: ck_assert_str_eq("val3", dict->get(dict, "keyc"));
! 463: ck_assert_str_eq("set again", dict->get(dict, "unset"));
! 464: dict->destroy(dict);
! 465: /* since B includes A too the inclusion in D and E has no effect */
! 466: dict = parser->get_section(parser, CONF_PARSER_CONN, "D");
! 467: ck_assert(dict);
! 468: ck_assert_str_eq("valb", dict->get(dict, "key"));
! 469: ck_assert_str_eq("val1", dict->get(dict, "keya"));
! 470: ck_assert_str_eq("val2", dict->get(dict, "keyb"));
! 471: ck_assert(!dict->get(dict, "keyc"));
! 472: ck_assert_str_eq("val4", dict->get(dict, "keyd"));
! 473: ck_assert(!dict->get(dict, "unset"));
! 474: dict->destroy(dict);
! 475: dict = parser->get_section(parser, CONF_PARSER_CONN, "E");
! 476: ck_assert(dict);
! 477: ck_assert_str_eq("valb", dict->get(dict, "key"));
! 478: ck_assert_str_eq("val1", dict->get(dict, "keya"));
! 479: ck_assert_str_eq("val2", dict->get(dict, "keyb"));
! 480: ck_assert(!dict->get(dict, "keyc"));
! 481: ck_assert(!dict->get(dict, "keyd"));
! 482: ck_assert_str_eq("val5", dict->get(dict, "keye"));
! 483: ck_assert(!dict->get(dict, "unset"));
! 484: dict->destroy(dict);
! 485: }
! 486: END_TEST
! 487:
! 488: START_TEST(test_ambiguous)
! 489: {
! 490: dictionary_t *dict;
! 491:
! 492: create_parser(chunk_from_str(
! 493: "conn A\n"
! 494: " key=vala\n"
! 495: "conn B\n"
! 496: " key=valb\n"
! 497: "conn C\n"
! 498: " also=A\n"
! 499: " also=B\n"
! 500: "conn D\n"
! 501: " also=B\n"
! 502: " also=A\n"
! 503: "conn E\n"
! 504: " also=C\n"
! 505: " also=D\n"
! 506: "conn F\n"
! 507: " also=D\n"
! 508: " also=C\n"));
! 509:
! 510: ck_assert(parser->parse(parser));
! 511: dict = parser->get_section(parser, CONF_PARSER_CONN, "E");
! 512: ck_assert(dict);
! 513: ck_assert_str_eq("valb", dict->get(dict, "key"));
! 514: dict->destroy(dict);
! 515: dict = parser->get_section(parser, CONF_PARSER_CONN, "F");
! 516: ck_assert(dict);
! 517: ck_assert_str_eq("vala", dict->get(dict, "key"));
! 518: dict->destroy(dict);
! 519: }
! 520: END_TEST
! 521:
! 522: Suite *parser_suite_create()
! 523: {
! 524: Suite *s;
! 525: TCase *tc;
! 526:
! 527: s = suite_create("ipsec.conf parser");
! 528:
! 529: tc = tcase_create("get_section(s)");
! 530: tcase_add_checked_fixture(tc, NULL, teardown_parser);
! 531: tcase_add_test(tc, test_get_sections_config_setup);
! 532: tcase_add_test(tc, test_get_sections_conn);
! 533: tcase_add_test(tc, test_get_section_config_setup);
! 534: tcase_add_test(tc, test_get_section_conn);
! 535: suite_add_tcase(s, tc);
! 536:
! 537: tc = tcase_create("enumerate settings");
! 538: tcase_add_checked_fixture(tc, NULL, teardown_parser);
! 539: tcase_add_test(tc, test_enumerate_values);
! 540: suite_add_tcase(s, tc);
! 541:
! 542: tc = tcase_create("extensibility");
! 543: tcase_add_checked_fixture(tc, NULL, teardown_parser);
! 544: tcase_add_loop_test(tc, test_extensibility, 0, countof(extensibility_data));
! 545: suite_add_tcase(s, tc);
! 546:
! 547: tc = tcase_create("comments");
! 548: tcase_add_checked_fixture(tc, NULL, teardown_parser);
! 549: tcase_add_loop_test(tc, test_comments, 0, countof(comments_data));
! 550: suite_add_tcase(s, tc);
! 551:
! 552: tc = tcase_create("whitespace");
! 553: tcase_add_checked_fixture(tc, NULL, teardown_parser);
! 554: tcase_add_loop_test(tc, test_whitespace, 0, countof(whitespace_data));
! 555: suite_add_tcase(s, tc);
! 556:
! 557: tc = tcase_create("strings");
! 558: tcase_add_checked_fixture(tc, NULL, teardown_parser);
! 559: tcase_add_loop_test(tc, test_strings, 0, countof(strings_data));
! 560: suite_add_tcase(s, tc);
! 561:
! 562: tc = tcase_create("refcounting");
! 563: tcase_add_test(tc, test_refcounting);
! 564: suite_add_tcase(s, tc);
! 565:
! 566: tc = tcase_create("%default");
! 567: tcase_add_checked_fixture(tc, NULL, teardown_parser);
! 568: tcase_add_test(tc, test_default);
! 569: suite_add_tcase(s, tc);
! 570:
! 571: tc = tcase_create("also=");
! 572: tcase_add_checked_fixture(tc, NULL, teardown_parser);
! 573: tcase_add_test(tc, test_also);
! 574: tcase_add_test(tc, test_ambiguous);
! 575: suite_add_tcase(s, tc);
! 576:
! 577: return s;
! 578: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>