Index: third_party/grpc/src/python/grpcio/tests/unit/framework/interfaces/base/_sequence.py |
diff --git a/third_party/grpc/src/python/grpcio/tests/unit/framework/interfaces/base/_sequence.py b/third_party/grpc/src/python/grpcio/tests/unit/framework/interfaces/base/_sequence.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..571d0e1e632e14db535c53f9b4128c49eb0e8860 |
--- /dev/null |
+++ b/third_party/grpc/src/python/grpcio/tests/unit/framework/interfaces/base/_sequence.py |
@@ -0,0 +1,171 @@ |
+# 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. |
+ |
+"""Part of the tests of the base interface of RPC Framework.""" |
+ |
+import collections |
+import enum |
+ |
+from grpc.framework.interfaces.base import base |
+from tests.unit.framework.common import test_constants |
+ |
+ |
+class Invocation( |
+ collections.namedtuple( |
+ 'Invocation', ('timeout', 'initial_metadata', 'payload', 'complete',))): |
+ """A recipe for operation invocation. |
+ |
+ Attributes: |
+ timeout: A duration in seconds to pass to the system under test as the |
+ operation's timeout value. |
+ initial_metadata: A boolean indicating whether or not to pass initial |
+ metadata when invoking the operation. |
+ payload: A boolean indicating whether or not to pass a payload when |
+ invoking the operation. |
+ complete: A boolean indicating whether or not to indicate completion of |
+ transmissions from the invoking side of the operation when invoking the |
+ operation. |
+ """ |
+ |
+ |
+class Transmission( |
+ collections.namedtuple( |
+ 'Transmission', ('initial_metadata', 'payload', 'complete',))): |
+ """A recipe for a single transmission in an operation. |
+ |
+ Attributes: |
+ initial_metadata: A boolean indicating whether or not to pass initial |
+ metadata as part of the transmission. |
+ payload: A boolean indicating whether or not to pass a payload as part of |
+ the transmission. |
+ complete: A boolean indicating whether or not to indicate completion of |
+ transmission from the transmitting side of the operation as part of the |
+ transmission. |
+ """ |
+ |
+ |
+class Intertransmission( |
+ collections.namedtuple('Intertransmission', ('invocation', 'service',))): |
+ """A recipe for multiple transmissions in an operation. |
+ |
+ Attributes: |
+ invocation: An integer describing the number of payloads to send from the |
+ invocation side of the operation to the service side. |
+ service: An integer describing the number of payloads to send from the |
+ service side of the operation to the invocation side. |
+ """ |
+ |
+ |
+class Element(collections.namedtuple('Element', ('kind', 'transmission',))): |
+ """A sum type for steps to perform when testing an operation. |
+ |
+ Attributes: |
+ kind: A Kind value describing the kind of step to perform in the test. |
+ transmission: Only valid for kinds Kind.INVOCATION_TRANSMISSION and |
+ Kind.SERVICE_TRANSMISSION, a Transmission value describing the details of |
+ the transmission to be made. |
+ """ |
+ |
+ @enum.unique |
+ class Kind(enum.Enum): |
+ INVOCATION_TRANSMISSION = 'invocation transmission' |
+ SERVICE_TRANSMISSION = 'service transmission' |
+ INTERTRANSMISSION = 'intertransmission' |
+ INVOCATION_CANCEL = 'invocation cancel' |
+ SERVICE_CANCEL = 'service cancel' |
+ INVOCATION_FAILURE = 'invocation failure' |
+ SERVICE_FAILURE = 'service failure' |
+ |
+ |
+class OutcomeKinds( |
+ collections.namedtuple('Outcome', ('invocation', 'service',))): |
+ """A description of the expected outcome of an operation test. |
+ |
+ Attributes: |
+ invocation: The base.Outcome.Kind value expected on the invocation side of |
+ the operation. |
+ service: The base.Outcome.Kind value expected on the service side of the |
+ operation. |
+ """ |
+ |
+ |
+class Sequence( |
+ collections.namedtuple( |
+ 'Sequence', |
+ ('name', 'maximum_duration', 'invocation', 'elements', |
+ 'outcome_kinds',))): |
+ """Describes at a high level steps to perform in a test. |
+ |
+ Attributes: |
+ name: The string name of the sequence. |
+ maximum_duration: A length of time in seconds to allow for the test before |
+ declaring it to have failed. |
+ invocation: An Invocation value describing how to invoke the operation |
+ under test. |
+ elements: A sequence of Element values describing at coarse granularity |
+ actions to take during the operation under test. |
+ outcome_kinds: An OutcomeKinds value describing the expected outcome kinds |
+ of the test. |
+ """ |
+ |
+_EASY = Sequence( |
+ 'Easy', |
+ test_constants.TIME_ALLOWANCE, |
+ Invocation(test_constants.LONG_TIMEOUT, True, True, True), |
+ ( |
+ Element( |
+ Element.Kind.SERVICE_TRANSMISSION, Transmission(True, True, True)), |
+ ), |
+ OutcomeKinds(base.Outcome.Kind.COMPLETED, base.Outcome.Kind.COMPLETED)) |
+ |
+_PEASY = Sequence( |
+ 'Peasy', |
+ test_constants.TIME_ALLOWANCE, |
+ Invocation(test_constants.LONG_TIMEOUT, True, True, False), |
+ ( |
+ Element( |
+ Element.Kind.SERVICE_TRANSMISSION, Transmission(True, True, False)), |
+ Element( |
+ Element.Kind.INVOCATION_TRANSMISSION, |
+ Transmission(False, True, True)), |
+ Element( |
+ Element.Kind.SERVICE_TRANSMISSION, Transmission(False, True, True)), |
+ ), |
+ OutcomeKinds(base.Outcome.Kind.COMPLETED, base.Outcome.Kind.COMPLETED)) |
+ |
+ |
+# TODO(issue 2959): Finish this test suite. This tuple of sequences should |
+# contain at least the values in the Cartesian product of (half-duplex, |
+# full-duplex) * (zero payloads, one payload, test_constants.STREAM_LENGTH |
+# payloads) * (completion, cancellation, expiration, programming defect in |
+# servicer code). |
+SEQUENCES = ( |
+ _EASY, |
+ _PEASY, |
+) |