mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
Choose directory servers by IPv4/IPv6 preferences
Add unit tests, refactor pick_directory functions.
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
#include "or.h"
|
||||
#include "routerlist.h"
|
||||
#include "directory.h"
|
||||
#include "connection.h"
|
||||
#include "test.h"
|
||||
|
||||
/* 4 digests + 3 sep + pre + post + NULL */
|
||||
@@ -94,12 +95,84 @@ test_routerlist_launch_descriptor_downloads(void *arg)
|
||||
smartlist_free(downloadable);
|
||||
}
|
||||
|
||||
connection_t *mocked_connection = NULL;
|
||||
|
||||
/* Mock connection_get_by_type_addr_port_purpose by returning
|
||||
* mocked_connection. */
|
||||
static connection_t *
|
||||
mock_connection_get_by_type_addr_port_purpose(int type,
|
||||
const tor_addr_t *addr,
|
||||
uint16_t port, int purpose)
|
||||
{
|
||||
(void)type;
|
||||
(void)addr;
|
||||
(void)port;
|
||||
(void)purpose;
|
||||
|
||||
return mocked_connection;
|
||||
}
|
||||
|
||||
#define TEST_ADDR_STR "127.0.0.1"
|
||||
#define TEST_DIR_PORT 12345
|
||||
|
||||
static void
|
||||
test_routerlist_router_is_already_dir_fetching(void *arg)
|
||||
{
|
||||
(void)arg;
|
||||
tor_addr_port_t test_ap, null_addr_ap, zero_port_ap;
|
||||
|
||||
/* Setup */
|
||||
tor_addr_parse(&test_ap.addr, TEST_ADDR_STR);
|
||||
test_ap.port = TEST_DIR_PORT;
|
||||
tor_addr_make_null(&null_addr_ap.addr, AF_INET6);
|
||||
null_addr_ap.port = TEST_DIR_PORT;
|
||||
tor_addr_parse(&zero_port_ap.addr, TEST_ADDR_STR);
|
||||
zero_port_ap.port = 0;
|
||||
MOCK(connection_get_by_type_addr_port_purpose,
|
||||
mock_connection_get_by_type_addr_port_purpose);
|
||||
|
||||
/* Test that we never get 1 from a NULL connection */
|
||||
mocked_connection = NULL;
|
||||
tt_assert(router_is_already_dir_fetching(&test_ap, 1, 1) == 0);
|
||||
tt_assert(router_is_already_dir_fetching(&test_ap, 1, 0) == 0);
|
||||
tt_assert(router_is_already_dir_fetching(&test_ap, 0, 1) == 0);
|
||||
/* We always expect 0 in these cases */
|
||||
tt_assert(router_is_already_dir_fetching(&test_ap, 0, 0) == 0);
|
||||
tt_assert(router_is_already_dir_fetching(NULL, 1, 1) == 0);
|
||||
tt_assert(router_is_already_dir_fetching(&null_addr_ap, 1, 1) == 0);
|
||||
tt_assert(router_is_already_dir_fetching(&zero_port_ap, 1, 1) == 0);
|
||||
|
||||
/* Test that we get 1 with a connection in the appropriate circumstances */
|
||||
mocked_connection = connection_new(CONN_TYPE_DIR, AF_INET);
|
||||
tt_assert(router_is_already_dir_fetching(&test_ap, 1, 1) == 1);
|
||||
tt_assert(router_is_already_dir_fetching(&test_ap, 1, 0) == 1);
|
||||
tt_assert(router_is_already_dir_fetching(&test_ap, 0, 1) == 1);
|
||||
|
||||
/* Test that we get 0 even with a connection in the appropriate
|
||||
* circumstances */
|
||||
tt_assert(router_is_already_dir_fetching(&test_ap, 0, 0) == 0);
|
||||
tt_assert(router_is_already_dir_fetching(NULL, 1, 1) == 0);
|
||||
tt_assert(router_is_already_dir_fetching(&null_addr_ap, 1, 1) == 0);
|
||||
tt_assert(router_is_already_dir_fetching(&zero_port_ap, 1, 1) == 0);
|
||||
|
||||
done:
|
||||
/* If a connection is never set up, connection_free chokes on it. */
|
||||
buf_free(mocked_connection->inbuf);
|
||||
buf_free(mocked_connection->outbuf);
|
||||
tor_free(mocked_connection);
|
||||
UNMOCK(connection_get_by_type_addr_port_purpose);
|
||||
}
|
||||
|
||||
#undef TEST_ADDR_STR
|
||||
#undef TEST_DIR_PORT
|
||||
|
||||
#define NODE(name, flags) \
|
||||
{ #name, test_routerlist_##name, (flags), NULL, NULL }
|
||||
|
||||
struct testcase_t routerlist_tests[] = {
|
||||
NODE(initiate_descriptor_downloads, 0),
|
||||
NODE(launch_descriptor_downloads, 0),
|
||||
NODE(router_is_already_dir_fetching, TT_FORK),
|
||||
END_OF_TESTCASES
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user