]> git.ipfire.org Git - thirdparty/bird.git/blame - nest/a-path_test.c
Merge remote-tracking branch 'origin/master' into mq-filter-stack
[thirdparty/bird.git] / nest / a-path_test.c
CommitLineData
9b0a0ba9
OZ
1/*
2 * BIRD -- Path 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 "nest/route.h"
13#include "nest/attrs.h"
14#include "lib/resource.h"
15
16#define TESTS_NUM 30
17#define AS_PATH_LENGTH 1000
18
19#if AS_PATH_LENGTH > AS_PATH_MAXLEN
20#warning "AS_PATH_LENGTH should be <= AS_PATH_MAXLEN"
21#endif
22
23static int
24t_as_path_match(void)
25{
26 resource_init();
27
28 int round;
29 for (round = 0; round < TESTS_NUM; round++)
30 {
31 struct adata empty_as_path = {};
32 struct adata *as_path = &empty_as_path;
33 u32 first_prepended, last_prepended;
34 first_prepended = last_prepended = 0;
05d47bd5 35 struct linpool *lp = lp_new_default(&root_pool);
9b0a0ba9 36
4c553c5a
MM
37 struct f_path_mask *mask = alloca(sizeof(struct f_path_mask) + AS_PATH_LENGTH * sizeof(struct f_path_mask_item));
38 mask->len = AS_PATH_LENGTH;
39 for (int i = AS_PATH_LENGTH - 1; i >= 0; i--)
9b0a0ba9
OZ
40 {
41 u32 val = bt_random();
42 as_path = as_path_prepend(lp, as_path, val);
43 bt_debug("Prepending ASN: %10u \n", val);
44
45 if (i == 0)
a82f692e 46 last_prepended = val;
4c553c5a
MM
47 if (i == AS_PATH_LENGTH-1)
48 first_prepended = val;
9b0a0ba9 49
4c553c5a
MM
50 mask->item[i].kind = PM_ASN;
51 mask->item[i].asn = val;
9b0a0ba9
OZ
52 }
53
4c553c5a 54 bt_assert_msg(as_path_match(as_path, mask), "Mask should match with AS path");
9b0a0ba9
OZ
55
56 u32 asn;
57
58 bt_assert(as_path_get_first(as_path, &asn));
59 bt_assert_msg(asn == last_prepended, "as_path_get_first() should return the last prepended ASN");
60
61 bt_assert(as_path_get_last(as_path, &asn));
62 bt_assert_msg(asn == first_prepended, "as_path_get_last() should return the first prepended ASN");
63
64 rfree(lp);
65 }
66
5e3cd0e5 67 return 1;
9b0a0ba9
OZ
68}
69
70static int
71t_path_format(void)
72{
73 resource_init();
74
75 struct adata empty_as_path = {};
76 struct adata *as_path = &empty_as_path;
05d47bd5 77 struct linpool *lp = lp_new_default(&root_pool);
9b0a0ba9
OZ
78
79 uint i;
80 for (i = 4294967285; i <= 4294967294; i++)
81 {
82 as_path = as_path_prepend(lp, as_path, i);
83 bt_debug("Prepending ASN: %10u \n", i);
84 }
85
5509e17d 86#define BUFFER_SIZE 120
9b0a0ba9 87 byte buf[BUFFER_SIZE] = {};
5509e17d
OZ
88
89 as_path_format(&empty_as_path, buf, BUFFER_SIZE);
90 bt_assert_msg(strcmp(buf, "") == 0, "Buffer(%zu): '%s'", strlen(buf), buf);
91
9b0a0ba9 92 as_path_format(as_path, buf, BUFFER_SIZE);
5509e17d 93 bt_assert_msg(strcmp(buf, "4294967294 4294967293 4294967292 4294967291 4294967290 4294967289 4294967288 4294967287 4294967286 4294967285") == 0, "Buffer(%zu): '%s'", strlen(buf), buf);
9b0a0ba9
OZ
94
95#define SMALL_BUFFER_SIZE 25
96 byte buf2[SMALL_BUFFER_SIZE] = {};
97 as_path_format(as_path, buf2, SMALL_BUFFER_SIZE);
5509e17d 98 bt_assert_msg(strcmp(buf2, "4294967294 42...") == 0, "Small Buffer(%zu): '%s'", strlen(buf2), buf2);
9b0a0ba9
OZ
99
100 rfree(lp);
101
5e3cd0e5 102 return 1;
9b0a0ba9
OZ
103}
104
105static int
106count_asn_in_array(const u32 *array, u32 asn)
107{
108 int counts_of_contains = 0;
109 int u;
110 for (u = 0; u < AS_PATH_LENGTH; u++)
111 if (array[u] == asn)
112 counts_of_contains++;
113 return counts_of_contains;
114}
115
116static int
117t_path_include(void)
118{
119 resource_init();
120
121 struct adata empty_as_path = {};
122 struct adata *as_path = &empty_as_path;
05d47bd5 123 struct linpool *lp = lp_new_default(&root_pool);
9b0a0ba9
OZ
124
125 u32 as_nums[AS_PATH_LENGTH] = {};
126 int i;
127 for (i = 0; i < AS_PATH_LENGTH; i++)
128 {
129 u32 val = bt_random();
130 as_nums[i] = val;
131 as_path = as_path_prepend(lp, as_path, val);
132 }
133
134 for (i = 0; i < AS_PATH_LENGTH; i++)
135 {
136 int counts_of_contains = count_asn_in_array(as_nums, as_nums[i]);
137 bt_assert_msg(as_path_contains(as_path, as_nums[i], counts_of_contains), "AS Path should contains %d-times number %d", counts_of_contains, as_nums[i]);
138
139 bt_assert(as_path_filter(lp, as_path, NULL, as_nums[i], 0) != NULL);
140 bt_assert(as_path_filter(lp, as_path, NULL, as_nums[i], 1) != NULL);
141 }
142
143 for (i = 0; i < 10000; i++)
144 {
145 u32 test_val = bt_random();
146 int counts_of_contains = count_asn_in_array(as_nums, test_val);
147 int result = as_path_contains(as_path, test_val, (counts_of_contains == 0 ? 1 : counts_of_contains));
148
149 if (counts_of_contains)
150 bt_assert_msg(result, "As path should contain %d-times the number %u", counts_of_contains, test_val);
151 else
152 bt_assert_msg(result == 0, "As path should not contain the number %u", test_val);
153 }
154
155 rfree(lp);
156
5e3cd0e5 157 return 1;
9b0a0ba9
OZ
158}
159
c42ecaab 160#if 0
9b0a0ba9
OZ
161static int
162t_as_path_converting(void)
163{
164 resource_init();
165
166 struct adata empty_as_path = {};
167 struct adata *as_path = &empty_as_path;
05d47bd5 168 struct linpool *lp = lp_new_default(&root_pool);
9b0a0ba9
OZ
169#define AS_PATH_LENGTH_FOR_CONVERTING_TEST 10
170
171 int i;
172 for (i = 0; i < AS_PATH_LENGTH_FOR_CONVERTING_TEST; i++)
173 as_path = as_path_prepend(lp, as_path, i);
174
175 bt_debug("data length: %u \n", as_path->length);
176
177 byte buffer[100] = {};
178 int used_size = as_path_convert_to_new(as_path, buffer, AS_PATH_LENGTH_FOR_CONVERTING_TEST-1);
179 bt_debug("as_path_convert_to_new: len %d \n%s\n", used_size, buffer);
180 for (i = 0; i < used_size; i++)
181 {
182 bt_debug("\\03%d", buffer[i]);
183 }
184 bt_debug("\n");
185 bt_assert(memcmp(buffer,
186 "\032\039\030\030\030\030\030\030\030\039\030\030\030\030\030\030\030\038\030\030\030\030\030\030"
187 "\030\037\030\030\030\030\030\030\030\036\030\030\030\030",
188 38));
189
190 bzero(buffer, sizeof(buffer));
191 int new_used;
192 used_size = as_path_convert_to_old(as_path, buffer, &new_used);
193 bt_debug("as_path_convert_to_old: len %d, new_used: %d \n", used_size, new_used);
194 for (i = 0; i < used_size; i++)
195 {
196 bt_debug("\\03%d", buffer[i]);
197 }
198 bt_debug("\n");
199 bt_assert(memcmp(buffer,
200 "\032\0310\030\039\030\038\030\037\030\036\030\035\030\034\030\033\030\032\030\031\030\030",
201 22));
202
5e3cd0e5 203 return 1;
9b0a0ba9 204}
c42ecaab 205#endif
9b0a0ba9
OZ
206
207int
208main(int argc, char *argv[])
209{
210 bt_init(argc, argv);
211
212 bt_test_suite(t_as_path_match, "Testing AS path matching and some a-path utilities.");
213 bt_test_suite(t_path_format, "Testing formating as path into byte buffer");
214 bt_test_suite(t_path_include, "Testing including a AS number in AS path");
c42ecaab 215 // bt_test_suite(t_as_path_converting, "Testing as_path_convert_to_*() output constancy");
9b0a0ba9
OZ
216
217 return bt_exit_value();
218}