mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-30 23:53:32 +01:00
Add tests for new_route_len()
This commit is contained in:
parent
e79f90c7f0
commit
1e8e8a4e94
@ -73,7 +73,6 @@ static int circuit_deliver_create_cell(circuit_t *circ,
|
||||
static int onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit);
|
||||
static crypt_path_t *onion_next_hop_in_cpath(crypt_path_t *cpath);
|
||||
static int onion_extend_cpath(origin_circuit_t *circ);
|
||||
static int count_acceptable_nodes(smartlist_t *routers);
|
||||
static int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice);
|
||||
|
||||
/** This function tries to get a channel to the specified endpoint,
|
||||
@ -1552,7 +1551,7 @@ onionskin_answer(or_circuit_t *circ,
|
||||
* If the routerlist <b>nodes</b> doesn't have enough routers
|
||||
* to handle the desired path length, return -1.
|
||||
*/
|
||||
static int
|
||||
STATIC int
|
||||
new_route_len(uint8_t purpose, extend_info_t *exit_ei, smartlist_t *nodes)
|
||||
{
|
||||
int num_acceptable_routers;
|
||||
@ -2188,8 +2187,8 @@ circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *exit_ei)
|
||||
/** Return the number of routers in <b>routers</b> that are currently up
|
||||
* and available for building circuits through.
|
||||
*/
|
||||
static int
|
||||
count_acceptable_nodes(smartlist_t *nodes)
|
||||
MOCK_IMPL(STATIC int,
|
||||
count_acceptable_nodes, (smartlist_t *nodes))
|
||||
{
|
||||
int num=0;
|
||||
|
||||
|
@ -77,6 +77,9 @@ void circuit_upgrade_circuits_from_guard_wait(void);
|
||||
|
||||
#ifdef CIRCUITBUILD_PRIVATE
|
||||
STATIC circid_t get_unique_circ_id_by_chan(channel_t *chan);
|
||||
STATIC int new_route_len(uint8_t purpose, extend_info_t *exit_ei,
|
||||
smartlist_t *nodes);
|
||||
MOCK_DECL(STATIC int, count_acceptable_nodes, (smartlist_t *nodes));
|
||||
#if defined(ENABLE_TOR2WEB_MODE) || defined(TOR_UNIT_TESTS)
|
||||
STATIC const node_t *pick_tor2web_rendezvous_node(router_crn_flags_t flags,
|
||||
const or_options_t *options);
|
||||
|
@ -82,6 +82,7 @@ src_test_test_SOURCES = \
|
||||
src/test/test_checkdir.c \
|
||||
src/test/test_circuitlist.c \
|
||||
src/test/test_circuitmux.c \
|
||||
src/test/test_circuitbuild.c \
|
||||
src/test/test_circuituse.c \
|
||||
src/test/test_compat_libevent.c \
|
||||
src/test/test_config.c \
|
||||
|
@ -1188,6 +1188,7 @@ struct testgroup_t testgroups[] = {
|
||||
{ "channel/", channel_tests },
|
||||
{ "channeltls/", channeltls_tests },
|
||||
{ "checkdir/", checkdir_tests },
|
||||
{ "circuitbuild/", circuitbuild_tests },
|
||||
{ "circuitlist/", circuitlist_tests },
|
||||
{ "circuitmux/", circuitmux_tests },
|
||||
{ "circuituse/", circuituse_tests },
|
||||
|
@ -183,6 +183,7 @@ extern struct testcase_t cell_queue_tests[];
|
||||
extern struct testcase_t channel_tests[];
|
||||
extern struct testcase_t channeltls_tests[];
|
||||
extern struct testcase_t checkdir_tests[];
|
||||
extern struct testcase_t circuitbuild_tests[];
|
||||
extern struct testcase_t circuitlist_tests[];
|
||||
extern struct testcase_t circuitmux_tests[];
|
||||
extern struct testcase_t circuituse_tests[];
|
||||
|
105
src/test/test_circuitbuild.c
Normal file
105
src/test/test_circuitbuild.c
Normal file
@ -0,0 +1,105 @@
|
||||
/* Copyright (c) 2001-2004, Roger Dingledine.
|
||||
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
|
||||
* Copyright (c) 2007-2016, The Tor Project, Inc. */
|
||||
/* See LICENSE for licensing information */
|
||||
|
||||
#define CIRCUITBUILD_PRIVATE
|
||||
|
||||
#include "or.h"
|
||||
#include "test.h"
|
||||
#include "test_helpers.h"
|
||||
#include "config.h"
|
||||
#include "circuitbuild.h"
|
||||
|
||||
/* Dummy nodes smartlist for testing */
|
||||
static smartlist_t dummy_nodes;
|
||||
/* Dummy exit extend_info for testing */
|
||||
static extend_info_t dummy_ei;
|
||||
|
||||
static int
|
||||
mock_count_acceptable_nodes(smartlist_t *nodes)
|
||||
{
|
||||
(void)nodes;
|
||||
|
||||
return DEFAULT_ROUTE_LEN + 1;
|
||||
}
|
||||
|
||||
/* Test route lengths when the caller of new_route_len() doesn't
|
||||
* specify exit_ei. */
|
||||
static void
|
||||
test_new_route_len_noexit(void *arg)
|
||||
{
|
||||
int r;
|
||||
|
||||
(void)arg;
|
||||
MOCK(count_acceptable_nodes, mock_count_acceptable_nodes);
|
||||
|
||||
r = new_route_len(CIRCUIT_PURPOSE_C_GENERAL, NULL, &dummy_nodes);
|
||||
tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r);
|
||||
|
||||
r = new_route_len(CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT, NULL, &dummy_nodes);
|
||||
tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r);
|
||||
|
||||
r = new_route_len(CIRCUIT_PURPOSE_S_CONNECT_REND, NULL, &dummy_nodes);
|
||||
tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r);
|
||||
|
||||
done:
|
||||
UNMOCK(count_acceptable_nodes);
|
||||
}
|
||||
|
||||
/* Test route lengths where someone else chose the "exit" node, which
|
||||
* require an extra hop for safety. */
|
||||
static void
|
||||
test_new_route_len_unsafe_exit(void *arg)
|
||||
{
|
||||
int r;
|
||||
|
||||
(void)arg;
|
||||
MOCK(count_acceptable_nodes, mock_count_acceptable_nodes);
|
||||
|
||||
/* connecting to hidden service directory */
|
||||
r = new_route_len(CIRCUIT_PURPOSE_C_GENERAL, &dummy_ei, &dummy_nodes);
|
||||
tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r);
|
||||
|
||||
/* client connecting to introduction point */
|
||||
r = new_route_len(CIRCUIT_PURPOSE_C_INTRODUCING, &dummy_ei, &dummy_nodes);
|
||||
tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r);
|
||||
|
||||
/* hidden service connecting to rendezvous point */
|
||||
r = new_route_len(CIRCUIT_PURPOSE_S_CONNECT_REND, &dummy_ei, &dummy_nodes);
|
||||
tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r);
|
||||
|
||||
done:
|
||||
UNMOCK(count_acceptable_nodes);
|
||||
}
|
||||
|
||||
/* Test route lengths where we chose the "exit" node, which don't
|
||||
* require an extra hop for safety. */
|
||||
static void
|
||||
test_new_route_len_safe_exit(void *arg)
|
||||
{
|
||||
int r;
|
||||
|
||||
(void)arg;
|
||||
MOCK(count_acceptable_nodes, mock_count_acceptable_nodes);
|
||||
|
||||
/* hidden service connecting to introduction point */
|
||||
r = new_route_len(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, &dummy_ei,
|
||||
&dummy_nodes);
|
||||
tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r);
|
||||
|
||||
/* router testing its own reachability */
|
||||
r = new_route_len(CIRCUIT_PURPOSE_TESTING, &dummy_ei, &dummy_nodes);
|
||||
tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r);
|
||||
|
||||
done:
|
||||
UNMOCK(count_acceptable_nodes);
|
||||
}
|
||||
|
||||
struct testcase_t circuitbuild_tests[] = {
|
||||
{ "noexit", test_new_route_len_noexit, 0, NULL, NULL },
|
||||
{ "safe_exit", test_new_route_len_safe_exit, 0, NULL, NULL },
|
||||
{ "unsafe_exit", test_new_route_len_unsafe_exit, 0, NULL, NULL },
|
||||
END_OF_TESTCASES
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user