Пример #1
0
 def assertMetadataTransmitted(self, original_metadata,
                               transmitted_metadata):
     self.assertTrue(
         test_common.metadata_transmitted(original_metadata,
                                          transmitted_metadata),
         '%s erroneously transmitted as %s' %
         (original_metadata, transmitted_metadata))
 def completion_transmitted(self, original_completion, transmitted_completion):
   if (original_completion.terminal_metadata is not None and
       not grpc_test_common.metadata_transmitted(
           original_completion.terminal_metadata,
           transmitted_completion.terminal_metadata)):
       return False
   elif original_completion.code is not transmitted_completion.code:
     return False
   elif original_completion.message != transmitted_completion.message:
     return False
   else:
     return True
Пример #3
0
 def assertMetadataTransmitted(self, original_metadata, transmitted_metadata):
   self.assertTrue(
       test_common.metadata_transmitted(
           original_metadata, transmitted_metadata),
       '%s erroneously transmitted as %s' % (
           original_metadata, transmitted_metadata))
 def metadata_transmitted(self, original_metadata, transmitted_metadata):
     return original_metadata is None or grpc_test_common.metadata_transmitted(
         original_metadata, transmitted_metadata)
 def metadata_transmitted(self, original_metadata, transmitted_metadata):
   return original_metadata is None or grpc_test_common.metadata_transmitted(
       original_metadata, transmitted_metadata)
Пример #6
0
  def testEcho(self):
    DEADLINE = time.time()+5
    DEADLINE_TOLERANCE = 0.25
    CLIENT_METADATA_ASCII_KEY = b'key'
    CLIENT_METADATA_ASCII_VALUE = b'val'
    CLIENT_METADATA_BIN_KEY = b'key-bin'
    CLIENT_METADATA_BIN_VALUE = b'\0'*1000
    SERVER_INITIAL_METADATA_KEY = b'init_me_me_me'
    SERVER_INITIAL_METADATA_VALUE = b'whodawha?'
    SERVER_TRAILING_METADATA_KEY = b'california_is_in_a_drought'
    SERVER_TRAILING_METADATA_VALUE = b'zomg it is'
    SERVER_STATUS_CODE = cygrpc.StatusCode.ok
    SERVER_STATUS_DETAILS = b'our work is never over'
    REQUEST = b'in death a member of project mayhem has a name'
    RESPONSE = b'his name is robert paulson'
    METHOD = b'twinkies'
    HOST = b'hostess'

    cygrpc_deadline = cygrpc.Timespec(DEADLINE)

    server_request_tag = object()
    request_call_result = self.server.request_call(
        self.server_completion_queue, self.server_completion_queue,
        server_request_tag)

    self.assertEqual(cygrpc.CallError.ok, request_call_result)

    client_call_tag = object()
    client_call = self.client_channel.create_call(
        None, 0, self.client_completion_queue, METHOD, HOST, cygrpc_deadline)
    client_initial_metadata = cygrpc.Metadata([
        cygrpc.Metadatum(CLIENT_METADATA_ASCII_KEY,
                         CLIENT_METADATA_ASCII_VALUE),
        cygrpc.Metadatum(CLIENT_METADATA_BIN_KEY, CLIENT_METADATA_BIN_VALUE)])
    client_start_batch_result = client_call.start_batch(cygrpc.Operations([
        cygrpc.operation_send_initial_metadata(client_initial_metadata),
        cygrpc.operation_send_message(REQUEST),
        cygrpc.operation_send_close_from_client(),
        cygrpc.operation_receive_initial_metadata(),
        cygrpc.operation_receive_message(),
        cygrpc.operation_receive_status_on_client()
    ]), client_call_tag)
    self.assertEqual(cygrpc.CallError.ok, client_start_batch_result)
    client_event_future = test_utilities.CompletionQueuePollFuture(
        self.client_completion_queue, cygrpc_deadline)

    request_event = self.server_completion_queue.poll(cygrpc_deadline)
    self.assertEqual(cygrpc.CompletionType.operation_complete,
                      request_event.type)
    self.assertIsInstance(request_event.operation_call, cygrpc.Call)
    self.assertIs(server_request_tag, request_event.tag)
    self.assertEqual(0, len(request_event.batch_operations))
    self.assertTrue(
        test_common.metadata_transmitted(client_initial_metadata,
                                         request_event.request_metadata))
    self.assertEqual(METHOD, request_event.request_call_details.method)
    self.assertEqual(HOST, request_event.request_call_details.host)
    self.assertLess(
        abs(DEADLINE - float(request_event.request_call_details.deadline)),
        DEADLINE_TOLERANCE)

    server_call_tag = object()
    server_call = request_event.operation_call
    server_initial_metadata = cygrpc.Metadata([
        cygrpc.Metadatum(SERVER_INITIAL_METADATA_KEY,
                         SERVER_INITIAL_METADATA_VALUE)])
    server_trailing_metadata = cygrpc.Metadata([
        cygrpc.Metadatum(SERVER_TRAILING_METADATA_KEY,
                         SERVER_TRAILING_METADATA_VALUE)])
    server_start_batch_result = server_call.start_batch([
        cygrpc.operation_send_initial_metadata(server_initial_metadata),
        cygrpc.operation_receive_message(),
        cygrpc.operation_send_message(RESPONSE),
        cygrpc.operation_receive_close_on_server(),
        cygrpc.operation_send_status_from_server(
            server_trailing_metadata, SERVER_STATUS_CODE, SERVER_STATUS_DETAILS)
    ], server_call_tag)
    self.assertEqual(cygrpc.CallError.ok, server_start_batch_result)

    client_event = client_event_future.result()
    server_event = self.server_completion_queue.poll(cygrpc_deadline)

    self.assertEqual(6, len(client_event.batch_operations))
    found_client_op_types = set()
    for client_result in client_event.batch_operations:
      # we expect each op type to be unique
      self.assertNotIn(client_result.type, found_client_op_types)
      found_client_op_types.add(client_result.type)
      if client_result.type == cygrpc.OperationType.receive_initial_metadata:
        self.assertTrue(
            test_common.metadata_transmitted(server_initial_metadata,
                                             client_result.received_metadata))
      elif client_result.type == cygrpc.OperationType.receive_message:
        self.assertEqual(RESPONSE, client_result.received_message.bytes())
      elif client_result.type == cygrpc.OperationType.receive_status_on_client:
        self.assertTrue(
            test_common.metadata_transmitted(server_trailing_metadata,
                                             client_result.received_metadata))
        self.assertEqual(SERVER_STATUS_DETAILS,
                         client_result.received_status_details)
        self.assertEqual(SERVER_STATUS_CODE, client_result.received_status_code)
    self.assertEqual(set([
          cygrpc.OperationType.send_initial_metadata,
          cygrpc.OperationType.send_message,
          cygrpc.OperationType.send_close_from_client,
          cygrpc.OperationType.receive_initial_metadata,
          cygrpc.OperationType.receive_message,
          cygrpc.OperationType.receive_status_on_client
      ]), found_client_op_types)

    self.assertEqual(5, len(server_event.batch_operations))
    found_server_op_types = set()
    for server_result in server_event.batch_operations:
      self.assertNotIn(client_result.type, found_server_op_types)
      found_server_op_types.add(server_result.type)
      if server_result.type == cygrpc.OperationType.receive_message:
        self.assertEqual(REQUEST, server_result.received_message.bytes())
      elif server_result.type == cygrpc.OperationType.receive_close_on_server:
        self.assertFalse(server_result.received_cancelled)
    self.assertEqual(set([
          cygrpc.OperationType.send_initial_metadata,
          cygrpc.OperationType.receive_message,
          cygrpc.OperationType.send_message,
          cygrpc.OperationType.receive_close_on_server,
          cygrpc.OperationType.send_status_from_server
      ]), found_server_op_types)

    del client_call
    del server_call
Пример #7
0
    def testEcho(self):
        deadline = time.time() + 5
        event_time_tolerance = 2
        deadline_tolerance = 0.25
        client_metadata_ascii_key = 'key'
        client_metadata_ascii_value = 'val'
        client_metadata_bin_key = 'key-bin'
        client_metadata_bin_value = b'\0' * 1000
        server_initial_metadata_key = 'init_me_me_me'
        server_initial_metadata_value = 'whodawha?'
        server_trailing_metadata_key = 'california_is_in_a_drought'
        server_trailing_metadata_value = 'zomg it is'
        server_status_code = _types.StatusCode.OK
        server_status_details = 'our work is never over'
        request = 'blarghaflargh'
        response = 'his name is robert paulson'
        method = 'twinkies'
        host = 'hostess'
        server_request_tag = object()
        request_call_result = self.server.request_call(
            self.server_completion_queue, server_request_tag)

        self.assertEqual(_types.CallError.OK, request_call_result)

        client_call_tag = object()
        client_call = self.client_channel.create_call(
            self.client_completion_queue, method, host, deadline)
        client_initial_metadata = [
            (client_metadata_ascii_key, client_metadata_ascii_value),
            (client_metadata_bin_key, client_metadata_bin_value)
        ]
        client_start_batch_result = client_call.start_batch([
            _types.OpArgs.send_initial_metadata(client_initial_metadata),
            _types.OpArgs.send_message(request, 0),
            _types.OpArgs.send_close_from_client(),
            _types.OpArgs.recv_initial_metadata(),
            _types.OpArgs.recv_message(),
            _types.OpArgs.recv_status_on_client()
        ], client_call_tag)
        self.assertEqual(_types.CallError.OK, client_start_batch_result)

        client_no_event, request_event, = wait_for_events(
            [self.client_completion_queue, self.server_completion_queue],
            time.time() + event_time_tolerance)
        self.assertEqual(client_no_event, None)
        self.assertEqual(_types.EventType.OP_COMPLETE, request_event.type)
        self.assertIsInstance(request_event.call, _low.Call)
        self.assertIs(server_request_tag, request_event.tag)
        self.assertEqual(1, len(request_event.results))
        received_initial_metadata = request_event.results[0].initial_metadata
        # Check that our metadata were transmitted
        self.assertTrue(
            test_common.metadata_transmitted(client_initial_metadata,
                                             received_initial_metadata))
        # Check that Python's user agent string is a part of the full user agent
        # string
        received_initial_metadata_dict = dict(received_initial_metadata)
        self.assertIn('user-agent', received_initial_metadata_dict)
        self.assertIn('Python-gRPC-{}'.format(_grpcio_metadata.__version__),
                      received_initial_metadata_dict['user-agent'])
        self.assertEqual(method, request_event.call_details.method)
        self.assertEqual(host, request_event.call_details.host)
        self.assertLess(abs(deadline - request_event.call_details.deadline),
                        deadline_tolerance)

        # Check that the channel is connected, and that both it and the call have
        # the proper target and peer; do this after the first flurry of messages to
        # avoid the possibility that connection was delayed by the core until the
        # first message was sent.
        self.assertEqual(_types.ConnectivityState.READY,
                         self.client_channel.check_connectivity_state(False))
        self.assertIsNotNone(self.client_channel.target())
        self.assertIsNotNone(client_call.peer())

        server_call_tag = object()
        server_call = request_event.call
        server_initial_metadata = [(server_initial_metadata_key,
                                    server_initial_metadata_value)]
        server_trailing_metadata = [(server_trailing_metadata_key,
                                     server_trailing_metadata_value)]
        server_start_batch_result = server_call.start_batch([
            _types.OpArgs.send_initial_metadata(server_initial_metadata),
            _types.OpArgs.recv_message(),
            _types.OpArgs.send_message(response, 0),
            _types.OpArgs.recv_close_on_server(),
            _types.OpArgs.send_status_from_server(server_trailing_metadata,
                                                  server_status_code,
                                                  server_status_details)
        ], server_call_tag)
        self.assertEqual(_types.CallError.OK, server_start_batch_result)

        client_event, server_event, = wait_for_events(
            [self.client_completion_queue, self.server_completion_queue],
            time.time() + event_time_tolerance)

        self.assertEqual(6, len(client_event.results))
        found_client_op_types = set()
        for client_result in client_event.results:
            # we expect each op type to be unique
            self.assertNotIn(client_result.type, found_client_op_types)
            found_client_op_types.add(client_result.type)
            if client_result.type == _types.OpType.RECV_INITIAL_METADATA:
                self.assertTrue(
                    test_common.metadata_transmitted(
                        server_initial_metadata,
                        client_result.initial_metadata))
            elif client_result.type == _types.OpType.RECV_MESSAGE:
                self.assertEqual(response, client_result.message)
            elif client_result.type == _types.OpType.RECV_STATUS_ON_CLIENT:
                self.assertTrue(
                    test_common.metadata_transmitted(
                        server_trailing_metadata,
                        client_result.trailing_metadata))
                self.assertEqual(server_status_details,
                                 client_result.status.details)
                self.assertEqual(server_status_code, client_result.status.code)
        self.assertEqual(
            set([
                _types.OpType.SEND_INITIAL_METADATA,
                _types.OpType.SEND_MESSAGE,
                _types.OpType.SEND_CLOSE_FROM_CLIENT,
                _types.OpType.RECV_INITIAL_METADATA,
                _types.OpType.RECV_MESSAGE, _types.OpType.RECV_STATUS_ON_CLIENT
            ]), found_client_op_types)

        self.assertEqual(5, len(server_event.results))
        found_server_op_types = set()
        for server_result in server_event.results:
            self.assertNotIn(client_result.type, found_server_op_types)
            found_server_op_types.add(server_result.type)
            if server_result.type == _types.OpType.RECV_MESSAGE:
                self.assertEqual(request, server_result.message)
            elif server_result.type == _types.OpType.RECV_CLOSE_ON_SERVER:
                self.assertFalse(server_result.cancelled)
        self.assertEqual(
            set([
                _types.OpType.SEND_INITIAL_METADATA,
                _types.OpType.RECV_MESSAGE, _types.OpType.SEND_MESSAGE,
                _types.OpType.RECV_CLOSE_ON_SERVER,
                _types.OpType.SEND_STATUS_FROM_SERVER
            ]), found_server_op_types)

        del client_call
        del server_call
Пример #8
0
    def testEcho(self):
        DEADLINE = time.time() + 5
        DEADLINE_TOLERANCE = 0.25
        CLIENT_METADATA_ASCII_KEY = b'key'
        CLIENT_METADATA_ASCII_VALUE = b'val'
        CLIENT_METADATA_BIN_KEY = b'key-bin'
        CLIENT_METADATA_BIN_VALUE = b'\0' * 1000
        SERVER_INITIAL_METADATA_KEY = b'init_me_me_me'
        SERVER_INITIAL_METADATA_VALUE = b'whodawha?'
        SERVER_TRAILING_METADATA_KEY = b'california_is_in_a_drought'
        SERVER_TRAILING_METADATA_VALUE = b'zomg it is'
        SERVER_STATUS_CODE = cygrpc.StatusCode.ok
        SERVER_STATUS_DETAILS = b'our work is never over'
        REQUEST = b'in death a member of project mayhem has a name'
        RESPONSE = b'his name is robert paulson'
        METHOD = b'twinkies'
        HOST = b'hostess'

        cygrpc_deadline = cygrpc.Timespec(DEADLINE)

        server_request_tag = object()
        request_call_result = self.server.request_call(
            self.server_completion_queue, self.server_completion_queue,
            server_request_tag)

        self.assertEqual(cygrpc.CallError.ok, request_call_result)

        client_call_tag = object()
        client_call = self.client_channel.create_call(
            None, 0, self.client_completion_queue, METHOD, HOST,
            cygrpc_deadline)
        client_initial_metadata = cygrpc.Metadata([
            cygrpc.Metadatum(CLIENT_METADATA_ASCII_KEY,
                             CLIENT_METADATA_ASCII_VALUE),
            cygrpc.Metadatum(CLIENT_METADATA_BIN_KEY,
                             CLIENT_METADATA_BIN_VALUE)
        ])
        client_start_batch_result = client_call.start_batch(
            cygrpc.Operations([
                cygrpc.operation_send_initial_metadata(
                    client_initial_metadata),
                cygrpc.operation_send_message(REQUEST),
                cygrpc.operation_send_close_from_client(),
                cygrpc.operation_receive_initial_metadata(),
                cygrpc.operation_receive_message(),
                cygrpc.operation_receive_status_on_client()
            ]), client_call_tag)
        self.assertEqual(cygrpc.CallError.ok, client_start_batch_result)
        client_event_future = test_utilities.CompletionQueuePollFuture(
            self.client_completion_queue, cygrpc_deadline)

        request_event = self.server_completion_queue.poll(cygrpc_deadline)
        self.assertEqual(cygrpc.CompletionType.operation_complete,
                         request_event.type)
        self.assertIsInstance(request_event.operation_call, cygrpc.Call)
        self.assertIs(server_request_tag, request_event.tag)
        self.assertEqual(0, len(request_event.batch_operations))
        self.assertTrue(
            test_common.metadata_transmitted(client_initial_metadata,
                                             request_event.request_metadata))
        self.assertEqual(METHOD, request_event.request_call_details.method)
        self.assertEqual(HOST, request_event.request_call_details.host)
        self.assertLess(
            abs(DEADLINE - float(request_event.request_call_details.deadline)),
            DEADLINE_TOLERANCE)

        server_call_tag = object()
        server_call = request_event.operation_call
        server_initial_metadata = cygrpc.Metadata([
            cygrpc.Metadatum(SERVER_INITIAL_METADATA_KEY,
                             SERVER_INITIAL_METADATA_VALUE)
        ])
        server_trailing_metadata = cygrpc.Metadata([
            cygrpc.Metadatum(SERVER_TRAILING_METADATA_KEY,
                             SERVER_TRAILING_METADATA_VALUE)
        ])
        server_start_batch_result = server_call.start_batch([
            cygrpc.operation_send_initial_metadata(server_initial_metadata),
            cygrpc.operation_receive_message(),
            cygrpc.operation_send_message(RESPONSE),
            cygrpc.operation_receive_close_on_server(),
            cygrpc.operation_send_status_from_server(server_trailing_metadata,
                                                     SERVER_STATUS_CODE,
                                                     SERVER_STATUS_DETAILS)
        ], server_call_tag)
        self.assertEqual(cygrpc.CallError.ok, server_start_batch_result)

        client_event = client_event_future.result()
        server_event = self.server_completion_queue.poll(cygrpc_deadline)

        self.assertEqual(6, len(client_event.batch_operations))
        found_client_op_types = set()
        for client_result in client_event.batch_operations:
            # we expect each op type to be unique
            self.assertNotIn(client_result.type, found_client_op_types)
            found_client_op_types.add(client_result.type)
            if client_result.type == cygrpc.OperationType.receive_initial_metadata:
                self.assertTrue(
                    test_common.metadata_transmitted(
                        server_initial_metadata,
                        client_result.received_metadata))
            elif client_result.type == cygrpc.OperationType.receive_message:
                self.assertEqual(RESPONSE,
                                 client_result.received_message.bytes())
            elif client_result.type == cygrpc.OperationType.receive_status_on_client:
                self.assertTrue(
                    test_common.metadata_transmitted(
                        server_trailing_metadata,
                        client_result.received_metadata))
                self.assertEqual(SERVER_STATUS_DETAILS,
                                 client_result.received_status_details)
                self.assertEqual(SERVER_STATUS_CODE,
                                 client_result.received_status_code)
        self.assertEqual(
            set([
                cygrpc.OperationType.send_initial_metadata,
                cygrpc.OperationType.send_message,
                cygrpc.OperationType.send_close_from_client,
                cygrpc.OperationType.receive_initial_metadata,
                cygrpc.OperationType.receive_message,
                cygrpc.OperationType.receive_status_on_client
            ]), found_client_op_types)

        self.assertEqual(5, len(server_event.batch_operations))
        found_server_op_types = set()
        for server_result in server_event.batch_operations:
            self.assertNotIn(client_result.type, found_server_op_types)
            found_server_op_types.add(server_result.type)
            if server_result.type == cygrpc.OperationType.receive_message:
                self.assertEqual(REQUEST,
                                 server_result.received_message.bytes())
            elif server_result.type == cygrpc.OperationType.receive_close_on_server:
                self.assertFalse(server_result.received_cancelled)
        self.assertEqual(
            set([
                cygrpc.OperationType.send_initial_metadata,
                cygrpc.OperationType.receive_message,
                cygrpc.OperationType.send_message,
                cygrpc.OperationType.receive_close_on_server,
                cygrpc.OperationType.send_status_from_server
            ]), found_server_op_types)

        del client_call
        del server_call
Пример #9
0
    def testEcho(self):
        deadline = time.time() + 5
        event_time_tolerance = 2
        deadline_tolerance = 0.25
        client_metadata_ascii_key = "key"
        client_metadata_ascii_value = "val"
        client_metadata_bin_key = "key-bin"
        client_metadata_bin_value = b"\0" * 1000
        server_initial_metadata_key = "init_me_me_me"
        server_initial_metadata_value = "whodawha?"
        server_trailing_metadata_key = "california_is_in_a_drought"
        server_trailing_metadata_value = "zomg it is"
        server_status_code = _types.StatusCode.OK
        server_status_details = "our work is never over"
        request = "blarghaflargh"
        response = "his name is robert paulson"
        method = "twinkies"
        host = "hostess"
        server_request_tag = object()
        request_call_result = self.server.request_call(self.server_completion_queue, server_request_tag)

        self.assertEqual(_types.CallError.OK, request_call_result)

        client_call_tag = object()
        client_call = self.client_channel.create_call(self.client_completion_queue, method, host, deadline)
        client_initial_metadata = [
            (client_metadata_ascii_key, client_metadata_ascii_value),
            (client_metadata_bin_key, client_metadata_bin_value),
        ]
        client_start_batch_result = client_call.start_batch(
            [
                _types.OpArgs.send_initial_metadata(client_initial_metadata),
                _types.OpArgs.send_message(request, 0),
                _types.OpArgs.send_close_from_client(),
                _types.OpArgs.recv_initial_metadata(),
                _types.OpArgs.recv_message(),
                _types.OpArgs.recv_status_on_client(),
            ],
            client_call_tag,
        )
        self.assertEqual(_types.CallError.OK, client_start_batch_result)

        client_no_event, request_event, = wait_for_events(
            [self.client_completion_queue, self.server_completion_queue], time.time() + event_time_tolerance
        )
        self.assertEqual(client_no_event, None)
        self.assertEqual(_types.EventType.OP_COMPLETE, request_event.type)
        self.assertIsInstance(request_event.call, _low.Call)
        self.assertIs(server_request_tag, request_event.tag)
        self.assertEqual(1, len(request_event.results))
        received_initial_metadata = request_event.results[0].initial_metadata
        # Check that our metadata were transmitted
        self.assertTrue(test_common.metadata_transmitted(client_initial_metadata, received_initial_metadata))
        # Check that Python's user agent string is a part of the full user agent
        # string
        received_initial_metadata_dict = dict(received_initial_metadata)
        self.assertIn("user-agent", received_initial_metadata_dict)
        self.assertIn(
            "Python-gRPC-{}".format(_grpcio_metadata.__version__), received_initial_metadata_dict["user-agent"]
        )
        self.assertEqual(method, request_event.call_details.method)
        self.assertEqual(host, request_event.call_details.host)
        self.assertLess(abs(deadline - request_event.call_details.deadline), deadline_tolerance)

        # Check that the channel is connected, and that both it and the call have
        # the proper target and peer; do this after the first flurry of messages to
        # avoid the possibility that connection was delayed by the core until the
        # first message was sent.
        self.assertEqual(_types.ConnectivityState.READY, self.client_channel.check_connectivity_state(False))
        self.assertIsNotNone(self.client_channel.target())
        self.assertIsNotNone(client_call.peer())

        server_call_tag = object()
        server_call = request_event.call
        server_initial_metadata = [(server_initial_metadata_key, server_initial_metadata_value)]
        server_trailing_metadata = [(server_trailing_metadata_key, server_trailing_metadata_value)]
        server_start_batch_result = server_call.start_batch(
            [
                _types.OpArgs.send_initial_metadata(server_initial_metadata),
                _types.OpArgs.recv_message(),
                _types.OpArgs.send_message(response, 0),
                _types.OpArgs.recv_close_on_server(),
                _types.OpArgs.send_status_from_server(
                    server_trailing_metadata, server_status_code, server_status_details
                ),
            ],
            server_call_tag,
        )
        self.assertEqual(_types.CallError.OK, server_start_batch_result)

        client_event, server_event, = wait_for_events(
            [self.client_completion_queue, self.server_completion_queue], time.time() + event_time_tolerance
        )

        self.assertEqual(6, len(client_event.results))
        found_client_op_types = set()
        for client_result in client_event.results:
            # we expect each op type to be unique
            self.assertNotIn(client_result.type, found_client_op_types)
            found_client_op_types.add(client_result.type)
            if client_result.type == _types.OpType.RECV_INITIAL_METADATA:
                self.assertTrue(
                    test_common.metadata_transmitted(server_initial_metadata, client_result.initial_metadata)
                )
            elif client_result.type == _types.OpType.RECV_MESSAGE:
                self.assertEqual(response, client_result.message)
            elif client_result.type == _types.OpType.RECV_STATUS_ON_CLIENT:
                self.assertTrue(
                    test_common.metadata_transmitted(server_trailing_metadata, client_result.trailing_metadata)
                )
                self.assertEqual(server_status_details, client_result.status.details)
                self.assertEqual(server_status_code, client_result.status.code)
        self.assertEqual(
            set(
                [
                    _types.OpType.SEND_INITIAL_METADATA,
                    _types.OpType.SEND_MESSAGE,
                    _types.OpType.SEND_CLOSE_FROM_CLIENT,
                    _types.OpType.RECV_INITIAL_METADATA,
                    _types.OpType.RECV_MESSAGE,
                    _types.OpType.RECV_STATUS_ON_CLIENT,
                ]
            ),
            found_client_op_types,
        )

        self.assertEqual(5, len(server_event.results))
        found_server_op_types = set()
        for server_result in server_event.results:
            self.assertNotIn(client_result.type, found_server_op_types)
            found_server_op_types.add(server_result.type)
            if server_result.type == _types.OpType.RECV_MESSAGE:
                self.assertEqual(request, server_result.message)
            elif server_result.type == _types.OpType.RECV_CLOSE_ON_SERVER:
                self.assertFalse(server_result.cancelled)
        self.assertEqual(
            set(
                [
                    _types.OpType.SEND_INITIAL_METADATA,
                    _types.OpType.RECV_MESSAGE,
                    _types.OpType.SEND_MESSAGE,
                    _types.OpType.RECV_CLOSE_ON_SERVER,
                    _types.OpType.SEND_STATUS_FROM_SERVER,
                ]
            ),
            found_server_op_types,
        )

        del client_call
        del server_call