]>
Commit | Line | Data |
---|---|---|
11fdf7f2 TL |
1 | /*- |
2 | * BSD LICENSE | |
3 | * | |
4 | * Copyright (c) Intel Corporation. | |
5 | * All rights reserved. | |
6 | * | |
7 | * Redistribution and use in source and binary forms, with or without | |
8 | * modification, are permitted provided that the following conditions | |
9 | * are met: | |
10 | * | |
11 | * * Redistributions of source code must retain the above copyright | |
12 | * notice, this list of conditions and the following disclaimer. | |
13 | * * Redistributions in binary form must reproduce the above copyright | |
14 | * notice, this list of conditions and the following disclaimer in | |
15 | * the documentation and/or other materials provided with the | |
16 | * distribution. | |
17 | * * Neither the name of Intel Corporation nor the names of its | |
18 | * contributors may be used to endorse or promote products derived | |
19 | * from this software without specific prior written permission. | |
20 | * | |
21 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
22 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
23 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
24 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
25 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
26 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
27 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
28 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
29 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
30 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
31 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
32 | */ | |
33 | ||
34 | #include "spdk/stdinc.h" | |
35 | #include "spdk/event.h" | |
36 | ||
37 | #include "spdk_cunit.h" | |
38 | ||
9f95a23c TL |
39 | #include "common/lib/test_env.c" |
40 | #include "common/lib/test_sock.c" | |
41 | ||
11fdf7f2 TL |
42 | #include "../common.c" |
43 | #include "iscsi/portal_grp.c" | |
44 | #include "unit/lib/json_mock.c" | |
45 | ||
9f95a23c TL |
46 | #include "spdk_internal/thread.h" |
47 | ||
48 | DEFINE_STUB(spdk_iscsi_conn_construct, int, | |
49 | (struct spdk_iscsi_portal *portal, struct spdk_sock *sock), | |
50 | 0); | |
51 | ||
11fdf7f2 TL |
52 | struct spdk_iscsi_globals g_spdk_iscsi; |
53 | ||
54 | static int | |
55 | test_setup(void) | |
56 | { | |
57 | TAILQ_INIT(&g_spdk_iscsi.portal_head); | |
58 | TAILQ_INIT(&g_spdk_iscsi.pg_head); | |
59 | pthread_mutex_init(&g_spdk_iscsi.mutex, NULL); | |
60 | return 0; | |
61 | } | |
62 | ||
63 | static void | |
64 | portal_create_ipv4_normal_case(void) | |
65 | { | |
66 | struct spdk_iscsi_portal *p; | |
67 | ||
68 | const char *host = "192.168.2.0"; | |
69 | const char *port = "3260"; | |
70 | const char *cpumask = "1"; | |
71 | ||
72 | p = spdk_iscsi_portal_create(host, port, cpumask); | |
73 | CU_ASSERT(p != NULL); | |
74 | ||
75 | spdk_iscsi_portal_destroy(p); | |
76 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
77 | } | |
78 | ||
79 | static void | |
80 | portal_create_ipv6_normal_case(void) | |
81 | { | |
82 | struct spdk_iscsi_portal *p; | |
83 | ||
84 | const char *host = "[2001:ad6:1234::]"; | |
85 | const char *port = "3260"; | |
86 | const char *cpumask = "1"; | |
87 | ||
88 | p = spdk_iscsi_portal_create(host, port, cpumask); | |
89 | CU_ASSERT(p != NULL); | |
90 | ||
91 | spdk_iscsi_portal_destroy(p); | |
92 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
93 | } | |
94 | ||
95 | static void | |
96 | portal_create_ipv4_wildcard_case(void) | |
97 | { | |
98 | struct spdk_iscsi_portal *p; | |
99 | ||
100 | const char *host = "*"; | |
101 | const char *port = "3260"; | |
102 | const char *cpumask = "1"; | |
103 | ||
104 | p = spdk_iscsi_portal_create(host, port, cpumask); | |
105 | CU_ASSERT(p != NULL); | |
106 | ||
107 | spdk_iscsi_portal_destroy(p); | |
108 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
109 | } | |
110 | ||
111 | static void | |
112 | portal_create_ipv6_wildcard_case(void) | |
113 | { | |
114 | struct spdk_iscsi_portal *p; | |
115 | ||
116 | const char *host = "[*]"; | |
117 | const char *port = "3260"; | |
118 | const char *cpumask = "1"; | |
119 | ||
120 | p = spdk_iscsi_portal_create(host, port, cpumask); | |
121 | CU_ASSERT(p != NULL); | |
122 | ||
123 | spdk_iscsi_portal_destroy(p); | |
124 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
125 | } | |
126 | ||
127 | static void | |
128 | portal_create_cpumask_null_case(void) | |
129 | { | |
130 | struct spdk_iscsi_portal *p; | |
131 | ||
132 | const char *host = "192.168.2.0"; | |
133 | const char *port = "3260"; | |
134 | const char *cpumask = NULL; | |
135 | ||
136 | p = spdk_iscsi_portal_create(host, port, cpumask); | |
137 | CU_ASSERT(p != NULL); | |
138 | ||
139 | spdk_iscsi_portal_destroy(p); | |
140 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
141 | } | |
142 | ||
143 | static void | |
144 | portal_create_cpumask_no_bit_on_case(void) | |
145 | { | |
146 | struct spdk_iscsi_portal *p; | |
147 | ||
148 | const char *host = "192.168.2.0"; | |
149 | const char *port = "3260"; | |
150 | const char *cpumask = "0"; | |
151 | ||
152 | p = spdk_iscsi_portal_create(host, port, cpumask); | |
153 | CU_ASSERT(p == NULL); | |
154 | } | |
155 | ||
156 | static void | |
157 | portal_create_twice_case(void) | |
158 | { | |
159 | struct spdk_iscsi_portal *p1, *p2; | |
160 | ||
161 | const char *host = "192.168.2.0"; | |
162 | const char *port = "3260"; | |
163 | const char *cpumask = "1"; | |
164 | ||
165 | p1 = spdk_iscsi_portal_create(host, port, cpumask); | |
166 | CU_ASSERT(p1 != NULL); | |
167 | ||
168 | p2 = spdk_iscsi_portal_create(host, port, cpumask); | |
169 | CU_ASSERT(p2 == NULL); | |
170 | ||
171 | spdk_iscsi_portal_destroy(p1); | |
172 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
173 | } | |
174 | ||
175 | static void | |
176 | parse_portal_ipv4_normal_case(void) | |
177 | { | |
178 | const char *string = "192.168.2.0:3260@1"; | |
179 | const char *host_str = "192.168.2.0"; | |
180 | const char *port_str = "3260"; | |
181 | struct spdk_cpuset *cpumask_val; | |
182 | struct spdk_iscsi_portal *p = NULL; | |
183 | int rc; | |
184 | ||
185 | cpumask_val = spdk_cpuset_alloc(); | |
186 | SPDK_CU_ASSERT_FATAL(cpumask_val != NULL); | |
187 | ||
188 | spdk_cpuset_set_cpu(cpumask_val, 0, true); | |
189 | ||
9f95a23c | 190 | rc = iscsi_parse_portal(string, &p, 0); |
11fdf7f2 TL |
191 | CU_ASSERT(rc == 0); |
192 | SPDK_CU_ASSERT_FATAL(p != NULL); | |
193 | CU_ASSERT(strcmp(p->host, host_str) == 0); | |
194 | CU_ASSERT(strcmp(p->port, port_str) == 0); | |
195 | CU_ASSERT(spdk_cpuset_equal(p->cpumask, cpumask_val)); | |
196 | ||
197 | spdk_iscsi_portal_destroy(p); | |
198 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
199 | ||
200 | spdk_cpuset_free(cpumask_val); | |
201 | } | |
202 | ||
203 | static void | |
204 | parse_portal_ipv6_normal_case(void) | |
205 | { | |
206 | const char *string = "[2001:ad6:1234::]:3260@1"; | |
207 | const char *host_str = "[2001:ad6:1234::]"; | |
208 | const char *port_str = "3260"; | |
209 | struct spdk_cpuset *cpumask_val; | |
210 | struct spdk_iscsi_portal *p = NULL; | |
211 | int rc; | |
212 | ||
213 | cpumask_val = spdk_cpuset_alloc(); | |
214 | SPDK_CU_ASSERT_FATAL(cpumask_val != NULL); | |
215 | ||
216 | spdk_cpuset_set_cpu(cpumask_val, 0, true); | |
217 | ||
9f95a23c | 218 | rc = iscsi_parse_portal(string, &p, 0); |
11fdf7f2 TL |
219 | CU_ASSERT(rc == 0); |
220 | SPDK_CU_ASSERT_FATAL(p != NULL); | |
221 | CU_ASSERT(strcmp(p->host, host_str) == 0); | |
222 | CU_ASSERT(strcmp(p->port, port_str) == 0); | |
223 | CU_ASSERT(spdk_cpuset_equal(p->cpumask, cpumask_val)); | |
224 | ||
225 | spdk_iscsi_portal_destroy(p); | |
226 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
227 | ||
228 | spdk_cpuset_free(cpumask_val); | |
229 | } | |
230 | ||
231 | static void | |
232 | parse_portal_ipv4_skip_cpumask_case(void) | |
233 | { | |
234 | const char *string = "192.168.2.0:3260"; | |
235 | const char *host_str = "192.168.2.0"; | |
236 | const char *port_str = "3260"; | |
237 | struct spdk_cpuset *cpumask_val; | |
238 | struct spdk_iscsi_portal *p = NULL; | |
239 | int rc; | |
240 | ||
241 | cpumask_val = spdk_app_get_core_mask(); | |
242 | ||
9f95a23c | 243 | rc = iscsi_parse_portal(string, &p, 0); |
11fdf7f2 TL |
244 | CU_ASSERT(rc == 0); |
245 | SPDK_CU_ASSERT_FATAL(p != NULL); | |
246 | CU_ASSERT(strcmp(p->host, host_str) == 0); | |
247 | CU_ASSERT(strcmp(p->port, port_str) == 0); | |
248 | CU_ASSERT(spdk_cpuset_equal(p->cpumask, cpumask_val)); | |
249 | ||
250 | spdk_iscsi_portal_destroy(p); | |
251 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
252 | } | |
253 | ||
254 | static void | |
255 | parse_portal_ipv6_skip_cpumask_case(void) | |
256 | { | |
257 | const char *string = "[2001:ad6:1234::]:3260"; | |
258 | const char *host_str = "[2001:ad6:1234::]"; | |
259 | const char *port_str = "3260"; | |
260 | struct spdk_cpuset *cpumask_val; | |
261 | struct spdk_iscsi_portal *p = NULL; | |
262 | int rc; | |
263 | ||
264 | cpumask_val = spdk_app_get_core_mask(); | |
265 | ||
9f95a23c | 266 | rc = iscsi_parse_portal(string, &p, 0); |
11fdf7f2 TL |
267 | CU_ASSERT(rc == 0); |
268 | SPDK_CU_ASSERT_FATAL(p != NULL); | |
269 | CU_ASSERT(strcmp(p->host, host_str) == 0); | |
270 | CU_ASSERT(strcmp(p->port, port_str) == 0); | |
271 | CU_ASSERT(spdk_cpuset_equal(p->cpumask, cpumask_val)); | |
272 | ||
273 | spdk_iscsi_portal_destroy(p); | |
274 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
275 | } | |
276 | ||
277 | static void | |
278 | parse_portal_ipv4_skip_port_and_cpumask_case(void) | |
279 | { | |
280 | const char *string = "192.168.2.0"; | |
281 | const char *host_str = "192.168.2.0"; | |
282 | const char *port_str = "3260"; | |
283 | struct spdk_cpuset *cpumask_val; | |
284 | struct spdk_iscsi_portal *p = NULL; | |
285 | int rc; | |
286 | ||
287 | cpumask_val = spdk_app_get_core_mask(); | |
288 | ||
9f95a23c | 289 | rc = iscsi_parse_portal(string, &p, 0); |
11fdf7f2 TL |
290 | CU_ASSERT(rc == 0); |
291 | SPDK_CU_ASSERT_FATAL(p != NULL); | |
292 | CU_ASSERT(strcmp(p->host, host_str) == 0); | |
293 | CU_ASSERT(strcmp(p->port, port_str) == 0); | |
294 | CU_ASSERT(spdk_cpuset_equal(p->cpumask, cpumask_val)); | |
295 | ||
296 | spdk_iscsi_portal_destroy(p); | |
297 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
298 | } | |
299 | ||
300 | static void | |
301 | parse_portal_ipv6_skip_port_and_cpumask_case(void) | |
302 | { | |
303 | const char *string = "[2001:ad6:1234::]"; | |
304 | const char *host_str = "[2001:ad6:1234::]"; | |
305 | const char *port_str = "3260"; | |
306 | struct spdk_cpuset *cpumask_val; | |
307 | struct spdk_iscsi_portal *p = NULL; | |
308 | int rc; | |
309 | ||
310 | cpumask_val = spdk_app_get_core_mask(); | |
311 | ||
9f95a23c | 312 | rc = iscsi_parse_portal(string, &p, 0); |
11fdf7f2 TL |
313 | CU_ASSERT(rc == 0); |
314 | SPDK_CU_ASSERT_FATAL(p != NULL); | |
315 | CU_ASSERT(strcmp(p->host, host_str) == 0); | |
316 | CU_ASSERT(strcmp(p->port, port_str) == 0); | |
317 | CU_ASSERT(spdk_cpuset_equal(p->cpumask, cpumask_val)); | |
318 | ||
319 | spdk_iscsi_portal_destroy(p); | |
320 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
321 | } | |
322 | ||
323 | static void | |
324 | portal_grp_register_unregister_case(void) | |
325 | { | |
326 | struct spdk_iscsi_portal *p; | |
327 | struct spdk_iscsi_portal_grp *pg1, *pg2; | |
328 | int rc; | |
329 | const char *host = "192.168.2.0"; | |
330 | const char *port = "3260"; | |
331 | const char *cpumask = "1"; | |
332 | ||
333 | pg1 = spdk_iscsi_portal_grp_create(1); | |
334 | CU_ASSERT(pg1 != NULL); | |
335 | ||
336 | p = spdk_iscsi_portal_create(host, port, cpumask); | |
337 | CU_ASSERT(p != NULL); | |
338 | ||
339 | spdk_iscsi_portal_grp_add_portal(pg1, p); | |
340 | ||
341 | rc = spdk_iscsi_portal_grp_register(pg1); | |
342 | CU_ASSERT(rc == 0); | |
343 | ||
344 | pg2 = spdk_iscsi_portal_grp_unregister(1); | |
345 | CU_ASSERT(pg2 != NULL); | |
346 | CU_ASSERT(pg1 == pg2); | |
347 | ||
348 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.pg_head)); | |
349 | ||
350 | spdk_iscsi_portal_grp_destroy(pg1); | |
351 | ||
352 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
353 | } | |
354 | ||
355 | static void | |
356 | portal_grp_register_twice_case(void) | |
357 | { | |
358 | struct spdk_iscsi_portal *p; | |
359 | struct spdk_iscsi_portal_grp *pg1, *pg2; | |
360 | int rc; | |
361 | const char *host = "192.168.2.0"; | |
362 | const char *port = "3260"; | |
363 | const char *cpumask = "1"; | |
364 | ||
365 | pg1 = spdk_iscsi_portal_grp_create(1); | |
366 | CU_ASSERT(pg1 != NULL); | |
367 | ||
368 | p = spdk_iscsi_portal_create(host, port, cpumask); | |
369 | CU_ASSERT(p != NULL); | |
370 | ||
371 | spdk_iscsi_portal_grp_add_portal(pg1, p); | |
372 | ||
373 | rc = spdk_iscsi_portal_grp_register(pg1); | |
374 | CU_ASSERT(rc == 0); | |
375 | ||
376 | rc = spdk_iscsi_portal_grp_register(pg1); | |
377 | CU_ASSERT(rc != 0); | |
378 | ||
379 | pg2 = spdk_iscsi_portal_grp_unregister(1); | |
380 | CU_ASSERT(pg2 != NULL); | |
381 | CU_ASSERT(pg1 == pg2); | |
382 | ||
383 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.pg_head)); | |
384 | ||
385 | spdk_iscsi_portal_grp_destroy(pg1); | |
386 | ||
387 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
388 | } | |
389 | ||
390 | static void | |
391 | portal_grp_add_delete_case(void) | |
392 | { | |
9f95a23c TL |
393 | struct spdk_sock sock = {}; |
394 | struct spdk_thread *thread; | |
11fdf7f2 TL |
395 | struct spdk_iscsi_portal_grp *pg1, *pg2; |
396 | struct spdk_iscsi_portal *p; | |
397 | int rc; | |
398 | ||
9f95a23c TL |
399 | thread = spdk_thread_create(NULL, NULL); |
400 | spdk_set_thread(thread); | |
401 | ||
11fdf7f2 TL |
402 | const char *host = "192.168.2.0"; |
403 | const char *port = "3260"; | |
404 | const char *cpumask = "1"; | |
405 | ||
406 | /* internal of add_portal_group */ | |
407 | pg1 = spdk_iscsi_portal_grp_create(1); | |
408 | CU_ASSERT(pg1 != NULL); | |
409 | ||
410 | p = spdk_iscsi_portal_create(host, port, cpumask); | |
411 | CU_ASSERT(p != NULL); | |
412 | ||
413 | spdk_iscsi_portal_grp_add_portal(pg1, p); | |
414 | ||
9f95a23c | 415 | MOCK_SET(spdk_sock_listen, &sock); |
11fdf7f2 TL |
416 | rc = spdk_iscsi_portal_grp_open(pg1); |
417 | CU_ASSERT(rc == 0); | |
9f95a23c | 418 | MOCK_CLEAR_P(spdk_sock_listen); |
11fdf7f2 TL |
419 | |
420 | rc = spdk_iscsi_portal_grp_register(pg1); | |
421 | CU_ASSERT(rc == 0); | |
422 | ||
423 | /* internal of delete_portal_group */ | |
424 | pg2 = spdk_iscsi_portal_grp_unregister(1); | |
425 | CU_ASSERT(pg2 != NULL); | |
426 | CU_ASSERT(pg1 == pg2); | |
427 | ||
428 | spdk_iscsi_portal_grp_release(pg2); | |
429 | ||
430 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
431 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.pg_head)); | |
9f95a23c TL |
432 | |
433 | spdk_thread_exit(thread); | |
434 | spdk_thread_destroy(thread); | |
435 | } | |
436 | ||
437 | static void | |
438 | portal_grp_add_delete_twice_case(void) | |
439 | { | |
440 | struct spdk_sock sock = {}; | |
441 | struct spdk_thread *thread; | |
442 | struct spdk_iscsi_portal_grp *pg1, *pg2; | |
443 | struct spdk_iscsi_portal *p; | |
444 | int rc; | |
445 | ||
446 | const char *host = "192.168.2.0"; | |
447 | const char *port1 = "3260", *port2 = "3261"; | |
448 | const char *cpumask = "1"; | |
449 | ||
450 | thread = spdk_thread_create(NULL, NULL); | |
451 | spdk_set_thread(thread); | |
452 | ||
453 | /* internal of add_portal_group related */ | |
454 | pg1 = spdk_iscsi_portal_grp_create(1); | |
455 | CU_ASSERT(pg1 != NULL); | |
456 | ||
457 | p = spdk_iscsi_portal_create(host, port1, cpumask); | |
458 | CU_ASSERT(p != NULL); | |
459 | ||
460 | spdk_iscsi_portal_grp_add_portal(pg1, p); | |
461 | ||
462 | MOCK_SET(spdk_sock_listen, &sock); | |
463 | rc = spdk_iscsi_portal_grp_open(pg1); | |
464 | CU_ASSERT(rc == 0); | |
465 | ||
466 | rc = spdk_iscsi_portal_grp_register(pg1); | |
467 | CU_ASSERT(rc == 0); | |
468 | ||
469 | /* internal of add_portal_group related */ | |
470 | pg2 = spdk_iscsi_portal_grp_create(2); | |
471 | CU_ASSERT(pg2 != NULL); | |
472 | ||
473 | p = spdk_iscsi_portal_create(host, port2, cpumask); | |
474 | CU_ASSERT(p != NULL); | |
475 | ||
476 | spdk_iscsi_portal_grp_add_portal(pg2, p); | |
477 | ||
478 | rc = spdk_iscsi_portal_grp_open(pg2); | |
479 | CU_ASSERT(rc == 0); | |
480 | ||
481 | rc = spdk_iscsi_portal_grp_register(pg2); | |
482 | CU_ASSERT(rc == 0); | |
483 | ||
484 | /* internal of destroy_portal_group related */ | |
485 | iscsi_portal_grp_close(pg1); | |
486 | iscsi_portal_grp_close(pg2); | |
487 | ||
488 | spdk_iscsi_portal_grps_destroy(); | |
489 | ||
490 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.portal_head)); | |
491 | CU_ASSERT(TAILQ_EMPTY(&g_spdk_iscsi.pg_head)); | |
492 | ||
493 | MOCK_CLEAR_P(spdk_sock_listen); | |
494 | spdk_thread_exit(thread); | |
495 | spdk_thread_destroy(thread); | |
11fdf7f2 TL |
496 | } |
497 | ||
498 | int | |
499 | main(int argc, char **argv) | |
500 | { | |
501 | CU_pSuite suite = NULL; | |
502 | unsigned int num_failures; | |
503 | ||
504 | if (CU_initialize_registry() != CUE_SUCCESS) { | |
505 | return CU_get_error(); | |
506 | } | |
507 | ||
508 | suite = CU_add_suite("portal_grp_suite", test_setup, NULL); | |
509 | if (suite == NULL) { | |
510 | CU_cleanup_registry(); | |
511 | return CU_get_error(); | |
512 | } | |
513 | ||
514 | if ( | |
515 | CU_add_test(suite, "portal create ipv4 normal case", | |
516 | portal_create_ipv4_normal_case) == NULL | |
517 | || CU_add_test(suite, "portal create ipv6 normal case", | |
518 | portal_create_ipv6_normal_case) == NULL | |
519 | || CU_add_test(suite, "portal create ipv4 wildcard case", | |
520 | portal_create_ipv4_wildcard_case) == NULL | |
521 | || CU_add_test(suite, "portal create ipv6 wildcard case", | |
522 | portal_create_ipv6_wildcard_case) == NULL | |
523 | || CU_add_test(suite, "portal create cpumask NULL case", | |
524 | portal_create_cpumask_null_case) == NULL | |
525 | || CU_add_test(suite, "portal create cpumask no bit on case", | |
526 | portal_create_cpumask_no_bit_on_case) == NULL | |
527 | || CU_add_test(suite, "portal create twice case", | |
528 | portal_create_twice_case) == NULL | |
529 | || CU_add_test(suite, "parse portal ipv4 normal case", | |
530 | parse_portal_ipv4_normal_case) == NULL | |
531 | || CU_add_test(suite, "parse portal ipv6 normal case", | |
532 | parse_portal_ipv6_normal_case) == NULL | |
533 | || CU_add_test(suite, "parse portal ipv4 skip cpumask case", | |
534 | parse_portal_ipv4_skip_cpumask_case) == NULL | |
535 | || CU_add_test(suite, "parse portal ipv6 skip cpumask case", | |
536 | parse_portal_ipv6_skip_cpumask_case) == NULL | |
537 | || CU_add_test(suite, "parse portal ipv4 skip port and cpumask case", | |
538 | parse_portal_ipv4_skip_port_and_cpumask_case) == NULL | |
539 | || CU_add_test(suite, "parse portal ipv6 skip port and cpumask case", | |
540 | parse_portal_ipv6_skip_port_and_cpumask_case) == NULL | |
541 | || CU_add_test(suite, "portal group register/unregister case", | |
542 | portal_grp_register_unregister_case) == NULL | |
543 | || CU_add_test(suite, "portal group register twice case", | |
544 | portal_grp_register_twice_case) == NULL | |
545 | || CU_add_test(suite, "portal group add/delete case", | |
546 | portal_grp_add_delete_case) == NULL | |
9f95a23c TL |
547 | || CU_add_test(suite, "portal group add/delete twice case", |
548 | portal_grp_add_delete_twice_case) == NULL | |
11fdf7f2 TL |
549 | ) { |
550 | CU_cleanup_registry(); | |
551 | return CU_get_error(); | |
552 | } | |
553 | ||
554 | CU_basic_set_mode(CU_BRM_VERBOSE); | |
555 | CU_basic_run_tests(); | |
556 | num_failures = CU_get_number_of_failures(); | |
557 | CU_cleanup_registry(); | |
558 | return num_failures; | |
559 | } |