]> www.infradead.org Git - users/sagi/libnvme.git/commitdiff
test: Add unit test for ctrl lookups
authorDaniel Wagner <dwagner@suse.de>
Thu, 18 May 2023 13:43:01 +0000 (15:43 +0200)
committerDaniel Wagner <wagi@monom.org>
Fri, 19 May 2023 07:05:37 +0000 (09:05 +0200)
Add a simple unit test which tests the ctrl lookup logic.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
test/meson.build
test/tree.c [new file with mode: 0644]

index 9b2657d2e5c661e651f883aacd337fadb3d59208..ea1995d710db791a3e6e47da36e8a855b1d0e54f 100644 (file)
@@ -66,4 +66,13 @@ uuid = executable(
 
 test('uuid', uuid)
 
+tree = executable(
+    'tree',
+    ['tree.c'],
+    dependencies: libnvme_dep,
+    include_directories: [incdir, internal_incdir]
+)
+
+test('tree', tree)
+
 subdir('nbft')
diff --git a/test/tree.c b/test/tree.c
new file mode 100644 (file)
index 0000000..b3baac8
--- /dev/null
@@ -0,0 +1,263 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/**
+ * This file is part of libnvme.
+ * Copyright (c) 2023 Daniel Wagner, SUSE LLC
+ */
+
+#include <assert.h>
+#include <string.h>
+
+#include <ccan/array_size/array_size.h>
+
+#include <libnvme.h>
+
+struct test_data {
+       /* input data */
+       const char *subsysname;
+       const char *subsysnqn;
+       const char *transport;
+       const char *traddr;
+       const char *host_traddr;
+       const char *host_iface;
+       const char *trsvcid;
+
+       /* track controller generated by input data */
+       nvme_subsystem_t s;
+       nvme_ctrl_t c;
+       int ctrl_id;
+};
+
+#define DEFAULT_SUBSYSNAME "subsysname"
+#define DEFAULT_SUBSYSNQN "subsysnqn"
+
+struct test_data test_data[] = {
+       { DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "tcp", "192.168.1.1", "192.168.1.20", NULL, "4420" },
+       { DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "tcp", "192.168.1.1", "192.168.1.20", NULL, "4421" },
+       { DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "tcp", "192.168.1.2", "192.168.1.20", "eth1", "4420" },
+       { DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "tcp", "192.168.1.2", "192.168.1.20", "eth1", "4421" },
+       { DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "rdma", "192.168.1.3", "192.168.1.20", NULL, NULL },
+       { DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "rdma", "192.168.1.4", "192.168.1.20", NULL, NULL },
+       { DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "fc",
+         "nn-0x201700a09890f5bf:pn-0x201900a09890f5bf",
+         "nn-0x200000109b579ef3:pn-0x100000109b579ef3"
+       },
+       { DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "fc",
+         "nn-0x201700a09890f5bf:pn-0x201900a09890f5bf",
+         "nn-0x200000109b579ef6:pn-0x100000109b579ef6",
+       },
+};
+
+static struct test_data *find_test_data(nvme_ctrl_t c)
+{
+       for (int i = 0; i < ARRAY_SIZE(test_data); i++) {
+               struct test_data *d = &test_data[i];
+
+               if (d->c == c)
+                       return d;
+       }
+
+       return NULL;
+}
+
+static void show_ctrl(nvme_ctrl_t c)
+{
+       struct test_data *d = find_test_data(c);
+
+       if (d)
+               printf("ctrl%d ", d->ctrl_id);
+
+       printf("0x%p: %s %s %s %s %s\n",
+              c,
+              nvme_ctrl_get_transport(c),
+              nvme_ctrl_get_traddr(c),
+              nvme_ctrl_get_host_traddr(c),
+              nvme_ctrl_get_host_iface(c),
+              nvme_ctrl_get_trsvcid(c));
+}
+
+static nvme_root_t create_tree()
+{
+       nvme_root_t r;
+       nvme_host_t h;
+
+       r = nvme_create_root(stdout, LOG_DEBUG);
+       assert(r);
+       h = nvme_default_host(r);
+       assert(h);
+
+       printf("  ctrls created:\n");
+       for (int i = 0; i < ARRAY_SIZE(test_data); i++) {
+               struct test_data *d = &test_data[i];
+
+               d->s = nvme_lookup_subsystem(h, d->subsysname, d->subsysnqn);
+               assert(d->s);
+               d->c = nvme_lookup_ctrl(d->s, d->transport, d->traddr,
+                                       d->host_traddr, d->host_iface,
+                                       d->trsvcid, NULL);
+               assert(d->c);
+               d->ctrl_id = i;
+
+               assert(!strcmp(d->transport, nvme_ctrl_get_transport(d->c)));
+               assert(!strcmp(d->traddr, nvme_ctrl_get_traddr(d->c)));
+               assert(!d->host_traddr || !strcmp(d->host_traddr, nvme_ctrl_get_host_traddr(d->c)));
+               assert(!d->host_iface || !strcmp(d->host_iface, nvme_ctrl_get_host_iface(d->c)));
+               assert(!d->trsvcid || !strcmp(d->trsvcid, nvme_ctrl_get_trsvcid(d->c)));
+
+               printf("    ");
+               show_ctrl(d->c);
+       }
+       printf("\n");
+
+       return r;
+}
+
+static unsigned int count_entries(nvme_root_t r)
+{
+       nvme_host_t h;
+       nvme_subsystem_t s;
+       nvme_ctrl_t c;
+       unsigned int i = 0;
+
+       nvme_for_each_host(r, h) {
+               nvme_for_each_subsystem(h, s) {
+                       nvme_subsystem_for_each_ctrl(s, c) {
+                               i++;
+                       }
+               }
+       }
+
+       return i;
+}
+
+static void ctrl_lookups(nvme_root_t r)
+{
+       nvme_host_t h;
+       nvme_subsystem_t s;
+       nvme_ctrl_t c;
+
+       h = nvme_first_host(r);
+       s = nvme_lookup_subsystem(h, DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN);
+
+       printf("  lookup controller:\n");
+       for (int i = 0; i < ARRAY_SIZE(test_data); i++) {
+               struct test_data *d = &test_data[i];
+
+               printf("%10s %10s    ", "", "");
+               show_ctrl(d->c);
+               c = nvme_lookup_ctrl(s, d->transport, d->traddr, d->host_traddr,
+                                    NULL, NULL, NULL);
+               printf("%10s %10s -> ", "-", "-");
+               show_ctrl(c);
+
+               assert(!strcmp(d->transport, nvme_ctrl_get_transport(c)));
+               assert(!strcmp(d->traddr, nvme_ctrl_get_traddr(c)));
+               assert(!strcmp(d->host_traddr, nvme_ctrl_get_host_traddr(c)));
+
+               if (d->host_iface) {
+                       c = nvme_lookup_ctrl(s, d->transport, d->traddr, d->host_traddr,
+                                            d->host_iface, NULL, NULL);
+                       printf("%10s %10s -> ", d->host_iface, "-");
+                       show_ctrl(c);
+
+                       assert(!strcmp(d->transport, nvme_ctrl_get_transport(c)));
+                       assert(!strcmp(d->traddr, nvme_ctrl_get_traddr(c)));
+                       assert(!strcmp(d->host_traddr, nvme_ctrl_get_host_traddr(c)));
+                       assert(!strcmp(d->host_iface, nvme_ctrl_get_host_iface(c)));
+               }
+
+               if (d->trsvcid) {
+                       c = nvme_lookup_ctrl(s, d->transport, d->traddr, d->host_traddr,
+                                            NULL, d->trsvcid, NULL);
+                       printf("%10s %10s -> ", "-", d->trsvcid);
+                       show_ctrl(c);
+
+                       assert(!strcmp(d->transport, nvme_ctrl_get_transport(c)));
+                       assert(!strcmp(d->traddr, nvme_ctrl_get_traddr(c)));
+                       assert(!strcmp(d->host_traddr, nvme_ctrl_get_host_traddr(c)));
+                       assert(!strcmp(d->trsvcid, nvme_ctrl_get_trsvcid(c)));
+               }
+
+               if (d->host_iface && d->trsvcid) {
+                       c = nvme_lookup_ctrl(s, d->transport, d->traddr, d->host_traddr,
+                                            d->host_iface, d->trsvcid, NULL);
+                       printf("%10s %10s -> ", d->host_iface, d->trsvcid);
+                       show_ctrl(c);
+
+                       assert(!strcmp(d->transport, nvme_ctrl_get_transport(c)));
+                       assert(!strcmp(d->traddr, nvme_ctrl_get_traddr(c)));
+                       assert(!strcmp(d->host_traddr, nvme_ctrl_get_host_traddr(c)));
+                       assert(!strcmp(d->trsvcid, nvme_ctrl_get_trsvcid(c)));
+                       assert(!strcmp(d->host_iface, nvme_ctrl_get_host_iface(c)));
+               }
+
+               printf("\n");
+       }
+}
+
+static void test_lookup_1(void)
+{
+       nvme_root_t r;
+
+       printf("test_lookup_1:\n");
+
+       r = create_tree();
+       assert(count_entries(r) == ARRAY_SIZE(test_data));
+       ctrl_lookups(r);
+
+       nvme_free_tree(r);
+}
+
+static void test_lookup_2(void)
+{
+       nvme_root_t r;
+       nvme_subsystem_t s;
+       nvme_host_t h;
+       nvme_ctrl_t c1, c2, c3, c4;
+
+       printf("test_lookup_2:\n");
+
+       r = nvme_create_root(stdout, LOG_DEBUG);
+       assert(r);
+       h = nvme_default_host(r);
+       assert(h);
+
+       s = nvme_lookup_subsystem(h, DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN);
+       assert(s);
+
+       assert(nvme_lookup_ctrl(s, "tcp", "192.168.2.1", "192.168.2.20",
+                               "eth0", "4420", NULL));
+
+       c1 = nvme_lookup_ctrl(s, "tcp", "192.168.1.1", "192.168.1.20",
+                             NULL, NULL, NULL);
+       assert(c1);
+       printf("%10s %10s    ", "", "");
+       show_ctrl(c1);
+
+       c2 = nvme_lookup_ctrl(s, "tcp", "192.168.1.1", "192.168.1.20",
+                             "eth0", NULL, NULL);
+       assert(c1 == c2);
+       printf("%10s %10s    ", "eth0", "-");
+       show_ctrl(c2);
+
+       c3 = nvme_lookup_ctrl(s, "tcp", "192.168.1.1", "192.168.1.20",
+                             NULL, "4420", NULL);
+       assert(c1 == c3);
+       printf("%10s %10s    ", "-", "4420");
+       show_ctrl(c3);
+
+       c4 = nvme_lookup_ctrl(s, "tcp", "192.168.1.1", "192.168.1.20",
+                             "eth0", "4420", NULL);
+       assert(c1 == c4);
+       printf("%10s %10s    ", "eth0", "4420");
+       show_ctrl(c4);
+
+       nvme_free_tree(r);
+}
+
+int main(int argc, char *argv[])
+{
+       test_lookup_1();
+       test_lookup_2();
+
+       return 0;
+}