File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird2 / nest / a-path_test.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Oct 21 16:03:56 2019 UTC (4 years, 8 months ago) by misho
Branches: bird2, MAIN
CVS tags: v2_0_7p0, HEAD
bird2 ver 2.0.7

    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>