Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_enumerator.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2013 Tobias Brunner
                      3:  * Copyright (C) 2007 Martin Willi
                      4:  * HSR Hochschule fuer Technik Rapperswil
                      5:  *
                      6:  * This program is free software; you can redistribute it and/or modify it
                      7:  * under the terms of the GNU General Public License as published by the
                      8:  * Free Software Foundation; either version 2 of the License, or (at your
                      9:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     10:  *
                     11:  * This program is distributed in the hope that it will be useful, but
                     12:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     13:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     14:  * for more details.
                     15:  */
                     16: 
                     17: #include "test_suite.h"
                     18: 
                     19: #include <collections/enumerator.h>
                     20: #include <collections/linked_list.h>
                     21: 
                     22: /*******************************************************************************
                     23:  * token test
                     24:  */
                     25: 
                     26: static const char *token_results1[] = { "abc", "cde", "efg" };
                     27: static const char *token_results2[] = { "a", "b", "c" };
                     28: 
                     29: static struct {
                     30:        char *string;
                     31:        char *sep;
                     32:        char *trim;
                     33:        const char **results;
                     34: } token_tests[] = {
                     35:        {"abc, cde, efg", ",", " ", token_results1},
                     36:        {" abc 1:2 cde;3  4efg5.  ", ":;.,", " 12345", token_results1},
                     37:        {"abc.cde,efg", ",.", "", token_results1},
                     38:        {"  abc   cde  efg  ", " ", " ", token_results1},
                     39:        {"a'abc' c 'cde' cefg", " ", " abcd", token_results1},
                     40:        {"'abc' abc 'cde'd 'efg'", " ", " abcd", token_results1},
                     41: 
                     42:        {"a, b, c", ",", " ", token_results2},
                     43:        {"a,b,c", ",", " ", token_results2},
                     44:        {" a 1:2 b;3  4c5.  ", ":;.,", " 12345", token_results2},
                     45:        {"a.b,c", ",.", "", token_results2},
                     46:        {"  a   b  c  ", " ", " ", token_results2},
                     47: };
                     48: 
                     49: START_TEST(test_token)
                     50: {
                     51:        enumerator_t *enumerator;
                     52:        const char **results;
                     53:        char *token;
                     54:        int tok = 0;
                     55: 
                     56:        enumerator = enumerator_create_token(token_tests[_i].string,
                     57:                                                                        token_tests[_i].sep, token_tests[_i].trim);
                     58:        results = token_tests[_i].results;
                     59:        while (enumerator->enumerate(enumerator, &token))
                     60:        {
                     61:                switch (tok)
                     62:                {
                     63:                        case 0:
                     64:                        case 1:
                     65:                        case 2:
                     66:                                ck_assert_str_eq(token, results[tok]);
                     67:                                break;
                     68:                        default:
                     69:                                fail("unexpected token '%s'", token);
                     70:                }
                     71:                tok++;
                     72:        }
                     73:        fail_if(tok != 3, "not enough tokens (%d) extracted from '%s'",
                     74:                        tok, token_tests[_i].string);
                     75:        enumerator->destroy(enumerator);
                     76: }
                     77: END_TEST
                     78: 
                     79: /*******************************************************************************
                     80:  * utilities for filtered, nested and cleaner tests
                     81:  */
                     82: 
                     83: static int destroy_data_called;
                     84: 
                     85: START_SETUP(setup_destroy_data)
                     86: {
                     87:        destroy_data_called = 0;
                     88: }
                     89: END_SETUP
                     90: 
                     91: START_TEARDOWN(teardown_destroy_data)
                     92: {
                     93:        ck_assert_int_eq(destroy_data_called, 1);
                     94: }
                     95: END_TEARDOWN
                     96: 
                     97: static void destroy_data(void *data)
                     98: {
                     99:        fail_if(data != (void*)101, "data does not match '101' in destructor");
                    100:        destroy_data_called++;
                    101: }
                    102: 
                    103: /*******************************************************************************
                    104:  * filtered test
                    105:  */
                    106: 
                    107: CALLBACK(filter, bool,
                    108:        int *data, enumerator_t *orig, va_list args)
                    109: {
                    110:        int *item, *vo, *wo, *xo, *yo, *zo;
                    111: 
                    112:        VA_ARGS_VGET(args, vo, wo, xo, yo, zo);
                    113: 
                    114:        if (orig->enumerate(orig, &item))
                    115:        {
                    116:                int val = *item;
                    117:                *vo = val++;
                    118:                *wo = val++;
                    119:                *xo = val++;
                    120:                *yo = val++;
                    121:                *zo = val++;
                    122:                fail_if(data != (void*)101, "data does not match '101' in filter function");
                    123:                return TRUE;
                    124:        }
                    125:        return FALSE;
                    126: }
                    127: 
                    128: CALLBACK(filter_odd, bool,
                    129:        void *data, enumerator_t *orig, va_list args)
                    130: {
                    131:        int *item, *out;
                    132: 
                    133:        VA_ARGS_VGET(args, out);
                    134: 
                    135:        fail_if(data != (void*)101, "data does not match '101' in filter function");
                    136: 
                    137:        while (orig->enumerate(orig, &item))
                    138:        {
                    139:                if (*item % 2 == 0)
                    140:                {
                    141:                        *out = *item;
                    142:                        return TRUE;
                    143:                }
                    144:        }
                    145:        return FALSE;
                    146: }
                    147: 
                    148: START_TEST(test_filtered)
                    149: {
                    150:        int data[5] = {1,2,3,4,5}, round, v, w, x, y, z;
                    151:        linked_list_t *list;
                    152:        enumerator_t *enumerator;
                    153: 
                    154:        list = linked_list_create_with_items(&data[0], &data[1], &data[2], &data[3],
                    155:                                                                                 &data[4], NULL);
                    156: 
                    157:        round = 1;
                    158:        enumerator = enumerator_create_filter(list->create_enumerator(list),
                    159:                                                                                  filter, (void*)101, destroy_data);
                    160:        while (enumerator->enumerate(enumerator, &v, &w, &x, &y, &z))
                    161:        {
                    162:                ck_assert_int_eq(v, round);
                    163:                ck_assert_int_eq(w, round + 1);
                    164:                ck_assert_int_eq(x, round + 2);
                    165:                ck_assert_int_eq(y, round + 3);
                    166:                ck_assert_int_eq(z, round + 4);
                    167:                round++;
                    168:        }
                    169:        enumerator->destroy(enumerator);
                    170:        ck_assert_int_eq(round, 6);
                    171: 
                    172:        list->destroy(list);
                    173: }
                    174: END_TEST
                    175: 
                    176: START_TEST(test_filtered_filter)
                    177: {
                    178:        int data[5] = {1,2,3,4,5}, count, x;
                    179:        linked_list_t *list;
                    180:        enumerator_t *enumerator;
                    181: 
                    182:        list = linked_list_create_with_items(&data[0], &data[1], &data[2], &data[3],
                    183:                                                                                 &data[4], NULL);
                    184: 
                    185:        count = 0;
                    186:        /* should also work without destructor, so set this manually */
                    187:        destroy_data_called = 1;
                    188:        enumerator = enumerator_create_filter(list->create_enumerator(list),
                    189:                                                                                  filter_odd, (void*)101, NULL);
                    190:        while (enumerator->enumerate(enumerator, &x))
                    191:        {
                    192:                ck_assert(x % 2 == 0);
                    193:                count++;
                    194:        }
                    195:        enumerator->destroy(enumerator);
                    196:        ck_assert_int_eq(count, 2);
                    197: 
                    198:        list->destroy(list);
                    199: }
                    200: END_TEST
                    201: 
                    202: /*******************************************************************************
                    203:  * nested test
                    204:  */
                    205: 
                    206: static enumerator_t* create_inner(linked_list_t *outer, void *data)
                    207: {
                    208:        fail_if(data != (void*)101, "data does not match '101' in nested constr.");
                    209:        return outer->create_enumerator(outer);
                    210: }
                    211: 
                    212: static enumerator_t* create_inner_null(void *outer, void *data)
                    213: {
                    214:        ck_assert(outer == (void*)1);
                    215:        fail_if(data != (void*)101, "data does not match '101' in nested constr.");
                    216:        return NULL;
                    217: }
                    218: 
                    219: START_TEST(test_nested)
                    220: {
                    221:        linked_list_t *list, *l1, *l2, *l3;
                    222:        enumerator_t *enumerator;
                    223:        intptr_t x;
                    224:        int round;
                    225: 
                    226:        l1 = linked_list_create_with_items((void*)1, (void*)2, NULL);
                    227:        l2 = linked_list_create();
                    228:        l3 = linked_list_create_with_items((void*)3, (void*)4, (void*)5, NULL);
                    229:        list = linked_list_create_with_items(l1, l2, l3, NULL);
                    230: 
                    231:        round = 1;
                    232:        enumerator = enumerator_create_nested(list->create_enumerator(list),
                    233:                                                                (void*)create_inner, (void*)101, destroy_data);
                    234:        while (enumerator->enumerate(enumerator, &x))
                    235:        {
                    236:                ck_assert_int_eq(round, x);
                    237:                round++;
                    238:        }
                    239:        enumerator->destroy(enumerator);
                    240:        ck_assert_int_eq(round, 6);
                    241: 
                    242:        list->destroy(list);
                    243:        l1->destroy(l1);
                    244:        l2->destroy(l2);
                    245:        l3->destroy(l3);
                    246: }
                    247: END_TEST
                    248: 
                    249: START_TEST(test_nested_reset)
                    250: {
                    251:        linked_list_t *list, *l1, *l2, *l3;
                    252:        enumerator_t *outer, *enumerator;
                    253:        intptr_t x;
                    254:        int count = 0;
                    255: 
                    256:        l1 = linked_list_create_with_items((void*)1, (void*)2, NULL);
                    257:        l2 = linked_list_create();
                    258:        l3 = linked_list_create_with_items((void*)3, (void*)4, (void*)5, NULL);
                    259:        list = linked_list_create_with_items(l1, l2, l3, NULL);
                    260: 
                    261:        outer = list->create_enumerator(list);
                    262:        enumerator = enumerator_create_nested(outer, (void*)create_inner,
                    263:                                                                                 (void*)101, destroy_data);
                    264:        while (enumerator->enumerate(enumerator, &x))
                    265:        {
                    266:                count++;
                    267:        }
                    268:        ck_assert_int_eq(count, 5);
                    269: 
                    270:        list->reset_enumerator(list, outer);
                    271:        ck_assert(enumerator->enumerate(enumerator, &x));
                    272:        ck_assert_int_eq(x, 1);
                    273:        enumerator->destroy(enumerator);
                    274: 
                    275:        list->destroy(list);
                    276:        l1->destroy(l1);
                    277:        l2->destroy(l2);
                    278:        l3->destroy(l3);
                    279: }
                    280: END_TEST
                    281: 
                    282: START_TEST(test_nested_empty)
                    283: {
                    284:        linked_list_t *list;
                    285:        enumerator_t *enumerator;
                    286:        intptr_t x;
                    287:        int count;
                    288: 
                    289:        list = linked_list_create();
                    290:        count = 0;
                    291:        enumerator = enumerator_create_nested(list->create_enumerator(list),
                    292:                                                                (void*)create_inner, (void*)101, destroy_data);
                    293:        while (enumerator->enumerate(enumerator, &x))
                    294:        {
                    295:                count++;
                    296:        }
                    297:        enumerator->destroy(enumerator);
                    298:        ck_assert_int_eq(count, 0);
                    299: 
                    300:        list->destroy(list);
                    301: }
                    302: END_TEST
                    303: 
                    304: START_TEST(test_nested_null)
                    305: {
                    306:        linked_list_t *list;
                    307:        enumerator_t *enumerator;
                    308:        intptr_t x;
                    309:        int count;
                    310: 
                    311:        list = linked_list_create_with_items((void*)1, NULL);
                    312: 
                    313:        count = 0;
                    314:        /* should also work without destructor, so set this manually */
                    315:        destroy_data_called = 1;
                    316:        enumerator = enumerator_create_nested(list->create_enumerator(list),
                    317:                                                                        (void*)create_inner_null, (void*)101, NULL);
                    318:        while (enumerator->enumerate(enumerator, &x))
                    319:        {
                    320:                count++;
                    321:        }
                    322:        enumerator->destroy(enumerator);
                    323:        ck_assert_int_eq(count, 0);
                    324: 
                    325:        list->destroy(list);
                    326: }
                    327: END_TEST
                    328: 
                    329: /*******************************************************************************
                    330:  * cleaner test
                    331:  */
                    332: 
                    333: START_TEST(test_cleaner)
                    334: {
                    335:        enumerator_t *enumerator;
                    336:        linked_list_t *list;
                    337:        intptr_t x;
                    338:        int round;
                    339: 
                    340:        list = linked_list_create_with_items((void*)1, (void*)2, NULL);
                    341: 
                    342:        round = 1;
                    343:        enumerator = enumerator_create_cleaner(list->create_enumerator(list),
                    344:                                                                                   destroy_data, (void*)101);
                    345:        while (enumerator->enumerate(enumerator, &x))
                    346:        {
                    347:                ck_assert_int_eq(round, x);
                    348:                round++;
                    349:        }
                    350:        ck_assert_int_eq(round, 3);
                    351:        enumerator->destroy(enumerator);
                    352:        list->destroy(list);
                    353: }
                    354: END_TEST
                    355: 
                    356: /*******************************************************************************
                    357:  * single test
                    358:  */
                    359: 
                    360: static void single_cleanup(void *data)
                    361: {
                    362:        ck_assert_int_eq((intptr_t)data, 1);
                    363: }
                    364: 
                    365: static void do_test_single(enumerator_t *enumerator)
                    366: {
                    367:        intptr_t x;
                    368: 
                    369:        ck_assert(enumerator->enumerate(enumerator, &x));
                    370:        ck_assert_int_eq(x, 1);
                    371:        ck_assert(!enumerator->enumerate(enumerator, &x));
                    372:        enumerator->destroy(enumerator);
                    373: }
                    374: 
                    375: START_TEST(test_single)
                    376: {
                    377:        enumerator_t *enumerator;
                    378: 
                    379:        enumerator = enumerator_create_single((void*)1, NULL);
                    380:        do_test_single(enumerator);
                    381: }
                    382: END_TEST
                    383: 
                    384: START_TEST(test_single_cleanup)
                    385: {
                    386:        enumerator_t *enumerator;
                    387: 
                    388:        enumerator = enumerator_create_single((void*)1, single_cleanup);
                    389:        do_test_single(enumerator);
                    390: }
                    391: END_TEST
                    392: 
                    393: Suite *enumerator_suite_create()
                    394: {
                    395:        Suite *s;
                    396:        TCase *tc;
                    397: 
                    398:        s = suite_create("enumerator");
                    399: 
                    400:        tc = tcase_create("tokens");
                    401:        tcase_add_loop_test(tc, test_token, 0, countof(token_tests));
                    402:        suite_add_tcase(s, tc);
                    403: 
                    404:        tc = tcase_create("filtered");
                    405:        tcase_add_checked_fixture(tc, setup_destroy_data, teardown_destroy_data);
                    406:        tcase_add_test(tc, test_filtered);
                    407:        tcase_add_test(tc, test_filtered_filter);
                    408:        suite_add_tcase(s, tc);
                    409: 
                    410:        tc = tcase_create("nested");
                    411:        tcase_add_checked_fixture(tc, setup_destroy_data, teardown_destroy_data);
                    412:        tcase_add_test(tc, test_nested);
                    413:        tcase_add_test(tc, test_nested_reset);
                    414:        tcase_add_test(tc, test_nested_empty);
                    415:        tcase_add_test(tc, test_nested_null);
                    416:        suite_add_tcase(s, tc);
                    417: 
                    418:        tc = tcase_create("cleaner");
                    419:        tcase_add_checked_fixture(tc, setup_destroy_data, teardown_destroy_data);
                    420:        tcase_add_test(tc, test_cleaner);
                    421:        suite_add_tcase(s, tc);
                    422: 
                    423:        tc = tcase_create("single");
                    424:        tcase_add_test(tc, test_single);
                    425:        tcase_add_test(tc, test_single_cleanup);
                    426:        suite_add_tcase(s, tc);
                    427: 
                    428:        return s;
                    429: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>