Annotation of embedaddon/bird2/nest/a-path_test.c, revision 1.1.1.1
1.1 misho 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:
23: static int
24: t_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;
35: struct linpool *lp = lp_new_default(&root_pool);
36:
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--)
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)
46: last_prepended = val;
47: if (i == AS_PATH_LENGTH-1)
48: first_prepended = val;
49:
50: mask->item[i].kind = PM_ASN;
51: mask->item[i].asn = val;
52: }
53:
54: bt_assert_msg(as_path_match(as_path, mask), "Mask should match with AS path");
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:
67: return 1;
68: }
69:
70: static int
71: t_path_format(void)
72: {
73: resource_init();
74:
75: struct adata empty_as_path = {};
76: struct adata *as_path = &empty_as_path;
77: struct linpool *lp = lp_new_default(&root_pool);
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:
86: #define BUFFER_SIZE 120
87: byte buf[BUFFER_SIZE] = {};
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:
92: as_path_format(as_path, buf, BUFFER_SIZE);
93: bt_assert_msg(strcmp(buf, "4294967294 4294967293 4294967292 4294967291 4294967290 4294967289 4294967288 4294967287 4294967286 4294967285") == 0, "Buffer(%zu): '%s'", strlen(buf), buf);
94:
95: #define SMALL_BUFFER_SIZE 25
96: byte buf2[SMALL_BUFFER_SIZE] = {};
97: as_path_format(as_path, buf2, SMALL_BUFFER_SIZE);
98: bt_assert_msg(strcmp(buf2, "4294967294 42...") == 0, "Small Buffer(%zu): '%s'", strlen(buf2), buf2);
99:
100: rfree(lp);
101:
102: return 1;
103: }
104:
105: static int
106: count_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:
116: static int
117: t_path_include(void)
118: {
119: resource_init();
120:
121: struct adata empty_as_path = {};
122: struct adata *as_path = &empty_as_path;
123: struct linpool *lp = lp_new_default(&root_pool);
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:
157: return 1;
158: }
159:
160: #if 0
161: static int
162: t_as_path_converting(void)
163: {
164: resource_init();
165:
166: struct adata empty_as_path = {};
167: struct adata *as_path = &empty_as_path;
168: struct linpool *lp = lp_new_default(&root_pool);
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:
203: return 1;
204: }
205: #endif
206:
207: int
208: main(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");
215: // bt_test_suite(t_as_path_converting, "Testing as_path_convert_to_*() output constancy");
216:
217: return bt_exit_value();
218: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>