diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/.cvsignore | 22 | ||||
| -rw-r--r-- | tests/aspath_test.c | 310 | ||||
| -rw-r--r-- | tests/bgp_capability_test.c | 19 | ||||
| -rw-r--r-- | tests/bgp_mp_attr_test.c | 16 | ||||
| -rw-r--r-- | tests/heavy-wq.c | 2 | 
5 files changed, 309 insertions, 60 deletions
diff --git a/tests/.cvsignore b/tests/.cvsignore deleted file mode 100644 index 4c3e50dc..00000000 --- a/tests/.cvsignore +++ /dev/null @@ -1,22 +0,0 @@ -Makefile -Makefile.in -*.o -tags -TAGS -.deps -.nfs* -*.lo -*.la -*.libs -testsig -.arch-inventory -.arch-ids -testbuffer -testmemory -testsig -aspathtest -heavy -heavythread -heavywq -testprivs -teststream diff --git a/tests/aspath_test.c b/tests/aspath_test.c index 9e51e8dd..4a2ce9aa 100644 --- a/tests/aspath_test.c +++ b/tests/aspath_test.c @@ -6,6 +6,7 @@  #include "bgpd/bgpd.h"  #include "bgpd/bgp_aspath.h" +#include "bgpd/bgp_attr.h"  #define VT100_RESET "\x1b[0m"  #define VT100_RED "\x1b[31m" @@ -407,7 +408,7 @@ static struct test_segment {      "#ASNs = 0, data = seq(8466 3 52737 4096 3456)",      { 0x2,0x0, 0x21,0x12, 0x00,0x03, 0xce,0x01, 0x10,0x00, 0x0d,0x80 },      12, -    { "", "", +    { NULL, NULL,        0, 0, 0, 0, 0, 0 },    },    { /* 26  */  @@ -417,10 +418,190 @@ static struct test_segment {        0x2,0x2, 0x10,0x00, 0x0d,0x80 },      14      , -    { "", "", +    { NULL, NULL,        0, 0, 0, 0, 0, 0 },    }, -  { NULL, NULL, {0}, 0, { NULL, 0, 0 } } +  { /* 27  */  +    "invalid segment type", +    "type=8(4096 3456)", +    { 0x8,0x2, 0x10,0x00, 0x0d,0x80 }, +    14 +    , +    { NULL, NULL, +      0, 0, 0, 0, 0, 0 }, +  },  { NULL, NULL, {0}, 0, { NULL, 0, 0 } } +}; + +/* */ +static struct aspath_tests { +  const char *desc; +  const struct test_segment *segment; +  const char *shouldbe;  /* String it should evaluate to */ +  const enum as4 { AS4_DATA, AS2_DATA } +          as4; 	/* whether data should be as4 or not (ie as2) */ +  const int result;	/* expected result for bgp_attr_parse */ +  const int cap;	/* capabilities to set for peer */ +  const char attrheader [1024]; +  size_t len; +} aspath_tests [] = +{ +  /* 0 */ +  { +    "basic test", +    &test_segments[0], +    "8466 3 52737 4096", +    AS2_DATA, 0, +    0, +    { BGP_ATTR_FLAG_TRANS, +      BGP_ATTR_AS_PATH,  +      10, +    }, +    3, +  }, +  /* 1 */ +  { +    "length too short", +    &test_segments[0], +    "8466 3 52737 4096", +    AS2_DATA, -1, +    0, +    { BGP_ATTR_FLAG_TRANS, +      BGP_ATTR_AS_PATH,  +      8, +    }, +    3, +  }, +  /* 2 */ +  { +    "length too long", +    &test_segments[0], +    "8466 3 52737 4096", +    AS2_DATA, -1, +    0, +    { BGP_ATTR_FLAG_TRANS, +      BGP_ATTR_AS_PATH,  +      12, +    }, +    3, +  }, +  /* 3 */ +  { +    "incorrect flag", +    &test_segments[0], +    "8466 3 52737 4096", +    AS2_DATA, -1, +    0, +    { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL, +      BGP_ATTR_AS_PATH,  +      10, +    }, +    3, +  }, +  /* 4 */ +  { +    "as4_path, with as2 format data", +    &test_segments[0], +    "8466 3 52737 4096", +    AS2_DATA, -1, +    0, +    { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL, +      BGP_ATTR_AS4_PATH,  +      10, +    }, +    3, +  }, +  /* 5 */ +  { +    "as4, with incorrect attr length", +    &test_segments[0], +    "8466 3 52737 4096", +    AS4_DATA, -1, +    PEER_CAP_AS4_RCV, +    { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL, +      BGP_ATTR_AS4_PATH,  +      10, +    }, +    3, +  }, +  /* 6 */ +  { +    "basic 4-byte as-path", +    &test_segments[0], +    "8466 3 52737 4096", +    AS4_DATA, 0, +    PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV, +    { BGP_ATTR_FLAG_TRANS, +      BGP_ATTR_AS_PATH,  +      18, +    }, +    3, +  }, +  /* 7 */ +  { +    "4b AS_PATH: too short", +    &test_segments[0], +    "8466 3 52737 4096", +    AS4_DATA, -1, +    PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV, +    { BGP_ATTR_FLAG_TRANS, +      BGP_ATTR_AS_PATH,  +      16, +    }, +    3, +  }, +  /* 8 */ +  { +    "4b AS_PATH: too long", +    &test_segments[0], +    "8466 3 52737 4096", +    AS4_DATA, -1, +    PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV, +    { BGP_ATTR_FLAG_TRANS, +      BGP_ATTR_AS_PATH,  +      20, +    }, +    3, +  }, +  /* 9 */ +  { +    "4b AS_PATH: too long2", +    &test_segments[0], +    "8466 3 52737 4096", +    AS4_DATA, -1, +    PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV, +    { BGP_ATTR_FLAG_TRANS, +      BGP_ATTR_AS_PATH,  +      22, +    }, +    3, +  }, +  /* 10 */ +  { +    "4b AS_PATH: bad flags", +    &test_segments[0], +    "8466 3 52737 4096", +    AS4_DATA, -1, +    PEER_CAP_AS4_RCV|PEER_CAP_AS4_ADV, +    { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL, +      BGP_ATTR_AS_PATH,  +      18, +    }, +    3, +  }, +  /* 11 */ +  { +    "4b AS_PATH: confed", +    &test_segments[6], +    "8466 3 52737 4096", +    AS4_DATA, -1, +    PEER_CAP_AS4_ADV, +    { BGP_ATTR_FLAG_TRANS|BGP_ATTR_FLAG_OPTIONAL, +      BGP_ATTR_AS4_PATH,  +      14, +    }, +    3, +  }, +  { NULL, NULL, NULL, 0, 0, 0, { 0 }, 0 },  };  /* prepending tests */ @@ -430,21 +611,25 @@ static struct tests {    struct test_spec sp;  } prepend_tests[] =   { +  /* 0 */    { &test_segments[0], &test_segments[1],      { "8466 3 52737 4096 8722 4",        "8466 3 52737 4096 8722 4",        6, 0, NOT_ALL_PRIVATE, 4096, 1, 8466 },    }, +  /* 1 */    { &test_segments[1], &test_segments[3],      { "8722 4 8482 51457 {5204}",        "8722 4 8482 51457 {5204}",        5, 0, NOT_ALL_PRIVATE, 5204, 1, 8722 }    }, +  /* 2 */    { &test_segments[3], &test_segments[4],      { "8482 51457 {5204} 8467 59649 {4196,48658} {17322,30745}",        "8482 51457 {5204} 8467 59649 {4196,48658} {17322,30745}",        7, 0, NOT_ALL_PRIVATE, 5204, 1, 8482 },    }, +  /* 3 */    { &test_segments[4], &test_segments[5],      { "8467 59649 {4196,48658} {17322,30745} 6435 59408 21665"        " {2457,4369,61697} 1842 41590 51793", @@ -452,11 +637,13 @@ static struct tests {        " {2457,4369,61697} 1842 41590 51793",        11, 0, NOT_ALL_PRIVATE, 61697, 1, 8467 }    }, +  /* 4 */    { &test_segments[5], &test_segments[6], -    { "6435 59408 21665 {2457,4369,61697} 1842 41590 51793 (123 456 789)", -      "6435 59408 21665 {2457,4369,61697} 1842 41590 51793 (123 456 789)", -      7, 3, NOT_ALL_PRIVATE, 123, 1, 6435 }, +    { "6435 59408 21665 {2457,4369,61697} 1842 41590 51793", +      "6435 59408 21665 {2457,4369,61697} 1842 41590 51793", +      7, 0, NOT_ALL_PRIVATE, 1842, 1, 6435 },    }, +  /* 5 */    { &test_segments[6], &test_segments[7],      { "(123 456 789) (123 456 789) (111 222)",        "", @@ -649,7 +836,7 @@ make_aspath (const u_char *data, size_t len, int use32bit)        s = stream_new (len);        stream_put (s, data, len);      } -  as = aspath_parse (s, len, use32bit, 0); +  as = aspath_parse (s, len, use32bit);    if (s)      stream_free (s); @@ -682,6 +869,12 @@ validate (struct aspath *as, const struct test_spec *sp)    static struct stream *s;    struct aspath *asinout, *asconfeddel, *asstr, *as4; +  if (as == NULL && sp->shouldbe == NULL) +    { +      printf ("Correctly failed to parse\n"); +      return fails; +    } +      out = aspath_snmp_pathseg (as, &bytes);    asinout = make_aspath (out, bytes, 0); @@ -826,7 +1019,7 @@ parse_test (struct test_segment *t)    printf ("%s: %s\n", t->name, t->desc);    asp = make_aspath (t->asdata, t->len, 0); - +      printf ("aspath: %s\nvalidating...:\n", aspath_print (asp));    if (!validate (asp, &t->sp)) @@ -835,7 +1028,9 @@ parse_test (struct test_segment *t)      printf (FAILED "\n");    printf ("\n"); -  aspath_unintern (asp); +   +  if (asp) +    aspath_unintern (asp);  }  /* prepend testing */ @@ -891,7 +1086,8 @@ empty_prepend_test (struct test_segment *t)      printf (FAILED "!\n");    printf ("\n"); -  aspath_unintern (asp1); +  if (asp1) +    aspath_unintern (asp1);    aspath_free (asp2);  } @@ -993,30 +1189,106 @@ cmp_test ()        aspath_unintern (asp2);      }  } -      + +static int +handle_attr_test (struct aspath_tests *t) +{ +  struct bgp bgp = { 0 };  +  struct peer peer = { 0 }; +  struct attr attr = { 0 };   +  int ret; +  int initfail = failed; +  struct aspath *asp; +  size_t datalen; +   +  asp = make_aspath (t->segment->asdata, t->segment->len, 0); +     +  peer.ibuf = stream_new (BGP_MAX_PACKET_SIZE); +  peer.obuf = stream_fifo_new (); +  peer.bgp = &bgp; +  peer.host = (char *)"none"; +  peer.fd = -1; +  peer.cap = t->cap; +   +  stream_write (peer.ibuf, t->attrheader, t->len); +  datalen = aspath_put (peer.ibuf, asp, t->as4 == AS4_DATA); +   +  ret = bgp_attr_parse (&peer, &attr, t->len + datalen, NULL, NULL); +   +  if (ret != t->result) +    { +      printf ("bgp_attr_parse returned %d, expected %d\n", ret, t->result); +      printf ("datalen %d\n", datalen); +      failed++; +    } +  if (ret != 0) +    goto out; +   +  if (attr.aspath == NULL) +    { +      printf ("aspath is NULL!\n"); +      failed++; +    } +  if (attr.aspath && strcmp (attr.aspath->str, t->shouldbe)) +    { +      printf ("attr str and 'shouldbe' mismatched!\n" +              "attr str:  %s\n" +              "shouldbe:  %s\n", +              attr.aspath->str, t->shouldbe); +      failed++; +    } + +out: +  if (attr.aspath) +    aspath_unintern (attr.aspath); +  if (asp) +    aspath_unintern (asp); +  return failed - initfail; +} + +static void +attr_test (struct aspath_tests *t) +{ +    printf ("%s\n", t->desc); +    printf ("%s\n\n", handle_attr_test (t) ? FAILED : OK);   +} +  int  main (void)  {    int i = 0; -  aspath_init(); +  bgp_master_init (); +  master = bm->master; +  bgp_attr_init (); +      while (test_segments[i].name)      { +      printf ("test %u\n", i);        parse_test (&test_segments[i]);        empty_prepend_test (&test_segments[i++]);      }    i = 0;    while (prepend_tests[i].test1) -    prepend_test (&prepend_tests[i++]); +    { +      printf ("prepend test %u\n", i); +      prepend_test (&prepend_tests[i++]); +    }    i = 0;    while (aggregate_tests[i].test1) -    aggregate_test (&aggregate_tests[i++]); +    { +      printf ("aggregate test %u\n", i); +      aggregate_test (&aggregate_tests[i++]); +    }    i = 0;    while (reconcile_tests[i].test1) -    as4_reconcile_test (&reconcile_tests[i++]); +    { +      printf ("reconcile test %u\n", i); +      as4_reconcile_test (&reconcile_tests[i++]); +    }    i = 0; @@ -1026,6 +1298,14 @@ main (void)    empty_get_test(); +  i = 0; +   +  while (aspath_tests[i].desc) +    { +      printf ("aspath_attr test %d\n", i); +      attr_test (&aspath_tests[i++]); +    } +      printf ("failures: %d\n", failed);    printf ("aspath count: %ld\n", aspath_count()); diff --git a/tests/bgp_capability_test.c b/tests/bgp_capability_test.c index 0dbf4fb9..9b43159c 100644 --- a/tests/bgp_capability_test.c +++ b/tests/bgp_capability_test.c @@ -96,10 +96,10 @@ static struct test_segment mp_segments[] =    },    /* 6 */    { "MP3", -    "MP IP6/VPNv4", +    "MP IP6/MPLS-labeled VPN",      { CAPABILITY_CODE_MP, 0x4, 0x0, 0x2, 0x0, 0x80 }, -    6, SHOULD_PARSE, 0, /* parses, but invalid afi,safi */ -    1, AFI_IP6, BGP_SAFI_VPNV4, INVALID_AFI, +    6, SHOULD_PARSE, 0, +    1, AFI_IP6, SAFI_MPLS_LABELED_VPN, VALID_AFI,    },    /* 7 */    { "MP5", @@ -110,21 +110,14 @@ static struct test_segment mp_segments[] =    },    /* 8 */    { "MP6", -    "MP IP4/VPNv4", +    "MP IP4/MPLS-laveled VPN",      { CAPABILITY_CODE_MP, 0x4, 0x0, 0x1, 0x0, 0x80 },      6, SHOULD_PARSE, 0, -    1, AFI_IP, BGP_SAFI_VPNV4, VALID_AFI, +    1, AFI_IP, SAFI_MPLS_LABELED_VPN, VALID_AFI,    },   -  /* 9 */ -  { "MP7", -    "MP IP4/VPNv6", -    { CAPABILITY_CODE_MP, 0x4, 0x0, 0x1, 0x0, 0x81 }, -    6, SHOULD_PARSE, 0, /* parses, but invalid afi,safi tuple */ -    1, AFI_IP, BGP_SAFI_VPNV6, INVALID_AFI, -  },    /* 10 */    { "MP8", -    "MP unknown AFI", +    "MP unknown AFI/SAFI",      { CAPABILITY_CODE_MP, 0x4, 0x0, 0xa, 0x0, 0x81 },      6, SHOULD_PARSE, 0,      1, 0xa, 0x81, INVALID_AFI, /* parses, but unknown */ diff --git a/tests/bgp_mp_attr_test.c b/tests/bgp_mp_attr_test.c index dde0df2f..9cbe9f22 100644 --- a/tests/bgp_mp_attr_test.c +++ b/tests/bgp_mp_attr_test.c @@ -286,10 +286,10 @@ static struct test_segment {      SHOULD_ERR,      AFI_IP, SAFI_UNICAST, VALID_AFI,    }, -  { "IPv4-vpnv4", -    "IPv4/VPNv4 MP Reach, RD, Nexthop, 3 NLRIs",  +  { "IPv4-MLVPN", +    "IPv4/MPLS-labeled VPN MP Reach, RD, Nexthop, 3 NLRIs",       { -      /* AFI / SAFI */		0x0, AFI_IP, BGP_SAFI_VPNV4, +      /* AFI / SAFI */		0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,        /* nexthop bytes */	12,        /* RD */			0, 0, 1, 2,                                  0, 0xff, 3, 4, @@ -409,10 +409,10 @@ static struct test_segment mp_unreach_segments [] =      SHOULD_ERR,      AFI_IP, SAFI_UNICAST, VALID_AFI,    }, -  { "IPv4-unreach-vpnv4", -    "IPv4/VPNv4 MP Unreach, RD, 3 NLRIs",  +  { "IPv4-unreach-MLVPN", +    "IPv4/MPLS-labeled VPN MP Unreach, RD, 3 NLRIs",       { -      /* AFI / SAFI */		0x0, AFI_IP, BGP_SAFI_VPNV4, +      /* AFI / SAFI */		0x0, AFI_IP, SAFI_MPLS_LABELED_VPN,        /* nexthop bytes */	12,        /* RD */			0, 0, 1, 2,                                  0, 0xff, 3, 4, @@ -449,9 +449,9 @@ parse_test (struct peer *peer, struct test_segment *t, int type)    printf ("%s: %s\n", t->name, t->desc);    if (type == BGP_ATTR_MP_REACH_NLRI) -    ret = bgp_mp_reach_parse (peer, t->len, &attr, &nlri); +    ret = bgp_mp_reach_parse (peer, t->len, &attr, BGP_ATTR_FLAG_OPTIONAL, BGP_INPUT_PNT (peer), &nlri);    else -    ret = bgp_mp_unreach_parse (peer, t->len, &nlri); +    ret = bgp_mp_unreach_parse (peer, t->len, BGP_ATTR_FLAG_OPTIONAL, BGP_INPUT_PNT (peer), &nlri);    if (!ret)      { diff --git a/tests/heavy-wq.c b/tests/heavy-wq.c index a2c609d4..e5f688c2 100644 --- a/tests/heavy-wq.c +++ b/tests/heavy-wq.c @@ -1,6 +1,4 @@  /* - * $Id$ - *   * This file is part of Quagga.   *   * Quagga is free software; you can redistribute it and/or modify it  | 
