Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_utils.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2013-2015 Tobias Brunner
3: * HSR Hochschule fuer Technik Rapperswil
4: *
5: * This program is free software; you can redistribute it and/or modify it
6: * under the terms of the GNU General Public License as published by the
7: * Free Software Foundation; either version 2 of the License, or (at your
8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
9: *
10: * This program is distributed in the hope that it will be useful, but
11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13: * for more details.
14: */
15:
16: #include "test_suite.h"
17:
18: #include <library.h>
19: #include <utils/utils.h>
20: #include <ipsec/ipsec_types.h>
21: #include <credentials/keys/public_key.h>
22:
23: #include <time.h>
24:
25: /*******************************************************************************
26: * object storage on lib
27: */
28:
29: START_TEST(test_objects)
30: {
31: char *k1 = "key1", *k2 = "key2";
32: char *v1 = "val1", *val;
33:
34: ck_assert(lib->get(lib, k1) == NULL);
35:
36: ck_assert(lib->set(lib, k1, v1));
37: ck_assert(!lib->set(lib, k1, v1));
38:
39: val = lib->get(lib, k1);
40: ck_assert(val != NULL);
41: ck_assert(streq(val, v1));
42:
43: ck_assert(lib->set(lib, k1, NULL));
44: ck_assert(!lib->set(lib, k2, NULL));
45:
46: ck_assert(lib->get(lib, k1) == NULL);
47: }
48: END_TEST
49:
50: /*******************************************************************************
51: * test return_... functions
52: */
53:
54: START_TEST(test_return_functions)
55: {
56: ck_assert(return_null() == NULL);
57: ck_assert(return_null("asdf", 5, NULL, 1, "qwer") == NULL);
58:
59: ck_assert(return_true() == TRUE);
60: ck_assert(return_true("asdf", 5, NULL, 1, "qwer") == TRUE);
61:
62: ck_assert(return_false() == FALSE);
63: ck_assert(return_false("asdf", 5, NULL, 1, "qwer") == FALSE);
64:
65: ck_assert(return_failed() == FAILED);
66: ck_assert(return_failed("asdf", 5, NULL, 1, "qwer") == FAILED);
67:
68: ck_assert(return_success() == SUCCESS);
69: ck_assert(return_success("asdf", 5, NULL, 1, "qwer") == SUCCESS);
70:
71: /* just make sure this works */
72: nop();
73: nop("asdf", 5, NULL, 1, "qwer");
74: }
75: END_TEST
76:
77: /*******************************************************************************
78: * timeval_add_ms
79: */
80:
81: START_TEST(test_timeval_add_ms)
82: {
83: timeval_t tv;
84:
85: tv.tv_sec = 0;
86: tv.tv_usec = 0;
87: timeval_add_ms(&tv, 0);
88: ck_assert_int_eq(tv.tv_sec, 0);
89: ck_assert_int_eq(tv.tv_usec, 0);
90:
91: timeval_add_ms(&tv, 1);
92: ck_assert_int_eq(tv.tv_sec, 0);
93: ck_assert_int_eq(tv.tv_usec, 1000);
94:
95: timeval_add_ms(&tv, 0);
96: ck_assert_int_eq(tv.tv_sec, 0);
97: ck_assert_int_eq(tv.tv_usec, 1000);
98:
99: timeval_add_ms(&tv, 999);
100: ck_assert_int_eq(tv.tv_sec, 1);
101: ck_assert_int_eq(tv.tv_usec, 0);
102:
103: timeval_add_ms(&tv, 0);
104: ck_assert_int_eq(tv.tv_sec, 1);
105: ck_assert_int_eq(tv.tv_usec, 0);
106:
107: timeval_add_ms(&tv, 1000);
108: ck_assert_int_eq(tv.tv_sec, 2);
109: ck_assert_int_eq(tv.tv_usec, 0);
110:
111: timeval_add_ms(&tv, 1500);
112: ck_assert_int_eq(tv.tv_sec, 3);
113: ck_assert_int_eq(tv.tv_usec, 500000);
114: }
115: END_TEST
116:
117: /*******************************************************************************
118: * timespan_from_string
119: */
120:
121: static struct {
122: char *s;
123: char *u;
124: bool v;
125: time_t t;
126: } ts_data[] = {
127: {NULL, NULL, FALSE, 0},
128: {"", NULL, FALSE, 0},
129: {"a", NULL, FALSE, 0},
130: {"0", NULL, TRUE, 0},
131: {"5", NULL, TRUE, 5},
132: {"5s", NULL, TRUE, 5},
133: {"5m", NULL, TRUE, 300},
134: {"5ms", NULL, TRUE, 300},
135: {"5h", NULL, TRUE, 18000},
136: {"5d", NULL, TRUE, 432000},
137: {"5x", NULL, FALSE, 0},
138: {"5", "", TRUE, 5},
139: {"5", "m", TRUE, 300},
140: {"5", "ms", TRUE, 300},
141: {"5", "x", FALSE, 0},
142: {"5x", "m", FALSE, 0},
143: {"18446744073709551616", NULL, FALSE, 0},
144: };
145:
146: START_TEST(test_timespan_from_string)
147: {
148: time_t val = 42;
149:
150: ck_assert(timespan_from_string(ts_data[_i].s, ts_data[_i].u,
151: NULL) == ts_data[_i].v);
152: ck_assert(timespan_from_string(ts_data[_i].s, ts_data[_i].u,
153: &val) == ts_data[_i].v);
154: if (ts_data[_i].v)
155: {
156: ck_assert_int_eq(val, ts_data[_i].t);
157: }
158: else
159: {
160: ck_assert_int_eq(val, 42);
161: }
162: }
163: END_TEST
164:
165: /*******************************************************************************
166: * htoun/untoh
167: */
168:
169: START_TEST(test_htoun)
170: {
171: chunk_t net64, expected;
172: uint16_t host16 = 513;
173: uint32_t net16 = 0, host32 = 67305985;
174: uint64_t net32 = 0, host64 = 578437695752307201ULL;
175:
176: net64 = chunk_alloca(16);
177: memset(net64.ptr, 0, net64.len);
178:
179: expected = chunk_from_chars(0x00, 0x02, 0x01, 0x00);
180: htoun16((char*)&net16 + 1, host16);
181: ck_assert(chunk_equals(expected, chunk_from_thing(net16)));
182:
183: expected = chunk_from_chars(0x00, 0x00, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00);
184: htoun32((uint16_t*)&net32 + 1, host32);
185: ck_assert(chunk_equals(expected, chunk_from_thing(net32)));
186:
187: expected = chunk_from_chars(0x00, 0x00, 0x00, 0x00,
188: 0x08, 0x07, 0x06, 0x05,
189: 0x04, 0x03, 0x02, 0x01,
190: 0x00, 0x00, 0x00, 0x00);
191: htoun64((uint32_t*)net64.ptr + 1, host64);
192: ck_assert(chunk_equals(expected, net64));
193: }
194: END_TEST
195:
196: START_TEST(test_untoh)
197: {
198: chunk_t net;
199: uint16_t host16;
200: uint32_t host32;
201: uint64_t host64;
202:
203: net = chunk_from_chars(0x00, 0x02, 0x01, 0x00);
204: host16 = untoh16(net.ptr + 1);
205: ck_assert(host16 == 513);
206:
207: net = chunk_from_chars(0x00, 0x00, 0x04, 0x03, 0x02, 0x01, 0x00, 0x00);
208: host32 = untoh32(net.ptr + 2);
209: ck_assert(host32 == 67305985);
210:
211: net = chunk_from_chars(0x00, 0x00, 0x00, 0x00, 0x08, 0x07, 0x06, 0x05,
212: 0x04, 0x03, 0x02, 0x01, 0x00, 0x00, 0x00, 0x00);
213: host64 = untoh64(net.ptr + 4);
214: ck_assert(host64 == 578437695752307201ULL);
215: }
216: END_TEST
217:
218: /*******************************************************************************
219: * pad_len/round_up/down
220: */
221:
222: START_TEST(test_round)
223: {
224: ck_assert_int_eq(pad_len(0, 4), 0);
225: ck_assert_int_eq(pad_len(1, 4), 3);
226: ck_assert_int_eq(pad_len(2, 4), 2);
227: ck_assert_int_eq(pad_len(3, 4), 1);
228: ck_assert_int_eq(pad_len(4, 4), 0);
229: ck_assert_int_eq(pad_len(5, 4), 3);
230:
231: ck_assert_int_eq(round_up(0, 4), 0);
232: ck_assert_int_eq(round_up(1, 4), 4);
233: ck_assert_int_eq(round_up(2, 4), 4);
234: ck_assert_int_eq(round_up(3, 4), 4);
235: ck_assert_int_eq(round_up(4, 4), 4);
236: ck_assert_int_eq(round_up(5, 4), 8);
237:
238: ck_assert_int_eq(round_down(0, 4), 0);
239: ck_assert_int_eq(round_down(1, 4), 0);
240: ck_assert_int_eq(round_down(2, 4), 0);
241: ck_assert_int_eq(round_down(3, 4), 0);
242: ck_assert_int_eq(round_down(4, 4), 4);
243: ck_assert_int_eq(round_down(5, 4), 4);
244: }
245: END_TEST
246:
247: /*******************************************************************************
248: * streq
249: */
250:
251: static struct {
252: char *a;
253: char *b;
254: bool eq;
255: bool case_eq;
256: } streq_data[] = {
257: {NULL, NULL, TRUE, TRUE},
258: {NULL, "", FALSE, FALSE},
259: {"", NULL, FALSE, FALSE},
260: {"abc", "", FALSE, FALSE},
261: {"abc", "abc", TRUE, TRUE},
262: {"abc", "ABC", FALSE, TRUE},
263: };
264:
265: START_TEST(test_streq)
266: {
267: bool eq;
268:
269: ck_assert(streq(streq_data[_i].a, streq_data[_i].a));
270: ck_assert(streq(streq_data[_i].b, streq_data[_i].b));
271: eq = streq(streq_data[_i].a, streq_data[_i].b);
272: ck_assert(eq == streq_data[_i].eq);
273:
274: ck_assert(strcaseeq(streq_data[_i].a, streq_data[_i].a));
275: ck_assert(strcaseeq(streq_data[_i].b, streq_data[_i].b));
276: eq = strcaseeq(streq_data[_i].a, streq_data[_i].b);
277: ck_assert(eq == streq_data[_i].case_eq);
278: }
279: END_TEST
280:
281: /*******************************************************************************
282: * strneq
283: */
284:
285: static struct {
286: char *a;
287: char *b;
288: size_t n;
289: bool eq;
290: bool case_eq;
291: } strneq_data[] = {
292: {NULL, NULL, 0, TRUE, TRUE},
293: {NULL, NULL, 10, TRUE, TRUE},
294: {NULL, "", 0, FALSE, FALSE},
295: {"", NULL, 0, FALSE, FALSE},
296: {"abc", "", 0, TRUE, TRUE},
297: {"abc", "", 1, FALSE, FALSE},
298: {"abc", "ab", 1, TRUE, TRUE},
299: {"abc", "ab", 2, TRUE, TRUE},
300: {"abc", "ab", 3, FALSE, FALSE},
301: {"abc", "abc", 3, TRUE, TRUE},
302: {"abc", "abc", 4, TRUE, TRUE},
303: {"abc", "abC", 2, TRUE, TRUE},
304: {"abc", "abC", 3, FALSE, TRUE},
305: };
306:
307: START_TEST(test_strneq)
308: {
309: bool eq;
310:
311: ck_assert(strneq(strneq_data[_i].a, strneq_data[_i].a, strneq_data[_i].n));
312: ck_assert(strneq(strneq_data[_i].b, strneq_data[_i].b, strneq_data[_i].n));
313: eq = strneq(strneq_data[_i].a, strneq_data[_i].b, strneq_data[_i].n);
314: ck_assert(eq == strneq_data[_i].eq);
315:
316: ck_assert(strncaseeq(strneq_data[_i].a, strneq_data[_i].a, strneq_data[_i].n));
317: ck_assert(strncaseeq(strneq_data[_i].b, strneq_data[_i].b, strneq_data[_i].n));
318: eq = strncaseeq(strneq_data[_i].a, strneq_data[_i].b, strneq_data[_i].n);
319: ck_assert(eq == strneq_data[_i].case_eq);
320: }
321: END_TEST
322:
323: /*******************************************************************************
324: * strpfx
325: */
326:
327: static struct {
328: char *str;
329: char *pfx;
330: bool prefix;
331: bool case_prefix;
332: } strpfx_data[] = {
333: {"", "", TRUE, TRUE},
334: {"abc", "", TRUE, TRUE},
335: {"abc", "a", TRUE, TRUE},
336: {"abc", "ab", TRUE, TRUE},
337: {"abc", "abc", TRUE, TRUE},
338: {"abc", "abcd", FALSE, FALSE},
339: {"abc", "AB", FALSE, TRUE},
340: {"ABC", "ab", FALSE, TRUE},
341: {" abc", "abc", FALSE, FALSE},
342: };
343:
344: START_TEST(test_strpfx)
345: {
346: bool prefix;
347:
348: prefix = strpfx(strpfx_data[_i].str, strpfx_data[_i].pfx);
349: ck_assert(prefix == strpfx_data[_i].prefix);
350: prefix = strcasepfx(strpfx_data[_i].str, strpfx_data[_i].pfx);
351: ck_assert(prefix == strpfx_data[_i].case_prefix);
352: }
353: END_TEST
354:
355: /*******************************************************************************
356: * malloc_align/free_align
357: */
358:
359: START_TEST(test_malloc_align)
360: {
361: void *ptr[128][256];
362: int size, align;
363:
364: for (size = 0; size < countof(ptr); size++)
365: {
366: for (align = 0; align < countof(ptr[0]); align++)
367: {
368: ptr[size][align] = malloc_align(size, align);
369: if (align)
370: {
371: ck_assert((uintptr_t)ptr[size][align] % align == 0);
372: }
373: if (size)
374: {
375: ck_assert(ptr[size][align]);
376: memset(ptr[size][align], 0xEF, size);
377: }
378: }
379: }
380: for (size = 0; size < countof(ptr); size++)
381: {
382: for (align = 0; align < countof(ptr[0]); align++)
383: {
384: free_align(ptr[size][align]);
385: }
386: }
387: }
388: END_TEST
389:
390: /*******************************************************************************
391: * memxor
392: */
393:
394: static void do_memxor(chunk_t a, chunk_t b, chunk_t exp)
395: {
396: chunk_t dst;
397:
398: dst = chunk_clonea(a);
399: dst.len = b.len;
400: memxor(dst.ptr, b.ptr, b.len);
401: ck_assert(chunk_equals(dst, exp));
402: }
403:
404: START_TEST(test_memxor)
405: {
406: chunk_t a, b, dst;
407: int i;
408:
409: a = chunk_alloca(64);
410: memset(a.ptr, 0, a.len);
411: b = chunk_alloca(64);
412: for (i = 0; i < 64; i++)
413: {
414: b.ptr[i] = i;
415: b.len = i;
416: do_memxor(a, b, b);
417: }
418: b.len = 64;
419: do_memxor(a, b, b);
420:
421: dst = chunk_clonea(a);
422: memxor(dst.ptr, b.ptr, b.len);
423: ck_assert(chunk_equals(dst, b));
424:
425: memxor(dst.ptr, b.ptr, 0);
426: memxor(dst.ptr, b.ptr, 1);
427: memxor(dst.ptr + 1, b.ptr + 1, 1);
428: memxor(dst.ptr + 2, b.ptr + 2, b.len - 2);
429: ck_assert(chunk_equals(dst, a));
430: }
431: END_TEST
432:
433: START_TEST(test_memxor_aligned)
434: {
435: uint64_t a = 0, b = 0;
436: chunk_t ca, cb;
437: int i;
438:
439: ca = chunk_from_thing(a);
440: cb = chunk_from_thing(b);
441:
442: for (i = 0; i < 8; i++)
443: {
444: cb.ptr[i] = i + 1;
445: }
446:
447: /* 64-bit aligned */
448: memxor(ca.ptr, cb.ptr, 8);
449: ck_assert(a == b);
450: /* 32-bit aligned source */
451: a = 0;
452: memxor(ca.ptr, cb.ptr + 4, 4);
453: ck_assert(chunk_equals(ca, chunk_from_chars(0x05, 0x06, 0x07, 0x08,
454: 0x00, 0x00, 0x00, 0x00)));
455: /* 16-bit aligned source */
456: a = 0;
457: memxor(ca.ptr, cb.ptr + 2, 6);
458: ck_assert(chunk_equals(ca, chunk_from_chars(0x03, 0x04, 0x05, 0x06,
459: 0x07, 0x08, 0x00, 0x00)));
460: /* 8-bit aligned source */
461: a = 0;
462: memxor(ca.ptr, cb.ptr + 1, 7);
463: ck_assert(chunk_equals(ca, chunk_from_chars(0x02, 0x03, 0x04, 0x05,
464: 0x06, 0x07, 0x08, 0x00)));
465: }
466: END_TEST
467:
468: /*******************************************************************************
469: * memeq/const
470: */
471:
472: static struct {
473: char *a;
474: char *b;
475: size_t n;
476: bool res;
477: } memeq_data[] = {
478: {NULL, NULL, 0, TRUE},
479: {"a", "b", 0, TRUE},
480: {"", "", 1, TRUE},
481: {"abcdefgh", "abcdefgh", 8, TRUE},
482: {"a", "b", 1, FALSE},
483: {"A", "a", 1, FALSE},
484: {"\0a", "\0b", 2, FALSE},
485: {"abc", "abd", 3, FALSE},
486: {"abc", "dbd", 3, FALSE},
487: {"abcdefgh", "abcdffgh", 8, FALSE},
488: {"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
489: "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz", 52, TRUE},
490: {"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
491: "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyy", 52, FALSE},
492: {"bbcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz",
493: "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz", 52, FALSE},
494: };
495:
496: START_TEST(test_memeq)
497: {
498: ck_assert(memeq(memeq_data[_i].a, memeq_data[_i].b,
499: memeq_data[_i].n) == memeq_data[_i].res);
500: }
501: END_TEST
502:
503: START_TEST(test_memeq_const)
504: {
505: ck_assert(memeq_const(memeq_data[_i].a, memeq_data[_i].b,
506: memeq_data[_i].n) == memeq_data[_i].res);
507: }
508: END_TEST
509:
510: /*******************************************************************************
511: * memstr
512: */
513:
514: static struct {
515: char *haystack;
516: char *needle;
517: size_t n;
518: int offset;
519: } memstr_data[] = {
520: {NULL, NULL, 0, -1},
521: {NULL, NULL, 3, -1},
522: {NULL, "abc", 0, -1},
523: {NULL, "abc", 3, -1},
524: {"", "", 0, -1},
525: {"abc", NULL, 3, -1},
526: {"abc", "", 3, -1},
527: {"abc", "abc", 3, 0},
528: {" abc", "abc", 4, 1},
529: {" abc", "abc", 3, -1},
530: {"abcabc", "abc", 6, 0},
531: {" abc ", "abc", 5, 1},
532: };
533:
534: START_TEST(test_memstr)
535: {
536: char *ret;
537:
538: ret = memstr(memstr_data[_i].haystack, memstr_data[_i].needle, memstr_data[_i].n);
539: if (memstr_data[_i].offset >= 0)
540: {
541: ck_assert(ret == memstr_data[_i].haystack + memstr_data[_i].offset);
542: }
543: else
544: {
545: ck_assert(ret == NULL);
546: }
547: }
548: END_TEST
549:
550: /*******************************************************************************
551: * memwipe
552: */
553:
554: START_TEST(test_memwipe_null)
555: {
556: memwipe(NULL, 16);
557: }
558: END_TEST
559:
560: static inline bool test_wiped_memory(char *buf, size_t len)
561: {
562: int i;
563:
564: /* comparing two bytes at once reduces the chances of conflicts if memory
565: * got overwritten already */
566: for (i = 0; i < len; i += 2)
567: {
568: if (buf[i] != 0 && buf[i] == i &&
569: buf[i+1] != 0 && buf[i+1] == i+1)
570: {
571: return FALSE;
572: }
573: }
574: return TRUE;
575: }
576:
577: START_TEST(test_memwipe_stack)
578: {
579: char buf[64];
580: int i;
581:
582: for (i = 0; i < sizeof(buf); i++)
583: {
584: buf[i] = i;
585: }
586: memwipe(buf, sizeof(buf));
587: ck_assert(test_wiped_memory(buf, sizeof(buf)));
588: }
589: END_TEST
590:
591: START_TEST(test_memwipe_heap)
592: {
593: size_t len = 64;
594: char *buf = malloc(len);
595: int i;
596:
597: for (i = 0; i < len; i++)
598: {
599: buf[i] = i;
600: }
601: memwipe(buf, len);
602: ck_assert(test_wiped_memory(buf, len));
603: free(buf);
604: }
605: END_TEST
606:
607: /*******************************************************************************
608: * utils_memrchr
609: */
610:
611: static struct {
612: char *s;
613: int c;
614: size_t n;
615: int offset;
616: } memrchr_data[] = {
617: {NULL, 'f', 0, -1},
618: {NULL, 'f', 3, -1},
619: {"", 'f', 0, -1},
620: {"", '\0', 1, 0},
621: {"foo", '\0', 3, -1},
622: {"foo", '\0', 4, 3},
623: {"foo", 'f', 3, 0},
624: {"foo", 'o', 3, 2},
625: {"foo", 'o', 2, 1},
626: {"foo", 'o', 1, -1},
627: {"foo", 'o', 0, -1},
628: {"foo", 'x', 3, -1},
629: };
630:
631: START_TEST(test_utils_memrchr)
632: {
633: void *ret;
634:
635: ret = utils_memrchr(memrchr_data[_i].s, memrchr_data[_i].c, memrchr_data[_i].n);
636: if (memrchr_data[_i].offset >= 0)
637: {
638: ck_assert(ret == memrchr_data[_i].s + memrchr_data[_i].offset);
639: }
640: else
641: {
642: ck_assert(ret == NULL);
643: }
644: }
645: END_TEST
646:
647: /*******************************************************************************
648: * translate
649: */
650:
651: static struct {
652: char *in;
653: char *from;
654: char *to;
655: char *out;
656: } translate_data[] = {
657: {NULL, "", "", NULL},
658: {"abc", "", "", "abc"},
659: {"abc", "", "x", "abc"},
660: {"abc", "x", "", "abc"},
661: {"abc", "abc", "xyz", "xyz"},
662: {"aabbcc", "abc", "xyz", "xxyyzz"},
663: {"abbaccb", "abc", "xyz", "xyyxzzy"},
664: {"abxyzc", "abc", "xyz", "xyxyzz"},
665: {"abcdef", "abc", "xyz", "xyzdef"},
666: {"aaa", "abc", "xyz", "xxx"},
667: {"abc", "aaa", "xyz", "xbc"},
668: {"abc", "abc", "xxx", "xxx"},
669: };
670:
671: START_TEST(test_translate)
672: {
673: char *str, *ret;
674:
675: str = strdupnull(translate_data[_i].in);
676: ret = translate(str, translate_data[_i].from, translate_data[_i].to);
677: ck_assert(ret == str);
678: if (ret != translate_data[_i].out)
679: {
680: ck_assert_str_eq(str, translate_data[_i].out);
681: }
682: free(str);
683: }
684: END_TEST
685:
686: /*******************************************************************************
687: * strreplace
688: */
689:
690: static struct {
691: char *in;
692: char *out;
693: char *search;
694: char *replace;
695: bool allocated;
696: } strreplace_data[] = {
697: /* invalid arguments */
698: {NULL, NULL, NULL, NULL, FALSE},
699: {"", "", NULL, NULL, FALSE},
700: {"", "", "", NULL, FALSE},
701: {"", "", NULL, "", FALSE},
702: {"", "", "", "", FALSE},
703: {"", "", "", "asdf", FALSE},
704: {"", "", "asdf", "", FALSE},
705: {"asdf", "asdf", NULL, NULL, FALSE},
706: {"asdf", "asdf", "", NULL, FALSE},
707: {"asdf", "asdf", NULL, "", FALSE},
708: {"asdf", "asdf", "", "", FALSE},
709: {"asdf", "asdf", "", "asdf", FALSE},
710: {"asdf", "asdf", "asdf", NULL, FALSE},
711: {"qwer", "qwer", "", "asdf", FALSE},
712: /* replacement shorter */
713: {"asdf", "", "asdf", "", TRUE},
714: {"asdfasdf", "", "asdf", "", TRUE},
715: {"asasdfdf", "asdf", "asdf", "", TRUE},
716: {"asdf", "df", "as", "", TRUE},
717: {"asdf", "as", "df", "", TRUE},
718: {"qwer", "qwer", "asdf", "", FALSE},
719: /* replacement same length */
720: {"a", "b", "a", "b", TRUE},
721: {"aaa", "bbb", "a", "b", TRUE},
722: {"aaa", "bbb", "aaa", "bbb", TRUE},
723: {"asdf", "asdf", "asdf", "asdf", TRUE},
724: {"qwer", "qwer", "asdf", "asdf", FALSE},
725: /* replacement longer */
726: {"asdf", "asdf", "", "asdf", FALSE},
727: {"asdf", "asdfasdf", "asdf", "asdfasdf", TRUE},
728: {"asdf", "asdfsdf", "a", "asdf", TRUE},
729: {"asdf", "asdasdf", "f", "asdf", TRUE},
730: {"aaa", "asdfasdfasdf", "a", "asdf", TRUE},
731: {"qwer", "qwer", "asdf", "asdfasdf", FALSE},
732: /* real examples */
733: {"http://x.org/no/spaces", "http://x.org/no/spaces", " ", "%20", FALSE},
734: {"http://x.org/end ", "http://x.org/end%20", " ", "%20", TRUE},
735: {" http://x.org/start", "%20http://x.org/start", " ", "%20", TRUE},
736: {" http://x.org/both ", "%20http://x.org/both%20", " ", "%20", TRUE},
737: {"http://x.org/ /slash", "http://x.org/%20/slash", " ", "%20", TRUE},
738: {"http://x.org/ /three", "http://x.org/%20%20%20/three", " ", "%20", TRUE},
739: {"http://x.org/ ", "http://x.org/%20%20%20%20%20%20", " ", "%20", TRUE},
740: {"http://x.org/%20/encoded", "http://x.org/%20/encoded", " ", "%20", FALSE},
741: };
742:
743: START_TEST(test_strreplace)
744: {
745: char *ret;
746:
747: ret = strreplace(strreplace_data[_i].in, strreplace_data[_i].search,
748: strreplace_data[_i].replace);
749: if (ret && strreplace_data[_i].out)
750: {
751: ck_assert_str_eq(ret, strreplace_data[_i].out);
752: }
753: else
754: {
755: ck_assert(ret == strreplace_data[_i].out);
756: }
757: if (strreplace_data[_i].allocated)
758: {
759: ck_assert(ret != strreplace_data[_i].in);
760: free(ret);
761: }
762: else
763: {
764: ck_assert(ret == strreplace_data[_i].in);
765: }
766: }
767: END_TEST
768:
769: /*******************************************************************************
770: * path_dirname/basename/absolute
771: */
772:
773: static struct {
774: char *path;
775: char *dir;
776: char *base;
777: bool absolute;
778: } path_data[] = {
779: {NULL, ".", ".", FALSE},
780: {"", ".", ".", FALSE},
781: {".", ".", ".", FALSE},
782: {"..", ".", "..", FALSE},
783: #ifdef WIN32
784: {"C:\\", "C:", "C:", TRUE},
785: {"X:\\\\", "X:", "X:", TRUE},
786: {"foo", ".", "foo", FALSE},
787: {"f\\", ".", "f", FALSE},
788: {"foo\\", ".", "foo", FALSE},
789: {"foo\\\\", ".", "foo", FALSE},
790: {"d:\\f", "d:", "f", TRUE},
791: {"C:\\f\\", "C:", "f", TRUE},
792: {"C:\\foo", "C:", "foo", TRUE},
793: {"C:\\foo\\", "C:", "foo", TRUE},
794: {"foo\\bar", "foo", "bar", FALSE},
795: {"foo\\\\bar", "foo", "bar", FALSE},
796: {"C:\\foo\\bar", "C:\\foo", "bar", TRUE},
797: {"C:\\foo\\bar\\", "C:\\foo", "bar", TRUE},
798: {"C:\\foo\\bar\\baz", "C:\\foo\\bar", "baz", TRUE},
799: {"\\foo\\bar", "\\foo", "bar", FALSE},
800: {"\\\\foo\\bar", "\\\\foo", "bar", TRUE},
801: #else /* !WIN32 */
802: {"/", "/", "/", TRUE},
803: {"//", "/", "/", TRUE},
804: {"foo", ".", "foo", FALSE},
805: {"f/", ".", "f", FALSE},
806: {"foo/", ".", "foo", FALSE},
807: {"foo//", ".", "foo", FALSE},
808: {"/f", "/", "f", TRUE},
809: {"/f/", "/", "f", TRUE},
810: {"/foo", "/", "foo", TRUE},
811: {"/foo/", "/", "foo", TRUE},
812: {"//foo/", "/", "foo", TRUE},
813: {"foo/bar", "foo", "bar", FALSE},
814: {"foo//bar", "foo", "bar", FALSE},
815: {"/foo/bar", "/foo", "bar", TRUE},
816: {"/foo/bar/", "/foo", "bar", TRUE},
817: {"/foo/bar/baz", "/foo/bar", "baz", TRUE},
818: #endif
819: };
820:
821: START_TEST(test_path_dirname)
822: {
823: char *dir;
824:
825: dir = path_dirname(path_data[_i].path);
826: ck_assert_str_eq(path_data[_i].dir, dir);
827: free(dir);
828: }
829: END_TEST
830:
831: START_TEST(test_path_basename)
832: {
833: char *base;
834:
835: base = path_basename(path_data[_i].path);
836: ck_assert_str_eq(path_data[_i].base, base);
837: free(base);
838: }
839: END_TEST
840:
841: START_TEST(test_path_absolute)
842: {
843: ck_assert(path_data[_i].absolute == path_absolute(path_data[_i].path));
844: }
845: END_TEST
846:
847: /*******************************************************************************
848: * time_printf_hook
849: */
850:
851: static struct {
852: time_t in;
853: bool utc;
854: char *out;
855: } time_data[] = {
856: {UNDEFINED_TIME, FALSE, "--- -- --:--:-- ----"},
857: {UNDEFINED_TIME, TRUE , "--- -- --:--:-- UTC ----"},
858: {1, FALSE, "Jan 01 01:00:01 1970"},
859: {1, TRUE , "Jan 01 00:00:01 UTC 1970"},
860: {1341150196, FALSE, "Jul 01 15:43:16 2012"},
861: {1341150196, TRUE , "Jul 01 13:43:16 UTC 2012"},
862: };
863:
864: START_TEST(test_time_printf_hook)
865: {
866: char buf[32];
867: int len;
868:
869: len = snprintf(buf, sizeof(buf), "%T", &time_data[_i].in, time_data[_i].utc);
870: ck_assert(len >= 0 && len < sizeof(buf));
871: ck_assert_str_eq(buf, time_data[_i].out);
872: }
873: END_TEST
874:
875: /*******************************************************************************
876: * time_delta_printf_hook
877: */
878:
879: static struct {
880: time_t a;
881: time_t b;
882: char *out;
883: } time_delta_data[] = {
884: {0, 0, "0 seconds"},
885: {0, 1, "1 second"},
886: {0, -1, "1 second"},
887: {1, 0, "1 second"},
888: {0, 2, "2 seconds"},
889: {2, 0, "2 seconds"},
890: {0, 60, "60 seconds"},
891: {0, 120, "120 seconds"},
892: {0, 121, "2 minutes"},
893: {0, 3600, "60 minutes"},
894: {0, 7200, "120 minutes"},
895: {0, 7201, "2 hours"},
896: {0, 86400, "24 hours"},
897: {0, 172800, "48 hours"},
898: {0, 172801, "2 days"},
899: {172801, 86400, "24 hours"},
900: };
901:
902: START_TEST(test_time_delta_printf_hook)
903: {
904: char buf[16];
905: int len;
906:
907: len = snprintf(buf, sizeof(buf), "%V", &time_delta_data[_i].a, &time_delta_data[_i].b);
908: ck_assert(len >= 0 && len < sizeof(buf));
909: ck_assert_str_eq(buf, time_delta_data[_i].out);
910: }
911: END_TEST
912:
913: /*******************************************************************************
914: * mark_from_string
915: */
916:
917: static struct {
918: char *s;
919: bool ok;
920: mark_op_t ops;
921: mark_t m;
922: } mark_data[] = {
923: {NULL, FALSE, MARK_OP_NONE, { 0 }},
924: {"", TRUE, MARK_OP_NONE, { 0, 0xffffffff }},
925: {"/", TRUE, MARK_OP_NONE, { 0, 0 }},
926: {"42", TRUE, MARK_OP_NONE, { 42, 0xffffffff }},
927: {"0x42", TRUE, MARK_OP_NONE, { 0x42, 0xffffffff }},
928: {"x", FALSE, MARK_OP_NONE, { 0 }},
929: {"42/", TRUE, MARK_OP_NONE, { 0, 0 }},
930: {"42/0", TRUE, MARK_OP_NONE, { 0, 0 }},
931: {"42/x", FALSE, MARK_OP_NONE, { 0 }},
932: {"42/42", TRUE, MARK_OP_NONE, { 42, 42 }},
933: {"42/0xff", TRUE, MARK_OP_NONE, { 42, 0xff }},
934: {"0x42/0xff", TRUE, MARK_OP_NONE, { 0x42, 0xff }},
935: {"/0xff", TRUE, MARK_OP_NONE, { 0, 0xff }},
936: {"/x", FALSE, MARK_OP_NONE, { 0 }},
937: {"x/x", FALSE, MARK_OP_NONE, { 0 }},
938: {"0xfffffff0/0x0000ffff", TRUE, MARK_OP_UNIQUE,
939: { 0x0000fff0, 0x0000ffff }},
940: {"%unique", TRUE, MARK_OP_UNIQUE,
941: { MARK_UNIQUE, 0xffffffff }},
942: {"%unique/", TRUE, MARK_OP_UNIQUE,
943: { MARK_UNIQUE, 0 }},
944: {"%unique", FALSE, MARK_OP_NONE,
945: { 0, 0 }},
946: {"%unique/0x0000ffff", TRUE, MARK_OP_UNIQUE,
947: { MARK_UNIQUE, 0x0000ffff }},
948: {"%unique/0xffffffff", TRUE, MARK_OP_UNIQUE,
949: { MARK_UNIQUE, 0xffffffff }},
950: {"%unique0xffffffffff", FALSE, MARK_OP_UNIQUE,
951: { 0, 0 }},
952: {"0xffffffff/0x0000ffff", TRUE, MARK_OP_UNIQUE,
953: { MARK_UNIQUE, 0x0000ffff }},
954: {"0xffffffff/0xffffffff", TRUE, MARK_OP_UNIQUE,
955: { MARK_UNIQUE, 0xffffffff }},
956: {"%unique-dir", TRUE, MARK_OP_UNIQUE,
957: { MARK_UNIQUE_DIR, 0xffffffff }},
958: {"%unique-dir/", TRUE, MARK_OP_UNIQUE,
959: { MARK_UNIQUE_DIR, 0 }},
960: {"%unique-dir", FALSE, MARK_OP_NONE,
961: { 0, 0 }},
962: {"%unique-dir/0x0000ffff", TRUE, MARK_OP_UNIQUE,
963: { MARK_UNIQUE_DIR, 0x0000ffff }},
964: {"%unique-dir/0xffffffff", TRUE, MARK_OP_UNIQUE,
965: { MARK_UNIQUE_DIR, 0xffffffff }},
966: {"%unique-dir0xffffffff", FALSE, MARK_OP_UNIQUE,
967: { 0, 0 }},
968: {"0xfffffffe/0x0000ffff", TRUE, MARK_OP_UNIQUE,
969: { MARK_UNIQUE_DIR, 0x0000ffff }},
970: {"0xfffffffe/0xffffffff", TRUE, MARK_OP_UNIQUE,
971: { MARK_UNIQUE_DIR, 0xffffffff }},
972: {"%unique-/0xffffffff", FALSE, MARK_OP_UNIQUE,
973: { 0, 0 }},
974: {"%unique-foo/0xffffffff", FALSE, MARK_OP_UNIQUE,
975: { 0, 0 }},
976: {"%same", TRUE, MARK_OP_SAME,
977: { MARK_SAME, 0xffffffff }},
978: {"%same/0x0000ffff", TRUE, MARK_OP_SAME,
979: { MARK_SAME, 0x0000ffff }},
980: {"%%same", FALSE, MARK_OP_NONE,
981: { 0, 0 }},
982: };
983:
984: START_TEST(test_mark_from_string)
985: {
986: mark_t mark;
987:
988: if (mark_from_string(mark_data[_i].s, mark_data[_i].ops, &mark))
989: {
990: ck_assert_int_eq(mark.value, mark_data[_i].m.value);
991: ck_assert_int_eq(mark.mask, mark_data[_i].m.mask);
992: }
993: else
994: {
995: ck_assert(!mark_data[_i].ok);
996: }
997: }
998: END_TEST
999:
1000: /*******************************************************************************
1001: * if_id_from_string
1002: */
1003:
1004: static struct {
1005: char *s;
1006: bool ok;
1007: uint32_t i;
1008: } if_id_data[] = {
1009: {NULL, FALSE, 0 },
1010: {"", TRUE, 0 },
1011: {"/", FALSE, 0 },
1012: {"42", TRUE, 42 },
1013: {"0x42", TRUE, 0x42 },
1014: {"x", FALSE, 0 },
1015: {"42/", FALSE, 0 },
1016: {"42/0", FALSE, 0 },
1017: {"%unique", TRUE, IF_ID_UNIQUE },
1018: {"%unique/", FALSE, 0},
1019: {"%unique0xffffffffff", FALSE, 0},
1020: {"0xffffffff", TRUE, IF_ID_UNIQUE},
1021: {"%unique-dir", TRUE, IF_ID_UNIQUE_DIR},
1022: {"%unique-dir/",FALSE, 0},
1023: {"0xfffffffe", TRUE, IF_ID_UNIQUE_DIR},
1024: {"%unique-", FALSE, 0},
1025: {"%unique-foo", FALSE, 0},
1026: };
1027:
1028: START_TEST(test_if_id_from_string)
1029: {
1030: uint32_t if_id;
1031:
1032: if (if_id_from_string(if_id_data[_i].s, &if_id))
1033: {
1034: ck_assert_int_eq(if_id, if_id_data[_i].i);
1035: }
1036: else
1037: {
1038: ck_assert(!if_id_data[_i].ok);
1039: }
1040: }
1041: END_TEST
1042:
1043: /*******************************************************************************
1044: * allocate_unique_if_ids
1045: */
1046:
1047: static struct {
1048: uint32_t in;
1049: uint32_t out;
1050: uint32_t exp_in;
1051: uint32_t exp_out;
1052: } unique_if_id_data[] = {
1053: {0, 0, 0, 0 },
1054: {42, 42, 42, 42 },
1055: {42, 1337, 42, 1337 },
1056: /* each call increases the internal counter by 1 or 2*/
1057: {IF_ID_UNIQUE, 42, 1, 42 },
1058: {42, IF_ID_UNIQUE, 42, 2 },
1059: {IF_ID_UNIQUE_DIR, 42, 3, 42 },
1060: {42, IF_ID_UNIQUE_DIR, 42, 4 },
1061: {IF_ID_UNIQUE, IF_ID_UNIQUE, 5, 5 },
1062: {IF_ID_UNIQUE_DIR, IF_ID_UNIQUE, 6, 7 },
1063: {IF_ID_UNIQUE, IF_ID_UNIQUE_DIR, 8, 9 },
1064: {IF_ID_UNIQUE_DIR, IF_ID_UNIQUE_DIR, 10, 11 },
1065: };
1066:
1067: START_TEST(test_allocate_unique_if_ids)
1068: {
1069: uint32_t if_id_in = unique_if_id_data[_i].in,
1070: if_id_out = unique_if_id_data[_i].out;
1071:
1072: allocate_unique_if_ids(&if_id_in, &if_id_out);
1073: ck_assert_int_eq(if_id_in, unique_if_id_data[_i].exp_in);
1074: ck_assert_int_eq(if_id_out, unique_if_id_data[_i].exp_out);
1075: }
1076: END_TEST
1077:
1078: /*******************************************************************************
1079: * signature_schemes_for_key
1080: */
1081:
1082: static struct {
1083: key_type_t type;
1084: int size;
1085: signature_scheme_t expected[7];
1086: } scheme_data[] = {
1087: {KEY_RSA, 1024, { SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PSS,
1088: SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PKCS1_SHA2_256,
1089: SIGN_RSA_EMSA_PKCS1_SHA2_384, SIGN_RSA_EMSA_PKCS1_SHA2_512,
1090: SIGN_UNKNOWN }},
1091: {KEY_RSA, 2048, { SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PSS,
1092: SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PKCS1_SHA2_256,
1093: SIGN_RSA_EMSA_PKCS1_SHA2_384, SIGN_RSA_EMSA_PKCS1_SHA2_512,
1094: SIGN_UNKNOWN }},
1095: {KEY_RSA, 4096, { SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PSS,
1096: SIGN_RSA_EMSA_PKCS1_SHA2_384, SIGN_RSA_EMSA_PKCS1_SHA2_512,
1097: SIGN_UNKNOWN }},
1098: {KEY_RSA, 8192, { SIGN_RSA_EMSA_PSS, SIGN_RSA_EMSA_PKCS1_SHA2_512, SIGN_UNKNOWN }},
1099: {KEY_ECDSA, 256, { SIGN_ECDSA_WITH_SHA256_DER, SIGN_ECDSA_WITH_SHA384_DER,
1100: SIGN_ECDSA_WITH_SHA512_DER, SIGN_UNKNOWN }},
1101: {KEY_ECDSA, 384, { SIGN_ECDSA_WITH_SHA384_DER, SIGN_ECDSA_WITH_SHA512_DER,
1102: SIGN_UNKNOWN }},
1103: {KEY_ECDSA, 512, { SIGN_ECDSA_WITH_SHA512_DER, SIGN_UNKNOWN }},
1104: {KEY_BLISS, 128, { SIGN_BLISS_WITH_SHA2_256, SIGN_BLISS_WITH_SHA2_384,
1105: SIGN_BLISS_WITH_SHA2_512, SIGN_UNKNOWN }},
1106: {KEY_BLISS, 192, { SIGN_BLISS_WITH_SHA2_384, SIGN_BLISS_WITH_SHA2_512,
1107: SIGN_UNKNOWN }},
1108: {KEY_BLISS, 256, { SIGN_BLISS_WITH_SHA2_512, SIGN_UNKNOWN }},
1109: };
1110:
1111: START_TEST(test_signature_schemes_for_key)
1112: {
1113: enumerator_t *enumerator;
1114: signature_params_t *params;
1115: int i;
1116:
1117: enumerator = signature_schemes_for_key(scheme_data[_i].type, scheme_data[_i].size);
1118: for (i = 0; scheme_data[_i].expected[i] != SIGN_UNKNOWN; i++)
1119: {
1120: ck_assert(enumerator->enumerate(enumerator, ¶ms));
1121: ck_assert_int_eq(scheme_data[_i].expected[i], params->scheme);
1122: }
1123: ck_assert(!enumerator->enumerate(enumerator, ¶ms));
1124: enumerator->destroy(enumerator);
1125: }
1126: END_TEST
1127:
1128: Suite *utils_suite_create()
1129: {
1130: Suite *s;
1131: TCase *tc;
1132:
1133: /* force a timezone to match non-UTC conversions */
1134: #ifdef WIN32
1135: _putenv("TZ=GST-1GDT");
1136: #else
1137: setenv("TZ", "Europe/Zurich", 1);
1138: #endif
1139: tzset();
1140:
1141: s = suite_create("utils");
1142:
1143: tc = tcase_create("objects");
1144: tcase_add_test(tc, test_objects);
1145: suite_add_tcase(s, tc);
1146:
1147: tc = tcase_create("return functions");
1148: tcase_add_test(tc, test_return_functions);
1149: suite_add_tcase(s, tc);
1150:
1151: tc = tcase_create("timeval_add_ms");
1152: tcase_add_test(tc, test_timeval_add_ms);
1153: suite_add_tcase(s, tc);
1154:
1155: tc = tcase_create("timespan_from_string");
1156: tcase_add_loop_test(tc, test_timespan_from_string, 0, countof(ts_data));
1157: suite_add_tcase(s, tc);
1158:
1159: tc = tcase_create("htoun,untoh");
1160: tcase_add_test(tc, test_htoun);
1161: tcase_add_test(tc, test_untoh);
1162: suite_add_tcase(s, tc);
1163:
1164: tc = tcase_create("round");
1165: tcase_add_test(tc, test_round);
1166: suite_add_tcase(s, tc);
1167:
1168: tc = tcase_create("string helper");
1169: tcase_add_loop_test(tc, test_streq, 0, countof(streq_data));
1170: tcase_add_loop_test(tc, test_strneq, 0, countof(strneq_data));
1171: tcase_add_loop_test(tc, test_strpfx, 0, countof(strpfx_data));
1172: suite_add_tcase(s, tc);
1173:
1174: tc = tcase_create("malloc_align");
1175: tcase_add_test(tc, test_malloc_align);
1176: suite_add_tcase(s, tc);
1177:
1178: tc = tcase_create("memxor");
1179: tcase_add_test(tc, test_memxor);
1180: tcase_add_test(tc, test_memxor_aligned);
1181: suite_add_tcase(s, tc);
1182:
1183: tc = tcase_create("memeq");
1184: tcase_add_loop_test(tc, test_memeq, 0, countof(memeq_data));
1185: tcase_add_loop_test(tc, test_memeq_const, 0, countof(memeq_data));
1186: suite_add_tcase(s, tc);
1187:
1188: tc = tcase_create("memstr");
1189: tcase_add_loop_test(tc, test_memstr, 0, countof(memstr_data));
1190: suite_add_tcase(s, tc);
1191:
1192: tc = tcase_create("memwipe");
1193: tcase_add_test(tc, test_memwipe_null);
1194: tcase_add_test(tc, test_memwipe_stack);
1195: tcase_add_test(tc, test_memwipe_heap);
1196: suite_add_tcase(s, tc);
1197:
1198: tc = tcase_create("utils_memrchr");
1199: tcase_add_loop_test(tc, test_utils_memrchr, 0, countof(memrchr_data));
1200: suite_add_tcase(s, tc);
1201:
1202: tc = tcase_create("translate");
1203: tcase_add_loop_test(tc, test_translate, 0, countof(translate_data));
1204: suite_add_tcase(s, tc);
1205:
1206: tc = tcase_create("strreplace");
1207: tcase_add_loop_test(tc, test_strreplace, 0, countof(strreplace_data));
1208: suite_add_tcase(s, tc);
1209:
1210: tc = tcase_create("path_dirname");
1211: tcase_add_loop_test(tc, test_path_dirname, 0, countof(path_data));
1212: suite_add_tcase(s, tc);
1213:
1214: tc = tcase_create("path_basename");
1215: tcase_add_loop_test(tc, test_path_basename, 0, countof(path_data));
1216: suite_add_tcase(s, tc);
1217:
1218: tc = tcase_create("path_absolute");
1219: tcase_add_loop_test(tc, test_path_absolute, 0, countof(path_data));
1220: suite_add_tcase(s, tc);
1221:
1222: tc = tcase_create("printf_hooks");
1223: tcase_add_loop_test(tc, test_time_printf_hook, 0, countof(time_data));
1224: tcase_add_loop_test(tc, test_time_delta_printf_hook, 0, countof(time_delta_data));
1225: suite_add_tcase(s, tc);
1226:
1227: tc = tcase_create("mark_from_string");
1228: tcase_add_loop_test(tc, test_mark_from_string, 0, countof(mark_data));
1229: suite_add_tcase(s, tc);
1230:
1231: tc = tcase_create("if_id_from_string");
1232: tcase_add_loop_test(tc, test_if_id_from_string, 0, countof(if_id_data));
1233: suite_add_tcase(s, tc);
1234:
1235: tc = tcase_create("allocate_unique_if_ids");
1236: tcase_add_loop_test(tc, test_allocate_unique_if_ids, 0, countof(unique_if_id_data));
1237: suite_add_tcase(s, tc);
1238:
1239: tc = tcase_create("signature_schemes_for_key");
1240: tcase_add_loop_test(tc, test_signature_schemes_for_key, 0, countof(scheme_data));
1241: suite_add_tcase(s, tc);
1242:
1243: return s;
1244: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>