|  | @@ -199,8 +199,7 @@ class HybridEnd2endTest : public ::testing::Test {
 | 
	
		
			
				|  |  |    HybridEnd2endTest() {}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    void SetUpServer(::grpc::Service* service1, ::grpc::Service* service2,
 | 
	
		
			
				|  |  | -                   AsyncGenericService* generic_service,
 | 
	
		
			
				|  |  | -                   int num_cqs_frequently_polled) {
 | 
	
		
			
				|  |  | +                   AsyncGenericService* generic_service) {
 | 
	
		
			
				|  |  |      int port = grpc_pick_unused_port_or_die();
 | 
	
		
			
				|  |  |      server_address_ << "localhost:" << port;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -208,6 +207,9 @@ class HybridEnd2endTest : public ::testing::Test {
 | 
	
		
			
				|  |  |      ServerBuilder builder;
 | 
	
		
			
				|  |  |      builder.AddListeningPort(server_address_.str(),
 | 
	
		
			
				|  |  |                               grpc::InsecureServerCredentials());
 | 
	
		
			
				|  |  | +    // Always add a sync unimplemented service: we rely on having at least one
 | 
	
		
			
				|  |  | +    // synchronous method to get a listening cq
 | 
	
		
			
				|  |  | +    builder.RegisterService(&unimplemented_service_);
 | 
	
		
			
				|  |  |      builder.RegisterService(service1);
 | 
	
		
			
				|  |  |      if (service2) {
 | 
	
		
			
				|  |  |        builder.RegisterService(service2);
 | 
	
	
		
			
				|  | @@ -217,7 +219,7 @@ class HybridEnd2endTest : public ::testing::Test {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      // Create a separate cq for each potential handler.
 | 
	
		
			
				|  |  |      for (int i = 0; i < 5; i++) {
 | 
	
		
			
				|  |  | -      cqs_.push_back(builder.AddCompletionQueue(i == num_cqs_frequently_polled - 1));
 | 
	
		
			
				|  |  | +      cqs_.push_back(builder.AddCompletionQueue(false));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      server_ = builder.BuildAndStart();
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -344,6 +346,7 @@ class HybridEnd2endTest : public ::testing::Test {
 | 
	
		
			
				|  |  |      EXPECT_TRUE(s.ok());
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  grpc::testing::UnimplementedService::Service unimplemented_service_;
 | 
	
		
			
				|  |  |    std::vector<std::unique_ptr<ServerCompletionQueue> > cqs_;
 | 
	
		
			
				|  |  |    std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
 | 
	
		
			
				|  |  |    std::unique_ptr<Server> server_;
 | 
	
	
		
			
				|  | @@ -352,7 +355,7 @@ class HybridEnd2endTest : public ::testing::Test {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  TEST_F(HybridEnd2endTest, AsyncEcho) {
 | 
	
		
			
				|  |  |    EchoTestService::WithAsyncMethod_Echo<TestServiceImpl> service;
 | 
	
		
			
				|  |  | -  SetUpServer(&service, nullptr, nullptr, 1);
 | 
	
		
			
				|  |  | +  SetUpServer(&service, nullptr, nullptr);
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::thread echo_handler_thread(
 | 
	
		
			
				|  |  |        [this, &service] { HandleEcho(&service, cqs_[0].get(), false); });
 | 
	
	
		
			
				|  | @@ -364,7 +367,7 @@ TEST_F(HybridEnd2endTest, AsyncEchoRequestStream) {
 | 
	
		
			
				|  |  |    EchoTestService::WithAsyncMethod_RequestStream<
 | 
	
		
			
				|  |  |        EchoTestService::WithAsyncMethod_Echo<TestServiceImpl> >
 | 
	
		
			
				|  |  |        service;
 | 
	
		
			
				|  |  | -  SetUpServer(&service, nullptr, nullptr, 2);
 | 
	
		
			
				|  |  | +  SetUpServer(&service, nullptr, nullptr);
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::thread echo_handler_thread(
 | 
	
		
			
				|  |  |        [this, &service] { HandleEcho(&service, cqs_[0].get(), false); });
 | 
	
	
		
			
				|  | @@ -379,7 +382,7 @@ TEST_F(HybridEnd2endTest, AsyncRequestStreamResponseStream) {
 | 
	
		
			
				|  |  |    EchoTestService::WithAsyncMethod_RequestStream<
 | 
	
		
			
				|  |  |        EchoTestService::WithAsyncMethod_ResponseStream<TestServiceImpl> >
 | 
	
		
			
				|  |  |        service;
 | 
	
		
			
				|  |  | -  SetUpServer(&service, nullptr, nullptr, 2);
 | 
	
		
			
				|  |  | +  SetUpServer(&service, nullptr, nullptr);
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::thread response_stream_handler_thread(
 | 
	
		
			
				|  |  |        [this, &service] { HandleServerStreaming(&service, cqs_[0].get()); });
 | 
	
	
		
			
				|  | @@ -396,7 +399,7 @@ TEST_F(HybridEnd2endTest, AsyncRequestStreamResponseStream_SyncDupService) {
 | 
	
		
			
				|  |  |        EchoTestService::WithAsyncMethod_ResponseStream<TestServiceImpl> >
 | 
	
		
			
				|  |  |        service;
 | 
	
		
			
				|  |  |    TestServiceImplDupPkg dup_service;
 | 
	
		
			
				|  |  | -  SetUpServer(&service, &dup_service, nullptr, 2);
 | 
	
		
			
				|  |  | +  SetUpServer(&service, &dup_service, nullptr);
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::thread response_stream_handler_thread(
 | 
	
		
			
				|  |  |        [this, &service] { HandleServerStreaming(&service, cqs_[0].get()); });
 | 
	
	
		
			
				|  | @@ -414,7 +417,7 @@ TEST_F(HybridEnd2endTest, AsyncRequestStreamResponseStream_AsyncDupService) {
 | 
	
		
			
				|  |  |        EchoTestService::WithAsyncMethod_ResponseStream<TestServiceImpl> >
 | 
	
		
			
				|  |  |        service;
 | 
	
		
			
				|  |  |    duplicate::EchoTestService::AsyncService dup_service;
 | 
	
		
			
				|  |  | -  SetUpServer(&service, &dup_service, nullptr, 3);
 | 
	
		
			
				|  |  | +  SetUpServer(&service, &dup_service, nullptr);
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::thread response_stream_handler_thread(
 | 
	
		
			
				|  |  |        [this, &service] { HandleServerStreaming(&service, cqs_[0].get()); });
 | 
	
	
		
			
				|  | @@ -432,7 +435,7 @@ TEST_F(HybridEnd2endTest, AsyncRequestStreamResponseStream_AsyncDupService) {
 | 
	
		
			
				|  |  |  TEST_F(HybridEnd2endTest, GenericEcho) {
 | 
	
		
			
				|  |  |    EchoTestService::WithGenericMethod_Echo<TestServiceImpl> service;
 | 
	
		
			
				|  |  |    AsyncGenericService generic_service;
 | 
	
		
			
				|  |  | -  SetUpServer(&service, nullptr, &generic_service, 1);
 | 
	
		
			
				|  |  | +  SetUpServer(&service, nullptr, &generic_service);
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::thread generic_handler_thread([this, &generic_service] {
 | 
	
		
			
				|  |  |      HandleGenericCall(&generic_service, cqs_[0].get());
 | 
	
	
		
			
				|  | @@ -446,7 +449,7 @@ TEST_F(HybridEnd2endTest, GenericEchoAsyncRequestStream) {
 | 
	
		
			
				|  |  |        EchoTestService::WithGenericMethod_Echo<TestServiceImpl> >
 | 
	
		
			
				|  |  |        service;
 | 
	
		
			
				|  |  |    AsyncGenericService generic_service;
 | 
	
		
			
				|  |  | -  SetUpServer(&service, nullptr, &generic_service, 2);
 | 
	
		
			
				|  |  | +  SetUpServer(&service, nullptr, &generic_service);
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::thread generic_handler_thread([this, &generic_service] {
 | 
	
		
			
				|  |  |      HandleGenericCall(&generic_service, cqs_[0].get());
 | 
	
	
		
			
				|  | @@ -465,7 +468,7 @@ TEST_F(HybridEnd2endTest, GenericEchoAsyncRequestStream_SyncDupService) {
 | 
	
		
			
				|  |  |        service;
 | 
	
		
			
				|  |  |    AsyncGenericService generic_service;
 | 
	
		
			
				|  |  |    TestServiceImplDupPkg dup_service;
 | 
	
		
			
				|  |  | -  SetUpServer(&service, &dup_service, &generic_service, 2);
 | 
	
		
			
				|  |  | +  SetUpServer(&service, &dup_service, &generic_service);
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::thread generic_handler_thread([this, &generic_service] {
 | 
	
		
			
				|  |  |      HandleGenericCall(&generic_service, cqs_[0].get());
 | 
	
	
		
			
				|  | @@ -485,7 +488,7 @@ TEST_F(HybridEnd2endTest, GenericEchoAsyncRequestStream_AsyncDupService) {
 | 
	
		
			
				|  |  |        service;
 | 
	
		
			
				|  |  |    AsyncGenericService generic_service;
 | 
	
		
			
				|  |  |    duplicate::EchoTestService::AsyncService dup_service;
 | 
	
		
			
				|  |  | -  SetUpServer(&service, &dup_service, &generic_service, 3);
 | 
	
		
			
				|  |  | +  SetUpServer(&service, &dup_service, &generic_service);
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::thread generic_handler_thread([this, &generic_service] {
 | 
	
		
			
				|  |  |      HandleGenericCall(&generic_service, cqs_[0].get());
 | 
	
	
		
			
				|  | @@ -507,7 +510,7 @@ TEST_F(HybridEnd2endTest, GenericEchoAsyncRequestStreamResponseStream) {
 | 
	
		
			
				|  |  |            EchoTestService::WithAsyncMethod_ResponseStream<TestServiceImpl> > >
 | 
	
		
			
				|  |  |        service;
 | 
	
		
			
				|  |  |    AsyncGenericService generic_service;
 | 
	
		
			
				|  |  | -  SetUpServer(&service, nullptr, &generic_service, 3);
 | 
	
		
			
				|  |  | +  SetUpServer(&service, nullptr, &generic_service);
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::thread generic_handler_thread([this, &generic_service] {
 | 
	
		
			
				|  |  |      gpr_log(GPR_DEBUG, "t0 start");
 | 
	
	
		
			
				|  | @@ -538,7 +541,7 @@ TEST_F(HybridEnd2endTest, GenericEchoRequestStreamAsyncResponseStream) {
 | 
	
		
			
				|  |  |            EchoTestService::WithAsyncMethod_ResponseStream<TestServiceImpl> > >
 | 
	
		
			
				|  |  |        service;
 | 
	
		
			
				|  |  |    AsyncGenericService generic_service;
 | 
	
		
			
				|  |  | -  SetUpServer(&service, nullptr, &generic_service, 3);
 | 
	
		
			
				|  |  | +  SetUpServer(&service, nullptr, &generic_service);
 | 
	
		
			
				|  |  |    ResetStub();
 | 
	
		
			
				|  |  |    std::thread generic_handler_thread([this, &generic_service] {
 | 
	
		
			
				|  |  |      HandleGenericCall(&generic_service, cqs_[0].get());
 | 
	
	
		
			
				|  | @@ -561,7 +564,7 @@ TEST_F(HybridEnd2endTest, GenericMethodWithoutGenericService) {
 | 
	
		
			
				|  |  |        EchoTestService::WithGenericMethod_Echo<
 | 
	
		
			
				|  |  |            EchoTestService::WithAsyncMethod_ResponseStream<TestServiceImpl> > >
 | 
	
		
			
				|  |  |        service;
 | 
	
		
			
				|  |  | -  SetUpServer(&service, nullptr, nullptr, 0);
 | 
	
		
			
				|  |  | +  SetUpServer(&service, nullptr, nullptr);
 | 
	
		
			
				|  |  |    EXPECT_EQ(nullptr, server_.get());
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 |