From 733088e798186ee0f83a8064e31461c2c4d93c7d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Pavel=20Tvrd=C3=ADk?= Date: Fri, 27 Mar 2015 14:10:00 +0100 Subject: [PATCH] Birdtest: Add test for lib/buffer_test.c --- lib/buffer_test.c | 177 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 lib/buffer_test.c diff --git a/lib/buffer_test.c b/lib/buffer_test.c new file mode 100644 index 000000000..84d51fa1f --- /dev/null +++ b/lib/buffer_test.c @@ -0,0 +1,177 @@ +/* + * BIRD Library -- Buffer Tests + * + * (c) 2015 CZ.NIC z.s.p.o. + * + * Can be freely distributed and used under the terms of the GNU GPL. + */ + +#include +#include "test/birdtest.h" +#include "lib/resource.h" +#include "lib/buffer.h" + +#define MAX_NUM 33 +typedef BUFFER(int) buffer_int; + +int expected[MAX_NUM]; +buffer_int buffer; +struct pool *buffer_pool; + +static void +show_buf(buffer_int *b) +{ + int i; + bt_debug(".used = %d, .size = %d\n", b->used, b->size); + + for (i = 0; i < b->size; i++) + bt_debug(" .data[%3i] = %-16d expected %-16d %s\n", i, b->data[i], expected[i], (b->data[i] == expected[i] ? "OK" : "FAIL!")); +} + +static void +fill_expected_array(void) +{ + int i; + + for (i = 0; i < MAX_NUM; i++) + expected[i] = bt_rand_num(); +} + +static void +init_buffer(void) +{ + buffer_pool = NULL; + BUFFER_INIT(buffer, buffer_pool, MAX_NUM); +} + +static void +free_buffer(void) +{ + free(buffer_pool); +} + +static int +is_buffer_as_expected(buffer_int *b) +{ + show_buf(b); + + int i; + for (i = 0; i < MAX_NUM; i++) + bt_assert(b->data[i] == expected[i]); + return 1; +} +static int +t_buffer_push(void) +{ + int i; + + init_buffer(); + fill_expected_array(); + + for (i = 0; i < MAX_NUM; i++) + BUFFER_PUSH(buffer) = expected[i]; + is_buffer_as_expected(&buffer); + + free_buffer(); + return BT_SUCCESS; +} + +static int +t_buffer_pop(void) +{ + int i; + + init_buffer(); + fill_expected_array(); + + /* POP a half of elements */ + for (i = 0; i < MAX_NUM; i++) + BUFFER_PUSH(buffer) = expected[i]; + for (i = MAX_NUM-1; i >= MAX_NUM/2; i--) + BUFFER_POP(buffer); + for (i = MAX_NUM/2; i < MAX_NUM; i++) + BUFFER_PUSH(buffer) = expected[i] = bt_rand_num(); + is_buffer_as_expected(&buffer); + + /* POP all of elements */ + for (i = MAX_NUM-1; i >= 0; i--) + BUFFER_POP(buffer); + bt_assert(buffer.used == 0); + for (i = 0; i < MAX_NUM; i++) + BUFFER_PUSH(buffer) = expected[i]; + is_buffer_as_expected(&buffer); + + free_buffer(); + return BT_SUCCESS; +} + +static int +t_buffer_resize(void) +{ + int i; + + buffer_pool = NULL; + BUFFER_INIT(buffer, buffer_pool, 0); + fill_expected_array(); + + for (i = 0; i < MAX_NUM; i++) + BUFFER_PUSH(buffer) = expected[i]; + is_buffer_as_expected(&buffer); + bt_assert(buffer.size >= MAX_NUM); + + free_buffer(); + return BT_SUCCESS; +} + +static int +t_buffer_flush(void) +{ + int i; + + init_buffer(); + fill_expected_array(); + for (i = 0; i < MAX_NUM; i++) + BUFFER_PUSH(buffer) = expected[i]; + + BUFFER_FLUSH(buffer); + bt_assert(buffer.used == 0); + + free_buffer(); + return BT_SUCCESS; +} + +int +main(int argc, char *argv[]) +{ + bt_init(argc, argv); + + bt_test_case(t_buffer_push, "Pushing new elements"); + bt_test_case(t_buffer_pop, "Fill whole buffer (PUSH), a half of elements POP and PUSH new elements"); + bt_test_case(t_buffer_resize, "Init a small buffer and try overfill"); + bt_test_case(t_buffer_flush, "Fill and flush all elements"); + + return 0; +} + + +/* Mockup */ +void * +mb_alloc(pool *UNUSED, unsigned size) { + return (void *) malloc(size); +}; + +/* Mockup */ +#define STEP_UP(x) ((x) + (x)/2 + 4) +#define MIN_(a,b) (((a)<(b))?(a):(b)) +#define MIN(a,b) MIN_(a,b) +void +buffer_realloc(void **buf, unsigned *size, unsigned need, unsigned item_size) +{ + unsigned nsize = MIN(*size, need); + + while (nsize < need) + nsize = STEP_UP(nsize); + + *buf = realloc(*buf, nsize * item_size); + *size = nsize; +} -- 2.47.2