| 
					
				 | 
			
			
				@@ -15,6 +15,7 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "container.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "directory.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "dirvote.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "microdesc.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "networkstatus.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "nodelist.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "policies.h" 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -190,6 +191,14 @@ construct_consensus(char **consensus_text_md) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   crypto_pk_free(sign_skey_leg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int mock_usable_consensus_flavor_value = FLAV_NS; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+mock_usable_consensus_flavor(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return mock_usable_consensus_flavor_value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 test_router_pick_directory_server_impl(void *arg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -209,6 +218,22 @@ test_router_pick_directory_server_impl(void *arg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   (void)arg; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  MOCK(usable_consensus_flavor, mock_usable_consensus_flavor); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* With no consensus, we must be bootstrapping, regardless of time or flavor 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  mock_usable_consensus_flavor_value = FLAV_NS; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now + 2000)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now + 2*24*60*60)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now - 2*24*60*60)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  mock_usable_consensus_flavor_value = FLAV_MICRODESC; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now + 2000)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now + 2*24*60*60)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now - 2*24*60*60)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* No consensus available, fail early */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   rs = router_pick_directory_server_impl(V3_DIRINFO, (const int) 0, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tt_assert(rs == NULL); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -223,6 +248,28 @@ test_router_pick_directory_server_impl(void *arg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tt_int_op(smartlist_len(con_md->routerstatus_list), ==, 3); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   tt_assert(!networkstatus_set_current_consensus_from_ns(con_md, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                  "microdesc")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* If the consensus time or flavor doesn't match, we are still 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * bootstrapping */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  mock_usable_consensus_flavor_value = FLAV_NS; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now + 2000)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now + 2*24*60*60)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now - 2*24*60*60)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* With a valid consensus for the current time and flavor, we stop 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   * bootstrapping, even if we have no certificates */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  mock_usable_consensus_flavor_value = FLAV_MICRODESC; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(!networkstatus_consensus_is_bootstrapping(now + 2000)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(!networkstatus_consensus_is_bootstrapping(con_md->valid_after)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(!networkstatus_consensus_is_bootstrapping(con_md->valid_until)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(!networkstatus_consensus_is_bootstrapping(con_md->valid_until 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                      + 24*60*60)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* These times are outside the test validity period */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now + 2*24*60*60)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  tt_assert(networkstatus_consensus_is_bootstrapping(now - 2*24*60*60)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   nodelist_set_consensus(con_md); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   nodelist_assert_ok(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -362,6 +409,7 @@ test_router_pick_directory_server_impl(void *arg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   node_router1->rs->last_dir_503_at = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  done: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  UNMOCK(usable_consensus_flavor); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (router1_id) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tor_free(router1_id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (router2_id) 
			 |