|  | @@ -468,7 +468,7 @@ static const config_var_t testing_tor_network_defaults[] = {
 | 
	
		
			
				|  |  |    V(V3AuthVotingInterval,        INTERVAL, "5 minutes"),
 | 
	
		
			
				|  |  |    V(V3AuthVoteDelay,             INTERVAL, "20 seconds"),
 | 
	
		
			
				|  |  |    V(V3AuthDistDelay,             INTERVAL, "20 seconds"),
 | 
	
		
			
				|  |  | -  V(TestingV3AuthInitialVotingInterval, INTERVAL, "5 minutes"),
 | 
	
		
			
				|  |  | +  V(TestingV3AuthInitialVotingInterval, INTERVAL, "150 seconds"),
 | 
	
		
			
				|  |  |    V(TestingV3AuthInitialVoteDelay, INTERVAL, "20 seconds"),
 | 
	
		
			
				|  |  |    V(TestingV3AuthInitialDistDelay, INTERVAL, "20 seconds"),
 | 
	
		
			
				|  |  |    V(TestingV3AuthVotingStartOffset, INTERVAL, "0"),
 | 
	
	
		
			
				|  | @@ -3397,19 +3397,68 @@ options_validate(or_options_t *old_options, or_options_t *options,
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (options->V3AuthVoteDelay + options->V3AuthDistDelay >=
 | 
	
		
			
				|  |  |        options->V3AuthVotingInterval/2) {
 | 
	
		
			
				|  |  | -    REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half "
 | 
	
		
			
				|  |  | -           "V3AuthVotingInterval");
 | 
	
		
			
				|  |  | +    /*
 | 
	
		
			
				|  |  | +    This doesn't work, but it seems like it should:
 | 
	
		
			
				|  |  | +     what code is preventing the interval being less than twice the lead-up?
 | 
	
		
			
				|  |  | +    if (options->TestingTorNetwork) {
 | 
	
		
			
				|  |  | +      if (options->V3AuthVoteDelay + options->V3AuthDistDelay >=
 | 
	
		
			
				|  |  | +          options->V3AuthVotingInterval) {
 | 
	
		
			
				|  |  | +        REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than "
 | 
	
		
			
				|  |  | +               "V3AuthVotingInterval");
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        COMPLAIN("V3AuthVoteDelay plus V3AuthDistDelay is more than half "
 | 
	
		
			
				|  |  | +                 "V3AuthVotingInterval. This may lead to "
 | 
	
		
			
				|  |  | +                 "consensus instability, particularly if clocks drift.");
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +      REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half "
 | 
	
		
			
				|  |  | +             "V3AuthVotingInterval");
 | 
	
		
			
				|  |  | +    /*
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +     */
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS) {
 | 
	
		
			
				|  |  | +    if (options->TestingTorNetwork) {
 | 
	
		
			
				|  |  | +      if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS_TESTING) {
 | 
	
		
			
				|  |  | +        REJECT("V3AuthVoteDelay is way too low.");
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        COMPLAIN("V3AuthVoteDelay is very low. "
 | 
	
		
			
				|  |  | +                 "This may lead to failure to vote for a consensus.");
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      REJECT("V3AuthVoteDelay is way too low.");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (options->V3AuthDistDelay < MIN_DIST_SECONDS) {
 | 
	
		
			
				|  |  | +    if (options->TestingTorNetwork) {
 | 
	
		
			
				|  |  | +      if (options->V3AuthDistDelay < MIN_DIST_SECONDS_TESTING) {
 | 
	
		
			
				|  |  | +        REJECT("V3AuthDistDelay is way too low.");
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        COMPLAIN("V3AuthDistDelay is very low. "
 | 
	
		
			
				|  |  | +                 "This may lead to missing votes in a consensus.");
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      REJECT("V3AuthDistDelay is way too low.");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS)
 | 
	
		
			
				|  |  | -    REJECT("V3AuthVoteDelay is way too low.");
 | 
	
		
			
				|  |  | -  if (options->V3AuthDistDelay < MIN_DIST_SECONDS)
 | 
	
		
			
				|  |  | -    REJECT("V3AuthDistDelay is way too low.");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (options->V3AuthNIntervalsValid < 2)
 | 
	
		
			
				|  |  |      REJECT("V3AuthNIntervalsValid must be at least 2.");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (options->V3AuthVotingInterval < MIN_VOTE_INTERVAL) {
 | 
	
		
			
				|  |  | -    REJECT("V3AuthVotingInterval is insanely low.");
 | 
	
		
			
				|  |  | +    if (options->TestingTorNetwork) {
 | 
	
		
			
				|  |  | +      if (options->V3AuthVotingInterval < MIN_VOTE_INTERVAL_TESTING) {
 | 
	
		
			
				|  |  | +        REJECT("V3AuthVotingInterval is insanely low.");
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        COMPLAIN("V3AuthVotingInterval is very low. "
 | 
	
		
			
				|  |  | +                 "This may lead to failure to synchronise for a consensus.");
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      REJECT("V3AuthVotingInterval is insanely low.");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |    } else if (options->V3AuthVotingInterval > 24*60*60) {
 | 
	
		
			
				|  |  |      REJECT("V3AuthVotingInterval is insanely high.");
 | 
	
		
			
				|  |  |    } else if (((24*60*60) % options->V3AuthVotingInterval) != 0) {
 | 
	
	
		
			
				|  | @@ -3484,26 +3533,27 @@ options_validate(or_options_t *old_options, or_options_t *options,
 | 
	
		
			
				|  |  |    CHECK_DEFAULT(TestingCertMaxDownloadTries);
 | 
	
		
			
				|  |  |  #undef CHECK_DEFAULT
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  if (options->TestingV3AuthInitialVotingInterval < MIN_VOTE_INTERVAL) {
 | 
	
		
			
				|  |  | +  if (options->TestingV3AuthInitialVotingInterval
 | 
	
		
			
				|  |  | +      < MIN_VOTE_INTERVAL_TESTING_INITIAL) {
 | 
	
		
			
				|  |  |      REJECT("TestingV3AuthInitialVotingInterval is insanely low.");
 | 
	
		
			
				|  |  |    } else if (((30*60) % options->TestingV3AuthInitialVotingInterval) != 0) {
 | 
	
		
			
				|  |  |      REJECT("TestingV3AuthInitialVotingInterval does not divide evenly into "
 | 
	
		
			
				|  |  |             "30 minutes.");
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS) {
 | 
	
		
			
				|  |  | +  if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS_TESTING) {
 | 
	
		
			
				|  |  |      REJECT("TestingV3AuthInitialVoteDelay is way too low.");
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS) {
 | 
	
		
			
				|  |  | +  if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS_TESTING) {
 | 
	
		
			
				|  |  |      REJECT("TestingV3AuthInitialDistDelay is way too low.");
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (options->TestingV3AuthInitialVoteDelay +
 | 
	
		
			
				|  |  |        options->TestingV3AuthInitialDistDelay >=
 | 
	
		
			
				|  |  | -      options->TestingV3AuthInitialVotingInterval/2) {
 | 
	
		
			
				|  |  | +      options->TestingV3AuthInitialVotingInterval) {
 | 
	
		
			
				|  |  |      REJECT("TestingV3AuthInitialVoteDelay plus TestingV3AuthInitialDistDelay "
 | 
	
		
			
				|  |  | -           "must be less than half TestingV3AuthInitialVotingInterval");
 | 
	
		
			
				|  |  | +           "must be less than TestingV3AuthInitialVotingInterval");
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (options->TestingV3AuthVotingStartOffset >
 | 
	
	
		
			
				|  | @@ -3511,6 +3561,8 @@ options_validate(or_options_t *old_options, or_options_t *options,
 | 
	
		
			
				|  |  |            options->V3AuthVotingInterval)) {
 | 
	
		
			
				|  |  |      REJECT("TestingV3AuthVotingStartOffset is higher than the voting "
 | 
	
		
			
				|  |  |             "interval.");
 | 
	
		
			
				|  |  | +  } else if (options->TestingV3AuthVotingStartOffset < 0) {
 | 
	
		
			
				|  |  | +    REJECT("TestingV3AuthVotingStartOffset must be non-negative.");
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (options->TestingAuthDirTimeToLearnReachability < 0) {
 |