tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

resolve_test_helpers.c (2124B)


      1 /* Copyright (c) 2001 Matej Pfajfar.
      2 * Copyright (c) 2001-2004, Roger Dingledine.
      3 * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
      4 * Copyright (c) 2007-2021, The Tor Project, Inc. */
      5 /* See LICENSE for licensing information */
      6 
      7 /**
      8 * @file resolve_test_helpers.c
      9 * @brief Helper functions for mocking libc's blocking hostname lookup
     10 *   facilities.
     11 **/
     12 
     13 #define RESOLVE_PRIVATE
     14 #include "orconfig.h"
     15 #include "test/resolve_test_helpers.h"
     16 #include "lib/net/address.h"
     17 #include "lib/net/resolve.h"
     18 #include "test/test.h"
     19 
     20 #include <stdio.h>
     21 #include <string.h>
     22 
     23 /**
     24 * Mock replacement for our getaddrinfo/gethostbyname wrapper.
     25 **/
     26 static int
     27 replacement_host_lookup(const char *name, uint16_t family, tor_addr_t *addr)
     28 {
     29  static const struct lookup_table_ent {
     30    const char *name;
     31    const char *ipv4;
     32    const char *ipv6;
     33  } entries[] = {
     34    { "localhost", "127.0.0.1", "::1" },
     35    { "torproject.org", "198.51.100.6", "2001:DB8::700" },
     36    { NULL, NULL, NULL },
     37  };
     38 
     39  int r = -1;
     40 
     41  for (unsigned i = 0; entries[i].name != NULL; ++i) {
     42    if (!strcasecmp(name, entries[i].name)) {
     43      if (family == AF_INET6) {
     44        int s = tor_addr_parse(addr, entries[i].ipv6);
     45        tt_int_op(s, OP_EQ, AF_INET6);
     46      } else {
     47        int s = tor_addr_parse(addr, entries[i].ipv4);
     48        tt_int_op(s, OP_EQ, AF_INET);
     49      }
     50      r = 0;
     51      break;
     52    }
     53  }
     54 
     55  log_debug(LD_GENERAL, "resolve(%s,%d) => %s",
     56            name, family, r == 0 ? fmt_addr(addr) : "-1");
     57 
     58  return r;
     59 done:
     60  return -1;
     61 }
     62 
     63 /**
     64 * Set up a mock replacement for our wrapper on libc's resolver code.
     65 *
     66 * According to our replacement, only "localhost" and "torproject.org"
     67 * are real addresses; everything else doesn't exist.
     68 *
     69 * Use this function to avoid using the DNS resolver during unit tests;
     70 * call unmock_hostname_resolver() when you're done.
     71 **/
     72 void
     73 mock_hostname_resolver(void)
     74 {
     75  MOCK(tor_addr_lookup_host_impl, replacement_host_lookup);
     76 }
     77 
     78 /**
     79 * Unmock our wrappers for libc's blocking hostname resolver code.
     80 **/
     81 void
     82 unmock_hostname_resolver(void)
     83 {
     84  UNMOCK(tor_addr_lookup_host_impl);
     85 }