diff --git a/src/os/tests/ifaddrs.c b/src/os/tests/ifaddrs.c index cff5188..0e72065 100644 --- a/src/os/tests/ifaddrs.c +++ b/src/os/tests/ifaddrs.c @@ -16,9 +16,38 @@ on a given host. To properly test all combinations the abstracted operating system functions must be mocked. */ +/* FIXME: It's possible that IPv6 is available in the network stack, but + disabled in the kernel. Travis CI for example has build environments + that do not have IPv6 enabled. */ + +#ifdef OS_SOCKET_HAS_IPV6 +static int ipv6_enabled = 1; +#endif + CUnit_Suite_Initialize(os_getifaddrs) { os_osInit(); + +#ifdef OS_SOCKET_HAS_IPV6 +#ifdef __linux + FILE *fh; + const char *const *path; + static const char *const paths[] = { + "/proc/sys/net/ipv6/conf/all/disable_ipv6", + "/proc/sys/net/ipv6/conf/default/disable_ipv6", + NULL + }; + + for (path = paths; ipv6_enabled == 1 && *path != NULL; path++) { + if ((fh = fopen(*path, "r")) != NULL) { + ipv6_enabled = (fgetc(fh) == '0'); + fclose(fh); + fh = NULL; + } + } +#endif /* __linux */ +#endif /* OS_SOCKET_HAS_IPV6 */ + return 0; } @@ -90,52 +119,68 @@ CUnit_Test(os_getifaddrs, empty_filter) #ifdef OS_SOCKET_HAS_IPV6 CUnit_Test(os_getifaddrs, ipv6) { - int err; - os_ifaddrs_t *ifa_root, *ifa; - const int afs[] = { AF_INET6, 0 }; + if (ipv6_enabled == 1) { + int err; + int have_ipv6 = 0; + os_ifaddrs_t *ifa_root, *ifa; + const int afs[] = { AF_INET6, 0 }; - err = os_getifaddrs(&ifa_root, afs); - CU_ASSERT_EQUAL_FATAL(err, 0); - for (ifa = ifa_root; ifa; ifa = ifa->next) { - CU_ASSERT_EQUAL(ifa->addr->sa_family, AF_INET6); - if (ifa->addr->sa_family == AF_INET6) { - if (ifa->flags & IFF_LOOPBACK) { - CU_ASSERT(os_sockaddrIsLoopback(ifa->addr)); - } else { - CU_ASSERT(!os_sockaddrIsLoopback(ifa->addr)); + err = os_getifaddrs(&ifa_root, afs); + CU_ASSERT_EQUAL_FATAL(err, 0); + for (ifa = ifa_root; ifa; ifa = ifa->next) { + CU_ASSERT_EQUAL(ifa->addr->sa_family, AF_INET6); + if (ifa->addr->sa_family == AF_INET6) { + have_ipv6 = 1; + if (ifa->flags & IFF_LOOPBACK) { + CU_ASSERT(os_sockaddrIsLoopback(ifa->addr)); + } else { + CU_ASSERT(!os_sockaddrIsLoopback(ifa->addr)); + } } } - } - os_freeifaddrs(ifa_root); + CU_ASSERT_EQUAL(have_ipv6, 1); + + os_freeifaddrs(ifa_root); + + CU_PASS("IPv6 enabled in test environment"); + } else { + CU_PASS("IPv6 disabled in test environment"); + } } /* Assume at least one IPv4 and one IPv6 interface are available when IPv6 is available on the platform. */ CUnit_Test(os_getifaddrs, ipv4_n_ipv6) { - int err; - int have_ipv4 = 0; - int have_ipv6 = 0; - os_ifaddrs_t *ifa_root, *ifa; - const int afs[] = { AF_INET, AF_INET6, 0 }; + if (ipv6_enabled == 1) { + int err; + int have_ipv4 = 0; + int have_ipv6 = 0; + os_ifaddrs_t *ifa_root, *ifa; + const int afs[] = { AF_INET, AF_INET6, 0 }; - err = os_getifaddrs(&ifa_root, afs); - CU_ASSERT_EQUAL_FATAL(err, 0); - for (ifa = ifa_root; ifa; ifa = ifa->next) { - CU_ASSERT(ifa->addr->sa_family == AF_INET || - ifa->addr->sa_family == AF_INET6); - if (ifa->addr->sa_family == AF_INET) { - have_ipv4 = 1; - } else if (ifa->addr->sa_family == AF_INET6) { - have_ipv6 = 1; - } + err = os_getifaddrs(&ifa_root, afs); + CU_ASSERT_EQUAL_FATAL(err, 0); + for (ifa = ifa_root; ifa; ifa = ifa->next) { + CU_ASSERT(ifa->addr->sa_family == AF_INET || + ifa->addr->sa_family == AF_INET6); + if (ifa->addr->sa_family == AF_INET) { + have_ipv4 = 1; + } else if (ifa->addr->sa_family == AF_INET6) { + have_ipv6 = 1; + } + } + + CU_ASSERT_EQUAL(have_ipv4, 1); + CU_ASSERT_EQUAL(have_ipv6, 1); + + os_freeifaddrs(ifa_root); + + CU_PASS("IPv6 enabled in test environment"); + } else { + CU_PASS("IPv6 disabled in test environment"); } - - CU_ASSERT_EQUAL(have_ipv4, 1); - CU_ASSERT_EQUAL(have_ipv6, 1); - - os_freeifaddrs(ifa_root); } #endif /* OS_SOCKET_HAS_IPV6 */