mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-24 20:33:31 +01:00
Tests for bugs 28683, 30173, and 29203.
This commit is contained in:
parent
621ea2315b
commit
42eb02a327
@ -2220,6 +2220,7 @@ circpad_circ_client_machine_init(void)
|
|||||||
circ_client_machine->conditions.state_mask =
|
circ_client_machine->conditions.state_mask =
|
||||||
CIRCPAD_CIRC_BUILDING|CIRCPAD_CIRC_OPENED|CIRCPAD_CIRC_HAS_RELAY_EARLY;
|
CIRCPAD_CIRC_BUILDING|CIRCPAD_CIRC_OPENED|CIRCPAD_CIRC_HAS_RELAY_EARLY;
|
||||||
circ_client_machine->conditions.purpose_mask = CIRCPAD_PURPOSE_ALL;
|
circ_client_machine->conditions.purpose_mask = CIRCPAD_PURPOSE_ALL;
|
||||||
|
circ_client_machine->conditions.reduced_padding_ok = 1;
|
||||||
|
|
||||||
circ_client_machine->target_hopnum = 2;
|
circ_client_machine->target_hopnum = 2;
|
||||||
circ_client_machine->is_origin_side = 1;
|
circ_client_machine->is_origin_side = 1;
|
||||||
|
@ -1683,7 +1683,10 @@ static void
|
|||||||
helper_create_conditional_machines(void)
|
helper_create_conditional_machines(void)
|
||||||
{
|
{
|
||||||
circpad_machine_spec_t *add = helper_create_conditional_machine();
|
circpad_machine_spec_t *add = helper_create_conditional_machine();
|
||||||
|
|
||||||
|
if (!origin_padding_machines)
|
||||||
origin_padding_machines = smartlist_new();
|
origin_padding_machines = smartlist_new();
|
||||||
|
if (!relay_padding_machines)
|
||||||
relay_padding_machines = smartlist_new();
|
relay_padding_machines = smartlist_new();
|
||||||
|
|
||||||
add->machine_num = 2;
|
add->machine_num = 2;
|
||||||
@ -2396,6 +2399,155 @@ test_circuitpadding_global_rate_limiting(void *arg)
|
|||||||
smartlist_free(vote1.net_params);
|
smartlist_free(vote1.net_params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test reduced and disabled padding */
|
||||||
|
static void
|
||||||
|
test_circuitpadding_reduce_disable(void *arg)
|
||||||
|
{
|
||||||
|
(void) arg;
|
||||||
|
int64_t actual_mocked_monotime_start;
|
||||||
|
|
||||||
|
MOCK(circuitmux_attach_circuit, circuitmux_attach_circuit_mock);
|
||||||
|
|
||||||
|
nodes_init();
|
||||||
|
dummy_channel.cmux = circuitmux_alloc();
|
||||||
|
relay_side = (circuit_t *)new_fake_orcirc(&dummy_channel,
|
||||||
|
&dummy_channel);
|
||||||
|
client_side = (circuit_t *)origin_circuit_new();
|
||||||
|
relay_side->purpose = CIRCUIT_PURPOSE_OR;
|
||||||
|
client_side->purpose = CIRCUIT_PURPOSE_C_GENERAL;
|
||||||
|
|
||||||
|
circpad_machines_init();
|
||||||
|
helper_create_conditional_machines();
|
||||||
|
|
||||||
|
monotime_init();
|
||||||
|
monotime_enable_test_mocking();
|
||||||
|
actual_mocked_monotime_start = MONOTIME_MOCK_START;
|
||||||
|
monotime_set_mock_time_nsec(actual_mocked_monotime_start);
|
||||||
|
monotime_coarse_set_mock_time_nsec(actual_mocked_monotime_start);
|
||||||
|
curr_mocked_time = actual_mocked_monotime_start;
|
||||||
|
timers_initialize();
|
||||||
|
|
||||||
|
/* This is needed so that we are not considered to be dormant */
|
||||||
|
note_user_activity(20);
|
||||||
|
|
||||||
|
MOCK(circuit_package_relay_cell,
|
||||||
|
circuit_package_relay_cell_mock);
|
||||||
|
MOCK(node_get_by_id,
|
||||||
|
node_get_by_id_mock);
|
||||||
|
|
||||||
|
/* Simulate extend. This should result in the original machine getting
|
||||||
|
* added, since the circuit is not built */
|
||||||
|
simulate_single_hop_extend(client_side, relay_side, 1);
|
||||||
|
simulate_single_hop_extend(client_side, relay_side, 1);
|
||||||
|
|
||||||
|
/* Verify that machine #2 is added */
|
||||||
|
tt_int_op(client_side->padding_machine[0]->machine_num, OP_EQ, 2);
|
||||||
|
tt_int_op(relay_side->padding_machine[0]->machine_num, OP_EQ, 2);
|
||||||
|
|
||||||
|
/* Deliver a padding cell to the client, to trigger burst state */
|
||||||
|
circpad_cell_event_padding_sent(client_side);
|
||||||
|
|
||||||
|
/* This should have trigger length shutdown condition on client.. */
|
||||||
|
tt_ptr_op(client_side->padding_info[0], OP_EQ, NULL);
|
||||||
|
tt_ptr_op(client_side->padding_machine[0], OP_EQ, NULL);
|
||||||
|
|
||||||
|
/* Verify machine is gone from both sides */
|
||||||
|
tt_ptr_op(relay_side->padding_info[0], OP_EQ, NULL);
|
||||||
|
tt_ptr_op(relay_side->padding_machine[0], OP_EQ, NULL);
|
||||||
|
|
||||||
|
/* Now test the reduced padding machine by setting up the consensus */
|
||||||
|
networkstatus_t vote1;
|
||||||
|
vote1.net_params = smartlist_new();
|
||||||
|
smartlist_split_string(vote1.net_params,
|
||||||
|
"circpad_padding_reduced=1", NULL, 0, 0);
|
||||||
|
|
||||||
|
/* Register reduced padding machine with the padding subsystem */
|
||||||
|
circpad_new_consensus_params(&vote1);
|
||||||
|
|
||||||
|
simulate_single_hop_extend(client_side, relay_side, 1);
|
||||||
|
|
||||||
|
/* Verify that machine #0 is added */
|
||||||
|
tt_int_op(client_side->padding_machine[0]->machine_num, OP_EQ, 0);
|
||||||
|
tt_int_op(relay_side->padding_machine[0]->machine_num, OP_EQ, 0);
|
||||||
|
|
||||||
|
tt_int_op(
|
||||||
|
circpad_machine_reached_padding_limit(client_side->padding_info[0]),
|
||||||
|
OP_EQ, 0);
|
||||||
|
tt_int_op(
|
||||||
|
circpad_machine_reached_padding_limit(relay_side->padding_info[0]),
|
||||||
|
OP_EQ, 0);
|
||||||
|
|
||||||
|
/* Test that machines get torn down when padding is disabled */
|
||||||
|
SMARTLIST_FOREACH(vote1.net_params, char *, cp, tor_free(cp));
|
||||||
|
smartlist_free(vote1.net_params);
|
||||||
|
vote1.net_params = smartlist_new();
|
||||||
|
smartlist_split_string(vote1.net_params,
|
||||||
|
"circpad_padding_disabled=1", NULL, 0, 0);
|
||||||
|
|
||||||
|
/* Register reduced padding machine with the padding subsystem */
|
||||||
|
circpad_new_consensus_params(&vote1);
|
||||||
|
|
||||||
|
tt_int_op(
|
||||||
|
circpad_machine_schedule_padding(client_side->padding_info[0]),
|
||||||
|
OP_EQ, CIRCPAD_STATE_UNCHANGED);
|
||||||
|
tt_int_op(
|
||||||
|
circpad_machine_schedule_padding(relay_side->padding_info[0]),
|
||||||
|
OP_EQ, CIRCPAD_STATE_UNCHANGED);
|
||||||
|
|
||||||
|
/* Signal that circuit is built: this event causes us to re-evaluate
|
||||||
|
* machine conditions (which don't apply because padding is disabled). */
|
||||||
|
circpad_machine_event_circ_built(TO_ORIGIN_CIRCUIT(client_side));
|
||||||
|
|
||||||
|
tt_ptr_op(client_side->padding_info[0], OP_EQ, NULL);
|
||||||
|
tt_ptr_op(client_side->padding_machine[0], OP_EQ, NULL);
|
||||||
|
tt_ptr_op(relay_side->padding_info[0], OP_EQ, NULL);
|
||||||
|
tt_ptr_op(relay_side->padding_machine[0], OP_EQ, NULL);
|
||||||
|
|
||||||
|
SMARTLIST_FOREACH(vote1.net_params, char *, cp, tor_free(cp));
|
||||||
|
smartlist_free(vote1.net_params);
|
||||||
|
vote1.net_params = NULL;
|
||||||
|
circpad_new_consensus_params(&vote1);
|
||||||
|
|
||||||
|
get_options_mutable()->ReducedCircuitPadding = 1;
|
||||||
|
|
||||||
|
simulate_single_hop_extend(client_side, relay_side, 1);
|
||||||
|
|
||||||
|
/* Verify that machine #0 is added */
|
||||||
|
tt_int_op(client_side->padding_machine[0]->machine_num, OP_EQ, 0);
|
||||||
|
tt_int_op(relay_side->padding_machine[0]->machine_num, OP_EQ, 0);
|
||||||
|
|
||||||
|
tt_int_op(
|
||||||
|
circpad_machine_reached_padding_limit(client_side->padding_info[0]),
|
||||||
|
OP_EQ, 0);
|
||||||
|
tt_int_op(
|
||||||
|
circpad_machine_reached_padding_limit(relay_side->padding_info[0]),
|
||||||
|
OP_EQ, 0);
|
||||||
|
|
||||||
|
get_options_mutable()->CircuitPadding = 0;
|
||||||
|
|
||||||
|
tt_int_op(
|
||||||
|
circpad_machine_schedule_padding(client_side->padding_info[0]),
|
||||||
|
OP_EQ, CIRCPAD_STATE_UNCHANGED);
|
||||||
|
tt_int_op(
|
||||||
|
circpad_machine_schedule_padding(relay_side->padding_info[0]),
|
||||||
|
OP_EQ, CIRCPAD_STATE_UNCHANGED);
|
||||||
|
|
||||||
|
/* Signal that circuit is built: this event causes us to re-evaluate
|
||||||
|
* machine conditions (which don't apply because padding is disabled). */
|
||||||
|
|
||||||
|
circpad_machine_event_circ_built(TO_ORIGIN_CIRCUIT(client_side));
|
||||||
|
|
||||||
|
tt_ptr_op(client_side->padding_info[0], OP_EQ, NULL);
|
||||||
|
tt_ptr_op(client_side->padding_machine[0], OP_EQ, NULL);
|
||||||
|
tt_ptr_op(relay_side->padding_info[0], OP_EQ, NULL);
|
||||||
|
tt_ptr_op(relay_side->padding_machine[0], OP_EQ, NULL);
|
||||||
|
|
||||||
|
done:
|
||||||
|
free_fake_orcirc(relay_side);
|
||||||
|
circuitmux_detach_all_circuits(dummy_channel.cmux, NULL);
|
||||||
|
circuitmux_free(dummy_channel.cmux);
|
||||||
|
}
|
||||||
|
|
||||||
#define TEST_CIRCUITPADDING(name, flags) \
|
#define TEST_CIRCUITPADDING(name, flags) \
|
||||||
{ #name, test_##name, (flags), NULL, NULL }
|
{ #name, test_##name, (flags), NULL, NULL }
|
||||||
|
|
||||||
@ -2410,6 +2562,7 @@ struct testcase_t circuitpadding_tests[] = {
|
|||||||
TEST_CIRCUITPADDING(circuitpadding_sample_distribution, TT_FORK),
|
TEST_CIRCUITPADDING(circuitpadding_sample_distribution, TT_FORK),
|
||||||
TEST_CIRCUITPADDING(circuitpadding_machine_rate_limiting, TT_FORK),
|
TEST_CIRCUITPADDING(circuitpadding_machine_rate_limiting, TT_FORK),
|
||||||
TEST_CIRCUITPADDING(circuitpadding_global_rate_limiting, TT_FORK),
|
TEST_CIRCUITPADDING(circuitpadding_global_rate_limiting, TT_FORK),
|
||||||
|
TEST_CIRCUITPADDING(circuitpadding_reduce_disable, TT_FORK),
|
||||||
TEST_CIRCUITPADDING(circuitpadding_token_removal_lower, TT_FORK),
|
TEST_CIRCUITPADDING(circuitpadding_token_removal_lower, TT_FORK),
|
||||||
TEST_CIRCUITPADDING(circuitpadding_token_removal_higher, TT_FORK),
|
TEST_CIRCUITPADDING(circuitpadding_token_removal_higher, TT_FORK),
|
||||||
TEST_CIRCUITPADDING(circuitpadding_closest_token_removal, TT_FORK),
|
TEST_CIRCUITPADDING(circuitpadding_closest_token_removal, TT_FORK),
|
||||||
|
@ -430,6 +430,7 @@ get_options_test_data(const char *conf)
|
|||||||
// Being kinda lame and just fixing the immedate breakage for now..
|
// Being kinda lame and just fixing the immedate breakage for now..
|
||||||
result->opt->ConnectionPadding = -1; // default must be "auto"
|
result->opt->ConnectionPadding = -1; // default must be "auto"
|
||||||
result->opt->DormantClientTimeout = 1800; // must be over 600.
|
result->opt->DormantClientTimeout = 1800; // must be over 600.
|
||||||
|
result->opt->CircuitPadding = 1; // default must be "1"
|
||||||
|
|
||||||
rv = config_get_lines(conf, &cl, 1);
|
rv = config_get_lines(conf, &cl, 1);
|
||||||
tt_int_op(rv, OP_EQ, 0);
|
tt_int_op(rv, OP_EQ, 0);
|
||||||
|
Loading…
Reference in New Issue
Block a user