You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
5.5 KiB
212 lines
5.5 KiB
/* |
|
* tests/check-addr.c nl_addr unit tests |
|
* |
|
* This library is free software; you can redistribute it and/or |
|
* modify it under the terms of the GNU Lesser General Public |
|
* License as published by the Free Software Foundation version 2.1 |
|
* of the License. |
|
* |
|
* Copyright (c) 2013 Thomas Graf <tgraf@suug.ch> |
|
*/ |
|
|
|
#include <check.h> |
|
#include <netlink/addr.h> |
|
|
|
START_TEST(addr_alloc) |
|
{ |
|
struct nl_addr *addr; |
|
|
|
addr = nl_addr_alloc(16); |
|
fail_if(addr == NULL, |
|
"Allocation should not return NULL"); |
|
|
|
fail_if(nl_addr_iszero(addr) == 0, |
|
"New empty address should be all zeros"); |
|
|
|
fail_if(nl_addr_get_family(addr) != AF_UNSPEC, |
|
"New empty address should have family AF_UNSPEC"); |
|
|
|
fail_if(nl_addr_get_prefixlen(addr) != 0, |
|
"New empty address should have prefix length 0"); |
|
|
|
fail_if(nl_addr_shared(addr), |
|
"New empty address should not be shared"); |
|
|
|
fail_if(nl_addr_get(addr) != addr, |
|
"nl_addr_get() should return pointer to address"); |
|
|
|
fail_if(nl_addr_shared(addr) == 0, |
|
"Address should be shared after call to nl_addr_get()"); |
|
|
|
nl_addr_put(addr); |
|
|
|
fail_if(nl_addr_shared(addr), |
|
"Address should not be shared after call to nl_addr_put()"); |
|
|
|
fail_if(nl_addr_fill_sockaddr(addr, NULL, 0) == 0, |
|
"Socket address filling should fail for empty address"); |
|
|
|
nl_addr_put(addr); |
|
} |
|
END_TEST |
|
|
|
START_TEST(addr_binary_addr) |
|
{ |
|
struct nl_addr *addr, *addr2; |
|
char baddr[4] = { 0x1, 0x2, 0x3, 0x4 }; |
|
char baddr2[6] = { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6 }; |
|
|
|
addr = nl_addr_alloc(4); |
|
fail_if(addr == NULL, |
|
"Allocation should not return NULL"); |
|
|
|
fail_if(nl_addr_set_binary_addr(addr, baddr, 4) < 0, |
|
"Valid binary address should be settable"); |
|
|
|
fail_if(nl_addr_get_prefixlen(addr) != 0, |
|
"Prefix length should be unchanged after nl_addr_set_binary_addr()"); |
|
|
|
fail_if(nl_addr_get_len(addr) != 4, |
|
"Address length should be 4"); |
|
|
|
fail_if(nl_addr_set_binary_addr(addr, baddr2, 6) == 0, |
|
"Should not be able to set binary address exceeding maximum length"); |
|
|
|
fail_if(nl_addr_get_len(addr) != 4, |
|
"Address length should still be 4"); |
|
|
|
fail_if(nl_addr_guess_family(addr) != AF_INET, |
|
"Binary address of length 4 should be guessed as AF_INET"); |
|
|
|
fail_if(memcmp(baddr, nl_addr_get_binary_addr(addr), 4) != 0, |
|
"Binary address mismatches"); |
|
|
|
addr2 = nl_addr_build(AF_UNSPEC, baddr, 4); |
|
fail_if(addr2 == NULL, |
|
"Building of address should not fail"); |
|
|
|
nl_addr_set_prefixlen(addr, 32); |
|
fail_if(nl_addr_get_prefixlen(addr) != 32, |
|
"Prefix length should be successful changed after nl_addr_set_prefixlen()"); |
|
|
|
fail_if(nl_addr_cmp(addr, addr2), |
|
"Addresses built from same binary address should match"); |
|
|
|
nl_addr_put(addr); |
|
nl_addr_put(addr2); |
|
} |
|
END_TEST |
|
|
|
START_TEST(addr_parse4) |
|
{ |
|
struct nl_addr *addr4, *clone; |
|
struct sockaddr_in sin; |
|
socklen_t len = sizeof(sin); |
|
char *addr_str = "10.0.0.1/16"; |
|
char buf[128]; |
|
|
|
fail_if(nl_addr_parse(addr_str, AF_INET6, &addr4) == 0, |
|
"Should not be able to parse IPv4 address in IPv6 mode"); |
|
|
|
fail_if(nl_addr_parse(addr_str, AF_UNSPEC, &addr4) != 0, |
|
"Should be able to parse \"%s\"", addr_str); |
|
|
|
fail_if(nl_addr_get_family(addr4) != AF_INET, |
|
"Address family should be AF_INET"); |
|
|
|
fail_if(nl_addr_get_prefixlen(addr4) != 16, |
|
"Prefix length should be 16"); |
|
|
|
fail_if(nl_addr_iszero(addr4), |
|
"Address should not be all zeroes"); |
|
|
|
clone = nl_addr_clone(addr4); |
|
fail_if(clone == NULL, |
|
"Cloned address should not be NULL"); |
|
|
|
fail_if(nl_addr_cmp(addr4, clone) != 0, |
|
"Cloned address should not mismatch original"); |
|
|
|
fail_if(nl_addr_fill_sockaddr(addr4, (struct sockaddr *) &sin, &len) != 0, |
|
"Should be able to fill socketaddr"); |
|
|
|
fail_if(strcmp(nl_addr2str(addr4, buf, sizeof(buf)), addr_str), |
|
"Address translated back to string does not match original"); |
|
|
|
nl_addr_put(addr4); |
|
nl_addr_put(clone); |
|
} |
|
END_TEST |
|
|
|
START_TEST(addr_parse6) |
|
{ |
|
struct nl_addr *addr6, *clone; |
|
struct sockaddr_in6 sin; |
|
socklen_t len = sizeof(sin); |
|
char *addr_str = "2001:1:2::3/64"; |
|
char buf[128]; |
|
|
|
fail_if(nl_addr_parse(addr_str, AF_INET, &addr6) == 0, |
|
"Should not be able to parse IPv6 address in IPv4 mode"); |
|
|
|
fail_if(nl_addr_parse(addr_str, AF_UNSPEC, &addr6) != 0, |
|
"Should be able to parse \"%s\"", addr_str); |
|
|
|
fail_if(nl_addr_get_family(addr6) != AF_INET6, |
|
"Address family should be AF_INET6"); |
|
|
|
fail_if(nl_addr_get_prefixlen(addr6) != 64, |
|
"Prefix length should be 64"); |
|
|
|
fail_if(nl_addr_iszero(addr6), |
|
"Address should not be all zeroes"); |
|
|
|
clone = nl_addr_clone(addr6); |
|
fail_if(clone == NULL, |
|
"Cloned address should not be NULL"); |
|
|
|
fail_if(nl_addr_cmp(addr6, clone) != 0, |
|
"Cloned address should not mismatch original"); |
|
|
|
fail_if(nl_addr_fill_sockaddr(addr6, (struct sockaddr *) &sin, &len) != 0, |
|
"Should be able to fill socketaddr"); |
|
|
|
fail_if(strcmp(nl_addr2str(addr6, buf, sizeof(buf)), addr_str), |
|
"Address translated back to string does not match original"); |
|
|
|
nl_addr_put(addr6); |
|
nl_addr_put(clone); |
|
} |
|
END_TEST |
|
|
|
START_TEST(addr_info) |
|
{ |
|
struct nl_addr *addr; |
|
char *addr_str = "127.0.0.1"; |
|
struct addrinfo *result; |
|
|
|
fail_if(nl_addr_parse(addr_str, AF_UNSPEC, &addr) != 0, |
|
"Parsing of valid address should not fail"); |
|
|
|
fail_if(nl_addr_info(addr, &result) != 0, |
|
"getaddrinfo() on loopback address should work"); |
|
|
|
freeaddrinfo(result); |
|
nl_addr_put(addr); |
|
} |
|
END_TEST |
|
|
|
Suite *make_nl_addr_suite(void) |
|
{ |
|
Suite *suite = suite_create("Abstract addresses"); |
|
|
|
TCase *tc_addr = tcase_create("Core"); |
|
tcase_add_test(tc_addr, addr_alloc); |
|
tcase_add_test(tc_addr, addr_binary_addr); |
|
tcase_add_test(tc_addr, addr_parse4); |
|
tcase_add_test(tc_addr, addr_parse6); |
|
tcase_add_test(tc_addr, addr_info); |
|
suite_add_tcase(suite, tc_addr); |
|
|
|
return suite; |
|
}
|
|
|