Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_linked_list.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2013 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 "test_suite.h"
! 17:
! 18: #include <collections/linked_list.h>
! 19:
! 20: /*******************************************************************************
! 21: * test fixture
! 22: */
! 23:
! 24: static linked_list_t *list;
! 25:
! 26: START_SETUP(setup_list)
! 27: {
! 28: void *x = NULL;
! 29:
! 30: list = linked_list_create();
! 31: ck_assert_int_eq(list->get_count(list), 0);
! 32: ck_assert(list->get_first(list, &x) == NOT_FOUND);
! 33: ck_assert(list->get_last(list, &x) == NOT_FOUND);
! 34: }
! 35: END_SETUP
! 36:
! 37: START_TEARDOWN(teardown_list)
! 38: {
! 39: list->destroy(list);
! 40: }
! 41: END_TEARDOWN
! 42:
! 43: /*******************************************************************************
! 44: * insert first/last
! 45: */
! 46:
! 47: START_TEST(test_insert_first)
! 48: {
! 49: void *a = (void*)1, *b = (void*)2, *x = NULL;
! 50:
! 51: list->insert_first(list, a);
! 52: ck_assert_int_eq(list->get_count(list), 1);
! 53: ck_assert(list->get_first(list, &x) == SUCCESS);
! 54: ck_assert(x == a);
! 55: ck_assert(list->get_last(list, &x) == SUCCESS);
! 56: ck_assert(x == a);
! 57:
! 58: list->insert_first(list, b);
! 59: ck_assert_int_eq(list->get_count(list), 2);
! 60: ck_assert(list->get_first(list, &x) == SUCCESS);
! 61: ck_assert(x == b);
! 62: ck_assert(list->get_last(list, &x) == SUCCESS);
! 63: ck_assert(x == a);
! 64: }
! 65: END_TEST
! 66:
! 67: START_TEST(test_insert_last)
! 68: {
! 69: void *a = (void*)1, *b = (void*)2, *x = NULL;
! 70:
! 71: list->insert_last(list, a);
! 72: ck_assert_int_eq(list->get_count(list), 1);
! 73: ck_assert(list->get_first(list, &x) == SUCCESS);
! 74: ck_assert(x == a);
! 75: ck_assert(list->get_last(list, &x) == SUCCESS);
! 76: ck_assert(x == a);
! 77:
! 78: list->insert_last(list, b);
! 79: ck_assert_int_eq(list->get_count(list), 2);
! 80: ck_assert(list->get_first(list, &x) == SUCCESS);
! 81: ck_assert(x == a);
! 82: ck_assert(list->get_last(list, &x) == SUCCESS);
! 83: ck_assert(x == b);
! 84: }
! 85: END_TEST
! 86:
! 87: /*******************************************************************************
! 88: * remove first/last
! 89: */
! 90:
! 91: START_TEST(test_remove_first)
! 92: {
! 93: void *a = (void*)1, *b = (void*)2, *x = NULL;
! 94:
! 95: list->insert_first(list, a);
! 96: list->insert_first(list, b);
! 97: ck_assert(list->remove_first(list, &x) == SUCCESS);
! 98: ck_assert_int_eq(list->get_count(list), 1);
! 99: ck_assert(x == b);
! 100: ck_assert(list->remove_first(list, &x) == SUCCESS);
! 101: ck_assert_int_eq(list->get_count(list), 0);
! 102: ck_assert(x == a);
! 103: ck_assert(list->remove_first(list, &x) == NOT_FOUND);
! 104: ck_assert(list->remove_last(list, &x) == NOT_FOUND);
! 105: }
! 106: END_TEST
! 107:
! 108: START_TEST(test_remove_last)
! 109: {
! 110: void *a = (void*)1, *b = (void*)2, *x = NULL;
! 111:
! 112: list->insert_first(list, a);
! 113: list->insert_first(list, b);
! 114: ck_assert(list->remove_last(list, &x) == SUCCESS);
! 115: ck_assert_int_eq(list->get_count(list), 1);
! 116: ck_assert(x == a);
! 117: ck_assert(list->remove_last(list, &x) == SUCCESS);
! 118: ck_assert_int_eq(list->get_count(list), 0);
! 119: ck_assert(x == b);
! 120: ck_assert(list->remove_first(list, &x) == NOT_FOUND);
! 121: ck_assert(list->remove_last(list, &x) == NOT_FOUND);
! 122: }
! 123: END_TEST
! 124:
! 125: /*******************************************************************************
! 126: * helper function for remove and find tests
! 127: */
! 128:
! 129: static bool match_a(void *item, void *a)
! 130: {
! 131: ck_assert(a == (void*)1);
! 132: return item == a;
! 133: }
! 134:
! 135: static bool match_b(void *item, void *b)
! 136: {
! 137: ck_assert(b == (void*)2);
! 138: return item == b;
! 139: }
! 140:
! 141: /*******************************************************************************
! 142: * remove
! 143: */
! 144:
! 145: START_TEST(test_remove)
! 146: {
! 147: void *a = (void*)1, *b = (void*)2;
! 148:
! 149: list->insert_first(list, a);
! 150: ck_assert(list->remove(list, a, NULL) == 1);
! 151: ck_assert_int_eq(list->get_count(list), 0);
! 152:
! 153: list->insert_last(list, a);
! 154: list->insert_last(list, a);
! 155: list->insert_last(list, a);
! 156: list->insert_last(list, b);
! 157: ck_assert(list->remove(list, a, NULL) == 3);
! 158: ck_assert(list->remove(list, a, NULL) == 0);
! 159: ck_assert_int_eq(list->get_count(list), 1);
! 160: ck_assert(list->remove(list, b, NULL) == 1);
! 161: ck_assert(list->remove(list, b, NULL) == 0);
! 162: }
! 163: END_TEST
! 164:
! 165: START_TEST(test_remove_callback)
! 166: {
! 167: void *a = (void*)1, *b = (void*)2;
! 168:
! 169: list->insert_last(list, a);
! 170: list->insert_last(list, b);
! 171: list->insert_last(list, a);
! 172: list->insert_last(list, b);
! 173: ck_assert(list->remove(list, a, match_a) == 2);
! 174: ck_assert(list->remove(list, a, match_a) == 0);
! 175: ck_assert_int_eq(list->get_count(list), 2);
! 176: ck_assert(list->remove(list, b, match_b) == 2);
! 177: ck_assert(list->remove(list, b, match_b) == 0);
! 178: ck_assert_int_eq(list->get_count(list), 0);
! 179: }
! 180: END_TEST
! 181:
! 182: /*******************************************************************************
! 183: * find
! 184: */
! 185:
! 186: CALLBACK(find_a_b, bool,
! 187: void *item, va_list args)
! 188: {
! 189: void *a, *b;
! 190:
! 191: VA_ARGS_VGET(args, a, b);
! 192: ck_assert(a == (void*)1);
! 193: ck_assert(b == (void*)2);
! 194: return item == a || item == b;
! 195: }
! 196:
! 197: CALLBACK(find_a, bool,
! 198: void *item, va_list args)
! 199: {
! 200: void *a;
! 201:
! 202: VA_ARGS_VGET(args, a);
! 203: return match_a(item, a);
! 204: }
! 205:
! 206: CALLBACK(find_b, bool,
! 207: void *item, va_list args)
! 208: {
! 209: void *b;
! 210:
! 211: VA_ARGS_VGET(args, b);
! 212: return match_b(item, b);
! 213: }
! 214:
! 215: START_TEST(test_find)
! 216: {
! 217: void *a = (void*)1, *b = (void*)2;
! 218:
! 219: ck_assert(!list->find_first(list, NULL, &a));
! 220: list->insert_last(list, a);
! 221: ck_assert(list->find_first(list, NULL, &a));
! 222: ck_assert(!list->find_first(list, NULL, &b));
! 223: list->insert_last(list, b);
! 224: ck_assert(list->find_first(list, NULL, &a));
! 225: ck_assert(list->find_first(list, NULL, &b));
! 226:
! 227: ck_assert(!list->find_first(list, NULL, NULL));
! 228: }
! 229: END_TEST
! 230:
! 231: START_TEST(test_find_callback)
! 232: {
! 233: void *a = (void*)1, *b = (void*)2, *x = NULL;
! 234:
! 235: ck_assert(!list->find_first(list, find_a_b, &x, a, b));
! 236: list->insert_last(list, a);
! 237: ck_assert(list->find_first(list, find_a, NULL, a));
! 238: x = NULL;
! 239: ck_assert(list->find_first(list, find_a, &x, a));
! 240: ck_assert(a == x);
! 241: ck_assert(!list->find_first(list, find_b, &x, b));
! 242: ck_assert(a == x);
! 243: x = NULL;
! 244: ck_assert(list->find_first(list, find_a_b, &x, a, b));
! 245: ck_assert(a == x);
! 246:
! 247: list->insert_last(list, b);
! 248: ck_assert(list->find_first(list, find_a, &x, a));
! 249: ck_assert(a == x);
! 250: ck_assert(list->find_first(list, find_b, &x, b));
! 251: ck_assert(b == x);
! 252: x = NULL;
! 253: ck_assert(list->find_first(list, find_a_b, &x, a, b));
! 254: ck_assert(a == x);
! 255: }
! 256: END_TEST
! 257:
! 258: CALLBACK(find_args, bool,
! 259: void *item, va_list args)
! 260: {
! 261: uint64_t d, e;
! 262: level_t c;
! 263: int *a, b;
! 264:
! 265: VA_ARGS_VGET(args, a, b, c, d, e);
! 266: ck_assert_int_eq(*a, 1);
! 267: ck_assert_int_eq(b, 2);
! 268: ck_assert_int_eq(c, LEVEL_PRIVATE);
! 269: ck_assert_int_eq(d, UINT64_MAX);
! 270: ck_assert_int_eq(e, UINT64_MAX-1);
! 271: return item == a;
! 272: }
! 273:
! 274: START_TEST(test_find_callback_args)
! 275: {
! 276: int a = 1, b = 2, *x;
! 277: uint64_t d = UINT64_MAX;
! 278:
! 279: list->insert_last(list, &a);
! 280: ck_assert(list->find_first(list, find_args, (void**)&x, &a, b,
! 281: LEVEL_PRIVATE, d, UINT64_MAX-1));
! 282: ck_assert_int_eq(a, *x);
! 283: }
! 284: END_TEST
! 285:
! 286: /*******************************************************************************
! 287: * invoke
! 288: */
! 289:
! 290: typedef struct invoke_t invoke_t;
! 291:
! 292: struct invoke_t {
! 293: int val;
! 294: void (*invoke)(invoke_t *item);
! 295: };
! 296:
! 297: CALLBACK(invoke, void,
! 298: intptr_t item, va_list args)
! 299: {
! 300: void *a, *b, *c, *d;
! 301: int *sum;
! 302:
! 303: VA_ARGS_VGET(args, a, b, c, d, sum);
! 304: ck_assert_int_eq((uintptr_t)a, 1);
! 305: ck_assert_int_eq((uintptr_t)b, 2);
! 306: ck_assert_int_eq((uintptr_t)c, 3);
! 307: ck_assert_int_eq((uintptr_t)d, 4);
! 308: *sum += item;
! 309: }
! 310:
! 311: static void invoke_offset(invoke_t *item)
! 312: {
! 313: item->val++;
! 314: }
! 315:
! 316: START_TEST(test_invoke_function)
! 317: {
! 318: int sum = 0;
! 319:
! 320: list->insert_last(list, (void*)1);
! 321: list->insert_last(list, (void*)2);
! 322: list->insert_last(list, (void*)3);
! 323: list->insert_last(list, (void*)4);
! 324: list->insert_last(list, (void*)5);
! 325: list->invoke_function(list, invoke, (uintptr_t)1, (uintptr_t)2,
! 326: (uintptr_t)3, (uintptr_t)4, &sum);
! 327: ck_assert_int_eq(sum, 15);
! 328: }
! 329: END_TEST
! 330:
! 331: START_TEST(test_invoke_offset)
! 332: {
! 333: invoke_t items[] = {
! 334: { .val = 1, .invoke = invoke_offset, },
! 335: { .val = 2, .invoke = invoke_offset, },
! 336: { .val = 3, .invoke = invoke_offset, },
! 337: { .val = 4, .invoke = invoke_offset, },
! 338: { .val = 5, .invoke = invoke_offset, },
! 339: }, *item;
! 340: int i;
! 341:
! 342: for (i = 0; i < countof(items); i++)
! 343: {
! 344: list->insert_last(list, &items[i]);
! 345: }
! 346: list->invoke_offset(list, offsetof(invoke_t, invoke));
! 347: i = 2;
! 348: while (list->remove_first(list, (void**)&item) == SUCCESS)
! 349: {
! 350: ck_assert_int_eq(item->val, i++);
! 351: }
! 352: }
! 353: END_TEST
! 354:
! 355: /*******************************************************************************
! 356: * clone
! 357: */
! 358:
! 359: typedef struct clone_t clone_t;
! 360:
! 361: struct clone_t {
! 362: void *val;
! 363: void *(*clone)(clone_t *item);
! 364: };
! 365:
! 366: static void *clonefn(clone_t *item)
! 367: {
! 368: return item->val;
! 369: }
! 370:
! 371: static void test_clone(linked_list_t *list)
! 372: {
! 373: intptr_t x;
! 374: int round = 1;
! 375:
! 376: ck_assert_int_eq(list->get_count(list), 5);
! 377: while (list->remove_first(list, (void*)&x) == SUCCESS)
! 378: {
! 379: ck_assert_int_eq(round, x);
! 380: round++;
! 381: }
! 382: ck_assert_int_eq(round, 6);
! 383: }
! 384:
! 385: START_TEST(test_clone_offset)
! 386: {
! 387: linked_list_t *other;
! 388: clone_t items[] = {
! 389: { .val = (void*)1, .clone = clonefn, },
! 390: { .val = (void*)2, .clone = clonefn, },
! 391: { .val = (void*)3, .clone = clonefn, },
! 392: { .val = (void*)4, .clone = clonefn, },
! 393: { .val = (void*)5, .clone = clonefn, },
! 394: };
! 395: int i;
! 396:
! 397: for (i = 0; i < countof(items); i++)
! 398: {
! 399: list->insert_last(list, &items[i]);
! 400: }
! 401: other = list->clone_offset(list, offsetof(clone_t, clone));
! 402: test_clone(other);
! 403: other->destroy(other);
! 404: }
! 405: END_TEST
! 406:
! 407:
! 408: /*******************************************************************************
! 409: * equals
! 410: */
! 411:
! 412: typedef struct equals_t equals_t;
! 413:
! 414: struct equals_t {
! 415: int val;
! 416: bool (*equals)(equals_t *a, equals_t *b);
! 417: };
! 418:
! 419: static bool equalsfn(equals_t *a, equals_t *b)
! 420: {
! 421: return a->val == b->val;
! 422: }
! 423:
! 424: START_TEST(test_equals_offset)
! 425: {
! 426: linked_list_t *other;
! 427: equals_t *x, items[] = {
! 428: { .val = 1, .equals = equalsfn, },
! 429: { .val = 2, .equals = equalsfn, },
! 430: { .val = 3, .equals = equalsfn, },
! 431: { .val = 4, .equals = equalsfn, },
! 432: { .val = 5, .equals = equalsfn, },
! 433: };
! 434: int i;
! 435:
! 436: for (i = 0; i < countof(items); i++)
! 437: {
! 438: list->insert_last(list, &items[i]);
! 439: }
! 440: ck_assert(list->equals_offset(list, list, offsetof(equals_t, equals)));
! 441: other = linked_list_create_from_enumerator(list->create_enumerator(list));
! 442: ck_assert(list->equals_offset(list, other, offsetof(equals_t, equals)));
! 443: other->remove_last(other, (void**)&x);
! 444: ck_assert(!list->equals_offset(list, other, offsetof(equals_t, equals)));
! 445: list->remove_last(list, (void**)&x);
! 446: ck_assert(list->equals_offset(list, other, offsetof(equals_t, equals)));
! 447: other->remove_first(other, (void**)&x);
! 448: ck_assert(!list->equals_offset(list, other, offsetof(equals_t, equals)));
! 449: list->remove_first(list, (void**)&x);
! 450: ck_assert(list->equals_offset(list, other, offsetof(equals_t, equals)));
! 451: while (list->remove_first(list, (void**)&x) == SUCCESS);
! 452: while (other->remove_first(other, (void**)&x) == SUCCESS);
! 453: ck_assert(list->equals_offset(list, other, offsetof(equals_t, equals)));
! 454: other->destroy(other);
! 455: }
! 456: END_TEST
! 457:
! 458: START_TEST(test_equals_function)
! 459: {
! 460: linked_list_t *other;
! 461: equals_t *x, items[] = {
! 462: { .val = 1, },
! 463: { .val = 2, },
! 464: { .val = 3, },
! 465: { .val = 4, },
! 466: { .val = 5, },
! 467: };
! 468: int i;
! 469:
! 470: for (i = 0; i < countof(items); i++)
! 471: {
! 472: list->insert_last(list, &items[i]);
! 473: }
! 474: ck_assert(list->equals_function(list, list, (void*)equalsfn));
! 475: other = linked_list_create_from_enumerator(list->create_enumerator(list));
! 476: ck_assert(list->equals_function(list, other, (void*)equalsfn));
! 477: other->remove_last(other, (void**)&x);
! 478: ck_assert(!list->equals_function(list, other, (void*)equalsfn));
! 479: list->remove_last(list, (void**)&x);
! 480: ck_assert(list->equals_function(list, other, (void*)equalsfn));
! 481: other->remove_first(other, (void**)&x);
! 482: ck_assert(!list->equals_function(list, other, (void*)equalsfn));
! 483: list->remove_first(list, (void**)&x);
! 484: ck_assert(list->equals_function(list, other, (void*)equalsfn));
! 485: while (list->remove_first(list, (void**)&x) == SUCCESS);
! 486: while (other->remove_first(other, (void**)&x) == SUCCESS);
! 487: ck_assert(list->equals_function(list, other, (void*)equalsfn));
! 488: other->destroy(other);
! 489: }
! 490: END_TEST
! 491:
! 492: Suite *linked_list_suite_create()
! 493: {
! 494: Suite *s;
! 495: TCase *tc;
! 496:
! 497: s = suite_create("linked list");
! 498:
! 499: tc = tcase_create("insert/get");
! 500: tcase_add_checked_fixture(tc, setup_list, teardown_list);
! 501: tcase_add_test(tc, test_insert_first);
! 502: tcase_add_test(tc, test_insert_last);
! 503: suite_add_tcase(s, tc);
! 504:
! 505: tc = tcase_create("remove");
! 506: tcase_add_checked_fixture(tc, setup_list, teardown_list);
! 507: tcase_add_test(tc, test_remove_first);
! 508: tcase_add_test(tc, test_remove_last);
! 509: tcase_add_test(tc, test_remove);
! 510: tcase_add_test(tc, test_remove_callback);
! 511: suite_add_tcase(s, tc);
! 512:
! 513: tc = tcase_create("find");
! 514: tcase_add_checked_fixture(tc, setup_list, teardown_list);
! 515: tcase_add_test(tc, test_find);
! 516: tcase_add_test(tc, test_find_callback);
! 517: tcase_add_test(tc, test_find_callback_args);
! 518: suite_add_tcase(s, tc);
! 519:
! 520: tc = tcase_create("invoke");
! 521: tcase_add_checked_fixture(tc, setup_list, teardown_list);
! 522: tcase_add_test(tc, test_invoke_function);
! 523: tcase_add_test(tc, test_invoke_offset);
! 524: suite_add_tcase(s, tc);
! 525:
! 526: tc = tcase_create("clone");
! 527: tcase_add_checked_fixture(tc, setup_list, teardown_list);
! 528: tcase_add_test(tc, test_clone_offset);
! 529: suite_add_tcase(s, tc);
! 530:
! 531: tc = tcase_create("equals");
! 532: tcase_add_checked_fixture(tc, setup_list, teardown_list);
! 533: tcase_add_test(tc, test_equals_offset);
! 534: tcase_add_test(tc, test_equals_function);
! 535: suite_add_tcase(s, tc);
! 536:
! 537: return s;
! 538: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>