| 
					
				 | 
			
			
				@@ -501,7 +501,14 @@ class BidiStreamingRpcHijackingInterceptorFactory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class LoggingInterceptor : public experimental::Interceptor { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  public: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  LoggingInterceptor(experimental::ClientRpcInfo* info) { info_ = info; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  LoggingInterceptor(experimental::ClientRpcInfo* info) : info_(info) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       pre_send_initial_metadata_ = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       pre_send_message_count_ = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      pre_send_close_ = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       post_recv_initial_metadata_ = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      post_recv_message_count_ = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+       post_recv_status_ = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   virtual void Intercept(experimental::InterceptorBatchMethods* methods) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (methods->QueryInterceptionHookPoint( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -512,6 +519,8 @@ class LoggingInterceptor : public experimental::Interceptor { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       auto iterator = map->begin(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       EXPECT_EQ("testkey", iterator->first); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       EXPECT_EQ("testvalue", iterator->second); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      ASSERT_FALSE(pre_send_initial_metadata_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      pre_send_initial_metadata_ = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (methods->QueryInterceptionHookPoint( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             experimental::InterceptionHookPoints::PRE_SEND_MESSAGE)) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -526,22 +535,28 @@ class LoggingInterceptor : public experimental::Interceptor { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           SerializationTraits<EchoRequest>::Deserialize(&copied_buffer, &req) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               .ok()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       EXPECT_TRUE(req.message().find("Hello") == 0u); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      pre_send_message_count_++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (methods->QueryInterceptionHookPoint( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             experimental::InterceptionHookPoints::PRE_SEND_CLOSE)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // Got nothing to do here for now 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      pre_send_close_ = true;       
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (methods->QueryInterceptionHookPoint( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             experimental::InterceptionHookPoints::POST_RECV_INITIAL_METADATA)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       auto* map = methods->GetRecvInitialMetadata(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // Got nothing better to do here for now 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       EXPECT_EQ(map->size(), static_cast<unsigned>(0)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      post_recv_initial_metadata_ = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (methods->QueryInterceptionHookPoint( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             experimental::InterceptionHookPoints::POST_RECV_MESSAGE)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       EchoResponse* resp = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           static_cast<EchoResponse*>(methods->GetRecvMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      EXPECT_TRUE(resp->message().find("Hello") == 0u); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if(resp != nullptr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        EXPECT_TRUE(resp->message().find("Hello") == 0u); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        post_recv_message_count_++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (methods->QueryInterceptionHookPoint( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             experimental::InterceptionHookPoints::POST_RECV_STATUS)) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -556,14 +571,59 @@ class LoggingInterceptor : public experimental::Interceptor { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       EXPECT_EQ(found, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       auto* status = methods->GetRecvStatus(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       EXPECT_EQ(status->ok(), true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      post_recv_status_ = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     methods->Proceed(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static void VerifyCallCommon() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    EXPECT_TRUE(pre_send_initial_metadata_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    EXPECT_TRUE(pre_send_close_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    EXPECT_TRUE(post_recv_initial_metadata_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    EXPECT_TRUE(post_recv_status_); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static void VerifyUnaryCall() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    VerifyCallCommon(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    EXPECT_EQ(pre_send_message_count_, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    EXPECT_EQ(post_recv_message_count_, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static void VerifyClientStreamingCall() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    VerifyCallCommon();     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    EXPECT_EQ(pre_send_message_count_, kNumStreamingMessages); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    EXPECT_EQ(post_recv_message_count_, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static void VerifyServerStreamingCall() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    VerifyCallCommon();     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    EXPECT_EQ(pre_send_message_count_, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    EXPECT_EQ(post_recv_message_count_, kNumStreamingMessages); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static void VerifyBidiStreamingCall() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    VerifyCallCommon();     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    EXPECT_EQ(pre_send_message_count_, kNumStreamingMessages); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    EXPECT_EQ(post_recv_message_count_, kNumStreamingMessages); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  private: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   experimental::ClientRpcInfo* info_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static bool pre_send_initial_metadata_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static int pre_send_message_count_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static bool pre_send_close_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static bool post_recv_initial_metadata_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static int post_recv_message_count_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  static bool post_recv_status_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+bool LoggingInterceptor::pre_send_initial_metadata_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int LoggingInterceptor::pre_send_message_count_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+bool LoggingInterceptor::pre_send_close_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+bool LoggingInterceptor::post_recv_initial_metadata_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+int LoggingInterceptor::post_recv_message_count_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+bool LoggingInterceptor::post_recv_status_; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class LoggingInterceptorFactory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     : public experimental::ClientInterceptorFactoryInterface { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  public: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -607,6 +667,7 @@ TEST_F(ClientInterceptorsEnd2endTest, ClientInterceptorLoggingTest) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto channel = experimental::CreateCustomChannelWithInterceptors( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       server_address_, InsecureChannelCredentials(), args, std::move(creators)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   MakeCall(channel); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  LoggingInterceptor::VerifyUnaryCall(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Make sure all 20 dummy interceptors were run 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(DummyInterceptor::GetNumTimesRun(), 20); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -643,7 +704,6 @@ TEST_F(ClientInterceptorsEnd2endTest, ClientInterceptorHijackingTest) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto channel = experimental::CreateCustomChannelWithInterceptors( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       server_address_, InsecureChannelCredentials(), args, std::move(creators)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   MakeCall(channel); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Make sure only 20 dummy interceptors were run 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(DummyInterceptor::GetNumTimesRun(), 20); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -659,8 +719,8 @@ TEST_F(ClientInterceptorsEnd2endTest, ClientInterceptorLogThenHijackTest) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       new HijackingInterceptorFactory())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto channel = experimental::CreateCustomChannelWithInterceptors( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       server_address_, InsecureChannelCredentials(), args, std::move(creators)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   MakeCall(channel); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  LoggingInterceptor::VerifyUnaryCall(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 TEST_F(ClientInterceptorsEnd2endTest, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -708,6 +768,7 @@ TEST_F(ClientInterceptorsEnd2endTest, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto channel = server_->experimental().InProcessChannelWithInterceptors( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       args, std::move(creators)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   MakeCallbackCall(channel); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  LoggingInterceptor::VerifyUnaryCall(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Make sure all 20 dummy interceptors were run 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(DummyInterceptor::GetNumTimesRun(), 20); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -730,6 +791,7 @@ TEST_F(ClientInterceptorsEnd2endTest, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto channel = server_->experimental().InProcessChannelWithInterceptors( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       args, std::move(creators)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   MakeCallbackCall(channel); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  LoggingInterceptor::VerifyUnaryCall(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Make sure all 20 dummy interceptors were run 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(DummyInterceptor::GetNumTimesRun(), 20); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -768,6 +830,7 @@ TEST_F(ClientInterceptorsStreamingEnd2endTest, ClientStreamingTest) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto channel = experimental::CreateCustomChannelWithInterceptors( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       server_address_, InsecureChannelCredentials(), args, std::move(creators)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   MakeClientStreamingCall(channel); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  LoggingInterceptor::VerifyClientStreamingCall(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Make sure all 20 dummy interceptors were run 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(DummyInterceptor::GetNumTimesRun(), 20); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -787,6 +850,7 @@ TEST_F(ClientInterceptorsStreamingEnd2endTest, ServerStreamingTest) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto channel = experimental::CreateCustomChannelWithInterceptors( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       server_address_, InsecureChannelCredentials(), args, std::move(creators)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   MakeServerStreamingCall(channel); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  LoggingInterceptor::VerifyServerStreamingCall(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Make sure all 20 dummy interceptors were run 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(DummyInterceptor::GetNumTimesRun(), 20); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -862,6 +926,7 @@ TEST_F(ClientInterceptorsStreamingEnd2endTest, BidiStreamingTest) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto channel = experimental::CreateCustomChannelWithInterceptors( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       server_address_, InsecureChannelCredentials(), args, std::move(creators)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   MakeBidiStreamingCall(channel); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  LoggingInterceptor::VerifyBidiStreamingCall(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Make sure all 20 dummy interceptors were run 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(DummyInterceptor::GetNumTimesRun(), 20); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -928,6 +993,7 @@ TEST_F(ClientGlobalInterceptorEnd2endTest, LoggingGlobalInterceptor) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto channel = experimental::CreateCustomChannelWithInterceptors( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       server_address_, InsecureChannelCredentials(), args, std::move(creators)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   MakeCall(channel); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  LoggingInterceptor::VerifyUnaryCall(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Make sure all 20 dummy interceptors were run 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   EXPECT_EQ(DummyInterceptor::GetNumTimesRun(), 20); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   experimental::TestOnlyResetGlobalClientInterceptorFactory(); 
			 |