2 * Copyright (C) 2013 Tobias Brunner
3 * Hochschule fuer Technik Rapperswil
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>.
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
16 #include "test_suite.h"
18 #include <networking/host.h>
21 * Verify a netmask (a number of set bits starting at byte 0)
22 * Can also be used to check for %any (mask == 0)
24 static void verify_netmask(chunk_t addr
, int mask
)
28 for (byte
= 0; byte
< addr
.len
; byte
++)
30 for (bit
= 7; bit
>= 0; bit
--)
32 int val
= (addr
.ptr
[byte
] >> bit
) & 0x01;
35 ck_assert_int_eq(val
, 1);
39 ck_assert_int_eq(val
, 0);
45 /*******************************************************************************
49 static void verify_any(host_t
*host
, int family
, u_int16_t port
)
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
);
57 static void test_create_any(int family
)
61 host
= host_create_any(family
);
62 verify_any(host
, family
, 0);
66 START_TEST(test_create_any_v4
)
68 test_create_any(AF_INET
);
72 START_TEST(test_create_any_v6
)
74 test_create_any(AF_INET6
);
78 START_TEST(test_create_any_other
)
82 host
= host_create_any(AF_UNSPEC
);
83 ck_assert(host
== NULL
);
87 /*******************************************************************************
88 * host_create_from_string
91 static void verify_address(host_t
*host
, chunk_t addr
, int family
, u_int16_t port
)
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
);
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);
103 START_TEST(test_create_from_string_v4
)
107 host
= host_create_from_string("%any", 500);
108 verify_any(host
, AF_INET
, 500);
111 host
= host_create_from_string("%any4", 500);
112 verify_any(host
, AF_INET
, 500);
115 host
= host_create_from_string("0.0.0.0", 500);
116 verify_any(host
, AF_INET
, 500);
119 host
= host_create_from_string("192.168.0.1", 500);
120 verify_address(host
, addr_v4
, AF_INET
, 500);
123 host
= host_create_from_string("192.168.0.1::500", 500);
124 ck_assert(host
== NULL
);
125 host
= host_create_from_string("123.456.789.012", 500);
126 ck_assert(host
== NULL
);
127 host
= host_create_from_string("1.1.1.1.1.1.1.1", 500);
128 ck_assert(host
== NULL
);
129 host
= host_create_from_string("foo.b.a.r", 500);
130 ck_assert(host
== NULL
);
134 START_TEST(test_create_from_string_any_v6
)
138 host
= host_create_from_string("%any6", 500);
139 verify_any(host
, AF_INET6
, 500);
142 host
= host_create_from_string("::", 500);
143 verify_any(host
, AF_INET6
, 500);
146 host
= host_create_from_string("fec1::1", 500);
147 verify_address(host
, addr_v6
, AF_INET6
, 500);
150 host
= host_create_from_string("fec1::1.500", 500);
151 ck_assert(host
== NULL
);
152 host
= host_create_from_string("f::e::c::1::1", 500);
153 ck_assert(host
== NULL
);
154 host
= host_create_from_string("foo::bar", 500);
155 ck_assert(host
== NULL
);
159 /*******************************************************************************
160 * host_create_from_string_and_family
163 static void test_create_from_string_and_family_any(char *string
, int family
,
168 host
= host_create_from_string_and_family(string
, family
, 500);
169 if (expected
== AF_UNSPEC
)
171 ck_assert(host
== NULL
);
175 verify_any(host
, expected
, 500);
180 static void test_create_from_string_and_family_addr(char *string
, chunk_t addr
,
181 int family
, int expected
)
185 host
= host_create_from_string_and_family(string
, family
, 500);
186 if (expected
== AF_UNSPEC
)
188 ck_assert(host
== NULL
);
192 verify_address(host
, addr
, expected
, 500);
197 START_TEST(test_create_from_string_and_family_v4
)
199 test_create_from_string_and_family_any("%any", AF_INET
, AF_INET
);
200 test_create_from_string_and_family_any("%any4", AF_INET
, AF_INET
);
201 test_create_from_string_and_family_any("0.0.0.0", AF_INET
, AF_INET
);
203 test_create_from_string_and_family_any("%any4", AF_INET6
, AF_UNSPEC
);
204 test_create_from_string_and_family_any("0.0.0.0", AF_INET6
, AF_UNSPEC
);
206 test_create_from_string_and_family_addr("192.168.0.1", addr_v4
, AF_INET
, AF_INET
);
207 test_create_from_string_and_family_addr("192.168.0.1", addr_v4
, AF_INET6
, AF_UNSPEC
);
211 START_TEST(test_create_from_string_and_family_v6
)
213 test_create_from_string_and_family_any("%any", AF_INET6
, AF_INET6
);
214 test_create_from_string_and_family_any("%any6", AF_INET6
, AF_INET6
);
215 test_create_from_string_and_family_any("::", AF_INET6
, AF_INET6
);
217 test_create_from_string_and_family_any("%any6", AF_INET
, AF_UNSPEC
);
218 test_create_from_string_and_family_any("::", AF_INET
, AF_UNSPEC
);
220 test_create_from_string_and_family_addr("fec1::1", addr_v6
, AF_INET6
, AF_INET6
);
221 test_create_from_string_and_family_addr("fec1::1", addr_v6
, AF_INET
, AF_UNSPEC
);
225 START_TEST(test_create_from_string_and_family_other
)
227 test_create_from_string_and_family_any("%any", AF_UNSPEC
, AF_INET
);
228 test_create_from_string_and_family_any("%any4", AF_UNSPEC
, AF_INET
);
229 test_create_from_string_and_family_any("0.0.0.0", AF_UNSPEC
, AF_INET
);
231 test_create_from_string_and_family_any("%any6", AF_UNSPEC
, AF_INET6
);
232 test_create_from_string_and_family_any("::", AF_UNSPEC
, AF_INET6
);
234 test_create_from_string_and_family_addr("192.168.0.1", addr_v4
, AF_UNSPEC
, AF_INET
);
235 test_create_from_string_and_family_addr("fec1::1", addr_v6
, AF_UNSPEC
, AF_INET6
);
239 /*******************************************************************************
240 * host_create_from_sockaddr
243 START_TEST(test_create_from_sockaddr_v4
)
245 struct sockaddr_in addr
= {
246 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
247 .sin_len
= sizeof(struct sockaddr_in
),
249 .sin_family
= AF_INET
,
250 .sin_port
= htons(500),
255 host
= host_create_from_sockaddr((sockaddr_t
*)&addr
);
256 verify_any(host
, AF_INET
, 500);
257 val
= (struct sockaddr_in
*)host
->get_sockaddr(host
);
258 ck_assert(memeq(&addr
, val
, sizeof(addr
)));
259 socklen
= host
->get_sockaddr_len(host
);
260 ck_assert(*socklen
== sizeof(addr
));
265 START_TEST(test_create_from_sockaddr_v6
)
267 struct sockaddr_in6 addr
= {
268 #ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
269 .sin6_len
= sizeof(struct sockaddr_in6
),
271 .sin6_family
= AF_INET6
,
272 .sin6_port
= htons(500),
277 host
= host_create_from_sockaddr((sockaddr_t
*)&addr
);
278 verify_any(host
, AF_INET6
, 500);
279 val
= (struct sockaddr_in6
*)host
->get_sockaddr(host
);
280 ck_assert(memeq(&addr
, val
, sizeof(addr
)));
281 socklen
= host
->get_sockaddr_len(host
);
282 ck_assert(*socklen
== sizeof(addr
));
287 START_TEST(test_create_from_sockaddr_other
)
289 struct sockaddr_un addr
= {
290 .sun_family
= AF_UNIX
,
294 host
= host_create_from_sockaddr((sockaddr_t
*)&addr
);
295 ck_assert(host
== NULL
);
299 /*******************************************************************************
300 * host_create_from_chunk
303 START_TEST(test_create_from_chunk_v4
)
307 host
= host_create_from_chunk(AF_INET
, addr_v4
, 500);
308 verify_address(host
, addr_v4
, AF_INET
, 500);
311 host
= host_create_from_chunk(AF_UNSPEC
, addr_v4
, 500);
312 verify_address(host
, addr_v4
, AF_INET
, 500);
315 host
= host_create_from_chunk(AF_INET
, chunk_empty
, 500);
316 ck_assert(host
== NULL
);
317 host
= host_create_from_chunk(AF_UNSPEC
, chunk_empty
, 500);
318 ck_assert(host
== NULL
);
322 START_TEST(test_create_from_chunk_v6
)
326 host
= host_create_from_chunk(AF_INET6
, addr_v6
, 500);
327 verify_address(host
, addr_v6
, AF_INET6
, 500);
330 host
= host_create_from_chunk(AF_UNSPEC
, addr_v6
, 500);
331 verify_address(host
, addr_v6
, AF_INET6
, 500);
334 host
= host_create_from_chunk(AF_INET6
, chunk_empty
, 500);
335 ck_assert(host
== NULL
);
339 START_TEST(test_create_from_chunk_other
)
343 host
= host_create_from_chunk(AF_UNIX
, addr_v6
, 500);
344 ck_assert(host
== NULL
);
348 /*******************************************************************************
349 * host_create_from_subnet
352 START_TEST(test_create_from_subnet_v4
)
357 host
= host_create_from_subnet("0.0.0.0/0", &bits
);
358 verify_any(host
, AF_INET
, 0);
359 ck_assert_int_eq(bits
, 0);
362 host
= host_create_from_subnet("192.168.0.1", &bits
);
363 verify_address(host
, addr_v4
, AF_INET
, 0);
364 ck_assert_int_eq(bits
, 32);
367 host
= host_create_from_subnet("192.168.0.1/24", &bits
);
368 verify_address(host
, addr_v4
, AF_INET
, 0);
369 ck_assert_int_eq(bits
, 24);
372 host
= host_create_from_subnet("foo.b.a.r", &bits
);
373 ck_assert(host
== NULL
);
377 START_TEST(test_create_from_subnet_v6
)
382 host
= host_create_from_subnet("::/0", &bits
);
383 verify_any(host
, AF_INET6
, 0);
384 ck_assert_int_eq(bits
, 0);
387 host
= host_create_from_subnet("fec1::1", &bits
);
388 verify_address(host
, addr_v6
, AF_INET6
, 0);
389 ck_assert_int_eq(bits
, 128);
392 host
= host_create_from_subnet("fec1::1/64", &bits
);
393 verify_address(host
, addr_v6
, AF_INET6
, 0);
394 ck_assert_int_eq(bits
, 64);
397 host
= host_create_from_subnet("foo::bar", &bits
);
398 ck_assert(host
== NULL
);
402 /*******************************************************************************
403 * host_create_netmask
406 static void test_create_netmask(int family
)
409 int i
, len
= (family
== AF_INET
) ? 32 : 128;
411 netmask
= host_create_netmask(family
, -1);
412 ck_assert(netmask
== NULL
);
413 for (i
= 0; i
<= len
; i
++)
415 netmask
= host_create_netmask(family
, i
);
416 verify_netmask(netmask
->get_address(netmask
), i
);
417 netmask
->destroy(netmask
);
419 netmask
= host_create_netmask(family
, len
+ 1);
420 ck_assert(netmask
== NULL
);
423 START_TEST(test_create_netmask_v4
)
425 test_create_netmask(AF_INET
);
429 START_TEST(test_create_netmask_v6
)
431 test_create_netmask(AF_INET6
);
435 START_TEST(test_create_netmask_other
)
439 netmask
= host_create_netmask(AF_UNSPEC
, 0);
440 ck_assert(netmask
== NULL
);
444 /*******************************************************************************
448 START_TEST(test_equals
)
452 a
= host_create_from_string("192.168.0.1", 500);
453 b
= host_create_from_string("192.168.0.1", 0);
454 ck_assert(!a
->equals(a
, b
));
455 ck_assert(!b
->equals(b
, a
));
456 ck_assert(a
->ip_equals(a
, b
));
457 ck_assert(b
->ip_equals(b
, a
));
459 ck_assert(a
->equals(a
, b
));
460 ck_assert(b
->equals(b
, a
));
461 ck_assert(a
->ip_equals(a
, b
));
462 ck_assert(b
->ip_equals(b
, a
));
464 b
= host_create_from_string("192.168.0.2", 500);
465 ck_assert(!a
->ip_equals(a
, b
));
466 ck_assert(!a
->equals(a
, b
));
469 b
= host_create_from_string("fec1::1", 500);
470 ck_assert(!a
->ip_equals(a
, b
));
471 ck_assert(!a
->equals(a
, b
));
473 a
= host_create_from_string("fec1::1", 500);
474 ck_assert(a
->equals(a
, b
));
475 ck_assert(a
->ip_equals(a
, b
));
481 START_TEST(test_equals_any
)
485 a
= host_create_from_string("%any", 500);
486 b
= host_create_from_string("%any", 0);
487 ck_assert(!a
->equals(a
, b
));
488 ck_assert(a
->ip_equals(a
, b
));
490 ck_assert(a
->equals(a
, b
));
491 ck_assert(a
->ip_equals(a
, b
));
493 b
= host_create_from_string("%any6", 0);
494 ck_assert(a
->ip_equals(a
, b
));
495 ck_assert(!a
->equals(a
, b
));
497 ck_assert(a
->ip_equals(a
, b
));
498 ck_assert(a
->equals(a
, b
));
504 /*******************************************************************************
508 START_TEST(test_clone
)
512 a
= host_create_from_string("192.168.0.1", 500);
515 ck_assert(a
->equals(a
, b
));
521 /*******************************************************************************
528 /* results for %H, %+H, %#H (falls back to [0]) */
531 {NULL
, 0, { "(null)" }},
532 {NULL
, 500, { "(null)" }},
533 {"%any", 0, { "%any", "0.0.0.0", "0.0.0.0[0]" }},
534 {"%any", 500, { "%any", "0.0.0.0", "0.0.0.0[500]" }},
535 {"%any6", 0, { "%any6", "::", "::[0]" }},
536 {"%any6", 500, { "%any6", "::", "::[500]" }},
537 {"192.168.0.1", 0, { "192.168.0.1", "192.168.0.1", "192.168.0.1[0]" }},
538 {"192.168.0.1", 500, { "192.168.0.1", "192.168.0.1", "192.168.0.1[500]" }},
539 {"fec1::1", 0, { "fec1::1", "fec1::1", "fec1::1[0]" }},
540 {"fec1::1", 500, { "fec1::1", "fec1::1", "fec1::1[500]" }},
543 static void verify_printf(host_t
*host
, const char *format
, char *expected
)
547 snprintf(buf
, sizeof(buf
), format
, host
);
548 ck_assert_str_eq(expected
, buf
);
551 START_TEST(test_printf_hook
)
553 static const char *formats
[] = { "%H", "%+H", "%#H" };
558 if (printf_data
[_i
].addr
)
560 host
= host_create_from_string(printf_data
[_i
].addr
,
561 printf_data
[_i
].port
);
563 for (i
= 0; i
< countof(formats
); i
++)
565 expected
= printf_data
[_i
].result
[i
];
566 expected
= expected
?: printf_data
[_i
].result
[0];
567 verify_printf(host
, formats
[i
], expected
);
573 START_TEST(test_printf_hook_align
)
577 verify_printf(NULL
, "%14H", " (null)");
578 verify_printf(NULL
, "%-14H", "(null) ");
580 host
= host_create_from_string("192.168.0.1", 0);
581 verify_printf(host
, "%14H", " 192.168.0.1");
582 verify_printf(host
, "%-14H", "192.168.0.1 ");
583 verify_printf(host
, "%4H", "192.168.0.1");
584 verify_printf(host
, "%-4H", "192.168.0.1");
589 Suite
*host_suite_create()
594 s
= suite_create("host");
596 tc
= tcase_create("host_create_any");
597 tcase_add_test(tc
, test_create_any_v4
);
598 tcase_add_test(tc
, test_create_any_v6
);
599 tcase_add_test(tc
, test_create_any_other
);
600 suite_add_tcase(s
, tc
);
602 tc
= tcase_create("host_create_from_string");
603 tcase_add_test(tc
, test_create_from_string_v4
);
604 tcase_add_test(tc
, test_create_from_string_any_v6
);
605 suite_add_tcase(s
, tc
);
607 tc
= tcase_create("host_create_from_string_and_family");
608 tcase_add_test(tc
, test_create_from_string_and_family_v4
);
609 tcase_add_test(tc
, test_create_from_string_and_family_v6
);
610 tcase_add_test(tc
, test_create_from_string_and_family_other
);
611 suite_add_tcase(s
, tc
);
613 tc
= tcase_create("host_create_from_sockaddr");
614 tcase_add_test(tc
, test_create_from_sockaddr_v4
);
615 tcase_add_test(tc
, test_create_from_sockaddr_v6
);
616 tcase_add_test(tc
, test_create_from_sockaddr_other
);
617 suite_add_tcase(s
, tc
);
619 tc
= tcase_create("host_create_from_chunk");
620 tcase_add_test(tc
, test_create_from_chunk_v4
);
621 tcase_add_test(tc
, test_create_from_chunk_v6
);
622 tcase_add_test(tc
, test_create_from_chunk_other
);
623 suite_add_tcase(s
, tc
);
625 tc
= tcase_create("host_create_from_subnet");
626 tcase_add_test(tc
, test_create_from_subnet_v4
);
627 tcase_add_test(tc
, test_create_from_subnet_v6
);
628 suite_add_tcase(s
, tc
);
630 tc
= tcase_create("host_create_netmask");
631 tcase_add_test(tc
, test_create_netmask_v4
);
632 tcase_add_test(tc
, test_create_netmask_v6
);
633 tcase_add_test(tc
, test_create_netmask_other
);
634 suite_add_tcase(s
, tc
);
636 tc
= tcase_create("equals, ip_equals");
637 tcase_add_test(tc
, test_equals
);
638 tcase_add_test(tc
, test_equals_any
);
639 suite_add_tcase(s
, tc
);
641 tc
= tcase_create("clone");
642 tcase_add_test(tc
, test_clone
);
643 suite_add_tcase(s
, tc
);
645 tc
= tcase_create("printf hook");
646 tcase_add_loop_test(tc
, test_printf_hook
, 0, countof(printf_data
));
647 tcase_add_test(tc
, test_printf_hook_align
);
648 suite_add_tcase(s
, tc
);