Skip to content

Commit ecfba16

Browse files
dwsuseigaw
authored andcommitted
test: Add unit test for ctrl lookups
Add a simple unit test which tests the ctrl lookup logic. Signed-off-by: Daniel Wagner <[email protected]>
1 parent b8d0448 commit ecfba16

2 files changed

Lines changed: 272 additions & 0 deletions

File tree

test/meson.build

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,13 @@ uuid = executable(
6666

6767
test('uuid', uuid)
6868

69+
tree = executable(
70+
'tree',
71+
['tree.c'],
72+
dependencies: libnvme_dep,
73+
include_directories: [incdir, internal_incdir]
74+
)
75+
76+
test('tree', tree)
77+
6978
subdir('nbft')

test/tree.c

Lines changed: 263 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,263 @@
1+
// SPDX-License-Identifier: LGPL-2.1-or-later
2+
/**
3+
* This file is part of libnvme.
4+
* Copyright (c) 2023 Daniel Wagner, SUSE LLC
5+
*/
6+
7+
#include <assert.h>
8+
#include <string.h>
9+
10+
#include <ccan/array_size/array_size.h>
11+
12+
#include <libnvme.h>
13+
14+
struct test_data {
15+
/* input data */
16+
const char *subsysname;
17+
const char *subsysnqn;
18+
const char *transport;
19+
const char *traddr;
20+
const char *host_traddr;
21+
const char *host_iface;
22+
const char *trsvcid;
23+
24+
/* track controller generated by input data */
25+
nvme_subsystem_t s;
26+
nvme_ctrl_t c;
27+
int ctrl_id;
28+
};
29+
30+
#define DEFAULT_SUBSYSNAME "subsysname"
31+
#define DEFAULT_SUBSYSNQN "subsysnqn"
32+
33+
struct test_data test_data[] = {
34+
{ DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "tcp", "192.168.1.1", "192.168.1.20", NULL, "4420" },
35+
{ DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "tcp", "192.168.1.1", "192.168.1.20", NULL, "4421" },
36+
{ DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "tcp", "192.168.1.2", "192.168.1.20", "eth1", "4420" },
37+
{ DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "tcp", "192.168.1.2", "192.168.1.20", "eth1", "4421" },
38+
{ DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "rdma", "192.168.1.3", "192.168.1.20", NULL, NULL },
39+
{ DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "rdma", "192.168.1.4", "192.168.1.20", NULL, NULL },
40+
{ DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "fc",
41+
"nn-0x201700a09890f5bf:pn-0x201900a09890f5bf",
42+
"nn-0x200000109b579ef3:pn-0x100000109b579ef3"
43+
},
44+
{ DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN, "fc",
45+
"nn-0x201700a09890f5bf:pn-0x201900a09890f5bf",
46+
"nn-0x200000109b579ef6:pn-0x100000109b579ef6",
47+
},
48+
};
49+
50+
static struct test_data *find_test_data(nvme_ctrl_t c)
51+
{
52+
for (int i = 0; i < ARRAY_SIZE(test_data); i++) {
53+
struct test_data *d = &test_data[i];
54+
55+
if (d->c == c)
56+
return d;
57+
}
58+
59+
return NULL;
60+
}
61+
62+
static void show_ctrl(nvme_ctrl_t c)
63+
{
64+
struct test_data *d = find_test_data(c);
65+
66+
if (d)
67+
printf("ctrl%d ", d->ctrl_id);
68+
69+
printf("0x%p: %s %s %s %s %s\n",
70+
c,
71+
nvme_ctrl_get_transport(c),
72+
nvme_ctrl_get_traddr(c),
73+
nvme_ctrl_get_host_traddr(c),
74+
nvme_ctrl_get_host_iface(c),
75+
nvme_ctrl_get_trsvcid(c));
76+
}
77+
78+
static nvme_root_t create_tree()
79+
{
80+
nvme_root_t r;
81+
nvme_host_t h;
82+
83+
r = nvme_create_root(stdout, LOG_DEBUG);
84+
assert(r);
85+
h = nvme_default_host(r);
86+
assert(h);
87+
88+
printf(" ctrls created:\n");
89+
for (int i = 0; i < ARRAY_SIZE(test_data); i++) {
90+
struct test_data *d = &test_data[i];
91+
92+
d->s = nvme_lookup_subsystem(h, d->subsysname, d->subsysnqn);
93+
assert(d->s);
94+
d->c = nvme_lookup_ctrl(d->s, d->transport, d->traddr,
95+
d->host_traddr, d->host_iface,
96+
d->trsvcid, NULL);
97+
assert(d->c);
98+
d->ctrl_id = i;
99+
100+
assert(!strcmp(d->transport, nvme_ctrl_get_transport(d->c)));
101+
assert(!strcmp(d->traddr, nvme_ctrl_get_traddr(d->c)));
102+
assert(!d->host_traddr || !strcmp(d->host_traddr, nvme_ctrl_get_host_traddr(d->c)));
103+
assert(!d->host_iface || !strcmp(d->host_iface, nvme_ctrl_get_host_iface(d->c)));
104+
assert(!d->trsvcid || !strcmp(d->trsvcid, nvme_ctrl_get_trsvcid(d->c)));
105+
106+
printf(" ");
107+
show_ctrl(d->c);
108+
}
109+
printf("\n");
110+
111+
return r;
112+
}
113+
114+
static unsigned int count_entries(nvme_root_t r)
115+
{
116+
nvme_host_t h;
117+
nvme_subsystem_t s;
118+
nvme_ctrl_t c;
119+
unsigned int i = 0;
120+
121+
nvme_for_each_host(r, h) {
122+
nvme_for_each_subsystem(h, s) {
123+
nvme_subsystem_for_each_ctrl(s, c) {
124+
i++;
125+
}
126+
}
127+
}
128+
129+
return i;
130+
}
131+
132+
static void ctrl_lookups(nvme_root_t r)
133+
{
134+
nvme_host_t h;
135+
nvme_subsystem_t s;
136+
nvme_ctrl_t c;
137+
138+
h = nvme_first_host(r);
139+
s = nvme_lookup_subsystem(h, DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN);
140+
141+
printf(" lookup controller:\n");
142+
for (int i = 0; i < ARRAY_SIZE(test_data); i++) {
143+
struct test_data *d = &test_data[i];
144+
145+
printf("%10s %10s ", "", "");
146+
show_ctrl(d->c);
147+
c = nvme_lookup_ctrl(s, d->transport, d->traddr, d->host_traddr,
148+
NULL, NULL, NULL);
149+
printf("%10s %10s -> ", "-", "-");
150+
show_ctrl(c);
151+
152+
assert(!strcmp(d->transport, nvme_ctrl_get_transport(c)));
153+
assert(!strcmp(d->traddr, nvme_ctrl_get_traddr(c)));
154+
assert(!strcmp(d->host_traddr, nvme_ctrl_get_host_traddr(c)));
155+
156+
if (d->host_iface) {
157+
c = nvme_lookup_ctrl(s, d->transport, d->traddr, d->host_traddr,
158+
d->host_iface, NULL, NULL);
159+
printf("%10s %10s -> ", d->host_iface, "-");
160+
show_ctrl(c);
161+
162+
assert(!strcmp(d->transport, nvme_ctrl_get_transport(c)));
163+
assert(!strcmp(d->traddr, nvme_ctrl_get_traddr(c)));
164+
assert(!strcmp(d->host_traddr, nvme_ctrl_get_host_traddr(c)));
165+
assert(!strcmp(d->host_iface, nvme_ctrl_get_host_iface(c)));
166+
}
167+
168+
if (d->trsvcid) {
169+
c = nvme_lookup_ctrl(s, d->transport, d->traddr, d->host_traddr,
170+
NULL, d->trsvcid, NULL);
171+
printf("%10s %10s -> ", "-", d->trsvcid);
172+
show_ctrl(c);
173+
174+
assert(!strcmp(d->transport, nvme_ctrl_get_transport(c)));
175+
assert(!strcmp(d->traddr, nvme_ctrl_get_traddr(c)));
176+
assert(!strcmp(d->host_traddr, nvme_ctrl_get_host_traddr(c)));
177+
assert(!strcmp(d->trsvcid, nvme_ctrl_get_trsvcid(c)));
178+
}
179+
180+
if (d->host_iface && d->trsvcid) {
181+
c = nvme_lookup_ctrl(s, d->transport, d->traddr, d->host_traddr,
182+
d->host_iface, d->trsvcid, NULL);
183+
printf("%10s %10s -> ", d->host_iface, d->trsvcid);
184+
show_ctrl(c);
185+
186+
assert(!strcmp(d->transport, nvme_ctrl_get_transport(c)));
187+
assert(!strcmp(d->traddr, nvme_ctrl_get_traddr(c)));
188+
assert(!strcmp(d->host_traddr, nvme_ctrl_get_host_traddr(c)));
189+
assert(!strcmp(d->trsvcid, nvme_ctrl_get_trsvcid(c)));
190+
assert(!strcmp(d->host_iface, nvme_ctrl_get_host_iface(c)));
191+
}
192+
193+
printf("\n");
194+
}
195+
}
196+
197+
static void test_lookup_1(void)
198+
{
199+
nvme_root_t r;
200+
201+
printf("test_lookup_1:\n");
202+
203+
r = create_tree();
204+
assert(count_entries(r) == ARRAY_SIZE(test_data));
205+
ctrl_lookups(r);
206+
207+
nvme_free_tree(r);
208+
}
209+
210+
static void test_lookup_2(void)
211+
{
212+
nvme_root_t r;
213+
nvme_subsystem_t s;
214+
nvme_host_t h;
215+
nvme_ctrl_t c1, c2, c3, c4;
216+
217+
printf("test_lookup_2:\n");
218+
219+
r = nvme_create_root(stdout, LOG_DEBUG);
220+
assert(r);
221+
h = nvme_default_host(r);
222+
assert(h);
223+
224+
s = nvme_lookup_subsystem(h, DEFAULT_SUBSYSNAME, DEFAULT_SUBSYSNQN);
225+
assert(s);
226+
227+
assert(nvme_lookup_ctrl(s, "tcp", "192.168.2.1", "192.168.2.20",
228+
"eth0", "4420", NULL));
229+
230+
c1 = nvme_lookup_ctrl(s, "tcp", "192.168.1.1", "192.168.1.20",
231+
NULL, NULL, NULL);
232+
assert(c1);
233+
printf("%10s %10s ", "", "");
234+
show_ctrl(c1);
235+
236+
c2 = nvme_lookup_ctrl(s, "tcp", "192.168.1.1", "192.168.1.20",
237+
"eth0", NULL, NULL);
238+
assert(c1 == c2);
239+
printf("%10s %10s ", "eth0", "-");
240+
show_ctrl(c2);
241+
242+
c3 = nvme_lookup_ctrl(s, "tcp", "192.168.1.1", "192.168.1.20",
243+
NULL, "4420", NULL);
244+
assert(c1 == c3);
245+
printf("%10s %10s ", "-", "4420");
246+
show_ctrl(c3);
247+
248+
c4 = nvme_lookup_ctrl(s, "tcp", "192.168.1.1", "192.168.1.20",
249+
"eth0", "4420", NULL);
250+
assert(c1 == c4);
251+
printf("%10s %10s ", "eth0", "4420");
252+
show_ctrl(c4);
253+
254+
nvme_free_tree(r);
255+
}
256+
257+
int main(int argc, char *argv[])
258+
{
259+
test_lookup_1();
260+
test_lookup_2();
261+
262+
return 0;
263+
}

0 commit comments

Comments
 (0)