Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_host.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2013 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 <networking/host.h>
19:
20: /**
21: * Verify a netmask (a number of set bits starting at byte 0)
22: * Can also be used to check for %any (mask == 0)
23: */
24: static void verify_netmask(chunk_t addr, int mask)
25: {
26: int byte, bit;
27:
28: for (byte = 0; byte < addr.len; byte++)
29: {
30: for (bit = 7; bit >= 0; bit--)
31: {
32: int val = (addr.ptr[byte] >> bit) & 0x01;
33: if (mask-- > 0)
34: {
35: ck_assert_int_eq(val, 1);
36: }
37: else
38: {
39: ck_assert_int_eq(val, 0);
40: }
41: }
42: }
43: }
44:
45: /*******************************************************************************
46: * host_create_any
47: */
48:
49: static void verify_any(host_t *host, int family, uint16_t port)
50: {
51: verify_netmask(host->get_address(host), 0);
52: ck_assert(host->is_anyaddr(host));
53: ck_assert_int_eq(host->get_port(host), port);
54: ck_assert_int_eq(host->get_family(host), family);
55: }
56:
57: static void test_create_any(int family)
58: {
59: host_t *host;
60:
61: host = host_create_any(family);
62: verify_any(host, family, 0);
63: host->destroy(host);
64: }
65:
66: START_TEST(test_create_any_v4)
67: {
68: test_create_any(AF_INET);
69: }
70: END_TEST
71:
72: START_TEST(test_create_any_v6)
73: {
74: test_create_any(AF_INET6);
75: }
76: END_TEST
77:
78: START_TEST(test_create_any_other)
79: {
80: host_t *host;
81:
82: host = host_create_any(AF_UNSPEC);
83: ck_assert(host == NULL);
84: }
85: END_TEST
86:
87: /*******************************************************************************
88: * host_create_from_string
89: */
90:
91: static void verify_address(host_t *host, chunk_t addr, int family, uint16_t port)
92: {
93: ck_assert(chunk_equals(host->get_address(host), addr));
94: ck_assert(!host->is_anyaddr(host));
95: ck_assert_int_eq(host->get_port(host), port);
96: ck_assert_int_eq(host->get_family(host), family);
97: }
98:
99: static const chunk_t addr_v4 = chunk_from_chars(0xc0, 0xa8, 0x00, 0x01);
100: static const chunk_t addr_v6 = chunk_from_chars(0xfe, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
101: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01);
102:
103: START_TEST(test_create_from_string_v4)
104: {
105: host_t *host;
106:
107: host = host_create_from_string(NULL, 500);
108: ck_assert(!host);
109:
110: host = host_create_from_string("%any", 500);
111: verify_any(host, AF_INET, 500);
112: host->destroy(host);
113:
114: host = host_create_from_string("%any4", 500);
115: verify_any(host, AF_INET, 500);
116: host->destroy(host);
117:
118: host = host_create_from_string("0.0.0.0", 500);
119: verify_any(host, AF_INET, 500);
120: host->destroy(host);
121:
122: host = host_create_from_string("192.168.0.1", 500);
123: verify_address(host, addr_v4, AF_INET, 500);
124: host->destroy(host);
125:
126: host = host_create_from_string("192.168.0.1::500", 500);
127: ck_assert(host == NULL);
128: host = host_create_from_string("123.456.789.012", 500);
129: ck_assert(host == NULL);
130: host = host_create_from_string("1.1.1.1.1.1.1.1", 500);
131: ck_assert(host == NULL);
132: host = host_create_from_string("foo.b.a.r", 500);
133: ck_assert(host == NULL);
134: }
135: END_TEST
136:
137: START_TEST(test_create_from_string_any_v6)
138: {
139: host_t *host;
140:
141: host = host_create_from_string("%any6", 500);
142: verify_any(host, AF_INET6, 500);
143: host->destroy(host);
144:
145: host = host_create_from_string("::", 500);
146: verify_any(host, AF_INET6, 500);
147: host->destroy(host);
148:
149: host = host_create_from_string("fec1::1", 500);
150: verify_address(host, addr_v6, AF_INET6, 500);
151: host->destroy(host);
152:
153: host = host_create_from_string("fec1::1.500", 500);
154: ck_assert(host == NULL);
155: host = host_create_from_string("f::e::c::1::1", 500);
156: ck_assert(host == NULL);
157: host = host_create_from_string("foo::bar", 500);
158: ck_assert(host == NULL);
159: }
160: END_TEST
161:
162: /*******************************************************************************
163: * host_create_from_string_and_family
164: */
165:
166: static void test_create_from_string_and_family_any(char *string, int family,
167: int expected)
168: {
169: host_t *host;
170:
171: host = host_create_from_string_and_family(string, family, 500);
172: if (expected == AF_UNSPEC)
173: {
174: ck_assert(host == NULL);
175: }
176: else
177: {
178: verify_any(host, expected, 500);
179: host->destroy(host);
180: }
181: }
182:
183: static void test_create_from_string_and_family_addr(char *string, chunk_t addr,
184: int family, int expected)
185: {
186: host_t *host;
187:
188: host = host_create_from_string_and_family(string, family, 500);
189: if (expected == AF_UNSPEC)
190: {
191: ck_assert(host == NULL);
192: }
193: else
194: {
195: verify_address(host, addr, expected, 500);
196: host->destroy(host);
197: }
198: }
199:
200: START_TEST(test_create_from_string_and_family_v4)
201: {
202: test_create_from_string_and_family_any(NULL, AF_INET, AF_UNSPEC);
203: test_create_from_string_and_family_any("%any", AF_INET, AF_INET);
204: test_create_from_string_and_family_any("%any4", AF_INET, AF_INET);
205: test_create_from_string_and_family_any("0.0.0.0", AF_INET, AF_INET);
206:
207: test_create_from_string_and_family_any("%any4", AF_INET6, AF_UNSPEC);
208: test_create_from_string_and_family_any("0.0.0.0", AF_INET6, AF_UNSPEC);
209:
210: test_create_from_string_and_family_addr("192.168.0.1", addr_v4, AF_INET, AF_INET);
211: test_create_from_string_and_family_addr("192.168.0.1", addr_v4, AF_INET6, AF_UNSPEC);
212: }
213: END_TEST
214:
215: START_TEST(test_create_from_string_and_family_v6)
216: {
217: test_create_from_string_and_family_any(NULL, AF_INET6, AF_UNSPEC);
218: test_create_from_string_and_family_any("%any", AF_INET6, AF_INET6);
219: test_create_from_string_and_family_any("%any6", AF_INET6, AF_INET6);
220: test_create_from_string_and_family_any("::", AF_INET6, AF_INET6);
221:
222: test_create_from_string_and_family_any("%any6", AF_INET, AF_UNSPEC);
223: test_create_from_string_and_family_any("::", AF_INET, AF_UNSPEC);
224:
225: test_create_from_string_and_family_addr("fec1::1", addr_v6, AF_INET6, AF_INET6);
226: test_create_from_string_and_family_addr("fec1::1", addr_v6, AF_INET, AF_UNSPEC);
227: }
228: END_TEST
229:
230: START_TEST(test_create_from_string_and_family_other)
231: {
232: test_create_from_string_and_family_any(NULL, AF_UNSPEC, AF_UNSPEC);
233: test_create_from_string_and_family_any("%any", AF_UNSPEC, AF_INET);
234: test_create_from_string_and_family_any("%any4", AF_UNSPEC, AF_INET);
235: test_create_from_string_and_family_any("0.0.0.0", AF_UNSPEC, AF_INET);
236:
237: test_create_from_string_and_family_any("%any6", AF_UNSPEC, AF_INET6);
238: test_create_from_string_and_family_any("::", AF_UNSPEC, AF_INET6);
239:
240: test_create_from_string_and_family_addr("192.168.0.1", addr_v4, AF_UNSPEC, AF_INET);
241: test_create_from_string_and_family_addr("fec1::1", addr_v6, AF_UNSPEC, AF_INET6);
242: }
243: END_TEST
244:
245: /*******************************************************************************
246: * host_create_from_dns
247: */
248:
249: static void test_create_from_dns(int family, chunk_t addr)
250: {
251: host_t *host;
252:
253: host = host_create_from_dns("localhost", family, 500);
254: if (family != AF_INET6)
255: {
256: ck_assert(host != NULL);
257: }
258: if (host)
259: {
260: if (family != AF_UNSPEC)
261: {
262: verify_address(host, addr, family, 500);
263: }
264: host->destroy(host);
265: }
266: }
267:
268: START_TEST(test_create_from_dns_any)
269: {
270: test_create_from_dns(AF_UNSPEC, chunk_empty);
271: }
272: END_TEST
273:
274: START_TEST(test_create_from_dns_v4)
275: {
276: test_create_from_dns(AF_INET, chunk_from_chars(127,0,0,1));
277: }
278: END_TEST
279:
280: START_TEST(test_create_from_dns_v6)
281: {
282: test_create_from_dns(AF_INET6,
283: chunk_from_chars(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1));
284: }
285: END_TEST
286:
287: /*******************************************************************************
288: * host_create_from_sockaddr
289: */
290:
291: START_TEST(test_create_from_sockaddr_v4)
292: {
293: struct sockaddr_in addr = {
294: #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
295: .sin_len = sizeof(struct sockaddr_in),
296: #endif
297: .sin_family = AF_INET,
298: .sin_port = htons(500),
299: }, *val;
300: socklen_t *socklen;
301: host_t *host;
302:
303: host = host_create_from_sockaddr((sockaddr_t*)&addr);
304: verify_any(host, AF_INET, 500);
305: val = (struct sockaddr_in*)host->get_sockaddr(host);
306: ck_assert(memeq(&addr, val, sizeof(addr)));
307: socklen = host->get_sockaddr_len(host);
308: ck_assert(*socklen == sizeof(addr));
309: host->destroy(host);
310: }
311: END_TEST
312:
313: START_TEST(test_create_from_sockaddr_v6)
314: {
315: struct sockaddr_in6 addr = {
316: #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
317: .sin6_len = sizeof(struct sockaddr_in6),
318: #endif
319: .sin6_family = AF_INET6,
320: .sin6_port = htons(500),
321: }, *val;
322: socklen_t *socklen;
323: host_t *host;
324:
325: host = host_create_from_sockaddr((sockaddr_t*)&addr);
326: verify_any(host, AF_INET6, 500);
327: val = (struct sockaddr_in6*)host->get_sockaddr(host);
328: ck_assert(memeq(&addr, val, sizeof(addr)));
329: socklen = host->get_sockaddr_len(host);
330: ck_assert(*socklen == sizeof(addr));
331: host->destroy(host);
332: }
333: END_TEST
334:
335: START_TEST(test_create_from_sockaddr_other)
336: {
337: struct sockaddr addr = {
338: .sa_family = AF_UNIX,
339: };
340: host_t *host;
341:
342: host = host_create_from_sockaddr((sockaddr_t*)&addr);
343: ck_assert(host == NULL);
344: }
345: END_TEST
346:
347: /*******************************************************************************
348: * host_create_from_chunk
349: */
350:
351: START_TEST(test_create_from_chunk_v4)
352: {
353: host_t *host;
354:
355: host = host_create_from_chunk(AF_INET, addr_v4, 500);
356: verify_address(host, addr_v4, AF_INET, 500);
357: host->destroy(host);
358:
359: host = host_create_from_chunk(AF_UNSPEC, addr_v4, 500);
360: verify_address(host, addr_v4, AF_INET, 500);
361: host->destroy(host);
362:
363: host = host_create_from_chunk(AF_INET, chunk_empty, 500);
364: ck_assert(host == NULL);
365: host = host_create_from_chunk(AF_UNSPEC, chunk_empty, 500);
366: ck_assert(host == NULL);
367: }
368: END_TEST
369:
370: START_TEST(test_create_from_chunk_v6)
371: {
372: host_t *host;
373:
374: host = host_create_from_chunk(AF_INET6, addr_v6, 500);
375: verify_address(host, addr_v6, AF_INET6, 500);
376: host->destroy(host);
377:
378: host = host_create_from_chunk(AF_UNSPEC, addr_v6, 500);
379: verify_address(host, addr_v6, AF_INET6, 500);
380: host->destroy(host);
381:
382: host = host_create_from_chunk(AF_INET6, chunk_empty, 500);
383: ck_assert(host == NULL);
384: }
385: END_TEST
386:
387: START_TEST(test_create_from_chunk_other)
388: {
389: host_t *host;
390:
391: host = host_create_from_chunk(AF_UNIX, addr_v6, 500);
392: ck_assert(host == NULL);
393: }
394: END_TEST
395:
396: /*******************************************************************************
397: * host_create_from_subnet
398: */
399:
400: START_TEST(test_create_from_subnet_v4)
401: {
402: host_t *host;
403: int bits = -1;
404:
405: host = host_create_from_subnet("0.0.0.0/0", &bits);
406: verify_any(host, AF_INET, 0);
407: ck_assert_int_eq(bits, 0);
408: host->destroy(host);
409:
410: host = host_create_from_subnet("192.168.0.1", &bits);
411: verify_address(host, addr_v4, AF_INET, 0);
412: ck_assert_int_eq(bits, 32);
413: host->destroy(host);
414:
415: host = host_create_from_subnet("192.168.0.1/24", &bits);
416: verify_address(host, addr_v4, AF_INET, 0);
417: ck_assert_int_eq(bits, 24);
418: host->destroy(host);
419:
420: host = host_create_from_subnet("foo.b.a.r", &bits);
421: ck_assert(host == NULL);
422: }
423: END_TEST
424:
425: START_TEST(test_create_from_subnet_v6)
426: {
427: host_t *host;
428: int bits = -1;
429:
430: host = host_create_from_subnet("::/0", &bits);
431: verify_any(host, AF_INET6, 0);
432: ck_assert_int_eq(bits, 0);
433: host->destroy(host);
434:
435: host = host_create_from_subnet("fec1::1", &bits);
436: verify_address(host, addr_v6, AF_INET6, 0);
437: ck_assert_int_eq(bits, 128);
438: host->destroy(host);
439:
440: host = host_create_from_subnet("fec1::1/64", &bits);
441: verify_address(host, addr_v6, AF_INET6, 0);
442: ck_assert_int_eq(bits, 64);
443: host->destroy(host);
444:
445: host = host_create_from_subnet("foo::bar", &bits);
446: ck_assert(host == NULL);
447: }
448: END_TEST
449:
450: /*******************************************************************************
451: * host_create_from_range
452: */
453:
454: static const chunk_t addr_v4_to = chunk_from_chars(0xc0, 0xa8, 0x00, 0x05);
455: static const chunk_t addr_v6_to = chunk_from_chars(0xfe, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
456: 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05);
457:
458: static void verify_range(char *str, int family, chunk_t from_addr,
459: chunk_t to_addr)
460: {
461: host_t *from, *to;
462:
463: if (!family)
464: {
465: ck_assert(!host_create_from_range(str, &from, &to));
466: }
467: else
468: {
469: ck_assert(host_create_from_range(str, &from, &to));
470: verify_address(from, from_addr, family, 0);
471: verify_address(to, to_addr, family, 0);
472: from->destroy(from);
473: to->destroy(to);
474: }
475: }
476:
477: START_TEST(test_create_from_range_v4)
478: {
479: host_t *from, *to;
480:
481: ck_assert(host_create_from_range("0.0.0.0-0.0.0.0", &from, &to));
482: verify_any(from, AF_INET, 0);
483: verify_any(to, AF_INET, 0);
484: from->destroy(from);
485: to->destroy(to);
486:
487: verify_range("192.168.0.1-192.168.0.1", AF_INET, addr_v4, addr_v4);
488: verify_range("192.168.0.1-192.168.0.5", AF_INET, addr_v4, addr_v4_to);
489: verify_range("192.168.0.1- 192.168.0.5", AF_INET, addr_v4, addr_v4_to);
490: verify_range("192.168.0.1 -192.168.0.5", AF_INET, addr_v4, addr_v4_to);
491: verify_range("192.168.0.1 - 192.168.0.5", AF_INET, addr_v4, addr_v4_to);
492: verify_range("192.168.0.5-192.168.0.1", AF_INET, addr_v4_to, addr_v4);
493:
494: verify_range("192.168.0.1", 0, chunk_empty, chunk_empty);
495: verify_range("192.168.0.1-", 0, chunk_empty, chunk_empty);
496: verify_range("-192.168.0.1", 0, chunk_empty, chunk_empty);
497: verify_range("192.168.0.1-192", 0, chunk_empty, chunk_empty);
498: verify_range("192.168.0.1-192.168", 0, chunk_empty, chunk_empty);
499: verify_range("192.168.0.1-192.168.0", 0, chunk_empty, chunk_empty);
500: verify_range("foo.b.a.r", 0, chunk_empty, chunk_empty);
501: verify_range("foo.b.a.r-b.a.r.f", 0, chunk_empty, chunk_empty);
502: }
503: END_TEST
504:
505: START_TEST(test_create_from_range_v6)
506: {
507: host_t *from, *to;
508:
509: ck_assert(host_create_from_range("::-::", &from, &to));
510: verify_any(from, AF_INET6, 0);
511: verify_any(to, AF_INET6, 0);
512: from->destroy(from);
513: to->destroy(to);
514:
515: verify_range("fec1::1-fec1::1", AF_INET6, addr_v6, addr_v6);
516: verify_range("fec1::1-fec1::5", AF_INET6, addr_v6, addr_v6_to);
517: verify_range("fec1::1- fec1::5", AF_INET6, addr_v6, addr_v6_to);
518: verify_range("fec1::1 -fec1::5", AF_INET6, addr_v6, addr_v6_to);
519: verify_range("fec1::1 - fec1::5", AF_INET6, addr_v6, addr_v6_to);
520: verify_range("fec1::5-fec1::1", AF_INET6, addr_v6_to, addr_v6);
521:
522: verify_range("fec1::1", 0, chunk_empty, chunk_empty);
523: verify_range("fec1::1-", 0, chunk_empty, chunk_empty);
524: verify_range("-fec1::1", 0, chunk_empty, chunk_empty);
525: verify_range("fec1::1-fec1", 0, chunk_empty, chunk_empty);
526: verify_range("foo::bar", 0, chunk_empty, chunk_empty);
527: verify_range("foo::bar-bar::foo", 0, chunk_empty, chunk_empty);
528:
529: verify_range("fec1::1-192.168.0.1", 0, chunk_empty, chunk_empty);
530: verify_range("192.168.0.1-fec1::1", 0, chunk_empty, chunk_empty);
531: }
532: END_TEST
533:
534: /*******************************************************************************
535: * host_create_netmask
536: */
537:
538: static void test_create_netmask(int family)
539: {
540: host_t *netmask;
541: int i, len = (family == AF_INET) ? 32 : 128;
542:
543: netmask = host_create_netmask(family, -1);
544: ck_assert(netmask == NULL);
545: for (i = 0; i <= len; i++)
546: {
547: netmask = host_create_netmask(family, i);
548: verify_netmask(netmask->get_address(netmask), i);
549: netmask->destroy(netmask);
550: }
551: netmask = host_create_netmask(family, len + 1);
552: ck_assert(netmask == NULL);
553: }
554:
555: START_TEST(test_create_netmask_v4)
556: {
557: test_create_netmask(AF_INET);
558: }
559: END_TEST
560:
561: START_TEST(test_create_netmask_v6)
562: {
563: test_create_netmask(AF_INET6);
564: }
565: END_TEST
566:
567: START_TEST(test_create_netmask_other)
568: {
569: host_t *netmask;
570:
571: netmask = host_create_netmask(AF_UNSPEC, 0);
572: ck_assert(netmask == NULL);
573: }
574: END_TEST
575:
576: /*******************************************************************************
577: * equals, ip_equals
578: */
579:
580: START_TEST(test_equals)
581: {
582: host_t *a, *b;
583:
584: a = host_create_from_string("192.168.0.1", 500);
585: b = host_create_from_string("192.168.0.1", 0);
586: ck_assert(!a->equals(a, b));
587: ck_assert(!b->equals(b, a));
588: ck_assert(a->ip_equals(a, b));
589: ck_assert(b->ip_equals(b, a));
590: b->set_port(b, 500);
591: ck_assert(a->equals(a, b));
592: ck_assert(b->equals(b, a));
593: ck_assert(a->ip_equals(a, b));
594: ck_assert(b->ip_equals(b, a));
595: b->destroy(b);
596: b = host_create_from_string("192.168.0.2", 500);
597: ck_assert(!a->ip_equals(a, b));
598: ck_assert(!a->equals(a, b));
599: b->destroy(b);
600:
601: b = host_create_from_string("fec1::1", 500);
602: ck_assert(!a->ip_equals(a, b));
603: ck_assert(!a->equals(a, b));
604: a->destroy(a);
605: a = host_create_from_string("fec1::1", 500);
606: ck_assert(a->equals(a, b));
607: ck_assert(a->ip_equals(a, b));
608: a->destroy(a);
609: b->destroy(b);
610: }
611: END_TEST
612:
613: START_TEST(test_equals_any)
614: {
615: host_t *a, *b;
616:
617: a = host_create_from_string("%any", 500);
618: b = host_create_from_string("%any", 0);
619: ck_assert(!a->equals(a, b));
620: ck_assert(a->ip_equals(a, b));
621: b->set_port(b, 500);
622: ck_assert(a->equals(a, b));
623: ck_assert(a->ip_equals(a, b));
624: b->destroy(b);
625: b = host_create_from_string("%any6", 0);
626: ck_assert(a->ip_equals(a, b));
627: ck_assert(!a->equals(a, b));
628: b->set_port(b, 500);
629: ck_assert(a->ip_equals(a, b));
630: ck_assert(a->equals(a, b));
631: a->destroy(a);
632: b->destroy(b);
633: }
634: END_TEST
635:
636: /*******************************************************************************
637: * clone
638: */
639:
640: START_TEST(test_clone)
641: {
642: host_t *a, *b;
643:
644: a = host_create_from_string("192.168.0.1", 500);
645: b = a->clone(a);
646: ck_assert(a != b);
647: ck_assert(a->equals(a, b));
648: a->destroy(a);
649: b->destroy(b);
650: }
651: END_TEST
652:
653: /*******************************************************************************
654: * printf hook
655: */
656:
657: static struct {
658: char *addr;
659: uint16_t port;
660: /* results for %H, %+H, %#H (falls back to the first entry) */
661: char *result[3];
662: } printf_data[] = {
663: {NULL, 0, { "(null)" }},
664: {NULL, 500, { "(null)" }},
665: {"%any", 0, { "%any", "0.0.0.0", "0.0.0.0" }},
666: {"%any", 500, { "%any", "0.0.0.0", "0.0.0.0[500]" }},
667: {"%any6", 0, { "%any6", "::", "::" }},
668: {"%any6", 500, { "%any6", "::", "::[500]" }},
669: {"192.168.0.1", 0, { "192.168.0.1" }},
670: {"192.168.0.1", 500, { "192.168.0.1", "192.168.0.1", "192.168.0.1[500]" }},
671: {"fec1::1", 0, { "fec1::1" }},
672: {"fec1::1", 500, { "fec1::1", "fec1::1", "fec1::1[500]" }},
673: };
674:
675: static void verify_printf(host_t *host, const char *format, char *expected)
676: {
677: char buf[64];
678:
679: snprintf(buf, sizeof(buf), format, host);
680: ck_assert_str_eq(expected, buf);
681: }
682:
683: START_TEST(test_printf_hook)
684: {
685: static const char *formats[] = { "%H", "%+H", "%#H" };
686: host_t *host = NULL;
687: char *expected;
688: int i;
689:
690: if (printf_data[_i].addr)
691: {
692: host = host_create_from_string(printf_data[_i].addr,
693: printf_data[_i].port);
694: }
695: for (i = 0; i < countof(formats); i++)
696: {
697: expected = printf_data[_i].result[i];
698: expected = expected ?: printf_data[_i].result[0];
699: verify_printf(host, formats[i], expected);
700: }
701: DESTROY_IF(host);
702: }
703: END_TEST
704:
705: START_TEST(test_printf_hook_align)
706: {
707: host_t *host;
708:
709: verify_printf(NULL, "%14H", " (null)");
710: verify_printf(NULL, "%-14H", "(null) ");
711:
712: host = host_create_from_string("192.168.0.1", 0);
713: verify_printf(host, "%14H", " 192.168.0.1");
714: verify_printf(host, "%-14H", "192.168.0.1 ");
715: verify_printf(host, "%4H", "192.168.0.1");
716: verify_printf(host, "%-4H", "192.168.0.1");
717: host->destroy(host);
718: }
719: END_TEST
720:
721: Suite *host_suite_create()
722: {
723: Suite *s;
724: TCase *tc;
725:
726: s = suite_create("host");
727:
728: tc = tcase_create("host_create_any");
729: tcase_add_test(tc, test_create_any_v4);
730: tcase_add_test(tc, test_create_any_v6);
731: tcase_add_test(tc, test_create_any_other);
732: suite_add_tcase(s, tc);
733:
734: tc = tcase_create("host_create_from_string");
735: tcase_add_test(tc, test_create_from_string_v4);
736: tcase_add_test(tc, test_create_from_string_any_v6);
737: suite_add_tcase(s, tc);
738:
739: tc = tcase_create("host_create_from_string_and_family");
740: tcase_add_test(tc, test_create_from_string_and_family_v4);
741: tcase_add_test(tc, test_create_from_string_and_family_v6);
742: tcase_add_test(tc, test_create_from_string_and_family_other);
743: suite_add_tcase(s, tc);
744:
745: tc = tcase_create("host_create_from_dns");
746: tcase_add_test(tc, test_create_from_dns_any);
747: tcase_add_test(tc, test_create_from_dns_v4);
748: tcase_add_test(tc, test_create_from_dns_v6);
749: suite_add_tcase(s, tc);
750:
751: tc = tcase_create("host_create_from_sockaddr");
752: tcase_add_test(tc, test_create_from_sockaddr_v4);
753: tcase_add_test(tc, test_create_from_sockaddr_v6);
754: tcase_add_test(tc, test_create_from_sockaddr_other);
755: suite_add_tcase(s, tc);
756:
757: tc = tcase_create("host_create_from_chunk");
758: tcase_add_test(tc, test_create_from_chunk_v4);
759: tcase_add_test(tc, test_create_from_chunk_v6);
760: tcase_add_test(tc, test_create_from_chunk_other);
761: suite_add_tcase(s, tc);
762:
763: tc = tcase_create("host_create_from_subnet");
764: tcase_add_test(tc, test_create_from_subnet_v4);
765: tcase_add_test(tc, test_create_from_subnet_v6);
766: suite_add_tcase(s, tc);
767:
768: tc = tcase_create("host_create_from_range");
769: tcase_add_test(tc, test_create_from_range_v4);
770: tcase_add_test(tc, test_create_from_range_v6);
771: suite_add_tcase(s, tc);
772:
773: tc = tcase_create("host_create_netmask");
774: tcase_add_test(tc, test_create_netmask_v4);
775: tcase_add_test(tc, test_create_netmask_v6);
776: tcase_add_test(tc, test_create_netmask_other);
777: suite_add_tcase(s, tc);
778:
779: tc = tcase_create("equals, ip_equals");
780: tcase_add_test(tc, test_equals);
781: tcase_add_test(tc, test_equals_any);
782: suite_add_tcase(s, tc);
783:
784: tc = tcase_create("clone");
785: tcase_add_test(tc, test_clone);
786: suite_add_tcase(s, tc);
787:
788: tc = tcase_create("printf hook");
789: tcase_add_loop_test(tc, test_printf_hook, 0, countof(printf_data));
790: tcase_add_test(tc, test_printf_hook_align);
791: suite_add_tcase(s, tc);
792:
793: return s;
794: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>