diff options
author | David Lamparter <equinox@opensourcerouting.org> | 2017-07-08 15:30:34 +0200 |
---|---|---|
committer | David Lamparter <equinox@opensourcerouting.org> | 2017-07-11 15:04:12 +0200 |
commit | f1c73d149564889c68fd3367fa767344090df0d2 (patch) | |
tree | 276a0467b7a55bd5d67bf8a513804fdcd427a532 /tests/ospf6d | |
parent | tests: fix pytest API "surprise" in skipping tests (diff) | |
download | frr-f1c73d149564889c68fd3367fa767344090df0d2.tar.xz frr-f1c73d149564889c68fd3367fa767344090df0d2.zip |
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>
Diffstat (limited to 'tests/ospf6d')
-rw-r--r-- | tests/ospf6d/test_lsdb.c | 253 | ||||
-rw-r--r-- | tests/ospf6d/test_lsdb.in | 72 | ||||
-rw-r--r-- | tests/ospf6d/test_lsdb.py | 4 | ||||
-rw-r--r-- | tests/ospf6d/test_lsdb.refout | 192 |
4 files changed, 521 insertions, 0 deletions
diff --git a/tests/ospf6d/test_lsdb.c b/tests/ospf6d/test_lsdb.c new file mode 100644 index 000000000..29d7b510e --- /dev/null +++ b/tests/ospf6d/test_lsdb.c @@ -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); +} diff --git a/tests/ospf6d/test_lsdb.in b/tests/ospf6d/test_lsdb.in new file mode 100644 index 000000000..0475f3dc5 --- /dev/null +++ b/tests/ospf6d/test_lsdb.in @@ -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 + diff --git a/tests/ospf6d/test_lsdb.py b/tests/ospf6d/test_lsdb.py new file mode 100644 index 000000000..6a9439511 --- /dev/null +++ b/tests/ospf6d/test_lsdb.py @@ -0,0 +1,4 @@ +import frrtest + +class TestLSDB(frrtest.TestRefOut): + program = './test_lsdb' diff --git a/tests/ospf6d/test_lsdb.refout b/tests/ospf6d/test_lsdb.refout new file mode 100644 index 000000000..8b1765226 --- /dev/null +++ b/tests/ospf6d/test_lsdb.refout @@ -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. |