Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_bio_writer.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_writer.h>
19:
20: /*******************************************************************************
21: * different integer writes
22: */
23:
24: static inline void verify_int_buffer(chunk_t data, int bits, int val)
25: {
26: size_t i;
27: int len = bits / 8;
28:
29: ck_assert_int_eq(data.len, (val + 1) * len);
30: for (i = 0; i < data.len; i++)
31: {
32: if ((i + 1) % len)
33: {
34: ck_assert_int_eq(data.ptr[i], 0);
35: }
36: else
37: {
38: ck_assert_int_eq(data.ptr[i], i / len);
39: }
40: }
41: }
42:
43: #define assert_integer_write(init, bits) ({ \
44: int i; \
45: bio_writer_t *writer = bio_writer_create(init); \
46: for (i = 0; i < 16; i++) \
47: { \
48: writer->write_uint##bits(writer, i); \
49: verify_int_buffer(writer->get_buf(writer), bits, i); \
50: } \
51: writer->destroy(writer); \
52: })
53:
54: START_TEST(test_write_uint8)
55: {
56: /* use default buffer (and increase) size */
57: assert_integer_write(0, 8);
58: /* force a resize by the given size */
59: assert_integer_write(1, 8);
60: }
61: END_TEST
62:
63: START_TEST(test_write_uint16)
64: {
65: assert_integer_write(0, 16);
66: assert_integer_write(1, 16);
67: }
68: END_TEST
69:
70: START_TEST(test_write_uint24)
71: {
72: assert_integer_write(0, 24);
73: assert_integer_write(1, 24);
74: }
75: END_TEST
76:
77: START_TEST(test_write_uint32)
78: {
79: assert_integer_write(0, 32);
80: assert_integer_write(1, 32);
81: }
82: END_TEST
83:
84: START_TEST(test_write_uint64)
85: {
86: assert_integer_write(0, 64);
87: assert_integer_write(1, 64);
88: }
89: END_TEST
90:
91: /*******************************************************************************
92: * write data / skip
93: */
94:
95: static inline void assert_writer_after_write(bio_writer_t *writer, int count)
96: {
97: chunk_t buf;
98: size_t i;
99:
100: buf = writer->get_buf(writer);
101: ck_assert_int_eq(buf.len, count * 3);
102: for (i = 0; i < buf.len; i++)
103: {
104: ck_assert(buf.ptr[i] == i % 3);
105: }
106: }
107:
108: START_TEST(test_write_data)
109: {
110: chunk_t buf, data = chunk_from_chars(0x00, 0x01, 0x02);
111: bio_writer_t *writer;
112:
113: /* no allocation, but default buffer size */
114: writer = bio_writer_create(0);
115: buf = writer->get_buf(writer);
116: ck_assert_int_eq(buf.len, 0);
117: ck_assert(buf.ptr == NULL);
118:
119: writer->write_data(writer, chunk_empty);
120: buf = writer->get_buf(writer);
121: ck_assert_int_eq(buf.len, 0);
122: ck_assert(buf.ptr == NULL);
123: writer->destroy(writer);
124:
125: /* custom buffer size, initial buffer allocated */
126: writer = bio_writer_create(1);
127: buf = writer->get_buf(writer);
128: ck_assert_int_eq(buf.len, 0);
129: ck_assert(buf.ptr != NULL);
130:
131: writer->write_data(writer, chunk_empty);
132: buf = writer->get_buf(writer);
133: ck_assert_int_eq(buf.len, 0);
134: ck_assert(buf.ptr != NULL);
135: writer->destroy(writer);
136:
137: writer = bio_writer_create(0);
138:
139: writer->write_data(writer, data);
140: assert_writer_after_write(writer, 1);
141:
142: writer->write_data(writer, data);
143: assert_writer_after_write(writer, 2);
144:
145: writer->write_data(writer, data);
146: assert_writer_after_write(writer, 3);
147:
148: writer->destroy(writer);
149: }
150: END_TEST
151:
152: START_TEST(test_skip)
153: {
154: chunk_t skipped, buf, data = chunk_from_chars(0x00, 0x01, 0x02);
155: bio_writer_t *writer;
156:
157: writer = bio_writer_create(4);
158: skipped = writer->skip(writer, 3);
159: ck_assert_int_eq(skipped.len, 3);
160: buf = writer->get_buf(writer);
161: ck_assert(skipped.ptr == buf.ptr);
162: memset(skipped.ptr, 0, skipped.len);
163:
164: writer->write_data(writer, data);
165: buf = writer->get_buf(writer);
166: ck_assert(chunk_equals(buf, chunk_from_chars(0x00, 0x00, 0x00, 0x00, 0x01, 0x02)));
167: writer->destroy(writer);
168:
169: writer = bio_writer_create(1);
170: skipped = writer->skip(writer, 3);
171: memcpy(skipped.ptr, data.ptr, data.len);
172:
173: writer->write_data(writer, data);
174: assert_writer_after_write(writer, 2);
175: writer->destroy(writer);
176: }
177: END_TEST
178:
179: /*******************************************************************************
180: * write length followed by data
181: */
182:
183: #define assert_write_data_len(init, bits) ({ \
184: bio_writer_t *writer; \
185: chunk_t buf, data; \
186: int i, len = bits / 8; \
187: writer = bio_writer_create(init); \
188: writer->write_data##bits(writer, chunk_empty); \
189: buf = writer->get_buf(writer); \
190: ck_assert_int_eq(buf.len, len); \
191: ck_assert_int_eq(buf.ptr[len - 1], 0); \
192: writer->destroy(writer); \
193: data = chunk_alloca(32); \
194: memset(data.ptr, 0, data.len); \
195: for (i = 0; i < 32; i++) \
196: { \
197: data.ptr[i] = i; \
198: data.len = i; \
199: writer = bio_writer_create(init); \
200: writer->write_data##bits(writer, data); \
201: buf = writer->get_buf(writer); \
202: ck_assert_int_eq(buf.len, len + i); \
203: ck_assert_int_eq(buf.ptr[len - 1], i); \
204: ck_assert(chunk_equals(chunk_create(buf.ptr + len, buf.len - len), data)); \
205: writer->destroy(writer); \
206: } \
207: })
208:
209: START_TEST(test_write_data8)
210: {
211: assert_write_data_len(0, 8);
212: assert_write_data_len(1, 8);
213: }
214: END_TEST
215:
216: START_TEST(test_write_data16)
217: {
218: assert_write_data_len(0, 16);
219: assert_write_data_len(1, 16);
220: }
221: END_TEST
222:
223: START_TEST(test_write_data24)
224: {
225: assert_write_data_len(0, 24);
226: assert_write_data_len(1, 24);
227: }
228: END_TEST
229:
230: START_TEST(test_write_data32)
231: {
232: assert_write_data_len(0, 32);
233: assert_write_data_len(1, 32);
234: }
235: END_TEST
236:
237:
238: /*******************************************************************************
239: * add length header before current data
240: */
241:
242: #define assert_wrap_data(init, bits) ({ \
243: bio_writer_t *writer; \
244: chunk_t buf, data; \
245: int i, len = bits / 8; \
246: writer = bio_writer_create(init); \
247: writer->wrap##bits(writer); \
248: buf = writer->get_buf(writer); \
249: ck_assert_int_eq(buf.len, len); \
250: ck_assert_int_eq(buf.ptr[len - 1], 0); \
251: writer->destroy(writer); \
252: data = chunk_alloca(32); \
253: memset(data.ptr, 0, data.len); \
254: for (i = 0; i < 32; i++) \
255: { \
256: data.ptr[i] = i; \
257: data.len = i; \
258: writer = bio_writer_create(init); \
259: writer->write_data(writer, data); \
260: writer->wrap##bits(writer); \
261: buf = writer->get_buf(writer); \
262: ck_assert_int_eq(buf.len, len + i); \
263: ck_assert_int_eq(buf.ptr[len - 1], i); \
264: ck_assert(chunk_equals(chunk_create(buf.ptr + len, buf.len - len), data)); \
265: writer->wrap##bits(writer); \
266: buf = writer->get_buf(writer); \
267: ck_assert_int_eq(buf.len, 2 * len + i); \
268: ck_assert_int_eq(buf.ptr[len - 1], len + i); \
269: ck_assert(chunk_equals(chunk_create(buf.ptr + 2 * len, buf.len - 2 * len), data)); \
270: writer->destroy(writer); \
271: } \
272: })
273:
274: START_TEST(test_wrap8)
275: {
276: assert_wrap_data(0, 8);
277: assert_wrap_data(1, 8);
278: }
279: END_TEST
280:
281: START_TEST(test_wrap16)
282: {
283: assert_wrap_data(0, 16);
284: assert_wrap_data(1, 16);
285: }
286: END_TEST
287:
288: START_TEST(test_wrap24)
289: {
290: assert_wrap_data(0, 24);
291: assert_wrap_data(1, 24);
292: }
293: END_TEST
294:
295: START_TEST(test_wrap32)
296: {
297: assert_wrap_data(0, 32);
298: assert_wrap_data(1, 32);
299: }
300: END_TEST
301:
302: /*******************************************************************************
303: * test data extraction
304: */
305:
306: START_TEST(test_get_buf)
307: {
308: bio_writer_t *writer;
309: chunk_t data1, data2;
310:
311: writer = bio_writer_create(0);
312: writer->write_uint8(writer, 1);
313: data1 = writer->get_buf(writer);
314: ck_assert_int_eq(data1.len, 1);
315: ck_assert(data1.ptr[0] == 1);
316:
317: data2 = writer->get_buf(writer);
318: ck_assert(chunk_equals(data1, data2));
319: ck_assert(data1.ptr == data2.ptr);
320: writer->destroy(writer);
321: }
322: END_TEST
323:
324: START_TEST(test_extract_buf)
325: {
326: bio_writer_t *writer;
327: chunk_t data1, data2;
328:
329: writer = bio_writer_create(0);
330: writer->write_uint8(writer, 1);
331: data1 = writer->extract_buf(writer);
332: ck_assert_int_eq(data1.len, 1);
333: ck_assert(data1.ptr[0] == 1);
334:
335: data2 = writer->get_buf(writer);
336: ck_assert_int_eq(data2.len, 0);
337: ck_assert(data2.ptr == NULL);
338: data2 = writer->extract_buf(writer);
339: ck_assert_int_eq(data2.len, 0);
340: ck_assert(data2.ptr == NULL);
341:
342: writer->write_uint8(writer, 1);
343: data2 = writer->get_buf(writer);
344: ck_assert(chunk_equals(data1, data2));
345: ck_assert(data1.ptr != data2.ptr);
346:
347: writer->destroy(writer);
348: chunk_free(&data1);
349: }
350: END_TEST
351:
352: Suite *bio_writer_suite_create()
353: {
354: Suite *s;
355: TCase *tc;
356:
357: s = suite_create("bio_writer");
358:
359: tc = tcase_create("integer writes");
360: tcase_add_test(tc, test_write_uint8);
361: tcase_add_test(tc, test_write_uint16);
362: tcase_add_test(tc, test_write_uint24);
363: tcase_add_test(tc, test_write_uint32);
364: tcase_add_test(tc, test_write_uint64);
365: suite_add_tcase(s, tc);
366:
367: tc = tcase_create("data writes/skip");
368: tcase_add_test(tc, test_write_data);
369: tcase_add_test(tc, test_skip);
370: suite_add_tcase(s, tc);
371:
372: tc = tcase_create("data length writes");
373: tcase_add_test(tc, test_write_data8);
374: tcase_add_test(tc, test_write_data16);
375: tcase_add_test(tc, test_write_data24);
376: tcase_add_test(tc, test_write_data32);
377: suite_add_tcase(s, tc);
378:
379: tc = tcase_create("wrap writes");
380: tcase_add_test(tc, test_wrap8);
381: tcase_add_test(tc, test_wrap16);
382: tcase_add_test(tc, test_wrap24);
383: tcase_add_test(tc, test_wrap32);
384: suite_add_tcase(s, tc);
385:
386: tc = tcase_create("get/extract");
387: tcase_add_test(tc, test_get_buf);
388: tcase_add_test(tc, test_extract_buf);
389: suite_add_tcase(s, tc);
390:
391: return s;
392: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>