From c464a367728dcd123b9ad9bd0cf6a4a3e4397310 Mon Sep 17 00:00:00 2001 From: "teor (Tim Wilson-Brown)" Date: Tue, 6 Oct 2015 15:32:44 +1100 Subject: [PATCH] Make get_ifaddrs tests more tolerant of unusual network configs * Don't assume that every test box has an IPv4 address * Don't assume that every test box has a non-local address Resolves issue #17255 released in unit tests in 0.2.7.3-rc. --- changes/ifaddrs-tests-network-configs | 7 ++++ src/test/test_address.c | 46 +++++++++++++++++---------- 2 files changed, 37 insertions(+), 16 deletions(-) create mode 100644 changes/ifaddrs-tests-network-configs diff --git a/changes/ifaddrs-tests-network-configs b/changes/ifaddrs-tests-network-configs new file mode 100644 index 0000000000..f7f3d3edd0 --- /dev/null +++ b/changes/ifaddrs-tests-network-configs @@ -0,0 +1,7 @@ + o Minor fixes (unit tests, networking): + - Make get_ifaddrs_* unit tests more tolerant of different network + configurations: + - Don't assume every test box has an IPv4 address. + - Don't assume every test box has a non-localhost address. + - Closes ticket #17255. Patch by "teor". + Fix for unit tests released in 0.2.7.3. diff --git a/src/test/test_address.c b/src/test/test_address.c index 938f77693d..3e73c3e27b 100644 --- a/src/test/test_address.c +++ b/src/test/test_address.c @@ -688,16 +688,20 @@ test_address_get_if_addrs_list_internal(void *arg) results = get_interface_address_list(LOG_ERR, 1); tt_assert(results != NULL); - /* Assume every system has at least 1 non-local non-multicast IPv4 - * interface, even if it is an internal one */ - tt_int_op(smartlist_len(results),>=,1); + /* When the network is down, a system might not have any non-local + * non-multicast addresseses, not even internal ones. + * Unit tests shouldn't fail because of this. */ + tt_int_op(smartlist_len(results),>=,0); tt_assert(!smartlist_contains_localhost_tor_addr(results)); tt_assert(!smartlist_contains_multicast_tor_addr(results)); /* The list may or may not contain internal addresses */ - tt_assert(smartlist_contains_ipv4_tor_addr(results)); - tt_assert(!smartlist_contains_ipv6_tor_addr(results)); + /* Allow unit tests to pass on IPv6-only machines */ + if (smartlist_len(results) > 0) { + tt_assert(smartlist_contains_ipv4_tor_addr(results) + || smartlist_contains_ipv6_tor_addr(results)); + } done: free_interface_address_list(results); @@ -721,7 +725,10 @@ test_address_get_if_addrs_list_no_internal(void *arg) tt_assert(!smartlist_contains_multicast_tor_addr(results)); tt_assert(!smartlist_contains_internal_tor_addr(results)); - /* The list may or may not contain IPv4 addresses */ + /* if there are any addresses, they must be IPv4 */ + if (smartlist_len(results) > 0) { + tt_assert(smartlist_contains_ipv4_tor_addr(results)); + } tt_assert(!smartlist_contains_ipv6_tor_addr(results)); done: @@ -746,8 +753,11 @@ test_address_get_if_addrs6_list_internal(void *arg) tt_assert(!smartlist_contains_multicast_tor_addr(results)); /* The list may or may not contain internal addresses */ + /* if there are any addresses, they must be IPv6 */ tt_assert(!smartlist_contains_ipv4_tor_addr(results)); - /* The list may or may not contain IPv6 addresses */ + if (smartlist_len(results) > 0) { + tt_assert(smartlist_contains_ipv6_tor_addr(results)); + } done: free_interface_address6_list(results); @@ -772,7 +782,9 @@ test_address_get_if_addrs6_list_no_internal(void *arg) tt_assert(!smartlist_contains_internal_tor_addr(results)); tt_assert(!smartlist_contains_ipv4_tor_addr(results)); - /* The list may or may not contain IPv6 addresses */ + if (smartlist_len(results) > 0) { + tt_assert(smartlist_contains_ipv6_tor_addr(results)); + } done: free_interface_address6_list(results); @@ -883,16 +895,18 @@ test_address_get_if_addrs(void *arg) rv = get_interface_address(LOG_ERR, &addr_h); - /* Assume every system has at least 1 non-local non-multicast IPv4 - * interface, even if it is an internal one */ - tt_assert(rv == 0); - tor_addr_from_ipv4h(&tor_addr, addr_h); + /* When the network is down, a system might not have any non-local + * non-multicast IPv4 addresses, not even internal ones. + * Unit tests shouldn't fail because of this. */ + if (rv == 0) { + tor_addr_from_ipv4h(&tor_addr, addr_h); - tt_assert(!tor_addr_is_loopback(&tor_addr)); - tt_assert(!tor_addr_is_multicast(&tor_addr)); - /* The address may or may not be an internal address */ + tt_assert(!tor_addr_is_loopback(&tor_addr)); + tt_assert(!tor_addr_is_multicast(&tor_addr)); + /* The address may or may not be an internal address */ - tt_assert(tor_addr_is_v4(&tor_addr)); + tt_assert(tor_addr_is_v4(&tor_addr)); + } done: return;