[tor-commits] [tor/master] Merge remote-tracking branch 'twstrike/address_tests'

nickm at torproject.org nickm at torproject.org
Thu Oct 15 14:21:50 UTC 2015


commit 0d8b8fa585ed50513f2f63c54ddba57a54d5be44
Merge: 49ccb7e fb5cefb
Author: Nick Mathewson <nickm at torproject.org>
Date:   Thu Oct 15 10:21:42 2015 -0400

    Merge remote-tracking branch 'twstrike/address_tests'

 src/test/test_address.c |  118 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 117 insertions(+), 1 deletion(-)

diff --cc src/test/test_address.c
index de96998,57a4f9f..b925608
--- a/src/test/test_address.c
+++ b/src/test/test_address.c
@@@ -679,262 -635,117 +679,374 @@@ test_address_udp_socket_trick_blackbox(
  }
  
  static void
 +test_address_get_if_addrs_list_internal(void *arg)
 +{
 +  smartlist_t *results = NULL;
 +
 +  (void)arg;
 +
 +  results = get_interface_address_list(LOG_ERR, 1);
 +
 +  tt_assert(results != NULL);
 +  /* 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 */
 +
 +  /* 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);
 +  return;
 +}
 +
 +static void
 +test_address_get_if_addrs_list_no_internal(void *arg)
 +{
 +  smartlist_t *results = NULL;
 +
 +  (void)arg;
 +
 +  results = get_interface_address_list(LOG_ERR, 0);
 +
 +  tt_assert(results != NULL);
 +  /* Work even on systems with only internal IPv4 addresses */
 +  tt_int_op(smartlist_len(results),>=,0);
 +
 +  tt_assert(!smartlist_contains_localhost_tor_addr(results));
 +  tt_assert(!smartlist_contains_multicast_tor_addr(results));
 +  tt_assert(!smartlist_contains_internal_tor_addr(results));
 +
 +  /* 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:
 +  free_interface_address_list(results);
 +  return;
 +}
 +
 +static void
 +test_address_get_if_addrs6_list_internal(void *arg)
 +{
 +  smartlist_t *results = NULL;
 +
 +  (void)arg;
 +
 +  results = get_interface_address6_list(LOG_ERR, AF_INET6, 1);
 +
 +  tt_assert(results != NULL);
 +  /* Work even on systems without IPv6 interfaces */
 +  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 */
 +
 +  /* if there are any addresses, they must be IPv6 */
 +  tt_assert(!smartlist_contains_ipv4_tor_addr(results));
 +  if (smartlist_len(results) > 0) {
 +    tt_assert(smartlist_contains_ipv6_tor_addr(results));
 +  }
 +
 + done:
 +  free_interface_address6_list(results);
 +  return;
 +}
 +
 +static void
 +test_address_get_if_addrs6_list_no_internal(void *arg)
 +{
 +  smartlist_t *results = NULL;
 +
 +  (void)arg;
 +
 +  results = get_interface_address6_list(LOG_ERR, AF_INET6, 0);
 +
 +  tt_assert(results != NULL);
 +  /* Work even on systems without IPv6 interfaces */
 +  tt_int_op(smartlist_len(results),>=,0);
 +
 +  tt_assert(!smartlist_contains_localhost_tor_addr(results));
 +  tt_assert(!smartlist_contains_multicast_tor_addr(results));
 +  tt_assert(!smartlist_contains_internal_tor_addr(results));
 +
 +  tt_assert(!smartlist_contains_ipv4_tor_addr(results));
 +  if (smartlist_len(results) > 0) {
 +    tt_assert(smartlist_contains_ipv6_tor_addr(results));
 +  }
 +
 + done:
 +  free_interface_address6_list(results);
 +  return;
 +}
 +
 +static int called_get_interface_addresses_raw = 0;
 +
 +static smartlist_t *
 +mock_get_interface_addresses_raw_fail(int severity)
 +{
 +  (void)severity;
 +
 +  called_get_interface_addresses_raw++;
 +  return smartlist_new();
 +}
 +
 +static int called_get_interface_address6_via_udp_socket_hack = 0;
 +
 +static int
 +mock_get_interface_address6_via_udp_socket_hack_fail(int severity,
 +                                                     sa_family_t family,
 +                                                     tor_addr_t *addr)
 +{
 +  (void)severity;
 +  (void)family;
 +  (void)addr;
 +
 +  called_get_interface_address6_via_udp_socket_hack++;
 +  return -1;
 +}
 +
 +static void
 +test_address_get_if_addrs_internal_fail(void *arg)
 +{
 +  smartlist_t *results1 = NULL, *results2 = NULL;
 +  int rv = 0;
 +  uint32_t ipv4h_addr = 0;
 +  tor_addr_t ipv6_addr;
 +
 +  memset(&ipv6_addr, 0, sizeof(tor_addr_t));
 +
 +  (void)arg;
 +
 +  MOCK(get_interface_addresses_raw,
 +       mock_get_interface_addresses_raw_fail);
 +  MOCK(get_interface_address6_via_udp_socket_hack,
 +       mock_get_interface_address6_via_udp_socket_hack_fail);
 +
 +  results1 = get_interface_address6_list(LOG_ERR, AF_INET6, 1);
 +  tt_assert(results1 != NULL);
 +  tt_int_op(smartlist_len(results1),==,0);
 +
 +  results2 = get_interface_address_list(LOG_ERR, 1);
 +  tt_assert(results2 != NULL);
 +  tt_int_op(smartlist_len(results2),==,0);
 +
 +  rv = get_interface_address6(LOG_ERR, AF_INET6, &ipv6_addr);
 +  tt_assert(rv == -1);
 +
 +  rv = get_interface_address(LOG_ERR, &ipv4h_addr);
 +  tt_assert(rv == -1);
 +
 + done:
 +  UNMOCK(get_interface_addresses_raw);
 +  UNMOCK(get_interface_address6_via_udp_socket_hack);
 +  free_interface_address6_list(results1);
 +  free_interface_address6_list(results2);
 +  return;
 +}
 +
 +static void
 +test_address_get_if_addrs_no_internal_fail(void *arg)
 +{
 +  smartlist_t *results1 = NULL, *results2 = NULL;
 +
 +  (void)arg;
 +
 +  MOCK(get_interface_addresses_raw,
 +       mock_get_interface_addresses_raw_fail);
 +  MOCK(get_interface_address6_via_udp_socket_hack,
 +       mock_get_interface_address6_via_udp_socket_hack_fail);
 +
 +  results1 = get_interface_address6_list(LOG_ERR, AF_INET6, 0);
 +  tt_assert(results1 != NULL);
 +  tt_int_op(smartlist_len(results1),==,0);
 +
 +  results2 = get_interface_address_list(LOG_ERR, 0);
 +  tt_assert(results2 != NULL);
 +  tt_int_op(smartlist_len(results2),==,0);
 +
 + done:
 +  UNMOCK(get_interface_addresses_raw);
 +  UNMOCK(get_interface_address6_via_udp_socket_hack);
 +  free_interface_address6_list(results1);
 +  free_interface_address6_list(results2);
 +  return;
 +}
 +
 +static void
 +test_address_get_if_addrs(void *arg)
 +{
 +  int rv;
 +  uint32_t addr_h = 0;
 +  tor_addr_t tor_addr;
 +
 +  (void)arg;
 +
 +  rv = get_interface_address(LOG_ERR, &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_v4(&tor_addr));
 +  }
 +
 + done:
 +  return;
 +}
 +
 +static void
 +test_address_get_if_addrs6(void *arg)
 +{
 +  int rv;
 +  tor_addr_t tor_addr;
 +
 +  (void)arg;
 +
 +  rv = get_interface_address6(LOG_ERR, AF_INET6, &tor_addr);
 +
 +  /* Work even on systems without IPv6 interfaces */
 +  if (rv == 0) {
 +    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));
 +  }
 +
 + done:
 +  return;
 +}
 +
++static void
+ test_address_tor_addr_to_in6(void *ignored)
+ {
+   (void)ignored;
+   tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t));
+   const struct in6_addr *res;
+   uint8_t expected[16] = {42, 1, 2, 3, 4, 5, 6, 7, 8, 9,
+                           10, 11, 12, 13, 14, 15};
+ 
+   a->family = AF_INET;
+   res = tor_addr_to_in6(a);
+   tt_assert(!res);
+ 
+   a->family = AF_INET6;
+   memcpy(a->addr.in6_addr.s6_addr, expected, 16);
+   res = tor_addr_to_in6(a);
+   tt_assert(res);
+   tt_mem_op(res->s6_addr, OP_EQ, expected, 16);
+ 
+  done:
+   (void)0;
+ }
+ 
+ static void
+ test_address_tor_addr_to_in(void *ignored)
+ {
+   (void)ignored;
+   tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t));
+   const struct in_addr *res;
+ 
+   a->family = AF_INET6;
+   res = tor_addr_to_in(a);
+   tt_assert(!res);
+ 
+   a->family = AF_INET;
+   a->addr.in_addr.s_addr = 44;
+   res = tor_addr_to_in(a);
+   tt_assert(res);
+   tt_int_op(res->s_addr, OP_EQ, 44);
+ 
+  done:
+   (void)0;
+ }
+ 
+ static void
+ test_address_tor_addr_to_ipv4n(void *ignored)
+ {
+   (void)ignored;
+   tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t));
+   uint32_t res;
+ 
+   a->family = AF_INET6;
+   res = tor_addr_to_ipv4n(a);
+   tt_assert(!res);
+ 
+   a->family = AF_INET;
+   a->addr.in_addr.s_addr = 43;
+   res = tor_addr_to_ipv4n(a);
+   tt_assert(res);
+   tt_int_op(res, OP_EQ, 43);
+ 
+  done:
+   (void)0;
+ }
+ 
+ static void
+ test_address_tor_addr_to_mapped_ipv4h(void *ignored)
+ {
+   (void)ignored;
+   tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t));
+   uint32_t res;
+   uint8_t toset[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 0, 0, 0, 42};
+ 
+   a->family = AF_INET;
+   res = tor_addr_to_mapped_ipv4h(a);
+   tt_assert(!res);
+ 
+   a->family = AF_INET6;
+ 
+   memcpy(a->addr.in6_addr.s6_addr, toset, 16);
+   res = tor_addr_to_mapped_ipv4h(a);
+   tt_assert(res);
+   tt_int_op(res, OP_EQ, 42);
+ 
+  done:
+   (void)0;
+ }
+ 
+ static void
+ test_address_tor_addr_eq_ipv4h(void *ignored)
+ {
+   (void)ignored;
+   tor_addr_t *a = tor_malloc_zero(sizeof(tor_addr_t));
+   int res;
+ 
+   a->family = AF_INET6;
+   res = tor_addr_eq_ipv4h(a, 42);
+   tt_assert(!res);
+ 
+   a->family = AF_INET;
+   a->addr.in_addr.s_addr = 52;
+   res = tor_addr_eq_ipv4h(a, 42);
+   tt_assert(!res);
+ 
+   a->addr.in_addr.s_addr = 52;
+   res = tor_addr_eq_ipv4h(a, ntohl(52));
+   tt_assert(res);
+ 
+  done:
+   (void)0;
+ }
+ 
  #define ADDRESS_TEST(name, flags) \
    { #name, test_address_ ## name, flags, NULL, NULL }
  



More information about the tor-commits mailing list