tests: ospf6d: basic LSDB tests

Needed these while rewriting LSDB iteration.

NB: this commit fails because of a bug in ospf_lsdb_get_next, which will
SEGV when the LSDB is actually empty.  Whooo...  (this is fixed in the
following commits.)

Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
David Lamparter 2017-07-08 15:30:34 +02:00
parent 2e8a2df1fb
commit f1c73d1495
6 changed files with 543 additions and 2 deletions

1
tests/.gitignore vendored
View File

@ -44,3 +44,4 @@ __pycache__
/lib/test_timer_correctness
/lib/test_timer_performance
/lib/test_ttable
/ospf6d/test_lsdb

View File

@ -24,6 +24,14 @@ else
TESTS_BGPD =
endif
if OSPF6D
TESTS_OSPF6D = \
ospf6d/test_lsdb \
# end
else
TESTS_OSPF6D =
endif
if ENABLE_BGP_VNC
BGP_VNC_RFP_LIB=@top_builddir@/$(LIBRFP)/librfp.a
else
@ -31,6 +39,7 @@ BGP_VNC_RFP_LIB =
endif
lib/cli/test_cli.o: lib/cli/test_cli_clippy.c
ospf6d/test_lsdb.o: ospf6d/test_lsdb_clippy.c
check_PROGRAMS = \
lib/test_buffer \
@ -51,7 +60,9 @@ check_PROGRAMS = \
lib/test_ttable \
lib/cli/test_cli \
lib/cli/test_commands \
$(TESTS_BGPD)
$(TESTS_BGPD) \
$(TESTS_OSPF6D) \
# end
../vtysh/vtysh_cmd.c:
$(MAKE) -C ../vtysh vtysh_cmd.c
@ -100,8 +111,11 @@ bgpd_test_ecommunity_SOURCES = bgpd/test_ecommunity.c
bgpd_test_mp_attr_SOURCES = bgpd/test_mp_attr.c
bgpd_test_mpath_SOURCES = bgpd/test_mpath.c
ospf6d_test_lsdb_SOURCES = ospf6d/test_lsdb.c lib/cli/common_cli.c
ALL_TESTS_LDADD = ../lib/libfrr.la @LIBCAP@
BGP_TEST_LDADD = ../bgpd/libbgp.a $(BGP_VNC_RFP_LIB) $(ALL_TESTS_LDADD) -lm
OSPF6_TEST_LDADD = ../ospf6d/libospf6.a $(ALL_TESTS_LDADD)
lib_test_buffer_LDADD = $(ALL_TESTS_LDADD)
lib_test_checksum_LDADD = $(ALL_TESTS_LDADD)
@ -126,6 +140,7 @@ bgpd_test_capability_LDADD = $(BGP_TEST_LDADD)
bgpd_test_ecommunity_LDADD = $(BGP_TEST_LDADD)
bgpd_test_mp_attr_LDADD = $(BGP_TEST_LDADD)
bgpd_test_mpath_LDADD = $(BGP_TEST_LDADD)
ospf6d_test_lsdb_LDADD = $(OSPF6_TEST_LDADD)
EXTRA_DIST = \
runtests.py \
@ -148,7 +163,11 @@ EXTRA_DIST = \
lib/test_stream.refout \
lib/test_table.py \
lib/test_timer_correctness.py \
lib/test_ttable.py
lib/test_ttable.py \
ospf6d/test_lsdb.py \
ospf6d/test_lsdb.in \
ospf6d/test_lsdb.refout \
# end
.PHONY: tests.xml
tests.xml: $(check_PROGRAMS)

253
tests/ospf6d/test_lsdb.c Normal file
View File

@ -0,0 +1,253 @@
/*
* CLI/command dummy handling tester
*
* Copyright (C) 2015 by David Lamparter,
* for Open Source Routing / NetDEF, Inc.
*
* Quagga is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2, or (at your option) any
* later version.
*
* Quagga is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; see the file COPYING; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <zebra.h>
#include "prefix.h"
#include "vector.h"
#include "vty.h"
#include "ospf6d/ospf6_lsa.h"
#include "ospf6d/ospf6_lsdb.h"
#include "tests/lib/cli/common_cli.h"
#include "tests/ospf6d/test_lsdb_clippy.c"
static struct ospf6_lsdb *lsdb;
static struct ospf6_lsa **lsas = NULL;
static size_t lsa_count = 0;
static void lsa_check_resize(size_t len)
{
if (lsa_count >= len)
return;
lsas = realloc(lsas, len * sizeof(lsas[0]));
memset(lsas + lsa_count, 0, sizeof(lsas[0]) * (len - lsa_count));
lsa_count = len;
}
DEFPY(lsa_set, lsa_set_cmd,
"lsa set (0-999999)$idx {type (0-65535)|id A.B.C.D|adv A.B.C.D}",
"LSA\n"
"set\n"
"LSA index in array\n"
"OSPF6 type code\n"
"OSPF6 type code\n"
"LS-ID\n"
"LS-ID\n"
"Advertising router\n"
"Advertising router\n")
{
struct ospf6_lsa_header hdr;
memset(&hdr, 0, sizeof(hdr));
hdr.type = htons(type);
hdr.id = id.s_addr;
hdr.adv_router = adv.s_addr;
lsa_check_resize(idx + 1);
if (lsas[idx])
ospf6_lsa_unlock(lsas[idx]);
lsas[idx] = ospf6_lsa_create_headeronly(&hdr);
ospf6_lsa_lock(lsas[idx]);
return CMD_SUCCESS;
}
DEFPY(lsa_drop, lsa_drop_cmd,
"lsa drop (0-999999)$idx",
"LSA\n"
"drop reference\n"
"LSA index in array\n")
{
if ((size_t)idx >= lsa_count)
return CMD_SUCCESS;
if (lsas[idx]->lock != 1)
vty_outln(vty, "refcount at %u", lsas[idx]->lock);
ospf6_lsa_unlock(lsas[idx]);
lsas[idx] = NULL;
return CMD_SUCCESS;
}
DEFPY(lsdb_add, lsdb_add_cmd,
"lsdb add (0-999999)$idx",
"LSDB\n"
"insert LSA into LSDB\n"
"LSA index in array\n")
{
ospf6_lsdb_add(lsas[idx], lsdb);
return CMD_SUCCESS;
}
DEFPY(lsdb_remove, lsdb_remove_cmd,
"lsdb remove (0-999999)$idx",
"LSDB\n"
"remove LSA from LSDB\n"
"LSA index in array\n")
{
ospf6_lsdb_remove(lsas[idx], lsdb);
return CMD_SUCCESS;
}
static void lsa_show_oneline(struct vty *vty, struct ospf6_lsa *lsa)
{
char adv_router[64], id[64];
if (!lsa) {
vty_outln(vty, "lsa = NULL");
return;
}
inet_ntop(AF_INET, &lsa->header->id,
id, sizeof (id));
inet_ntop(AF_INET, &lsa->header->adv_router,
adv_router, sizeof (adv_router));
vty_outln(vty, "type %u adv %s id %s",
ntohs(lsa->header->type), adv_router, id);
}
DEFPY(lsdb_walk, lsdb_walk_cmd,
"lsdb walk",
"LSDB\n"
"walk entries\n")
{
struct ospf6_lsa *lsa;
unsigned cnt = 0;
for (ALL_LSDB(lsdb, lsa)) {
lsa_show_oneline(vty, lsa);
cnt++;
}
vty_outln(vty, "%u entries.", cnt);
return CMD_SUCCESS;
}
DEFPY(lsdb_walk_type, lsdb_walk_type_cmd,
"lsdb walk type (0-65535)",
"LSDB\n"
"walk entries\n"
"entry type\n"
"entry type\n")
{
struct ospf6_lsa *lsa;
unsigned cnt = 0;
type = htons(type);
for (ALL_LSDB_TYPED(lsdb, type, lsa)) {
lsa_show_oneline(vty, lsa);
cnt++;
}
vty_outln(vty, "%u entries.", cnt);
return CMD_SUCCESS;
}
DEFPY(lsdb_walk_type_adv, lsdb_walk_type_adv_cmd,
"lsdb walk type (0-65535) adv A.B.C.D",
"LSDB\n"
"walk entries\n"
"entry type\n"
"entry type\n"
"advertising router ID\n"
"advertising router ID\n")
{
struct ospf6_lsa *lsa;
unsigned cnt = 0;
type = htons(type);
for (ALL_LSDB_TYPED_ADVRTR(lsdb, type, adv.s_addr, lsa)) {
lsa_show_oneline(vty, lsa);
cnt++;
}
vty_outln(vty, "%u entries.", cnt);
return CMD_SUCCESS;
}
DEFPY(lsdb_get, lsdb_get_cmd,
"lsdb <get-next|get> type (0-65535) adv A.B.C.D id A.B.C.D",
"LSDB\n"
"get entry's successor\n"
"entry type\n"
"entry type\n"
"advertising router ID\n"
"advertising router ID\n"
"LS-ID\n"
"LS-ID\n")
{
struct ospf6_lsa *lsa;
type = htons(type);
if (!strcmp(argv[1]->text, "get-next"))
lsa = ospf6_lsdb_lookup_next(type, id.s_addr, adv.s_addr, lsdb);
else
lsa = ospf6_lsdb_lookup(type, id.s_addr, adv.s_addr, lsdb);
lsa_show_oneline(vty, lsa);
return CMD_SUCCESS;
}
DEFPY(lsa_refcounts, lsa_refcounts_cmd,
"lsa refcounts",
"LSA\n"
"show reference counts\n")
{
for (size_t i = 0; i < lsa_count; i++)
if (lsas[i])
vty_outln(vty, "[%zu] %u", i, lsas[i]->lock);
return CMD_SUCCESS;
}
DEFPY(lsdb_create, lsdb_create_cmd,
"lsdb create",
"LSDB\n"
"create LSDB\n")
{
if (lsdb)
ospf6_lsdb_delete(lsdb);
lsdb = ospf6_lsdb_create(NULL);
return CMD_SUCCESS;
}
DEFPY(lsdb_delete, lsdb_delete_cmd,
"lsdb delete",
"LSDB\n"
"delete LSDB\n")
{
ospf6_lsdb_delete(lsdb);
lsdb = NULL;
return CMD_SUCCESS;
}
struct zebra_privs_t ospf6d_privs;
void test_init(int argc, char **argv)
{
ospf6_lsa_init();
install_element(ENABLE_NODE, &lsa_set_cmd);
install_element(ENABLE_NODE, &lsa_refcounts_cmd);
install_element(ENABLE_NODE, &lsa_drop_cmd);
install_element(ENABLE_NODE, &lsdb_create_cmd);
install_element(ENABLE_NODE, &lsdb_delete_cmd);
install_element(ENABLE_NODE, &lsdb_add_cmd);
install_element(ENABLE_NODE, &lsdb_remove_cmd);
install_element(ENABLE_NODE, &lsdb_walk_cmd);
install_element(ENABLE_NODE, &lsdb_walk_type_cmd);
install_element(ENABLE_NODE, &lsdb_walk_type_adv_cmd);
install_element(ENABLE_NODE, &lsdb_get_cmd);
}

72
tests/ospf6d/test_lsdb.in Normal file
View File

@ -0,0 +1,72 @@
lsa set 0 type 1 adv 1.2.3.4 id 0.0.0.1
lsa set 1 type 1 adv 1.2.3.4 id 0.0.0.2
lsa set 2 type 2 adv 1.2.3.4 id 0.0.0.3
lsa set 3 type 2 adv 128.2.3.4 id 0.0.0.4
lsa set 4 type 2 adv 128.2.3.4 id 0.0.0.5
lsa set 5 type 3 adv 0.0.0.1 id 0.0.0.6
lsa refcounts
lsdb create
lsdb walk
lsdb walk type 1
lsdb walk type 2
lsdb get type 1 adv 1.2.3.4 id 0.0.0.2
lsdb get-next type 1 adv 1.2.3.4 id 0.0.0.2
lsa refcounts
lsdb add 0
lsdb add 1
lsa refcounts
lsdb walk
lsdb walk type 1
lsdb walk type 2
lsdb get type 1 adv 1.2.3.4 id 0.0.0.2
lsdb get-next type 1 adv 1.2.3.4 id 0.0.0.2
lsa refcounts
lsdb remove 0
lsdb add 2
lsdb add 3
lsdb add 4
lsa refcounts
lsdb walk
lsdb walk type 1
lsdb walk type 2
lsdb get type 1 adv 1.2.3.4 id 0.0.0.2
lsdb get-next type 1 adv 1.2.3.4 id 0.0.0.2
lsa refcounts
lsdb add 5
lsa refcounts
lsdb walk
lsdb walk type 1
lsdb walk type 2
lsdb get type 1 adv 1.2.3.4 id 0.0.0.2
lsdb get-next type 1 adv 1.2.3.4 id 0.0.0.2
lsa refcounts
lsdb remove 1
lsdb remove 5
lsa refcounts
lsdb walk
lsdb walk type 1
lsdb walk type 2
lsdb get type 1 adv 1.2.3.4 id 0.0.0.2
lsdb get-next type 1 adv 1.2.3.4 id 0.0.0.2
lsa refcounts
lsdb delete
lsa refcounts
lsa drop 0
lsa drop 1
lsa drop 2
lsa drop 3
lsa drop 4
lsa drop 5

View File

@ -0,0 +1,4 @@
import frrtest
class TestLSDB(frrtest.TestRefOut):
program = './test_lsdb'

View File

@ -0,0 +1,192 @@
test# lsa set 0 type 1 adv 1.2.3.4 id 0.0.0.1
test# lsa set 1 type 1 adv 1.2.3.4 id 0.0.0.2
test# lsa set 2 type 2 adv 1.2.3.4 id 0.0.0.3
test# lsa set 3 type 2 adv 128.2.3.4 id 0.0.0.4
test# lsa set 4 type 2 adv 128.2.3.4 id 0.0.0.5
test# lsa set 5 type 3 adv 0.0.0.1 id 0.0.0.6
test# lsa refcounts
[0] 1
[1] 1
[2] 1
[3] 1
[4] 1
[5] 1
test#
test# lsdb create
test#
test# lsdb walk
0 entries.
test# lsdb walk type 1
0 entries.
test# lsdb walk type 2
0 entries.
test# lsdb get type 1 adv 1.2.3.4 id 0.0.0.2
lsa = NULL
test# lsdb get-next type 1 adv 1.2.3.4 id 0.0.0.2
lsa = NULL
test# lsa refcounts
[0] 1
[1] 1
[2] 1
[3] 1
[4] 1
[5] 1
test#
test# lsdb add 0
test# lsdb add 1
test# lsa refcounts
[0] 2
[1] 2
[2] 1
[3] 1
[4] 1
[5] 1
test#
test# lsdb walk
type 1 adv 1.2.3.4 id 0.0.0.1
type 1 adv 1.2.3.4 id 0.0.0.2
2 entries.
test# lsdb walk type 1
type 1 adv 1.2.3.4 id 0.0.0.1
type 1 adv 1.2.3.4 id 0.0.0.2
2 entries.
test# lsdb walk type 2
0 entries.
test# lsdb get type 1 adv 1.2.3.4 id 0.0.0.2
type 1 adv 1.2.3.4 id 0.0.0.2
test# lsdb get-next type 1 adv 1.2.3.4 id 0.0.0.2
lsa = NULL
test# lsa refcounts
[0] 2
[1] 2
[2] 1
[3] 1
[4] 1
[5] 1
test#
test# lsdb remove 0
test# lsdb add 2
test# lsdb add 3
test# lsdb add 4
test# lsa refcounts
[0] 1
[1] 2
[2] 2
[3] 2
[4] 2
[5] 1
test#
test# lsdb walk
type 1 adv 1.2.3.4 id 0.0.0.2
type 2 adv 1.2.3.4 id 0.0.0.3
type 2 adv 128.2.3.4 id 0.0.0.4
type 2 adv 128.2.3.4 id 0.0.0.5
4 entries.
test# lsdb walk type 1
type 1 adv 1.2.3.4 id 0.0.0.2
1 entries.
test# lsdb walk type 2
type 2 adv 1.2.3.4 id 0.0.0.3
type 2 adv 128.2.3.4 id 0.0.0.4
type 2 adv 128.2.3.4 id 0.0.0.5
3 entries.
test# lsdb get type 1 adv 1.2.3.4 id 0.0.0.2
type 1 adv 1.2.3.4 id 0.0.0.2
test# lsdb get-next type 1 adv 1.2.3.4 id 0.0.0.2
type 2 adv 1.2.3.4 id 0.0.0.3
test# lsa refcounts
[0] 1
[1] 2
[2] 2
[3] 2
[4] 2
[5] 1
test#
test# lsdb add 5
test# lsa refcounts
[0] 1
[1] 2
[2] 2
[3] 2
[4] 2
[5] 2
test#
test# lsdb walk
type 1 adv 1.2.3.4 id 0.0.0.2
type 2 adv 1.2.3.4 id 0.0.0.3
type 2 adv 128.2.3.4 id 0.0.0.4
type 2 adv 128.2.3.4 id 0.0.0.5
type 3 adv 0.0.0.1 id 0.0.0.6
5 entries.
test# lsdb walk type 1
type 1 adv 1.2.3.4 id 0.0.0.2
1 entries.
test# lsdb walk type 2
type 2 adv 1.2.3.4 id 0.0.0.3
type 2 adv 128.2.3.4 id 0.0.0.4
type 2 adv 128.2.3.4 id 0.0.0.5
3 entries.
test# lsdb get type 1 adv 1.2.3.4 id 0.0.0.2
type 1 adv 1.2.3.4 id 0.0.0.2
test# lsdb get-next type 1 adv 1.2.3.4 id 0.0.0.2
type 2 adv 1.2.3.4 id 0.0.0.3
test# lsa refcounts
[0] 1
[1] 2
[2] 2
[3] 2
[4] 2
[5] 2
test#
test# lsdb remove 1
test# lsdb remove 5
test# lsa refcounts
[0] 1
[1] 1
[2] 2
[3] 2
[4] 2
[5] 1
test#
test# lsdb walk
type 2 adv 1.2.3.4 id 0.0.0.3
type 2 adv 128.2.3.4 id 0.0.0.4
type 2 adv 128.2.3.4 id 0.0.0.5
3 entries.
test# lsdb walk type 1
0 entries.
test# lsdb walk type 2
type 2 adv 1.2.3.4 id 0.0.0.3
type 2 adv 128.2.3.4 id 0.0.0.4
type 2 adv 128.2.3.4 id 0.0.0.5
3 entries.
test# lsdb get type 1 adv 1.2.3.4 id 0.0.0.2
lsa = NULL
test# lsdb get-next type 1 adv 1.2.3.4 id 0.0.0.2
type 2 adv 1.2.3.4 id 0.0.0.3
test# lsa refcounts
[0] 1
[1] 1
[2] 2
[3] 2
[4] 2
[5] 1
test#
test# lsdb delete
test#
test# lsa refcounts
[0] 1
[1] 1
[2] 1
[3] 1
[4] 1
[5] 1
test# lsa drop 0
test# lsa drop 1
test# lsa drop 2
test# lsa drop 3
test# lsa drop 4
test# lsa drop 5
test#
test#
end.