Annotation of embedaddon/bird2/nest/a-path_test.c, revision 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>