| 
					
				 | 
			
			
				@@ -0,0 +1,480 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Copyright 2015, Google Inc. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# All rights reserved. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Redistribution and use in source and binary forms, with or without 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# modification, are permitted provided that the following conditions are 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# met: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#     * Redistributions of source code must retain the above copyright 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# notice, this list of conditions and the following disclaimer. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#     * Redistributions in binary form must reproduce the above 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# copyright notice, this list of conditions and the following disclaimer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# in the documentation and/or other materials provided with the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# distribution. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#     * Neither the name of Google Inc. nor the names of its 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# contributors may be used to endorse or promote products derived from 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# this software without specific prior written permission. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import argparse 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import contextlib 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import errno 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import itertools 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import os 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import subprocess 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import sys 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import time 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import unittest 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from grpc.framework.face import exceptions 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from grpc.framework.foundation import future 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Assigned in __main__. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+_build_mode = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class _ServicerMethods(object): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def __init__(self, test_pb2, delay): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self._paused = False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self._failed = False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self.test_pb2 = test_pb2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self.delay = delay 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  @contextlib.contextmanager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def pause(self):  # pylint: disable=invalid-name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self._paused = True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    yield 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self._paused = False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  @contextlib.contextmanager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def fail(self):  # pylint: disable=invalid-name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self._failed = True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    yield 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self._failed = False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def _control(self):  # pylint: disable=invalid-name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if self._failed: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      raise ValueError() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    time.sleep(self.delay) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    while self._paused: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      time.sleep(0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def UnaryCall(self, request): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response = self.test_pb2.SimpleResponse() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response.payload.payload_type = self.test_pb2.COMPRESSABLE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response.payload.payload_compressable = 'a' * request.response_size 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self._control() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def StreamingOutputCall(self, request): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for parameter in request.response_parameters: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      response = self.test_pb2.StreamingOutputCallResponse() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      response.payload.payload_type = self.test_pb2.COMPRESSABLE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      response.payload.payload_compressable = 'a' * parameter.size 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      self._control() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      yield response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def StreamingInputCall(self, request_iter): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response = self.test_pb2.StreamingInputCallResponse() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    aggregated_payload_size = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for request in request_iter: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      aggregated_payload_size += len(request.payload.payload_compressable) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response.aggregated_payload_size = aggregated_payload_size 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self._control() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def FullDuplexCall(self, request_iter): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for request in request_iter: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      for parameter in request.response_parameters: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response = self.test_pb2.StreamingOutputCallResponse() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response.payload.payload_type = self.test_pb2.COMPRESSABLE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response.payload.payload_compressable = 'a' * parameter.size 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self._control() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        yield response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def HalfDuplexCall(self, request_iter): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    responses = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for request in request_iter: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      for parameter in request.response_parameters: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response = self.test_pb2.StreamingOutputCallResponse() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response.payload.payload_type = self.test_pb2.COMPRESSABLE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response.payload.payload_compressable = 'a' * parameter.size 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        self._control() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        responses.append(response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for response in responses: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      yield response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def CreateService(test_pb2, delay=0, timeout=1): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  """Provides a servicer backend and a stub. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  The servicer is just the implementation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  of the actual servicer passed to the face player of the python RPC 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  implementation; the two are detached. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Non-zero delay puts a delay on each call to the servicer, representative of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  communication latency. Timeout is the default timeout for the stub while 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  waiting for the service. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Args: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    test_pb2: the test_pb2 module generated by this test 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    delay: delay in seconds per response from the servicer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    timeout: how long the stub will wait for the servicer by default. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  Returns: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    A two-tuple (servicer, stub), where the servicer is the back-end of the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      service bound to the stub. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  class Servicer(test_pb2.TestServiceServicer): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def UnaryCall(self, request): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return servicer_methods.UnaryCall(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def StreamingOutputCall(self, request): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return servicer_methods.StreamingOutputCall(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def StreamingInputCall(self, request_iter): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return servicer_methods.StreamingInputCall(request_iter) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def FullDuplexCall(self, request_iter): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return servicer_methods.FullDuplexCall(request_iter) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def HalfDuplexCall(self, request_iter): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return servicer_methods.HalfDuplexCall(request_iter) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  servicer_methods = _ServicerMethods(test_pb2, delay) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  servicer = Servicer() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  linked_pair = test_pb2.mock_TestService(servicer, timeout) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  stub = linked_pair.stub 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return servicer_methods, stub 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def StreamingInputRequest(test_pb2): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for _ in range(3): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = test_pb2.StreamingInputCallRequest() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.payload.payload_type = test_pb2.COMPRESSABLE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request.payload.payload_compressable = 'a' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    yield request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def StreamingOutputRequest(test_pb2): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  request = test_pb2.StreamingOutputCallRequest() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  sizes = [1, 2, 3] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  request.response_parameters.add(size=sizes[0], interval_us=0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  request.response_parameters.add(size=sizes[1], interval_us=0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  request.response_parameters.add(size=sizes[2], interval_us=0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def FullDuplexRequest(test_pb2): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  request = test_pb2.StreamingOutputCallRequest() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  request.response_parameters.add(size=1, interval_us=0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  yield request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  request = test_pb2.StreamingOutputCallRequest() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  request.response_parameters.add(size=2, interval_us=0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  request.response_parameters.add(size=3, interval_us=0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  yield request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+class PythonPluginTest(unittest.TestCase): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  """Test case for the gRPC Python protoc-plugin. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  While reading these tests, remember that the futures API 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  (`stub.method.async()`) only gives futures for the *non-streaming* responses, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  else it behaves like its blocking cousin. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  """ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def setUp(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    protoc_command = '../../bins/%s/protobuf/protoc' % _build_mode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    protoc_plugin_filename = '../../bins/%s/grpc_python_plugin' % _build_mode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    test_proto_filename = '../cpp/interop/test.proto' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if not os.path.isfile(protoc_command): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      # Assume that if we haven't built protoc that it's on the system. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      protoc_command = 'protoc' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # ensure that the output directory exists 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    outdir = '../../gens/test/compiler/python/' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      os.makedirs(outdir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    except OSError as exception: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      if exception.errno != errno.EEXIST: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        raise 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cmd = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        protoc_command, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        '--plugin=protoc-gen-python-grpc=%s' % protoc_plugin_filename, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        '-I %s' % os.path.dirname(test_proto_filename), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        '--python_out=%s' % outdir, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        '--python-grpc_out=%s' % outdir, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        os.path.basename(test_proto_filename), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    subprocess.call(' '.join(cmd), shell=True) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    sys.path.append(outdir) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self.delay = 1  # seconds 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self.timeout = 2  # seconds 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testImportAttributes(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # check that we can access the members 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self.assertIsNotNone(getattr(test_pb2, 'TestServiceServicer', None)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self.assertIsNotNone(getattr(test_pb2, 'TestServiceService', None)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self.assertIsNotNone(getattr(test_pb2, 'TestServiceStub', None)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testUnaryCall(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = test_pb2.SimpleRequest(response_size=13) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response = stub.UnaryCall(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expected_response = servicer.UnaryCall(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self.assertEqual(expected_response, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testUnaryCallAsync(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        test_pb2, delay=self.delay, timeout=self.timeout) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = test_pb2.SimpleRequest(response_size=13) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # TODO(atash): consider using the 'profile' module? Does it even work here? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    start_time = time.clock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response_future = stub.UnaryCall.async(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self.assertGreater(self.delay, time.clock() - start_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response = response_future.result() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expected_response = servicer.UnaryCall(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self.assertEqual(expected_response, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testUnaryCallAsyncExpired(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # set the timeout super low... 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2, delay=1, timeout=0.1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = test_pb2.SimpleRequest(response_size=13) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with servicer.pause(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      response_future = stub.UnaryCall.async(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      with self.assertRaises(exceptions.ExpirationError): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response_future.result() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testUnaryCallAsyncCancelled(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = test_pb2.SimpleRequest(response_size=13) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with servicer.pause(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      response_future = stub.UnaryCall.async(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      response_future.cancel() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      self.assertTrue(response_future.cancelled()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testUnaryCallAsyncFailed(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = test_pb2.SimpleRequest(response_size=13) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with servicer.fail(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      response_future = stub.UnaryCall.async(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      self.assertIsNotNone(response_future.exception()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testStreamingOutputCall(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = StreamingOutputRequest(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    responses = stub.StreamingOutputCall(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expected_responses = servicer.StreamingOutputCall(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for check in itertools.izip_longest(expected_responses, responses): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      expected_response, response = check 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      self.assertEqual(expected_response, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testStreamingOutputCallAsync(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2, timeout=self.timeout) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = StreamingOutputRequest(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    responses = stub.StreamingOutputCall.async(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expected_responses = servicer.StreamingOutputCall(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for check in itertools.izip_longest(expected_responses, responses): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      expected_response, response = check 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      self.assertEqual(expected_response, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testStreamingOutputCallAsyncExpired(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2, timeout=0.1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = StreamingOutputRequest(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with servicer.pause(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      responses = stub.StreamingOutputCall.async(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      with self.assertRaises(exceptions.ExpirationError): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        list(responses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testStreamingOutputCallAsyncCancelled(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _, stub = CreateService(test_pb2, timeout=0.1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = StreamingOutputRequest(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    responses = stub.StreamingOutputCall.async(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    next(responses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    responses.cancel() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with self.assertRaises(future.CancelledError): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      next(responses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testStreamingOutputCallAsyncFailed(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2, timeout=0.1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = StreamingOutputRequest(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with servicer.fail(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      responses = stub.StreamingOutputCall.async(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      self.assertIsNotNone(responses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      with self.assertRaises(exceptions.ServicerError): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        next(responses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testStreamingInputCall(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response = stub.StreamingInputCall(StreamingInputRequest(test_pb2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expected_response = servicer.StreamingInputCall( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        StreamingInputRequest(test_pb2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self.assertEqual(expected_response, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testStreamingInputCallAsync(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        test_pb2, delay=self.delay, timeout=self.timeout) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    start_time = time.clock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response_future = stub.StreamingInputCall.async( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        StreamingInputRequest(test_pb2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self.assertGreater(self.delay, time.clock() - start_time) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    response = response_future.result() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expected_response = servicer.StreamingInputCall( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        StreamingInputRequest(test_pb2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    self.assertEqual(expected_response, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testStreamingInputCallAsyncExpired(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # set the timeout super low... 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2, delay=1, timeout=0.1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with servicer.pause(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      response_future = stub.StreamingInputCall.async( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          StreamingInputRequest(test_pb2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      with self.assertRaises(exceptions.ExpirationError): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response_future.result() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      self.assertIsInstance( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          response_future.exception(), exceptions.ExpirationError) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testStreamingInputCallAsyncCancelled(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with servicer.pause(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      response_future = stub.StreamingInputCall.async( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          StreamingInputRequest(test_pb2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      response_future.cancel() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      self.assertTrue(response_future.cancelled()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with self.assertRaises(future.CancelledError): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      response_future.result() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testStreamingInputCallAsyncFailed(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with servicer.fail(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      response_future = stub.StreamingInputCall.async( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          StreamingInputRequest(test_pb2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      self.assertIsNotNone(response_future.exception()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testFullDuplexCall(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    responses = stub.FullDuplexCall(FullDuplexRequest(test_pb2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expected_responses = servicer.FullDuplexCall(FullDuplexRequest(test_pb2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for check in itertools.izip_longest(expected_responses, responses): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      expected_response, response = check 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      self.assertEqual(expected_response, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testFullDuplexCallAsync(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2, timeout=self.timeout) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    responses = stub.FullDuplexCall.async(FullDuplexRequest(test_pb2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expected_responses = servicer.FullDuplexCall(FullDuplexRequest(test_pb2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for check in itertools.izip_longest(expected_responses, responses): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      expected_response, response = check 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      self.assertEqual(expected_response, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testFullDuplexCallAsyncExpired(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2, timeout=0.1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = FullDuplexRequest(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with servicer.pause(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      responses = stub.FullDuplexCall.async(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      with self.assertRaises(exceptions.ExpirationError): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        list(responses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testFullDuplexCallAsyncCancelled(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _, stub = CreateService(test_pb2, timeout=0.1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = FullDuplexRequest(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    responses = stub.FullDuplexCall.async(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    next(responses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    responses.cancel() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with self.assertRaises(future.CancelledError): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      next(responses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testFullDuplexCallAsyncFailed(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2, timeout=0.1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    request = FullDuplexRequest(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with servicer.fail(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      responses = stub.FullDuplexCall.async(request) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      self.assertIsNotNone(responses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      with self.assertRaises(exceptions.ServicerError): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        next(responses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testHalfDuplexCall(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    servicer, stub = CreateService(test_pb2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def HalfDuplexRequest(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      request = test_pb2.StreamingOutputCallRequest() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      request.response_parameters.add(size=1, interval_us=0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      yield request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      request = test_pb2.StreamingOutputCallRequest() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      request.response_parameters.add(size=2, interval_us=0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      request.response_parameters.add(size=3, interval_us=0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      yield request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    responses = stub.HalfDuplexCall(HalfDuplexRequest()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    expected_responses = servicer.HalfDuplexCall(HalfDuplexRequest()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for check in itertools.izip_longest(expected_responses, responses): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      expected_response, response = check 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      self.assertEqual(expected_response, response) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  def testHalfDuplexCallAsyncWedged(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    import test_pb2  # pylint: disable=g-import-not-at-top 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _, stub = CreateService(test_pb2, timeout=1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    wait_flag = [False] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    @contextlib.contextmanager 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def wait():  # pylint: disable=invalid-name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      # Where's Python 3's 'nonlocal' statement when you need it? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      wait_flag[0] = True 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      yield 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      wait_flag[0] = False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def HalfDuplexRequest(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      request = test_pb2.StreamingOutputCallRequest() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      request.response_parameters.add(size=1, interval_us=0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      yield request 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      while wait_flag[0]: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        time.sleep(0.1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    with wait(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      responses = stub.HalfDuplexCall.async(HalfDuplexRequest()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      # half-duplex waits for the client to send all info 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      with self.assertRaises(exceptions.ExpirationError): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        next(responses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+if __name__ == '__main__': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  os.chdir(os.path.dirname(sys.argv[0])) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  parser = argparse.ArgumentParser(description='Run Python compiler plugin test.') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  parser.add_argument('--build_mode', dest='build_mode', type=str, default='dbg', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      help='The build mode of the targets to test, e.g. ' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      '"dbg", "opt", "asan", etc.') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  args, remainder = parser.parse_known_args() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  _build_mode = args.build_mode 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  sys.argv[1:] = remainder 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  unittest.main() 
			 |