]>
git.ipfire.org Git - thirdparty/strongswan.git/blob - src/libstrongswan/tests/test_bio_writer.c
665cd2d7c3b550eb9b4d57766f4458021f3e7c04
2 * Copyright (C) 2013 Tobias Brunner
3 * Hochschule fuer Technik Rapperswil
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>.
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
16 #include "test_suite.h"
18 #include <bio/bio_writer.h>
20 /*******************************************************************************
21 * different integer writes
24 static inline void verify_int_buffer(chunk_t data
, int bits
, int val
)
29 ck_assert_int_eq(data
.len
, (val
+ 1) * len
);
30 for (i
= 0; i
< data
.len
; i
++)
34 ck_assert_int_eq(data
.ptr
[i
], 0);
38 ck_assert_int_eq(data
.ptr
[i
], i
/ len
);
43 #define assert_integer_write(init, bits) ({ \
45 bio_writer_t *writer = bio_writer_create(init); \
46 for (i = 0; i < 16; i++) \
48 writer->write_uint##bits(writer, i); \
49 verify_int_buffer(writer->get_buf(writer), bits, i); \
51 writer->destroy(writer); \
54 START_TEST(test_write_uint8
)
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);
63 START_TEST(test_write_uint16
)
65 assert_integer_write(0, 16);
66 assert_integer_write(1, 16);
70 START_TEST(test_write_uint24
)
72 assert_integer_write(0, 24);
73 assert_integer_write(1, 24);
77 START_TEST(test_write_uint32
)
79 assert_integer_write(0, 32);
80 assert_integer_write(1, 32);
84 START_TEST(test_write_uint64
)
86 assert_integer_write(0, 64);
87 assert_integer_write(1, 64);
91 /*******************************************************************************
95 static inline void assert_writer_after_write(bio_writer_t
*writer
, int count
)
100 buf
= writer
->get_buf(writer
);
101 ck_assert_int_eq(buf
.len
, count
* 3);
102 for (i
= 0; i
< buf
.len
; i
++)
104 ck_assert(buf
.ptr
[i
] == i
% 3);
108 START_TEST(test_write_data
)
110 chunk_t buf
, data
= chunk_from_chars(0x00, 0x01, 0x02);
111 bio_writer_t
*writer
;
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
);
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
);
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
);
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
);
137 writer
= bio_writer_create(0);
139 writer
->write_data(writer
, data
);
140 assert_writer_after_write(writer
, 1);
142 writer
->write_data(writer
, data
);
143 assert_writer_after_write(writer
, 2);
145 writer
->write_data(writer
, data
);
146 assert_writer_after_write(writer
, 3);
148 writer
->destroy(writer
);
152 START_TEST(test_skip
)
154 chunk_t skipped
, buf
, data
= chunk_from_chars(0x00, 0x01, 0x02);
155 bio_writer_t
*writer
;
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
);
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
);
169 writer
= bio_writer_create(1);
170 skipped
= writer
->skip(writer
, 3);
171 memcpy(skipped
.ptr
, data
.ptr
, data
.len
);
173 writer
->write_data(writer
, data
);
174 assert_writer_after_write(writer
, 2);
175 writer
->destroy(writer
);
179 /*******************************************************************************
180 * write length followed by data
183 #define assert_write_data_len(init, bits) ({ \
184 bio_writer_t *writer; \
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++) \
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); \
209 START_TEST(test_write_data8
)
211 assert_write_data_len(0, 8);
212 assert_write_data_len(1, 8);
216 START_TEST(test_write_data16
)
218 assert_write_data_len(0, 16);
219 assert_write_data_len(1, 16);
223 START_TEST(test_write_data24
)
225 assert_write_data_len(0, 24);
226 assert_write_data_len(1, 24);
230 START_TEST(test_write_data32
)
232 assert_write_data_len(0, 32);
233 assert_write_data_len(1, 32);
238 /*******************************************************************************
239 * add length header before current data
242 #define assert_wrap_data(init, bits) ({ \
243 bio_writer_t *writer; \
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++) \
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); \
274 START_TEST(test_wrap8
)
276 assert_wrap_data(0, 8);
277 assert_wrap_data(1, 8);
281 START_TEST(test_wrap16
)
283 assert_wrap_data(0, 16);
284 assert_wrap_data(1, 16);
288 START_TEST(test_wrap24
)
290 assert_wrap_data(0, 24);
291 assert_wrap_data(1, 24);
295 START_TEST(test_wrap32
)
297 assert_wrap_data(0, 32);
298 assert_wrap_data(1, 32);
302 /*******************************************************************************
303 * test data extraction
306 START_TEST(test_get_buf
)
308 bio_writer_t
*writer
;
309 chunk_t data1
, data2
;
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);
317 data2
= writer
->get_buf(writer
);
318 ck_assert(chunk_equals(data1
, data2
));
319 ck_assert(data1
.ptr
== data2
.ptr
);
320 writer
->destroy(writer
);
324 START_TEST(test_extract_buf
)
326 bio_writer_t
*writer
;
327 chunk_t data1
, data2
;
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);
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
);
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
);
347 writer
->destroy(writer
);
352 Suite
*bio_writer_suite_create()
357 s
= suite_create("bio_writer");
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
);
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
);
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
);
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
);
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
);