relay: Add tests for choosing extend IPs

Part of 33817.
This commit is contained in:
teor
2020-04-29 21:25:10 +10:00
parent 9a6186c267
commit df5ea29775
+93 -7
View File
@@ -821,6 +821,97 @@ test_circuit_extend_lspec_valid(void *arg)
tor_free(p_chan);
}
static bool router_has_ipv6_orport_result = false;
static int mock_router_ipv6_orport_calls = 0;
static bool
mock_router_has_advertised_ipv6_orport(const or_options_t *options)
{
(void)options;
mock_router_ipv6_orport_calls++;
return router_has_ipv6_orport_result;
}
/* Test the different cases in circuit_choose_ip_ap_for_extend(). */
static void
test_circuit_choose_ip_ap_for_extend(void *arg)
{
(void)arg;
tor_addr_port_t ipv4_ap;
tor_addr_port_t ipv6_ap;
/* Set up valid addresses */
tor_addr_parse(&ipv4_ap.addr, PUBLIC_IPV4);
ipv4_ap.port = VALID_PORT;
tor_addr_parse(&ipv6_ap.addr, PUBLIC_IPV6);
ipv6_ap.port = VALID_PORT;
or_options_t *fake_options = options_new();
MOCK(get_options, mock_get_options);
mocked_options = fake_options;
MOCK(router_has_advertised_ipv6_orport,
mock_router_has_advertised_ipv6_orport);
router_has_ipv6_orport_result = true;
mock_router_ipv6_orport_calls = 0;
/* No valid addresses */
router_has_ipv6_orport_result = true;
mock_router_ipv6_orport_calls = 0;
tt_ptr_op(circuit_choose_ip_ap_for_extend(NULL, NULL), OP_EQ, NULL);
tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
router_has_ipv6_orport_result = false;
mock_router_ipv6_orport_calls = 0;
tt_ptr_op(circuit_choose_ip_ap_for_extend(NULL, NULL), OP_EQ, NULL);
tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
/* One valid address: IPv4 */
router_has_ipv6_orport_result = true;
mock_router_ipv6_orport_calls = 0;
tt_ptr_op(circuit_choose_ip_ap_for_extend(&ipv4_ap, NULL), OP_EQ, &ipv4_ap);
tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
router_has_ipv6_orport_result = false;
mock_router_ipv6_orport_calls = 0;
tt_ptr_op(circuit_choose_ip_ap_for_extend(&ipv4_ap, NULL), OP_EQ, &ipv4_ap);
tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
/* One valid address: IPv6 */
router_has_ipv6_orport_result = true;
mock_router_ipv6_orport_calls = 0;
tt_ptr_op(circuit_choose_ip_ap_for_extend(NULL, &ipv6_ap), OP_EQ, &ipv6_ap);
tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
router_has_ipv6_orport_result = false;
mock_router_ipv6_orport_calls = 0;
tt_ptr_op(circuit_choose_ip_ap_for_extend(NULL, &ipv6_ap), OP_EQ, NULL);
tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
/* Two valid addresses */
const tor_addr_port_t *chosen_addr = NULL;
router_has_ipv6_orport_result = true;
mock_router_ipv6_orport_calls = 0;
chosen_addr = circuit_choose_ip_ap_for_extend(&ipv4_ap, &ipv6_ap);
tt_assert(chosen_addr == &ipv4_ap || chosen_addr == &ipv6_ap);
tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
router_has_ipv6_orport_result = false;
mock_router_ipv6_orport_calls = 0;
tt_ptr_op(circuit_choose_ip_ap_for_extend(&ipv4_ap, &ipv6_ap),
OP_EQ, &ipv4_ap);
tt_int_op(mock_router_ipv6_orport_calls, OP_EQ, 1);
done:
UNMOCK(get_options);
or_options_free(fake_options);
mocked_options = NULL;
UNMOCK(router_has_advertised_ipv6_orport);
tor_free(fake_options);
}
static int mock_circuit_close_calls = 0;
static void
mock_circuit_mark_for_close_(circuit_t *circ, int reason,
@@ -849,13 +940,6 @@ mock_channel_connect_for_circuit(const tor_addr_t *addr,
return mock_channel_connect_nchan;
}
static bool
mock_router_has_advertised_ipv6_orport(const or_options_t *options)
{
(void)options;
return 1;
}
/* Test the different cases in circuit_open_connection_for_extend().
* Chooses different IP addresses depending on the first character in arg:
* - 4: IPv4
@@ -886,6 +970,7 @@ test_circuit_open_connection_for_extend(void *arg)
MOCK(router_has_advertised_ipv6_orport,
mock_router_has_advertised_ipv6_orport);
router_has_ipv6_orport_result = true;
setup_full_capture_of_logs(LOG_INFO);
@@ -1457,6 +1542,7 @@ struct testcase_t circuitbuild_tests[] = {
TEST_CIRCUIT(extend_state_valid, TT_FORK),
TEST_CIRCUIT(extend_add_ed25519, TT_FORK),
TEST_CIRCUIT(extend_lspec_valid, TT_FORK),
TEST_CIRCUIT(choose_ip_ap_for_extend, 0),
TEST_CIRCUIT_PASSTHROUGH(open_connection_for_extend, TT_FORK, "4"),
TEST_CIRCUIT_PASSTHROUGH(open_connection_for_extend, TT_FORK, "6"),
TEST_CIRCUIT_PASSTHROUGH(open_connection_for_extend, TT_FORK, "dual-stack"),