mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
Add a mock replacement for blocking hostname resolution
Based on examination of our tests, this mock function accepts "localhost" and "torproject.org", and rejects everything else.
This commit is contained in:
@@ -102,6 +102,7 @@ src_test_test_SOURCES += \
|
||||
src/test/log_test_helpers.c \
|
||||
src/test/hs_test_helpers.c \
|
||||
src/test/rend_test_helpers.c \
|
||||
src/test/resolve_test_helpers.c \
|
||||
src/test/rng_test_helpers.c \
|
||||
src/test/test.c \
|
||||
src/test/test_accounting.c \
|
||||
@@ -340,6 +341,7 @@ noinst_HEADERS+= \
|
||||
src/test/hs_test_helpers.h \
|
||||
src/test/log_test_helpers.h \
|
||||
src/test/rend_test_helpers.h \
|
||||
src/test/resolve_test_helpers.h \
|
||||
src/test/rng_test_helpers.h \
|
||||
src/test/test.h \
|
||||
src/test/ptr_helpers.h \
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
/* Copyright (c) 2001 Matej Pfajfar.
|
||||
* Copyright (c) 2001-2004, Roger Dingledine.
|
||||
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
||||
* Copyright (c) 2007-2019, The Tor Project, Inc. */
|
||||
/* See LICENSE for licensing information */
|
||||
|
||||
/**
|
||||
* @file resolve_test_helpers.c
|
||||
* @brief Helper functions for mocking libc's blocking hostname lookup
|
||||
* facilities.
|
||||
**/
|
||||
|
||||
#define RESOLVE_PRIVATE
|
||||
#include "orconfig.h"
|
||||
#include "test/resolve_test_helpers.h"
|
||||
#include "lib/net/address.h"
|
||||
#include "lib/net/resolve.h"
|
||||
#include "test/test.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
/**
|
||||
* Mock replacement for our getaddrinfo/gethostbyname wrapper.
|
||||
**/
|
||||
static int
|
||||
replacement_host_lookup(const char *name, uint16_t family, tor_addr_t *addr)
|
||||
{
|
||||
static const struct lookup_table_ent {
|
||||
const char *name;
|
||||
const char *ipv4;
|
||||
const char *ipv6;
|
||||
} entries[] = {
|
||||
{ "localhost", "127.0.0.1", "::1" },
|
||||
{ "torproject.org", "198.51.100.6", "2001:DB8::700" },
|
||||
{ NULL, NULL, NULL },
|
||||
};
|
||||
|
||||
int r = -1;
|
||||
|
||||
for (unsigned i = 0; entries[i].name != NULL; ++i) {
|
||||
if (!strcasecmp(name, entries[i].name)) {
|
||||
if (family == AF_INET6) {
|
||||
int s = tor_addr_parse(addr, entries[i].ipv6);
|
||||
tt_int_op(s, OP_EQ, AF_INET6);
|
||||
} else {
|
||||
int s = tor_addr_parse(addr, entries[i].ipv4);
|
||||
tt_int_op(s, OP_EQ, AF_INET);
|
||||
}
|
||||
r = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
log_debug(LD_GENERAL, "resolve(%s,%d) => %s",
|
||||
name, family, r == 0 ? fmt_addr(addr) : "-1");
|
||||
|
||||
return r;
|
||||
done:
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up a mock replacement for our wrapper on libc's resolver code.
|
||||
*
|
||||
* According to our replacement, only "localhost" and "torproject.org"
|
||||
* are real addresses; everything else doesn't exist.
|
||||
*
|
||||
* Use this function to avoid using the DNS resolver during unit tests;
|
||||
* call unmock_hostname_resolver() when you're done.
|
||||
**/
|
||||
void
|
||||
mock_hostname_resolver(void)
|
||||
{
|
||||
MOCK(tor_addr_lookup_host_impl, replacement_host_lookup);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unmock our wrappers for libc's blocking hostname resolver code.
|
||||
**/
|
||||
void
|
||||
unmock_hostname_resolver(void)
|
||||
{
|
||||
UNMOCK(tor_addr_lookup_host_impl);
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
/* Copyright (c) 2001 Matej Pfajfar.
|
||||
* Copyright (c) 2001-2004, Roger Dingledine.
|
||||
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
||||
* Copyright (c) 2007-2019, The Tor Project, Inc. */
|
||||
/* See LICENSE for licensing information */
|
||||
|
||||
/**
|
||||
* @file resolve_test_helpers.h
|
||||
* @brief Header for test/resolve_test_helpers.c
|
||||
**/
|
||||
|
||||
#ifndef TOR_TEST_RESOLVE_TEST_HELPERS_H
|
||||
#define TOR_TEST_RESOLVE_TEST_HELPERS_H
|
||||
|
||||
void mock_hostname_resolver(void);
|
||||
void unmock_hostname_resolver(void);
|
||||
|
||||
#endif /* !defined(TOR_TEST_RESOLVE_TEST_HELPERS_H) */
|
||||
Reference in New Issue
Block a user