]> git.ipfire.org Git - thirdparty/bird.git/blame - nest/a-set_test.c
Doc: Document log rotation feature
[thirdparty/bird.git] / nest / a-set_test.c
CommitLineData
9b0a0ba9
OZ
1/*
2 * BIRD -- Set/Community-list Operations 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 "test/birdtest.h"
10#include "test/bt-utils.h"
11
12#include "lib/net.h"
13#include "nest/route.h"
14#include "nest/attrs.h"
15#include "lib/resource.h"
16
17#define SET_SIZE 10
18static struct adata *set_sequence; /* <0; SET_SIZE) */
19static struct adata *set_sequence_same; /* <0; SET_SIZE) */
20static struct adata *set_sequence_higher; /* <SET_SIZE; 2*SET_SIZE) */
21static struct adata *set_random;
22
23#define BUFFER_SIZE 1000
24static byte buf[BUFFER_SIZE] = {};
25
26#define SET_SIZE_FOR_FORMAT_OUTPUT 10
27
28struct linpool *lp;
29
30enum set_type
31{
32 SET_TYPE_INT,
33 SET_TYPE_EC
34};
35
36static void
37generate_set_sequence(enum set_type type)
38{
39 struct adata empty_as_path = {};
40 set_sequence = set_sequence_same = set_sequence_higher = set_random = &empty_as_path;
05d47bd5 41 lp = lp_new_default(&root_pool);
9b0a0ba9
OZ
42
43 int i;
44 for (i = 0; i < SET_SIZE; i++)
45 {
46 if (type == SET_TYPE_INT)
47 {
48 set_sequence = int_set_add(lp, set_sequence, i);
49 set_sequence_same = int_set_add(lp, set_sequence_same, i);
50 set_sequence_higher = int_set_add(lp, set_sequence_higher, i + SET_SIZE);
51 set_random = int_set_add(lp, set_random, bt_random());
52 }
53 else if (type == SET_TYPE_EC)
54 {
55 set_sequence = ec_set_add(lp, set_sequence, i);
56 set_sequence_same = ec_set_add(lp, set_sequence_same, i);
57 set_sequence_higher = ec_set_add(lp, set_sequence_higher, i + SET_SIZE);
58 set_random = ec_set_add(lp, set_random, (bt_random() << 32 | bt_random()));
59 }
60 else
61 bt_abort_msg("This should be unreachable");
62 }
63}
64
65/*
66 * SET INT TESTS
67 */
68
69static int
70t_set_int_contains(void)
71{
72 int i;
73
74 resource_init();
75 generate_set_sequence(SET_TYPE_INT);
76
77 bt_assert(int_set_get_size(set_sequence) == SET_SIZE);
78
79 for (i = 0; i < SET_SIZE; i++)
80 bt_assert(int_set_contains(set_sequence, i));
81 bt_assert(int_set_contains(set_sequence, -1) == 0);
82 bt_assert(int_set_contains(set_sequence, SET_SIZE) == 0);
83
84 int *data = int_set_get_data(set_sequence);
85 for (i = 0; i < SET_SIZE; i++)
86 bt_assert_msg(data[i] == i, "(data[i] = %d) == i = %d)", data[i], i);
87
88 rfree(lp);
5e3cd0e5 89 return 1;
9b0a0ba9
OZ
90}
91
92static int
93t_set_int_union(void)
94{
95 resource_init();
96 generate_set_sequence(SET_TYPE_INT);
97
98 struct adata *set_union;
99 set_union = int_set_union(lp, set_sequence, set_sequence_same);
100 bt_assert(int_set_get_size(set_union) == SET_SIZE);
101 bt_assert(int_set_format(set_union, 0, 2, buf, BUFFER_SIZE) == 0);
102
103 set_union = int_set_union(lp, set_sequence, set_sequence_higher);
104 bt_assert_msg(int_set_get_size(set_union) == SET_SIZE*2, "int_set_get_size(set_union) %d, SET_SIZE*2 %d", int_set_get_size(set_union), SET_SIZE*2);
105 bt_assert(int_set_format(set_union, 0, 2, buf, BUFFER_SIZE) == 0);
106
107 rfree(lp);
5e3cd0e5 108 return 1;
9b0a0ba9
OZ
109}
110
111static int
112t_set_int_format(void)
113{
114 resource_init();
115 generate_set_sequence(SET_TYPE_INT);
116
117 set_sequence->length = 4 * SET_SIZE_FOR_FORMAT_OUTPUT; /* dirty */
118 bt_assert(int_set_format(set_sequence, 0, 0, buf, BUFFER_SIZE) == 0);
119 bt_assert(strcmp(buf, "0.0.0.0 0.0.0.1 0.0.0.2 0.0.0.3 0.0.0.4 0.0.0.5 0.0.0.6 0.0.0.7 0.0.0.8 0.0.0.9") == 0);
120
121 bzero(buf, BUFFER_SIZE);
122 bt_assert(int_set_format(set_sequence, 0, 2, buf, BUFFER_SIZE) == 0);
123 bt_assert(strcmp(buf, "0.0.0.2 0.0.0.3 0.0.0.4 0.0.0.5 0.0.0.6 0.0.0.7 0.0.0.8 0.0.0.9") == 0);
124
125 bzero(buf, BUFFER_SIZE);
126 bt_assert(int_set_format(set_sequence, 1, 0, buf, BUFFER_SIZE) == 0);
127 bt_assert(strcmp(buf, "(0,0) (0,1) (0,2) (0,3) (0,4) (0,5) (0,6) (0,7) (0,8) (0,9)") == 0);
128
129 rfree(lp);
5e3cd0e5 130 return 1;
9b0a0ba9
OZ
131}
132
133static int
134t_set_int_delete(void)
135{
136 resource_init();
137 generate_set_sequence(SET_TYPE_INT);
138
139 struct adata *deleting_sequence = set_sequence;
140 u32 i;
141 for (i = 0; i < SET_SIZE; i++)
142 {
143 deleting_sequence = int_set_del(lp, deleting_sequence, i);
144 bt_assert_msg(int_set_get_size(deleting_sequence) == (int) (SET_SIZE-1-i),
145 "int_set_get_size(deleting_sequence) %d == SET_SIZE-1-i %d",
146 int_set_get_size(deleting_sequence),
147 SET_SIZE-1-i);
148 }
149
150 bt_assert(int_set_get_size(set_sequence) == SET_SIZE);
151
5e3cd0e5 152 return 1;
9b0a0ba9
OZ
153}
154
155/*
156 * SET EC TESTS
157 */
158
159static int
160t_set_ec_contains(void)
161{
162 u32 i;
163
164 resource_init();
165 generate_set_sequence(SET_TYPE_EC);
166
167 bt_assert(ec_set_get_size(set_sequence) == SET_SIZE);
168
169 for (i = 0; i < SET_SIZE; i++)
170 bt_assert(ec_set_contains(set_sequence, i));
171 bt_assert(ec_set_contains(set_sequence, -1) == 0);
172 bt_assert(ec_set_contains(set_sequence, SET_SIZE) == 0);
173
174// int *data = ec_set_get_data(set_sequence);
175// for (i = 0; i < SET_SIZE; i++)
176// bt_assert_msg(data[i] == (SET_SIZE-1-i), "(data[i] = %d) == ((SET_SIZE-1-i) = %d)", data[i], SET_SIZE-1-i);
177
178 rfree(lp);
5e3cd0e5 179 return 1;
9b0a0ba9
OZ
180}
181
182static int
183t_set_ec_union(void)
184{
185 resource_init();
186 generate_set_sequence(SET_TYPE_EC);
187
188 struct adata *set_union;
189 set_union = ec_set_union(lp, set_sequence, set_sequence_same);
190 bt_assert(ec_set_get_size(set_union) == SET_SIZE);
191 bt_assert(ec_set_format(set_union, 0, buf, BUFFER_SIZE) == 0);
192
193 set_union = ec_set_union(lp, set_sequence, set_sequence_higher);
194 bt_assert_msg(ec_set_get_size(set_union) == SET_SIZE*2, "ec_set_get_size(set_union) %d, SET_SIZE*2 %d", ec_set_get_size(set_union), SET_SIZE*2);
195 bt_assert(ec_set_format(set_union, 0, buf, BUFFER_SIZE) == 0);
196
197 rfree(lp);
5e3cd0e5 198 return 1;
9b0a0ba9
OZ
199}
200
201static int
202t_set_ec_format(void)
203{
204 resource_init();
205
206 struct adata empty_as_path = {};
207 set_sequence = set_sequence_same = set_sequence_higher = set_random = &empty_as_path;
05d47bd5 208 lp = lp_new_default(&root_pool);
9b0a0ba9
OZ
209
210 u64 i = 0;
211 set_sequence = ec_set_add(lp, set_sequence, i);
212 for (i = 1; i < SET_SIZE_FOR_FORMAT_OUTPUT; i++)
213 set_sequence = ec_set_add(lp, set_sequence, i + ((i%2) ? ((u64)EC_RO << 48) : ((u64)EC_RT << 48)));
214
215 bt_assert(ec_set_format(set_sequence, 0, buf, BUFFER_SIZE) == 0);
216 bt_assert_msg(strcmp(buf, "(unknown 0x0, 0, 0) (ro, 0, 1) (rt, 0, 2) (ro, 0, 3) (rt, 0, 4) (ro, 0, 5) (rt, 0, 6) (ro, 0, 7) (rt, 0, 8) (ro, 0, 9)") == 0,
217 "ec_set_format() returns '%s'", buf);
218
219 rfree(lp);
5e3cd0e5 220 return 1;
9b0a0ba9
OZ
221}
222
223static int
224t_set_ec_delete(void)
225{
226 resource_init();
227 generate_set_sequence(SET_TYPE_EC);
228
229 struct adata *deleting_sequence = set_sequence;
230 u32 i;
231 for (i = 0; i < SET_SIZE; i++)
232 {
233 deleting_sequence = ec_set_del(lp, deleting_sequence, i);
234 bt_assert_msg(ec_set_get_size(deleting_sequence) == (int) (SET_SIZE-1-i),
235 "ec_set_get_size(deleting_sequence) %d == SET_SIZE-1-i %d",
236 ec_set_get_size(deleting_sequence), SET_SIZE-1-i);
237 }
238
239 bt_assert(ec_set_get_size(set_sequence) == SET_SIZE);
240
5e3cd0e5 241 return 1;
9b0a0ba9
OZ
242}
243
244int
245main(int argc, char *argv[])
246{
247 bt_init(argc, argv);
248
249 bt_test_suite(t_set_int_contains, "Testing sets of integers: contains, get_data");
250 bt_test_suite(t_set_int_format, "Testing sets of integers: format");
251 bt_test_suite(t_set_int_union, "Testing sets of integers: union");
252 bt_test_suite(t_set_int_delete, "Testing sets of integers: delete");
253
254 bt_test_suite(t_set_ec_contains, "Testing sets of Extended Community values: contains, get_data");
255 bt_test_suite(t_set_ec_format, "Testing sets of Extended Community values: format");
256 bt_test_suite(t_set_ec_union, "Testing sets of Extended Community values: union");
257 bt_test_suite(t_set_ec_delete, "Testing sets of Extended Community values: delete");
258
259 return bt_exit_value();
260}