Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_bio_reader.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 <bio/bio_reader.h>
                     19: 
                     20: /*******************************************************************************
                     21:  * different integer reads
                     22:  */
                     23: 
                     24: #define assert_integer_read(data, bits, val) ({ \
                     25:        bio_reader_t *reader = bio_reader_create(data); \
                     26:        typeof(val) i; \
                     27:        for (i = 0; reader->remaining(reader) >= (bits / 8); i++) \
                     28:        { \
                     29:                ck_assert(reader->read_uint##bits(reader, &val)); \
                     30:                ck_assert_int_eq(i, val); \
                     31:        } \
                     32:        ck_assert_int_eq(i, data.len / (bits / 8)); \
                     33:        ck_assert_int_eq(reader->remaining(reader), data.len % (bits / 8)); \
                     34:        ck_assert(!reader->read_uint##bits(reader, &val)); \
                     35:        reader->destroy(reader); \
                     36: })
                     37: 
                     38: #define assert_integer_read_uneven(data, bits, val) ({ \
                     39:        int i; \
                     40:        for (i = 0; i <= bits / 8; i++, data.len++) \
                     41:        { \
                     42:                assert_integer_read(data, bits, val); \
                     43:        } \
                     44: })
                     45: 
                     46: #define assert_basic_read(bits, val) ({ \
                     47:        chunk_t data; \
                     48:        data = chunk_empty; \
                     49:        assert_integer_read(data, bits, val); \
                     50:        data = chunk_alloca(bits / 8); \
                     51:        memset(data.ptr, 0, data.len); \
                     52:        data.len = 0; \
                     53:        assert_integer_read_uneven(data, bits, val); \
                     54: })
                     55: 
                     56: #define assert_extended_read(data, bits, val) ({ \
                     57:        chunk_t extended = chunk_alloca(data.len + bits / 8); \
                     58:        memset(extended.ptr, 0, extended.len); \
                     59:        extended.ptr[extended.len - 1] = data.len / (bits / 8); \
                     60:        memcpy(extended.ptr, data.ptr, data.len); \
                     61:        extended.len = data.len; \
                     62:        assert_integer_read_uneven(extended, bits, val); \
                     63: })
                     64: 
                     65: START_TEST(test_read_uint8)
                     66: {
                     67:        chunk_t data = chunk_from_chars(0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07);
                     68:        uint8_t val;
                     69: 
                     70:        assert_integer_read(data, 8, val);
                     71:        assert_basic_read(8, val);
                     72:        assert_extended_read(data, 8, val);
                     73: }
                     74: END_TEST
                     75: 
                     76: START_TEST(test_read_uint16)
                     77: {
                     78:        chunk_t data = chunk_from_chars(0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03);
                     79:        uint16_t val;
                     80: 
                     81:        assert_integer_read(data, 16, val);
                     82:        assert_basic_read(16, val);
                     83:        assert_extended_read(data, 16, val);
                     84: }
                     85: END_TEST
                     86: 
                     87: START_TEST(test_read_uint24)
                     88: {
                     89:        chunk_t data = chunk_from_chars(0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03);
                     90:        uint32_t val;
                     91: 
                     92:        assert_integer_read(data, 24, val);
                     93:        assert_basic_read(24, val);
                     94:        assert_extended_read(data, 24, val);
                     95: }
                     96: END_TEST
                     97: 
                     98: START_TEST(test_read_uint32)
                     99: {
                    100:        chunk_t data = chunk_from_chars(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
                    101:                                                                        0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03);
                    102:        uint32_t val;
                    103: 
                    104:        assert_integer_read(data, 32, val);
                    105:        assert_basic_read(32, val);
                    106:        assert_extended_read(data, 32, val);
                    107: }
                    108: END_TEST
                    109: 
                    110: START_TEST(test_read_uint64)
                    111: {
                    112:        chunk_t data = chunk_from_chars(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    113:                                                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
                    114:                                                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
                    115:                                                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03);
                    116:        uint64_t val;
                    117: 
                    118:        assert_integer_read(data, 64, val);
                    119:        assert_basic_read(64, val);
                    120:        assert_extended_read(data, 64, val);
                    121: }
                    122: END_TEST
                    123: 
                    124: /*******************************************************************************
                    125:  * different integer reads from the end of a buffer
                    126:  */
                    127: 
                    128: #define assert_integer_read_end(data, bits, val) ({ \
                    129:        bio_reader_t *reader = bio_reader_create(data); \
                    130:        typeof(val) i; \
                    131:        for (i = 0; reader->remaining(reader) >= (bits / 8); i++) \
                    132:        { \
                    133:                ck_assert(reader->read_uint##bits##_end(reader, &val)); \
                    134:                ck_assert_int_eq(i, val); \
                    135:        } \
                    136:        ck_assert_int_eq(i, data.len / (bits / 8)); \
                    137:        ck_assert_int_eq(reader->remaining(reader), data.len % (bits / 8)); \
                    138:        ck_assert(!reader->read_uint##bits##_end(reader, &val)); \
                    139:        reader->destroy(reader); \
                    140: })
                    141: 
                    142: #define assert_integer_read_end_uneven(data, bits, val) ({ \
                    143:        int i; \
                    144:        data.ptr += bits / 8; \
                    145:        for (i = 0; i <= bits / 8; i++, data.ptr--, data.len++) \
                    146:        { \
                    147:                assert_integer_read_end(data, bits, val); \
                    148:        } \
                    149: })
                    150: 
                    151: #define assert_basic_read_end(bits, val) ({ \
                    152:        chunk_t data; \
                    153:        data = chunk_empty; \
                    154:        assert_integer_read_end(data, bits, val); \
                    155:        data = chunk_alloca(bits / 8); \
                    156:        memset(data.ptr, 0, data.len); \
                    157:        data.len = 0; \
                    158:        assert_integer_read_end_uneven(data, bits, val); \
                    159: })
                    160: 
                    161: #define assert_extended_read_end(data, bits, val) ({ \
                    162:        chunk_t extended = chunk_alloca(data.len + bits / 8); \
                    163:        memset(extended.ptr, 0, extended.len); \
                    164:        extended.ptr[bits / 8 - 1] = data.len / (bits / 8); \
                    165:        memcpy(extended.ptr + bits / 8, data.ptr, data.len); \
                    166:        extended.len = data.len; \
                    167:        assert_integer_read_end_uneven(extended, bits, val); \
                    168: })
                    169: 
                    170: START_TEST(test_read_uint8_end)
                    171: {
                    172:        chunk_t data = chunk_from_chars(0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00);
                    173:        uint8_t val;
                    174: 
                    175:        assert_integer_read_end(data, 8, val);
                    176:        assert_basic_read_end(8, val);
                    177:        assert_extended_read_end(data, 8, val);
                    178: }
                    179: END_TEST
                    180: 
                    181: START_TEST(test_read_uint16_end)
                    182: {
                    183:        chunk_t data = chunk_from_chars(0x00, 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00);
                    184:        uint16_t val;
                    185: 
                    186:        assert_integer_read_end(data, 16, val);
                    187:        assert_basic_read_end(16, val);
                    188:        assert_extended_read_end(data, 16, val);
                    189: }
                    190: END_TEST
                    191: 
                    192: START_TEST(test_read_uint24_end)
                    193: {
                    194:        chunk_t data = chunk_from_chars(0x00, 0x00, 0x03, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00);
                    195:        uint32_t val;
                    196: 
                    197:        assert_integer_read_end(data, 24, val);
                    198:        assert_basic_read_end(24, val);
                    199:        assert_extended_read_end(data, 24, val);
                    200: }
                    201: END_TEST
                    202: 
                    203: START_TEST(test_read_uint32_end)
                    204: {
                    205:        chunk_t data = chunk_from_chars(0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02,
                    206:                                                                        0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00);
                    207:        uint32_t val;
                    208: 
                    209:        assert_integer_read_end(data, 32, val);
                    210:        assert_basic_read_end(32, val);
                    211:        assert_extended_read_end(data, 32, val);
                    212: }
                    213: END_TEST
                    214: 
                    215: START_TEST(test_read_uint64_end)
                    216: {
                    217:        chunk_t data = chunk_from_chars(0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
                    218:                                                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
                    219:                                                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
                    220:                                                                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
                    221:        uint64_t val;
                    222: 
                    223:        assert_integer_read_end(data, 64, val);
                    224:        assert_basic_read_end(64, val);
                    225:        assert_extended_read_end(data, 64, val);
                    226: }
                    227: END_TEST
                    228: 
                    229: /*******************************************************************************
                    230:  * read data
                    231:  */
                    232: 
                    233: static inline void assert_reader_after_read(bio_reader_t *reader, chunk_t data)
                    234: {
                    235:        chunk_t peek;
                    236: 
                    237:        ck_assert_int_eq(reader->remaining(reader), data.len);
                    238:        peek = reader->peek(reader);
                    239:        ck_assert_int_eq(reader->remaining(reader), data.len);
                    240:        ck_assert(peek.ptr == data.ptr);
                    241:        data.ptr != NULL ? ck_assert(chunk_equals(peek, data))
                    242:                                         : ck_assert(peek.ptr == NULL);
                    243: }
                    244: 
                    245: START_TEST(test_read_data)
                    246: {
                    247:        chunk_t read, data = chunk_from_chars(0x00, 0x00, 0x00, 0x00);
                    248:        bio_reader_t *reader;
                    249: 
                    250:        reader = bio_reader_create(chunk_empty);
                    251:        ck_assert_int_eq(reader->remaining(reader), 0);
                    252:        ck_assert(reader->read_data(reader, 0, &read));
                    253:        ck_assert(!reader->read_data(reader, 1, &read));
                    254:        reader->destroy(reader);
                    255: 
                    256:        reader = bio_reader_create(data);
                    257:        ck_assert(reader->read_data(reader, 0, &read));
                    258:        ck_assert_int_eq(read.len, 0);
                    259:        ck_assert(read.ptr == data.ptr);
                    260:        assert_reader_after_read(reader, data);
                    261: 
                    262:        ck_assert(reader->read_data(reader, 1, &read));
                    263:        ck_assert_int_eq(read.len, 1);
                    264:        ck_assert(read.ptr == data.ptr);
                    265:        assert_reader_after_read(reader, chunk_skip(data, 1));
                    266: 
                    267:        ck_assert(reader->read_data(reader, 2, &read));
                    268:        ck_assert_int_eq(read.len, 2);
                    269:        ck_assert(read.ptr == data.ptr + 1);
                    270:        assert_reader_after_read(reader, chunk_skip(data, 3));
                    271: 
                    272:        ck_assert(!reader->read_data(reader, 2, &read));
                    273:        ck_assert(reader->read_data(reader, 1, &read));
                    274:        ck_assert_int_eq(read.len, 1);
                    275:        ck_assert(read.ptr == data.ptr + 3);
                    276:        assert_reader_after_read(reader, chunk_skip(data, 4));
                    277: 
                    278:        ck_assert_int_eq(reader->remaining(reader), 0);
                    279:        ck_assert(reader->read_data(reader, 0, &read));
                    280:        ck_assert(!reader->read_data(reader, 1, &read));
                    281:        reader->destroy(reader);
                    282: }
                    283: END_TEST
                    284: 
                    285: START_TEST(test_read_data_end)
                    286: {
                    287:        chunk_t read, data = chunk_from_chars(0x00, 0x00, 0x00, 0x00);
                    288:        bio_reader_t *reader;
                    289: 
                    290:        reader = bio_reader_create(chunk_empty);
                    291:        ck_assert_int_eq(reader->remaining(reader), 0);
                    292:        ck_assert(reader->read_data_end(reader, 0, &read));
                    293:        ck_assert(!reader->read_data_end(reader, 1, &read));
                    294:        reader->destroy(reader);
                    295: 
                    296:        reader = bio_reader_create(data);
                    297:        ck_assert(reader->read_data_end(reader, 0, &read));
                    298:        ck_assert_int_eq(read.len, 0);
                    299:        ck_assert(read.ptr == data.ptr + data.len);
                    300:        assert_reader_after_read(reader, data);
                    301: 
                    302:        ck_assert(reader->read_data_end(reader, 1, &read));
                    303:        ck_assert_int_eq(read.len, 1);
                    304:        data.len--;
                    305:        ck_assert(read.ptr == data.ptr + data.len);
                    306:        assert_reader_after_read(reader, data);
                    307: 
                    308:        ck_assert(reader->read_data_end(reader, 2, &read));
                    309:        ck_assert_int_eq(read.len, 2);
                    310:        data.len -= 2;
                    311:        ck_assert(read.ptr == data.ptr + data.len);
                    312:        assert_reader_after_read(reader, data);
                    313: 
                    314:        ck_assert(!reader->read_data(reader, 2, &read));
                    315:        ck_assert(reader->read_data(reader, 1, &read));
                    316:        ck_assert_int_eq(read.len, 1);
                    317:        ck_assert(read.ptr == data.ptr);
                    318:        assert_reader_after_read(reader, chunk_empty);
                    319: 
                    320:        ck_assert_int_eq(reader->remaining(reader), 0);
                    321:        ck_assert(reader->read_data(reader, 0, &read));
                    322:        ck_assert(!reader->read_data(reader, 1, &read));
                    323:        reader->destroy(reader);
                    324: }
                    325: END_TEST
                    326: 
                    327: /*******************************************************************************
                    328:  * read length followed by data
                    329:  */
                    330: 
                    331: #define assert_read_data_len(bits) ({ \
                    332:        bio_reader_t *reader; \
                    333:        chunk_t read, data; \
                    334:        int i, len = bits / 8; \
                    335:        data = chunk_empty; \
                    336:        reader = bio_reader_create(data); \
                    337:        ck_assert(!reader->read_data##bits(reader, &read)); \
                    338:        reader->destroy(reader); \
                    339:        data = chunk_alloca(len + 8); \
                    340:        memset(data.ptr, 0, data.len); \
                    341:        for (i = 0; i <= 8; i++) \
                    342:        { \
                    343:                data.ptr[len - 1] = i; \
                    344:                data.len = len + i; \
                    345:                reader = bio_reader_create(data); \
                    346:                ck_assert(reader->read_data##bits(reader, &read)); \
                    347:                ck_assert_int_eq(reader->remaining(reader), 0); \
                    348:                ck_assert_int_eq(read.len, i); \
                    349:                ck_assert((!read.ptr && !read.len) || (read.ptr == data.ptr + len)); \
                    350:                reader->destroy(reader); \
                    351:        } \
                    352:        data.ptr[len - 1] = i; \
                    353:        reader = bio_reader_create(data); \
                    354:        ck_assert(!reader->read_data##bits(reader, &read)); \
                    355:        reader->destroy(reader); \
                    356: })
                    357: 
                    358: START_TEST(test_read_data8)
                    359: {
                    360:        assert_read_data_len(8);
                    361: }
                    362: END_TEST
                    363: 
                    364: START_TEST(test_read_data16)
                    365: {
                    366:        assert_read_data_len(16);
                    367: }
                    368: END_TEST
                    369: 
                    370: START_TEST(test_read_data24)
                    371: {
                    372:        assert_read_data_len(24);
                    373: }
                    374: END_TEST
                    375: 
                    376: START_TEST(test_read_data32)
                    377: {
                    378:        assert_read_data_len(32);
                    379: }
                    380: END_TEST
                    381: 
                    382: /*******************************************************************************
                    383:  * test constructors
                    384:  */
                    385: 
                    386: START_TEST(test_create)
                    387: {
                    388:        chunk_t data = chunk_from_str("foobar");
                    389:        bio_reader_t *reader;
                    390: 
                    391:        data = chunk_clone(data);
                    392:        reader = bio_reader_create(data);
                    393:        reader->destroy(reader);
                    394:        chunk_free(&data);
                    395: }
                    396: END_TEST
                    397: 
                    398: START_TEST(test_create_own)
                    399: {
                    400:        chunk_t data = chunk_from_str("foobar");
                    401:        bio_reader_t *reader;
                    402: 
                    403:        data = chunk_clone(data);
                    404:        reader = bio_reader_create_own(data);
                    405:        reader->destroy(reader);
                    406: }
                    407: END_TEST
                    408: 
                    409: Suite *bio_reader_suite_create()
                    410: {
                    411:        Suite *s;
                    412:        TCase *tc;
                    413: 
                    414:        s = suite_create("bio_reader");
                    415: 
                    416:        tc = tcase_create("integer reads");
                    417:        tcase_add_test(tc, test_read_uint8);
                    418:        tcase_add_test(tc, test_read_uint16);
                    419:        tcase_add_test(tc, test_read_uint24);
                    420:        tcase_add_test(tc, test_read_uint32);
                    421:        tcase_add_test(tc, test_read_uint64);
                    422:        suite_add_tcase(s, tc);
                    423: 
                    424:        tc = tcase_create("integer reads from end");
                    425:        tcase_add_test(tc, test_read_uint8_end);
                    426:        tcase_add_test(tc, test_read_uint16_end);
                    427:        tcase_add_test(tc, test_read_uint24_end);
                    428:        tcase_add_test(tc, test_read_uint32_end);
                    429:        tcase_add_test(tc, test_read_uint64_end);
                    430:        suite_add_tcase(s, tc);
                    431: 
                    432:        tc = tcase_create("data reads and peek");
                    433:        tcase_add_test(tc, test_read_data);
                    434:        tcase_add_test(tc, test_read_data_end);
                    435:        suite_add_tcase(s, tc);
                    436: 
                    437:        tc = tcase_create("data length reads");
                    438:        tcase_add_test(tc, test_read_data8);
                    439:        tcase_add_test(tc, test_read_data16);
                    440:        tcase_add_test(tc, test_read_data24);
                    441:        tcase_add_test(tc, test_read_data32);
                    442:        suite_add_tcase(s, tc);
                    443: 
                    444:        tc = tcase_create("constructors");
                    445:        tcase_add_test(tc, test_create);
                    446:        tcase_add_test(tc, test_create_own);
                    447:        suite_add_tcase(s, tc);
                    448: 
                    449:        return s;
                    450: }

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