]> git.ipfire.org Git - thirdparty/bird.git/blob - lib/buffer_test.c
Merge commit 'beb5f78a' into backport
[thirdparty/bird.git] / lib / buffer_test.c
1 /*
2 * BIRD Library -- Buffer Tests
3 *
4 * (c) 2015 CZ.NIC z.s.p.o.
5 *
6 * Can be freely distributed and used under the terms of the GNU GPL.
7 */
8
9 #include <stdlib.h>
10
11 #include "test/birdtest.h"
12
13 #include "lib/buffer.h"
14
15 #define MAX_NUM 33
16
17 typedef BUFFER(int) buffer_int;
18 static int expected[MAX_NUM];
19 static buffer_int buf;
20 static struct pool *buffer_pool;
21
22 static void
23 show_buf(buffer_int *b)
24 {
25 uint i;
26 bt_debug(".used = %d, .size = %d\n", b->used, b->size);
27
28 for (i = 0; i < b->used; i++)
29 bt_debug(" .data[%3u] = %-16d expected %-16d %s\n", i, b->data[i], expected[i], (b->data[i] == expected[i] ? "OK" : "FAIL!"));
30 }
31
32 static void
33 fill_expected_array(void)
34 {
35 int i;
36
37 for (i = 0; i < MAX_NUM; i++)
38 expected[i] = bt_random();
39 }
40
41 static void
42 init_buffer(void)
43 {
44 buffer_pool = &root_pool;
45 BUFFER_INIT(buf, buffer_pool, MAX_NUM);
46 }
47
48 static int
49 is_buffer_as_expected(buffer_int *b)
50 {
51 show_buf(b);
52
53 int i;
54 for (i = 0; i < MAX_NUM; i++)
55 bt_assert(b->data[i] == expected[i]);
56 return 1;
57 }
58
59 static int
60 t_buffer_push(void)
61 {
62 int i;
63
64 init_buffer();
65 fill_expected_array();
66
67 for (i = 0; i < MAX_NUM; i++)
68 BUFFER_PUSH(buf) = expected[i];
69 is_buffer_as_expected(&buf);
70
71 return 1;
72 }
73
74 static int
75 t_buffer_pop(void)
76 {
77 int i;
78
79 init_buffer();
80 fill_expected_array();
81
82 /* POP a half of elements */
83 for (i = 0; i < MAX_NUM; i++)
84 BUFFER_PUSH(buf) = expected[i];
85 for (i = MAX_NUM-1; i >= MAX_NUM/2; i--)
86 BUFFER_POP(buf);
87 for (i = MAX_NUM/2; i < MAX_NUM; i++)
88 BUFFER_PUSH(buf) = expected[i] = bt_random();
89 is_buffer_as_expected(&buf);
90
91 /* POP all of elements */
92 for (i = MAX_NUM-1; i >= 0; i--)
93 BUFFER_POP(buf);
94 bt_assert(buf.used == 0);
95 for (i = 0; i < MAX_NUM; i++)
96 BUFFER_PUSH(buf) = expected[i];
97 is_buffer_as_expected(&buf);
98
99 return 1;
100 }
101
102 static int
103 t_buffer_resize(void)
104 {
105 int i;
106
107 init_buffer();
108 BUFFER_INIT(buf, buffer_pool, 0);
109 fill_expected_array();
110
111 for (i = 0; i < MAX_NUM; i++)
112 BUFFER_PUSH(buf) = expected[i];
113 is_buffer_as_expected(&buf);
114 bt_assert(buf.size >= MAX_NUM);
115
116 return 1;
117 }
118
119 static int
120 t_buffer_flush(void)
121 {
122 int i;
123
124 init_buffer();
125 fill_expected_array();
126 for (i = 0; i < MAX_NUM; i++)
127 BUFFER_PUSH(buf) = expected[i];
128
129 BUFFER_FLUSH(buf);
130 bt_assert(buf.used == 0);
131
132 return 1;
133 }
134
135 static int
136 t_buffer_walk(void)
137 {
138 int i;
139
140 init_buffer();
141 fill_expected_array();
142 for (i = 0; i < MAX_NUM; i++)
143 BUFFER_PUSH(buf) = expected[i];
144
145 i = 0;
146 BUFFER_WALK(buf, v)
147 bt_assert(v == expected[i++]);
148
149 bt_assert(i == MAX_NUM);
150
151 return 1;
152 }
153
154 int
155 main(int argc, char *argv[])
156 {
157 bt_init(argc, argv);
158
159 bt_test_suite(t_buffer_push, "Pushing new elements");
160 bt_test_suite(t_buffer_pop, "Fill whole buffer (PUSH), a half of elements POP and PUSH new elements");
161 bt_test_suite(t_buffer_resize, "Init a small buffer and try overfill");
162 bt_test_suite(t_buffer_flush, "Fill and flush all elements");
163 bt_test_suite(t_buffer_walk, "Fill and walk through buffer");
164
165 return bt_exit_value();
166 }