summaryrefslogtreecommitdiffstats
path: root/tests/ospf6d
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ospf6d')
-rw-r--r--tests/ospf6d/subdir.am19
-rw-r--r--tests/ospf6d/test_lsdb.c246
-rw-r--r--tests/ospf6d/test_lsdb.in72
-rw-r--r--tests/ospf6d/test_lsdb.py5
-rw-r--r--tests/ospf6d/test_lsdb.refout192
5 files changed, 534 insertions, 0 deletions
diff --git a/tests/ospf6d/subdir.am b/tests/ospf6d/subdir.am
new file mode 100644
index 0000000..ef1f40c
--- /dev/null
+++ b/tests/ospf6d/subdir.am
@@ -0,0 +1,19 @@
+if !OSPF6D
+PYTEST_IGNORE += --ignore=ospf6d/
+endif
+OSPF6_TEST_LDADD = ospf6d/libospf6.a $(ALL_TESTS_LDADD)
+
+
+if OSPF6D
+check_PROGRAMS += tests/ospf6d/test_lsdb
+endif
+tests_ospf6d_test_lsdb_CFLAGS = $(TESTS_CFLAGS)
+tests_ospf6d_test_lsdb_CPPFLAGS = $(TESTS_CPPFLAGS)
+tests_ospf6d_test_lsdb_LDADD = $(OSPF6_TEST_LDADD)
+tests_ospf6d_test_lsdb_SOURCES = tests/ospf6d/test_lsdb.c tests/lib/cli/common_cli.c
+clippy_scan += tests/ospf6d/test_lsdb.c
+EXTRA_DIST += \
+ tests/ospf6d/test_lsdb.py \
+ tests/ospf6d/test_lsdb.in \
+ tests/ospf6d/test_lsdb.refout \
+ # end
diff --git a/tests/ospf6d/test_lsdb.c b/tests/ospf6d/test_lsdb.c
new file mode 100644
index 0000000..f9df735
--- /dev/null
+++ b/tests/ospf6d/test_lsdb.c
@@ -0,0 +1,246 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * CLI/command dummy handling tester
+ *
+ * Copyright (C) 2015 by David Lamparter,
+ * for Open Source Routing / NetDEF, Inc.
+ */
+
+#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)
+{
+ struct ospf6_lsa **templsas;
+
+ if (lsa_count >= len)
+ return;
+ templsas = realloc(lsas, len * sizeof(lsas[0]));
+ if (templsas)
+ lsas = templsas;
+ else
+ return;
+ 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_out(vty, "refcount at %u\n", 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_out(vty, "lsa = NULL\n");
+ 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_out(vty, "type %u adv %s id %s\n", ntohs(lsa->header->type),
+ adv_router, id);
+}
+
+DEFPY(lsdb_walk, lsdb_walk_cmd,
+ "lsdb walk",
+ "LSDB\n"
+ "walk entries\n")
+{
+ struct ospf6_lsa *lsa, *lsanext;
+
+ unsigned cnt = 0;
+ for (ALL_LSDB(lsdb, lsa, lsanext)) {
+ lsa_show_oneline(vty, lsa);
+ cnt++;
+ }
+ vty_out(vty, "%u entries.\n", 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_out(vty, "%u entries.\n", 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_out(vty, "%u entries.\n", 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_out(vty, "[%zu] %u\n", 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 0000000..0475f3d
--- /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 0000000..6ada617
--- /dev/null
+++ b/tests/ospf6d/test_lsdb.py
@@ -0,0 +1,5 @@
+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 0000000..8b17652
--- /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.