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>