Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_linked_list.c, revision 1.1.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>