SR: Compute the start time of the current protocol run.

This function will be used to make the HS desc overlap function be
independent of absolute times.
This commit is contained in:
George Kadianakis 2017-07-17 14:45:14 +03:00 committed by Nick Mathewson
parent 85c80adf4a
commit 2af254096f
3 changed files with 95 additions and 0 deletions

View File

@ -156,6 +156,26 @@ get_start_time_of_current_round(time_t now)
return curr_start; return curr_start;
} }
/** Return the start time of the current SR protocol run. For example, if the
* time is 23/06/2017 23:47:08 and a full SR protocol run is 24 hours, this
* function should return 23/06/2017 00:00:00. */
time_t
sr_state_get_start_time_of_current_protocol_run(time_t now)
{
int total_rounds = SHARED_RANDOM_N_ROUNDS * SHARED_RANDOM_N_PHASES;
int voting_interval = get_voting_interval();
/* Find the time the current round started. */
time_t beginning_of_current_round = get_start_time_of_current_round(now);
/* Get current SR protocol round */
int current_round = (now / voting_interval) % total_rounds;
/* Get start time by subtracting the time elapsed from the beginning of the
protocol run */
time_t time_elapsed_since_start_of_run = current_round * voting_interval;
return beginning_of_current_round - time_elapsed_since_start_of_run;
}
/* Return the time we should expire the state file created at <b>now</b>. /* Return the time we should expire the state file created at <b>now</b>.
* We expire the state file in the beginning of the next protocol run. */ * We expire the state file in the beginning of the next protocol run. */
STATIC time_t STATIC time_t

View File

@ -121,6 +121,8 @@ int sr_state_is_initialized(void);
void sr_state_save(void); void sr_state_save(void);
void sr_state_free(void); void sr_state_free(void);
time_t sr_state_get_start_time_of_current_protocol_run(time_t now);
#ifdef SHARED_RANDOM_STATE_PRIVATE #ifdef SHARED_RANDOM_STATE_PRIVATE
STATIC int disk_state_load_from_disk_impl(const char *fname); STATIC int disk_state_load_from_disk_impl(const char *fname);

View File

@ -189,6 +189,77 @@ test_get_state_valid_until_time(void *arg)
; ;
} }
/** Test the function that calculates the start time of the current SRV
* protocol run. */
static void
test_get_start_time_of_current_run(void *arg)
{
int retval;
char tbuf[ISO_TIME_LEN + 1];
time_t current_time, run_start_time;
(void) arg;
{
/* Get start time if called at 00:00:01 */
retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:01 UTC",
&current_time);
tt_int_op(retval, ==, 0);
run_start_time =
sr_state_get_start_time_of_current_protocol_run(current_time);
/* Compare it with the correct result */
format_iso_time(tbuf, run_start_time);
tt_str_op("2015-04-20 00:00:00", OP_EQ, tbuf);
}
{
retval = parse_rfc1123_time("Mon, 20 Apr 2015 23:59:59 UTC",
&current_time);
tt_int_op(retval, ==, 0);
run_start_time =
sr_state_get_start_time_of_current_protocol_run(current_time);
/* Compare it with the correct result */
format_iso_time(tbuf, run_start_time);
tt_str_op("2015-04-20 00:00:00", OP_EQ, tbuf);
}
{
retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:00:00 UTC",
&current_time);
tt_int_op(retval, ==, 0);
run_start_time =
sr_state_get_start_time_of_current_protocol_run(current_time);
/* Compare it with the correct result */
format_iso_time(tbuf, run_start_time);
tt_str_op("2015-04-20 00:00:00", OP_EQ, tbuf);
}
/* Now let's alter the voting schedule and check the correctness of the
* function. Voting interval of 10 seconds, means that an SRV protocol run
* takes 10 seconds * 24 rounds = 4 mins */
{
or_options_t *options = get_options_mutable();
options->V3AuthVotingInterval = 10;
options->TestingV3AuthInitialVotingInterval = 10;
retval = parse_rfc1123_time("Mon, 20 Apr 2015 00:15:32 UTC",
&current_time);
tt_int_op(retval, ==, 0);
run_start_time =
sr_state_get_start_time_of_current_protocol_run(current_time);
/* Compare it with the correct result */
format_iso_time(tbuf, run_start_time);
tt_str_op("2015-04-20 00:12:00", OP_EQ, tbuf);
}
done:
;
}
/* Mock function to immediately return our local 'mock_consensus'. */ /* Mock function to immediately return our local 'mock_consensus'. */
static networkstatus_t * static networkstatus_t *
mock_networkstatus_get_live_consensus(time_t now) mock_networkstatus_get_live_consensus(time_t now)
@ -1272,6 +1343,8 @@ struct testcase_t sr_tests[] = {
NULL, NULL }, NULL, NULL },
{ "get_next_valid_after_time", test_get_next_valid_after_time, TT_FORK, { "get_next_valid_after_time", test_get_next_valid_after_time, TT_FORK,
NULL, NULL }, NULL, NULL },
{ "get_start_time_of_current_run", test_get_start_time_of_current_run,
TT_FORK, NULL, NULL },
{ "get_state_valid_until_time", test_get_state_valid_until_time, TT_FORK, { "get_state_valid_until_time", test_get_state_valid_until_time, TT_FORK,
NULL, NULL }, NULL, NULL },
{ "vote", test_vote, TT_FORK, { "vote", test_vote, TT_FORK,