mirror of https://github.com/grpc/grpc.git
Merge pull request #18842 from lidizheng/respect-interval
Respect interval_us setting for TestServicerreviewable/pr18937/r1
commit
f1dfe791ab
7 changed files with 155 additions and 113 deletions
@ -0,0 +1,97 @@ |
|||||||
|
# Copyright 2019 The gRPC Authors |
||||||
|
# |
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
# you may not use this file except in compliance with the License. |
||||||
|
# You may obtain a copy of the License at |
||||||
|
# |
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0 |
||||||
|
# |
||||||
|
# Unless required by applicable law or agreed to in writing, software |
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
# See the License for the specific language governing permissions and |
||||||
|
# limitations under the License. |
||||||
|
"""The Python implementation of the TestServicer.""" |
||||||
|
|
||||||
|
import time |
||||||
|
|
||||||
|
import grpc |
||||||
|
|
||||||
|
from src.proto.grpc.testing import empty_pb2 |
||||||
|
from src.proto.grpc.testing import messages_pb2 |
||||||
|
from src.proto.grpc.testing import test_pb2_grpc |
||||||
|
|
||||||
|
_INITIAL_METADATA_KEY = "x-grpc-test-echo-initial" |
||||||
|
_TRAILING_METADATA_KEY = "x-grpc-test-echo-trailing-bin" |
||||||
|
_US_IN_A_SECOND = 1000 * 1000 |
||||||
|
|
||||||
|
|
||||||
|
def _maybe_echo_metadata(servicer_context): |
||||||
|
"""Copies metadata from request to response if it is present.""" |
||||||
|
invocation_metadata = dict(servicer_context.invocation_metadata()) |
||||||
|
if _INITIAL_METADATA_KEY in invocation_metadata: |
||||||
|
initial_metadatum = (_INITIAL_METADATA_KEY, |
||||||
|
invocation_metadata[_INITIAL_METADATA_KEY]) |
||||||
|
servicer_context.send_initial_metadata((initial_metadatum,)) |
||||||
|
if _TRAILING_METADATA_KEY in invocation_metadata: |
||||||
|
trailing_metadatum = (_TRAILING_METADATA_KEY, |
||||||
|
invocation_metadata[_TRAILING_METADATA_KEY]) |
||||||
|
servicer_context.set_trailing_metadata((trailing_metadatum,)) |
||||||
|
|
||||||
|
|
||||||
|
def _maybe_echo_status_and_message(request, servicer_context): |
||||||
|
"""Sets the response context code and details if the request asks for them""" |
||||||
|
if request.HasField('response_status'): |
||||||
|
servicer_context.set_code(request.response_status.code) |
||||||
|
servicer_context.set_details(request.response_status.message) |
||||||
|
|
||||||
|
|
||||||
|
class TestService(test_pb2_grpc.TestServiceServicer): |
||||||
|
|
||||||
|
def EmptyCall(self, request, context): |
||||||
|
_maybe_echo_metadata(context) |
||||||
|
return empty_pb2.Empty() |
||||||
|
|
||||||
|
def UnaryCall(self, request, context): |
||||||
|
_maybe_echo_metadata(context) |
||||||
|
_maybe_echo_status_and_message(request, context) |
||||||
|
return messages_pb2.SimpleResponse( |
||||||
|
payload=messages_pb2.Payload( |
||||||
|
type=messages_pb2.COMPRESSABLE, |
||||||
|
body=b'\x00' * request.response_size)) |
||||||
|
|
||||||
|
def StreamingOutputCall(self, request, context): |
||||||
|
_maybe_echo_status_and_message(request, context) |
||||||
|
for response_parameters in request.response_parameters: |
||||||
|
if response_parameters.interval_us != 0: |
||||||
|
time.sleep(response_parameters.interval_us / _US_IN_A_SECOND) |
||||||
|
yield messages_pb2.StreamingOutputCallResponse( |
||||||
|
payload=messages_pb2.Payload( |
||||||
|
type=request.response_type, |
||||||
|
body=b'\x00' * response_parameters.size)) |
||||||
|
|
||||||
|
def StreamingInputCall(self, request_iterator, context): |
||||||
|
aggregate_size = 0 |
||||||
|
for request in request_iterator: |
||||||
|
if request.payload is not None and request.payload.body: |
||||||
|
aggregate_size += len(request.payload.body) |
||||||
|
return messages_pb2.StreamingInputCallResponse( |
||||||
|
aggregated_payload_size=aggregate_size) |
||||||
|
|
||||||
|
def FullDuplexCall(self, request_iterator, context): |
||||||
|
_maybe_echo_metadata(context) |
||||||
|
for request in request_iterator: |
||||||
|
_maybe_echo_status_and_message(request, context) |
||||||
|
for response_parameters in request.response_parameters: |
||||||
|
if response_parameters.interval_us != 0: |
||||||
|
time.sleep( |
||||||
|
response_parameters.interval_us / _US_IN_A_SECOND) |
||||||
|
yield messages_pb2.StreamingOutputCallResponse( |
||||||
|
payload=messages_pb2.Payload( |
||||||
|
type=request.payload.type, |
||||||
|
body=b'\x00' * response_parameters.size)) |
||||||
|
|
||||||
|
# NOTE(nathaniel): Apparently this is the same as the full-duplex call? |
||||||
|
# NOTE(atash): It isn't even called in the interop spec (Oct 22 2015)... |
||||||
|
def HalfDuplexCall(self, request_iterator, context): |
||||||
|
return self.FullDuplexCall(request_iterator, context) |
Loading…
Reference in new issue