diff --git a/src/or/shared_random_state.c b/src/or/shared_random_state.c index 1fc1440d0d..7f8094dafd 100644 --- a/src/or/shared_random_state.c +++ b/src/or/shared_random_state.c @@ -176,6 +176,22 @@ sr_state_get_start_time_of_current_protocol_run(time_t now) return beginning_of_current_round - time_elapsed_since_start_of_run; } +/** Return the time (in seconds) it takes to complete a full SR protocol phase + * (e.g. the commit phase). */ +unsigned int +sr_state_get_phase_duration(void) +{ + return SHARED_RANDOM_N_ROUNDS * get_voting_interval(); +} + +/** Return the time (in seconds) it takes to complete a full SR protocol run */ +unsigned int +sr_state_get_protocol_run_duration(void) +{ + int total_protocol_rounds = SHARED_RANDOM_N_ROUNDS * SHARED_RANDOM_N_PHASES; + return total_protocol_rounds * get_voting_interval(); +} + /* Return the time we should expire the state file created at now. * We expire the state file in the beginning of the next protocol run. */ STATIC time_t diff --git a/src/or/shared_random_state.h b/src/or/shared_random_state.h index ae1c5ac219..03dd5eb37e 100644 --- a/src/or/shared_random_state.h +++ b/src/or/shared_random_state.h @@ -122,6 +122,8 @@ void sr_state_save(void); void sr_state_free(void); time_t sr_state_get_start_time_of_current_protocol_run(time_t now); +unsigned int sr_state_get_phase_duration(void); +unsigned int sr_state_get_protocol_run_duration(void); #ifdef SHARED_RANDOM_STATE_PRIVATE diff --git a/src/test/test_shared_random.c b/src/test/test_shared_random.c index 3eb47dfbc3..ea037d417b 100644 --- a/src/test/test_shared_random.c +++ b/src/test/test_shared_random.c @@ -260,6 +260,25 @@ test_get_start_time_of_current_run(void *arg) ; } +static void +test_get_sr_protocol_duration(void *arg) +{ + (void) arg; + + /* Check that by default an SR phase is 12 hours */ + tt_int_op(sr_state_get_phase_duration(), ==, 12*60*60); + tt_int_op(sr_state_get_protocol_run_duration(), ==, 24*60*60); + + /* Now alter the voting interval and check that the SR phase is 2 mins long + * if voting happens every 10 seconds (10*12 seconds = 2 mins) */ + or_options_t *options = get_options_mutable(); + options->V3AuthVotingInterval = 10; + tt_int_op(sr_state_get_phase_duration(), ==, 2*60); + tt_int_op(sr_state_get_protocol_run_duration(), ==, 4*60); + + done: ; +} + /* Mock function to immediately return our local 'mock_consensus'. */ static networkstatus_t * mock_networkstatus_get_live_consensus(time_t now) @@ -1345,6 +1364,8 @@ struct testcase_t sr_tests[] = { NULL, NULL }, { "get_start_time_of_current_run", test_get_start_time_of_current_run, TT_FORK, NULL, NULL }, + { "get_sr_protocol_duration", test_get_sr_protocol_duration, TT_FORK, + NULL, NULL }, { "get_state_valid_until_time", test_get_state_valid_until_time, TT_FORK, NULL, NULL }, { "vote", test_vote, TT_FORK,