|  | @@ -279,9 +279,14 @@ class ClientLbEnd2endTest : public ::testing::Test {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    void WaitForServer(
 | 
	
		
			
				|  |  |        const std::unique_ptr<grpc::testing::EchoTestService::Stub>& stub,
 | 
	
		
			
				|  |  | -      size_t server_idx, const grpc_core::DebugLocation& location) {
 | 
	
		
			
				|  |  | +      size_t server_idx, const grpc_core::DebugLocation& location,
 | 
	
		
			
				|  |  | +      bool ignore_failure = false) {
 | 
	
		
			
				|  |  |      do {
 | 
	
		
			
				|  |  | -      CheckRpcSendOk(stub, location);
 | 
	
		
			
				|  |  | +      if (ignore_failure) {
 | 
	
		
			
				|  |  | +        SendRpc(stub);
 | 
	
		
			
				|  |  | +      } else {
 | 
	
		
			
				|  |  | +        CheckRpcSendOk(stub, location);
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |      } while (servers_[server_idx]->service_.request_count() == 0);
 | 
	
		
			
				|  |  |      ResetCounters();
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -507,6 +512,37 @@ TEST_F(ClientLbEnd2endTest, PickFirstManyUpdates) {
 | 
	
		
			
				|  |  |    EXPECT_EQ("pick_first", channel->GetLoadBalancingPolicyName());
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +TEST_F(ClientLbEnd2endTest, PickFirstReresolutionNoSelected) {
 | 
	
		
			
				|  |  | +  // Prepare the ports for up servers and down servers.
 | 
	
		
			
				|  |  | +  const int kNumServers = 3;
 | 
	
		
			
				|  |  | +  const int kNumAliveServers = 1;
 | 
	
		
			
				|  |  | +  StartServers(kNumAliveServers);
 | 
	
		
			
				|  |  | +  std::vector<int> alive_ports, dead_ports;
 | 
	
		
			
				|  |  | +  for (size_t i = 0; i < kNumServers; ++i) {
 | 
	
		
			
				|  |  | +    if (i < kNumAliveServers) {
 | 
	
		
			
				|  |  | +      alive_ports.emplace_back(servers_[i]->port_);
 | 
	
		
			
				|  |  | +    } else {
 | 
	
		
			
				|  |  | +      dead_ports.emplace_back(grpc_pick_unused_port_or_die());
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  auto channel = BuildChannel("pick_first");
 | 
	
		
			
				|  |  | +  auto stub = BuildStub(channel);
 | 
	
		
			
				|  |  | +  // The initial resolution only contains dead ports. There won't be any
 | 
	
		
			
				|  |  | +  // selected subchannel. Re-resolution will return the same result.
 | 
	
		
			
				|  |  | +  SetNextResolution(dead_ports);
 | 
	
		
			
				|  |  | +  gpr_log(GPR_INFO, "****** INITIAL RESOLUTION SET *******");
 | 
	
		
			
				|  |  | +  for (size_t i = 0; i < 10; ++i) CheckRpcSendFailure(stub);
 | 
	
		
			
				|  |  | +  // Set a re-resolution result that contains reachable ports, so that the
 | 
	
		
			
				|  |  | +  // pick_first LB policy can recover soon.
 | 
	
		
			
				|  |  | +  SetNextResolutionUponError(alive_ports);
 | 
	
		
			
				|  |  | +  gpr_log(GPR_INFO, "****** RE-RESOLUTION SET *******");
 | 
	
		
			
				|  |  | +  WaitForServer(stub, 0, DEBUG_LOCATION, true /* ignore_failure */);
 | 
	
		
			
				|  |  | +  CheckRpcSendOk(stub, DEBUG_LOCATION);
 | 
	
		
			
				|  |  | +  EXPECT_EQ(servers_[0]->service_.request_count(), 1);
 | 
	
		
			
				|  |  | +  // Check LB policy name for the channel.
 | 
	
		
			
				|  |  | +  EXPECT_EQ("pick_first", channel->GetLoadBalancingPolicyName());
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  TEST_F(ClientLbEnd2endTest, RoundRobin) {
 | 
	
		
			
				|  |  |    // Start servers and send one RPC per server.
 | 
	
		
			
				|  |  |    const int kNumServers = 3;
 |