xref: /aosp_15_r20/external/grpc-grpc/doc/interop-test-descriptions.md (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard WorkerInteroperability Test Case Descriptions
2*cc02d7e2SAndroid Build Coastguard Worker=======================================
3*cc02d7e2SAndroid Build Coastguard Worker
4*cc02d7e2SAndroid Build Coastguard WorkerClient and server use
5*cc02d7e2SAndroid Build Coastguard Worker[test.proto](../src/proto/grpc/testing/test.proto)
6*cc02d7e2SAndroid Build Coastguard Workerand the [gRPC over HTTP/2 v2 protocol](./PROTOCOL-HTTP2.md).
7*cc02d7e2SAndroid Build Coastguard Worker
8*cc02d7e2SAndroid Build Coastguard WorkerClient
9*cc02d7e2SAndroid Build Coastguard Worker------
10*cc02d7e2SAndroid Build Coastguard Worker
11*cc02d7e2SAndroid Build Coastguard WorkerClients implement test cases that test certain functionally. Each client is
12*cc02d7e2SAndroid Build Coastguard Workerprovided the test case it is expected to run as a command-line parameter. Names
13*cc02d7e2SAndroid Build Coastguard Workershould be lowercase and without spaces.
14*cc02d7e2SAndroid Build Coastguard Worker
15*cc02d7e2SAndroid Build Coastguard WorkerClients should accept these arguments:
16*cc02d7e2SAndroid Build Coastguard Worker* --server_host=HOSTNAME
17*cc02d7e2SAndroid Build Coastguard Worker    * The server host to connect to. For example, "localhost" or "127.0.0.1"
18*cc02d7e2SAndroid Build Coastguard Worker* --server_host_override=HOSTNAME
19*cc02d7e2SAndroid Build Coastguard Worker    * The server host to claim to be connecting to, for use in TLS and HTTP/2
20*cc02d7e2SAndroid Build Coastguard Worker      :authority header. If unspecified, the value of --server_host will be
21*cc02d7e2SAndroid Build Coastguard Worker      used
22*cc02d7e2SAndroid Build Coastguard Worker* --server_port=PORT
23*cc02d7e2SAndroid Build Coastguard Worker    * The server port to connect to. For example, "8080"
24*cc02d7e2SAndroid Build Coastguard Worker* --test_case=TESTCASE
25*cc02d7e2SAndroid Build Coastguard Worker    * The name of the test case to execute. For example, "empty_unary"
26*cc02d7e2SAndroid Build Coastguard Worker* --use_tls=BOOLEAN
27*cc02d7e2SAndroid Build Coastguard Worker    * Whether to use a plaintext or encrypted connection
28*cc02d7e2SAndroid Build Coastguard Worker* --use_test_ca=BOOLEAN
29*cc02d7e2SAndroid Build Coastguard Worker    * Whether to replace platform root CAs with
30*cc02d7e2SAndroid Build Coastguard Worker      [ca.pem](https://github.com/grpc/grpc/blob/master/src/core/tsi/test_creds/ca.pem)
31*cc02d7e2SAndroid Build Coastguard Worker      as the CA root
32*cc02d7e2SAndroid Build Coastguard Worker* --default_service_account=ACCOUNT_EMAIL
33*cc02d7e2SAndroid Build Coastguard Worker    * Email of the GCE default service account.
34*cc02d7e2SAndroid Build Coastguard Worker* --oauth_scope=SCOPE
35*cc02d7e2SAndroid Build Coastguard Worker    * OAuth scope. For example, "https://www.googleapis.com/auth/xapi.zoo"
36*cc02d7e2SAndroid Build Coastguard Worker* --service_account_key_file=PATH
37*cc02d7e2SAndroid Build Coastguard Worker    * The path to the service account JSON key file generated from GCE developer
38*cc02d7e2SAndroid Build Coastguard Worker      console.
39*cc02d7e2SAndroid Build Coastguard Worker* --service_config_json=SERVICE_CONFIG_JSON
40*cc02d7e2SAndroid Build Coastguard Worker    * Disables service config lookups and sets the provided string as the
41*cc02d7e2SAndroid Build Coastguard Worker      default service config.
42*cc02d7e2SAndroid Build Coastguard Worker* --additional_metadata=ADDITIONAL_METADATA
43*cc02d7e2SAndroid Build Coastguard Worker    * Additional metadata to send in each request, as a semicolon-separated list
44*cc02d7e2SAndroid Build Coastguard Worker      of key:value pairs. The first key/value pair is separated by the first colon.
45*cc02d7e2SAndroid Build Coastguard Worker      The second key/value pair is separated by the next colon *following* the
46*cc02d7e2SAndroid Build Coastguard Worker      next semi-colon thereafter, and so on. For example:
47*cc02d7e2SAndroid Build Coastguard Worker      - `abc-key:abc-value;foo-key:foo-value`
48*cc02d7e2SAndroid Build Coastguard Worker          - Key/value pairs: `abc-key`/`abc-value`, `foo-key`/`foo-value`.
49*cc02d7e2SAndroid Build Coastguard Worker      - `abc-key:abc:value;foo-key:foo:value`
50*cc02d7e2SAndroid Build Coastguard Worker          - Key/value pairs: `abc-key`/`abc:value`, `foo-key`/`foo:value`.
51*cc02d7e2SAndroid Build Coastguard Worker
52*cc02d7e2SAndroid Build Coastguard Worker      Keys must be ASCII only (no `-bin` headers allowed). Values may contain
53*cc02d7e2SAndroid Build Coastguard Worker      any character except semi-colons.
54*cc02d7e2SAndroid Build Coastguard Worker
55*cc02d7e2SAndroid Build Coastguard WorkerClients must support TLS with ALPN. Clients must not disable certificate
56*cc02d7e2SAndroid Build Coastguard Workerchecking.
57*cc02d7e2SAndroid Build Coastguard Worker
58*cc02d7e2SAndroid Build Coastguard Worker### empty_unary
59*cc02d7e2SAndroid Build Coastguard Worker
60*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that implementations support zero-size messages. Ideally,
61*cc02d7e2SAndroid Build Coastguard Workerclient implementations would verify that the request and response were zero
62*cc02d7e2SAndroid Build Coastguard Workerbytes serialized, but this is generally prohibitive to perform, so is not
63*cc02d7e2SAndroid Build Coastguard Workerrequired.
64*cc02d7e2SAndroid Build Coastguard Worker
65*cc02d7e2SAndroid Build Coastguard WorkerServer features:
66*cc02d7e2SAndroid Build Coastguard Worker* [EmptyCall][]
67*cc02d7e2SAndroid Build Coastguard Worker
68*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
69*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls EmptyCall with the default Empty message
70*cc02d7e2SAndroid Build Coastguard Worker
71*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
72*cc02d7e2SAndroid Build Coastguard Worker* call was successful
73*cc02d7e2SAndroid Build Coastguard Worker* response is non-null
74*cc02d7e2SAndroid Build Coastguard Worker
75*cc02d7e2SAndroid Build Coastguard Worker*It may be possible to use UnaryCall instead of EmptyCall, but it is harder to
76*cc02d7e2SAndroid Build Coastguard Workerensure that the proto serialized to zero bytes.*
77*cc02d7e2SAndroid Build Coastguard Worker
78*cc02d7e2SAndroid Build Coastguard Worker### cacheable_unary
79*cc02d7e2SAndroid Build Coastguard Worker
80*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that gRPC requests marked as cacheable use GET verb instead
81*cc02d7e2SAndroid Build Coastguard Workerof POST, and that server sets appropriate cache control headers for the response
82*cc02d7e2SAndroid Build Coastguard Workerto be cached by a proxy. This test requires that the server is behind
83*cc02d7e2SAndroid Build Coastguard Workera caching proxy. Use of current timestamp in the request prevents accidental
84*cc02d7e2SAndroid Build Coastguard Workercache matches left over from previous tests.
85*cc02d7e2SAndroid Build Coastguard Worker
86*cc02d7e2SAndroid Build Coastguard WorkerServer features:
87*cc02d7e2SAndroid Build Coastguard Worker* [CacheableUnaryCall][]
88*cc02d7e2SAndroid Build Coastguard Worker
89*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
90*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls CacheableUnaryCall with `SimpleRequest` request with payload
91*cc02d7e2SAndroid Build Coastguard Worker    set to current timestamp. Timestamp format is irrelevant, and resolution is
92*cc02d7e2SAndroid Build Coastguard Worker    in nanoseconds.
93*cc02d7e2SAndroid Build Coastguard Worker    Client adds a `x-user-ip` header with value `1.2.3.4` to the request.
94*cc02d7e2SAndroid Build Coastguard Worker    This is done since some proxys such as GFE will not cache requests from
95*cc02d7e2SAndroid Build Coastguard Worker    localhost.
96*cc02d7e2SAndroid Build Coastguard Worker    Client marks the request as cacheable by setting the cacheable flag in the
97*cc02d7e2SAndroid Build Coastguard Worker    request context. Longer term this should be driven by the method option
98*cc02d7e2SAndroid Build Coastguard Worker    specified in the proto file itself.
99*cc02d7e2SAndroid Build Coastguard Worker 2. Client calls CacheableUnaryCall again immediately with the same request and
100*cc02d7e2SAndroid Build Coastguard Worker    configuration as the previous call.
101*cc02d7e2SAndroid Build Coastguard Worker
102*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
103*cc02d7e2SAndroid Build Coastguard Worker* Both calls were successful
104*cc02d7e2SAndroid Build Coastguard Worker* The payload body of both responses is the same.
105*cc02d7e2SAndroid Build Coastguard Worker
106*cc02d7e2SAndroid Build Coastguard Worker### large_unary
107*cc02d7e2SAndroid Build Coastguard Worker
108*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies unary calls succeed in sending messages, and touches on flow
109*cc02d7e2SAndroid Build Coastguard Workercontrol (even if compression is enabled on the channel).
110*cc02d7e2SAndroid Build Coastguard Worker
111*cc02d7e2SAndroid Build Coastguard WorkerServer features:
112*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
113*cc02d7e2SAndroid Build Coastguard Worker
114*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
115*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls UnaryCall with:
116*cc02d7e2SAndroid Build Coastguard Worker
117*cc02d7e2SAndroid Build Coastguard Worker    ```
118*cc02d7e2SAndroid Build Coastguard Worker    {
119*cc02d7e2SAndroid Build Coastguard Worker      response_size: 314159
120*cc02d7e2SAndroid Build Coastguard Worker      payload:{
121*cc02d7e2SAndroid Build Coastguard Worker        body: 271828 bytes of zeros
122*cc02d7e2SAndroid Build Coastguard Worker      }
123*cc02d7e2SAndroid Build Coastguard Worker    }
124*cc02d7e2SAndroid Build Coastguard Worker    ```
125*cc02d7e2SAndroid Build Coastguard Worker
126*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
127*cc02d7e2SAndroid Build Coastguard Worker* call was successful
128*cc02d7e2SAndroid Build Coastguard Worker* response payload body is 314159 bytes in size
129*cc02d7e2SAndroid Build Coastguard Worker* clients are free to assert that the response payload body contents are zero
130*cc02d7e2SAndroid Build Coastguard Worker  and comparing the entire response message against a golden response
131*cc02d7e2SAndroid Build Coastguard Worker
132*cc02d7e2SAndroid Build Coastguard Worker### client_compressed_unary
133*cc02d7e2SAndroid Build Coastguard Worker
134*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies the client can compress unary messages by sending two unary
135*cc02d7e2SAndroid Build Coastguard Workercalls, for compressed and uncompressed payloads. It also sends an initial
136*cc02d7e2SAndroid Build Coastguard Workerprobing request to verify whether the server supports the [CompressedRequest][]
137*cc02d7e2SAndroid Build Coastguard Workerfeature by checking if the probing call fails with an `INVALID_ARGUMENT` status.
138*cc02d7e2SAndroid Build Coastguard Worker
139*cc02d7e2SAndroid Build Coastguard WorkerServer features:
140*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
141*cc02d7e2SAndroid Build Coastguard Worker* [CompressedRequest][]
142*cc02d7e2SAndroid Build Coastguard Worker
143*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
144*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls UnaryCall with the feature probe, an *uncompressed* message:
145*cc02d7e2SAndroid Build Coastguard Worker    ```
146*cc02d7e2SAndroid Build Coastguard Worker    {
147*cc02d7e2SAndroid Build Coastguard Worker      expect_compressed:{
148*cc02d7e2SAndroid Build Coastguard Worker        value: true
149*cc02d7e2SAndroid Build Coastguard Worker      }
150*cc02d7e2SAndroid Build Coastguard Worker      response_size: 314159
151*cc02d7e2SAndroid Build Coastguard Worker      payload:{
152*cc02d7e2SAndroid Build Coastguard Worker        body: 271828 bytes of zeros
153*cc02d7e2SAndroid Build Coastguard Worker      }
154*cc02d7e2SAndroid Build Coastguard Worker    }
155*cc02d7e2SAndroid Build Coastguard Worker    ```
156*cc02d7e2SAndroid Build Coastguard Worker
157*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls UnaryCall with the *compressed* message:
158*cc02d7e2SAndroid Build Coastguard Worker
159*cc02d7e2SAndroid Build Coastguard Worker    ```
160*cc02d7e2SAndroid Build Coastguard Worker    {
161*cc02d7e2SAndroid Build Coastguard Worker      expect_compressed:{
162*cc02d7e2SAndroid Build Coastguard Worker        value: true
163*cc02d7e2SAndroid Build Coastguard Worker      }
164*cc02d7e2SAndroid Build Coastguard Worker      response_size: 314159
165*cc02d7e2SAndroid Build Coastguard Worker      payload:{
166*cc02d7e2SAndroid Build Coastguard Worker        body: 271828 bytes of zeros
167*cc02d7e2SAndroid Build Coastguard Worker      }
168*cc02d7e2SAndroid Build Coastguard Worker    }
169*cc02d7e2SAndroid Build Coastguard Worker    ```
170*cc02d7e2SAndroid Build Coastguard Worker
171*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls UnaryCall with the *uncompressed* message:
172*cc02d7e2SAndroid Build Coastguard Worker
173*cc02d7e2SAndroid Build Coastguard Worker    ```
174*cc02d7e2SAndroid Build Coastguard Worker    {
175*cc02d7e2SAndroid Build Coastguard Worker      expect_compressed:{
176*cc02d7e2SAndroid Build Coastguard Worker        value: false
177*cc02d7e2SAndroid Build Coastguard Worker      }
178*cc02d7e2SAndroid Build Coastguard Worker      response_size: 314159
179*cc02d7e2SAndroid Build Coastguard Worker      payload:{
180*cc02d7e2SAndroid Build Coastguard Worker        body: 271828 bytes of zeros
181*cc02d7e2SAndroid Build Coastguard Worker      }
182*cc02d7e2SAndroid Build Coastguard Worker    }
183*cc02d7e2SAndroid Build Coastguard Worker    ```
184*cc02d7e2SAndroid Build Coastguard Worker
185*cc02d7e2SAndroid Build Coastguard Worker    Client asserts:
186*cc02d7e2SAndroid Build Coastguard Worker    * First call failed with `INVALID_ARGUMENT` status.
187*cc02d7e2SAndroid Build Coastguard Worker    * Subsequent calls were successful.
188*cc02d7e2SAndroid Build Coastguard Worker    * Response payload body is 314159 bytes in size.
189*cc02d7e2SAndroid Build Coastguard Worker    * Clients are free to assert that the response payload body contents are
190*cc02d7e2SAndroid Build Coastguard Worker      zeros and comparing the entire response message against a golden response.
191*cc02d7e2SAndroid Build Coastguard Worker
192*cc02d7e2SAndroid Build Coastguard Worker
193*cc02d7e2SAndroid Build Coastguard Worker### server_compressed_unary
194*cc02d7e2SAndroid Build Coastguard Worker
195*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies the server can compress unary messages. It sends two unary
196*cc02d7e2SAndroid Build Coastguard Workerrequests, expecting the server's response to be compressed or not according to
197*cc02d7e2SAndroid Build Coastguard Workerthe `response_compressed` boolean.
198*cc02d7e2SAndroid Build Coastguard Worker
199*cc02d7e2SAndroid Build Coastguard WorkerWhether compression was actually performed is determined by the compression bit
200*cc02d7e2SAndroid Build Coastguard Workerin the response's message flags. *Note that some languages may not have access
201*cc02d7e2SAndroid Build Coastguard Workerto the message flags, in which case the client will be unable to verify that
202*cc02d7e2SAndroid Build Coastguard Workerthe `response_compressed` boolean is obeyed by the server*.
203*cc02d7e2SAndroid Build Coastguard Worker
204*cc02d7e2SAndroid Build Coastguard Worker
205*cc02d7e2SAndroid Build Coastguard WorkerServer features:
206*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
207*cc02d7e2SAndroid Build Coastguard Worker* [CompressedResponse][]
208*cc02d7e2SAndroid Build Coastguard Worker
209*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
210*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls UnaryCall with `SimpleRequest`:
211*cc02d7e2SAndroid Build Coastguard Worker
212*cc02d7e2SAndroid Build Coastguard Worker    ```
213*cc02d7e2SAndroid Build Coastguard Worker    {
214*cc02d7e2SAndroid Build Coastguard Worker      response_compressed:{
215*cc02d7e2SAndroid Build Coastguard Worker        value: true
216*cc02d7e2SAndroid Build Coastguard Worker      }
217*cc02d7e2SAndroid Build Coastguard Worker      response_size: 314159
218*cc02d7e2SAndroid Build Coastguard Worker      payload:{
219*cc02d7e2SAndroid Build Coastguard Worker        body: 271828 bytes of zeros
220*cc02d7e2SAndroid Build Coastguard Worker      }
221*cc02d7e2SAndroid Build Coastguard Worker    }
222*cc02d7e2SAndroid Build Coastguard Worker    ```
223*cc02d7e2SAndroid Build Coastguard Worker
224*cc02d7e2SAndroid Build Coastguard Worker    ```
225*cc02d7e2SAndroid Build Coastguard Worker    {
226*cc02d7e2SAndroid Build Coastguard Worker      response_compressed:{
227*cc02d7e2SAndroid Build Coastguard Worker        value: false
228*cc02d7e2SAndroid Build Coastguard Worker      }
229*cc02d7e2SAndroid Build Coastguard Worker      response_size: 314159
230*cc02d7e2SAndroid Build Coastguard Worker      payload:{
231*cc02d7e2SAndroid Build Coastguard Worker        body: 271828 bytes of zeros
232*cc02d7e2SAndroid Build Coastguard Worker      }
233*cc02d7e2SAndroid Build Coastguard Worker    }
234*cc02d7e2SAndroid Build Coastguard Worker    ```
235*cc02d7e2SAndroid Build Coastguard Worker    Client asserts:
236*cc02d7e2SAndroid Build Coastguard Worker    * call was successful
237*cc02d7e2SAndroid Build Coastguard Worker    * if supported by the implementation, when `response_compressed` is true,
238*cc02d7e2SAndroid Build Coastguard Worker      the response MUST have the compressed message flag set.
239*cc02d7e2SAndroid Build Coastguard Worker    * if supported by the implementation, when `response_compressed` is false,
240*cc02d7e2SAndroid Build Coastguard Worker      the response MUST NOT have the compressed message flag set.
241*cc02d7e2SAndroid Build Coastguard Worker    * response payload body is 314159 bytes in size in both cases.
242*cc02d7e2SAndroid Build Coastguard Worker    * clients are free to assert that the response payload body contents are
243*cc02d7e2SAndroid Build Coastguard Worker      zero and comparing the entire response message against a golden response
244*cc02d7e2SAndroid Build Coastguard Worker
245*cc02d7e2SAndroid Build Coastguard Worker
246*cc02d7e2SAndroid Build Coastguard Worker### client_streaming
247*cc02d7e2SAndroid Build Coastguard Worker
248*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that client-only streaming succeeds.
249*cc02d7e2SAndroid Build Coastguard Worker
250*cc02d7e2SAndroid Build Coastguard WorkerServer features:
251*cc02d7e2SAndroid Build Coastguard Worker* [StreamingInputCall][]
252*cc02d7e2SAndroid Build Coastguard Worker
253*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
254*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls StreamingInputCall
255*cc02d7e2SAndroid Build Coastguard Worker 2. Client sends:
256*cc02d7e2SAndroid Build Coastguard Worker
257*cc02d7e2SAndroid Build Coastguard Worker    ```
258*cc02d7e2SAndroid Build Coastguard Worker    {
259*cc02d7e2SAndroid Build Coastguard Worker      payload:{
260*cc02d7e2SAndroid Build Coastguard Worker        body: 27182 bytes of zeros
261*cc02d7e2SAndroid Build Coastguard Worker      }
262*cc02d7e2SAndroid Build Coastguard Worker    }
263*cc02d7e2SAndroid Build Coastguard Worker    ```
264*cc02d7e2SAndroid Build Coastguard Worker
265*cc02d7e2SAndroid Build Coastguard Worker 3. Client then sends:
266*cc02d7e2SAndroid Build Coastguard Worker
267*cc02d7e2SAndroid Build Coastguard Worker    ```
268*cc02d7e2SAndroid Build Coastguard Worker    {
269*cc02d7e2SAndroid Build Coastguard Worker      payload:{
270*cc02d7e2SAndroid Build Coastguard Worker        body: 8 bytes of zeros
271*cc02d7e2SAndroid Build Coastguard Worker      }
272*cc02d7e2SAndroid Build Coastguard Worker    }
273*cc02d7e2SAndroid Build Coastguard Worker    ```
274*cc02d7e2SAndroid Build Coastguard Worker
275*cc02d7e2SAndroid Build Coastguard Worker 4. Client then sends:
276*cc02d7e2SAndroid Build Coastguard Worker
277*cc02d7e2SAndroid Build Coastguard Worker    ```
278*cc02d7e2SAndroid Build Coastguard Worker    {
279*cc02d7e2SAndroid Build Coastguard Worker      payload:{
280*cc02d7e2SAndroid Build Coastguard Worker        body: 1828 bytes of zeros
281*cc02d7e2SAndroid Build Coastguard Worker      }
282*cc02d7e2SAndroid Build Coastguard Worker    }
283*cc02d7e2SAndroid Build Coastguard Worker    ```
284*cc02d7e2SAndroid Build Coastguard Worker
285*cc02d7e2SAndroid Build Coastguard Worker 5. Client then sends:
286*cc02d7e2SAndroid Build Coastguard Worker
287*cc02d7e2SAndroid Build Coastguard Worker    ```
288*cc02d7e2SAndroid Build Coastguard Worker    {
289*cc02d7e2SAndroid Build Coastguard Worker      payload:{
290*cc02d7e2SAndroid Build Coastguard Worker        body: 45904 bytes of zeros
291*cc02d7e2SAndroid Build Coastguard Worker      }
292*cc02d7e2SAndroid Build Coastguard Worker    }
293*cc02d7e2SAndroid Build Coastguard Worker    ```
294*cc02d7e2SAndroid Build Coastguard Worker
295*cc02d7e2SAndroid Build Coastguard Worker 6. Client half-closes
296*cc02d7e2SAndroid Build Coastguard Worker
297*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
298*cc02d7e2SAndroid Build Coastguard Worker* call was successful
299*cc02d7e2SAndroid Build Coastguard Worker* response aggregated_payload_size is 74922
300*cc02d7e2SAndroid Build Coastguard Worker
301*cc02d7e2SAndroid Build Coastguard Worker
302*cc02d7e2SAndroid Build Coastguard Worker### client_compressed_streaming
303*cc02d7e2SAndroid Build Coastguard Worker
304*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies the client can compress requests on per-message basis by
305*cc02d7e2SAndroid Build Coastguard Workerperforming a two-request streaming call. It also sends an initial probing
306*cc02d7e2SAndroid Build Coastguard Workerrequest to verify whether the server supports the [CompressedRequest][] feature
307*cc02d7e2SAndroid Build Coastguard Workerby checking if the probing call fails with an `INVALID_ARGUMENT` status.
308*cc02d7e2SAndroid Build Coastguard Worker
309*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
310*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls `StreamingInputCall` and sends the following feature-probing
311*cc02d7e2SAndroid Build Coastguard Worker    *uncompressed* `StreamingInputCallRequest` message
312*cc02d7e2SAndroid Build Coastguard Worker
313*cc02d7e2SAndroid Build Coastguard Worker    ```
314*cc02d7e2SAndroid Build Coastguard Worker    {
315*cc02d7e2SAndroid Build Coastguard Worker      expect_compressed:{
316*cc02d7e2SAndroid Build Coastguard Worker        value: true
317*cc02d7e2SAndroid Build Coastguard Worker      }
318*cc02d7e2SAndroid Build Coastguard Worker      payload:{
319*cc02d7e2SAndroid Build Coastguard Worker        body: 27182 bytes of zeros
320*cc02d7e2SAndroid Build Coastguard Worker      }
321*cc02d7e2SAndroid Build Coastguard Worker    }
322*cc02d7e2SAndroid Build Coastguard Worker    ```
323*cc02d7e2SAndroid Build Coastguard Worker    If the call does not fail with `INVALID_ARGUMENT`, the test fails.
324*cc02d7e2SAndroid Build Coastguard Worker    Otherwise, we continue.
325*cc02d7e2SAndroid Build Coastguard Worker
326*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls `StreamingInputCall` again, sending the *compressed* message
327*cc02d7e2SAndroid Build Coastguard Worker
328*cc02d7e2SAndroid Build Coastguard Worker    ```
329*cc02d7e2SAndroid Build Coastguard Worker    {
330*cc02d7e2SAndroid Build Coastguard Worker      expect_compressed:{
331*cc02d7e2SAndroid Build Coastguard Worker        value: true
332*cc02d7e2SAndroid Build Coastguard Worker      }
333*cc02d7e2SAndroid Build Coastguard Worker      payload:{
334*cc02d7e2SAndroid Build Coastguard Worker        body: 27182 bytes of zeros
335*cc02d7e2SAndroid Build Coastguard Worker      }
336*cc02d7e2SAndroid Build Coastguard Worker    }
337*cc02d7e2SAndroid Build Coastguard Worker    ```
338*cc02d7e2SAndroid Build Coastguard Worker
339*cc02d7e2SAndroid Build Coastguard Worker 1. And finally, the *uncompressed* message
340*cc02d7e2SAndroid Build Coastguard Worker    ```
341*cc02d7e2SAndroid Build Coastguard Worker    {
342*cc02d7e2SAndroid Build Coastguard Worker      expect_compressed:{
343*cc02d7e2SAndroid Build Coastguard Worker        value: false
344*cc02d7e2SAndroid Build Coastguard Worker      }
345*cc02d7e2SAndroid Build Coastguard Worker      payload:{
346*cc02d7e2SAndroid Build Coastguard Worker        body: 45904 bytes of zeros
347*cc02d7e2SAndroid Build Coastguard Worker      }
348*cc02d7e2SAndroid Build Coastguard Worker    }
349*cc02d7e2SAndroid Build Coastguard Worker    ```
350*cc02d7e2SAndroid Build Coastguard Worker
351*cc02d7e2SAndroid Build Coastguard Worker 1. Client half-closes
352*cc02d7e2SAndroid Build Coastguard Worker
353*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
354*cc02d7e2SAndroid Build Coastguard Worker* First call fails with `INVALID_ARGUMENT`.
355*cc02d7e2SAndroid Build Coastguard Worker* Next calls succeeds.
356*cc02d7e2SAndroid Build Coastguard Worker* Response aggregated payload size is 73086.
357*cc02d7e2SAndroid Build Coastguard Worker
358*cc02d7e2SAndroid Build Coastguard Worker
359*cc02d7e2SAndroid Build Coastguard Worker### server_streaming
360*cc02d7e2SAndroid Build Coastguard Worker
361*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that server-only streaming succeeds.
362*cc02d7e2SAndroid Build Coastguard Worker
363*cc02d7e2SAndroid Build Coastguard WorkerServer features:
364*cc02d7e2SAndroid Build Coastguard Worker* [StreamingOutputCall][]
365*cc02d7e2SAndroid Build Coastguard Worker
366*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
367*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls StreamingOutputCall with `StreamingOutputCallRequest`:
368*cc02d7e2SAndroid Build Coastguard Worker
369*cc02d7e2SAndroid Build Coastguard Worker    ```
370*cc02d7e2SAndroid Build Coastguard Worker    {
371*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
372*cc02d7e2SAndroid Build Coastguard Worker        size: 31415
373*cc02d7e2SAndroid Build Coastguard Worker      }
374*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
375*cc02d7e2SAndroid Build Coastguard Worker        size: 9
376*cc02d7e2SAndroid Build Coastguard Worker      }
377*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
378*cc02d7e2SAndroid Build Coastguard Worker        size: 2653
379*cc02d7e2SAndroid Build Coastguard Worker      }
380*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
381*cc02d7e2SAndroid Build Coastguard Worker        size: 58979
382*cc02d7e2SAndroid Build Coastguard Worker      }
383*cc02d7e2SAndroid Build Coastguard Worker    }
384*cc02d7e2SAndroid Build Coastguard Worker    ```
385*cc02d7e2SAndroid Build Coastguard Worker
386*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
387*cc02d7e2SAndroid Build Coastguard Worker* call was successful
388*cc02d7e2SAndroid Build Coastguard Worker* exactly four responses
389*cc02d7e2SAndroid Build Coastguard Worker* response payload bodies are sized (in order): 31415, 9, 2653, 58979
390*cc02d7e2SAndroid Build Coastguard Worker* clients are free to assert that the response payload body contents are zero
391*cc02d7e2SAndroid Build Coastguard Worker  and comparing the entire response messages against golden responses
392*cc02d7e2SAndroid Build Coastguard Worker
393*cc02d7e2SAndroid Build Coastguard Worker### server_compressed_streaming
394*cc02d7e2SAndroid Build Coastguard Worker
395*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the server can compress streaming messages and disable
396*cc02d7e2SAndroid Build Coastguard Workercompression on individual messages, expecting the server's response to be
397*cc02d7e2SAndroid Build Coastguard Workercompressed or not according to the `response_compressed` boolean.
398*cc02d7e2SAndroid Build Coastguard Worker
399*cc02d7e2SAndroid Build Coastguard WorkerWhether compression was actually performed is determined by the compression bit
400*cc02d7e2SAndroid Build Coastguard Workerin the response's message flags. *Note that some languages may not have access
401*cc02d7e2SAndroid Build Coastguard Workerto the message flags, in which case the client will be unable to verify that the
402*cc02d7e2SAndroid Build Coastguard Worker`response_compressed` boolean is obeyed by the server*.
403*cc02d7e2SAndroid Build Coastguard Worker
404*cc02d7e2SAndroid Build Coastguard WorkerServer features:
405*cc02d7e2SAndroid Build Coastguard Worker* [StreamingOutputCall][]
406*cc02d7e2SAndroid Build Coastguard Worker* [CompressedResponse][]
407*cc02d7e2SAndroid Build Coastguard Worker
408*cc02d7e2SAndroid Build Coastguard Worker
409*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
410*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls StreamingOutputCall with `StreamingOutputCallRequest`:
411*cc02d7e2SAndroid Build Coastguard Worker
412*cc02d7e2SAndroid Build Coastguard Worker    ```
413*cc02d7e2SAndroid Build Coastguard Worker    {
414*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
415*cc02d7e2SAndroid Build Coastguard Worker        compressed: {
416*cc02d7e2SAndroid Build Coastguard Worker          value: true
417*cc02d7e2SAndroid Build Coastguard Worker        }
418*cc02d7e2SAndroid Build Coastguard Worker        size: 31415
419*cc02d7e2SAndroid Build Coastguard Worker      }
420*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
421*cc02d7e2SAndroid Build Coastguard Worker        compressed: {
422*cc02d7e2SAndroid Build Coastguard Worker          value: false
423*cc02d7e2SAndroid Build Coastguard Worker        }
424*cc02d7e2SAndroid Build Coastguard Worker        size: 92653
425*cc02d7e2SAndroid Build Coastguard Worker      }
426*cc02d7e2SAndroid Build Coastguard Worker    }
427*cc02d7e2SAndroid Build Coastguard Worker    ```
428*cc02d7e2SAndroid Build Coastguard Worker
429*cc02d7e2SAndroid Build Coastguard Worker    Client asserts:
430*cc02d7e2SAndroid Build Coastguard Worker    * call was successful
431*cc02d7e2SAndroid Build Coastguard Worker    * exactly two responses
432*cc02d7e2SAndroid Build Coastguard Worker    * if supported by the implementation, when `response_compressed` is false,
433*cc02d7e2SAndroid Build Coastguard Worker      the response's messages MUST NOT have the compressed message flag set.
434*cc02d7e2SAndroid Build Coastguard Worker    * if supported by the implementation, when `response_compressed` is true,
435*cc02d7e2SAndroid Build Coastguard Worker      the response's messages MUST have the compressed message flag set.
436*cc02d7e2SAndroid Build Coastguard Worker    * response payload bodies are sized (in order): 31415, 92653
437*cc02d7e2SAndroid Build Coastguard Worker    * clients are free to assert that the response payload body contents are
438*cc02d7e2SAndroid Build Coastguard Worker      zero and comparing the entire response messages against golden responses
439*cc02d7e2SAndroid Build Coastguard Worker
440*cc02d7e2SAndroid Build Coastguard Worker### ping_pong
441*cc02d7e2SAndroid Build Coastguard Worker
442*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that full duplex bidi is supported.
443*cc02d7e2SAndroid Build Coastguard Worker
444*cc02d7e2SAndroid Build Coastguard WorkerServer features:
445*cc02d7e2SAndroid Build Coastguard Worker* [FullDuplexCall][]
446*cc02d7e2SAndroid Build Coastguard Worker
447*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
448*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls FullDuplexCall with:
449*cc02d7e2SAndroid Build Coastguard Worker
450*cc02d7e2SAndroid Build Coastguard Worker    ```
451*cc02d7e2SAndroid Build Coastguard Worker    {
452*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
453*cc02d7e2SAndroid Build Coastguard Worker        size: 31415
454*cc02d7e2SAndroid Build Coastguard Worker      }
455*cc02d7e2SAndroid Build Coastguard Worker      payload:{
456*cc02d7e2SAndroid Build Coastguard Worker        body: 27182 bytes of zeros
457*cc02d7e2SAndroid Build Coastguard Worker      }
458*cc02d7e2SAndroid Build Coastguard Worker    }
459*cc02d7e2SAndroid Build Coastguard Worker    ```
460*cc02d7e2SAndroid Build Coastguard Worker
461*cc02d7e2SAndroid Build Coastguard Worker 2. After getting a reply, it sends:
462*cc02d7e2SAndroid Build Coastguard Worker
463*cc02d7e2SAndroid Build Coastguard Worker    ```
464*cc02d7e2SAndroid Build Coastguard Worker    {
465*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
466*cc02d7e2SAndroid Build Coastguard Worker        size: 9
467*cc02d7e2SAndroid Build Coastguard Worker      }
468*cc02d7e2SAndroid Build Coastguard Worker      payload:{
469*cc02d7e2SAndroid Build Coastguard Worker        body: 8 bytes of zeros
470*cc02d7e2SAndroid Build Coastguard Worker      }
471*cc02d7e2SAndroid Build Coastguard Worker    }
472*cc02d7e2SAndroid Build Coastguard Worker    ```
473*cc02d7e2SAndroid Build Coastguard Worker
474*cc02d7e2SAndroid Build Coastguard Worker 3. After getting a reply, it sends:
475*cc02d7e2SAndroid Build Coastguard Worker
476*cc02d7e2SAndroid Build Coastguard Worker    ```
477*cc02d7e2SAndroid Build Coastguard Worker    {
478*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
479*cc02d7e2SAndroid Build Coastguard Worker        size: 2653
480*cc02d7e2SAndroid Build Coastguard Worker      }
481*cc02d7e2SAndroid Build Coastguard Worker      payload:{
482*cc02d7e2SAndroid Build Coastguard Worker        body: 1828 bytes of zeros
483*cc02d7e2SAndroid Build Coastguard Worker      }
484*cc02d7e2SAndroid Build Coastguard Worker    }
485*cc02d7e2SAndroid Build Coastguard Worker    ```
486*cc02d7e2SAndroid Build Coastguard Worker
487*cc02d7e2SAndroid Build Coastguard Worker 4. After getting a reply, it sends:
488*cc02d7e2SAndroid Build Coastguard Worker
489*cc02d7e2SAndroid Build Coastguard Worker    ```
490*cc02d7e2SAndroid Build Coastguard Worker    {
491*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
492*cc02d7e2SAndroid Build Coastguard Worker        size: 58979
493*cc02d7e2SAndroid Build Coastguard Worker      }
494*cc02d7e2SAndroid Build Coastguard Worker      payload:{
495*cc02d7e2SAndroid Build Coastguard Worker        body: 45904 bytes of zeros
496*cc02d7e2SAndroid Build Coastguard Worker      }
497*cc02d7e2SAndroid Build Coastguard Worker    }
498*cc02d7e2SAndroid Build Coastguard Worker    ```
499*cc02d7e2SAndroid Build Coastguard Worker
500*cc02d7e2SAndroid Build Coastguard Worker 5. After getting a reply, client half-closes
501*cc02d7e2SAndroid Build Coastguard Worker
502*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
503*cc02d7e2SAndroid Build Coastguard Worker* call was successful
504*cc02d7e2SAndroid Build Coastguard Worker* exactly four responses
505*cc02d7e2SAndroid Build Coastguard Worker* response payload bodies are sized (in order): 31415, 9, 2653, 58979
506*cc02d7e2SAndroid Build Coastguard Worker* clients are free to assert that the response payload body contents are zero
507*cc02d7e2SAndroid Build Coastguard Worker  and comparing the entire response messages against golden responses
508*cc02d7e2SAndroid Build Coastguard Worker
509*cc02d7e2SAndroid Build Coastguard Worker### empty_stream
510*cc02d7e2SAndroid Build Coastguard Worker
511*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that streams support having zero-messages in both
512*cc02d7e2SAndroid Build Coastguard Workerdirections.
513*cc02d7e2SAndroid Build Coastguard Worker
514*cc02d7e2SAndroid Build Coastguard WorkerServer features:
515*cc02d7e2SAndroid Build Coastguard Worker* [FullDuplexCall][]
516*cc02d7e2SAndroid Build Coastguard Worker
517*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
518*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls FullDuplexCall and then half-closes
519*cc02d7e2SAndroid Build Coastguard Worker
520*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
521*cc02d7e2SAndroid Build Coastguard Worker* call was successful
522*cc02d7e2SAndroid Build Coastguard Worker* exactly zero responses
523*cc02d7e2SAndroid Build Coastguard Worker
524*cc02d7e2SAndroid Build Coastguard Worker### compute_engine_creds
525*cc02d7e2SAndroid Build Coastguard Worker
526*cc02d7e2SAndroid Build Coastguard WorkerThis test is only for cloud-to-prod path.
527*cc02d7e2SAndroid Build Coastguard Worker
528*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies unary calls succeed in sending messages while using Service
529*cc02d7e2SAndroid Build Coastguard WorkerCredentials from GCE metadata server. The client instance needs to be created
530*cc02d7e2SAndroid Build Coastguard Workerwith desired oauth scope.
531*cc02d7e2SAndroid Build Coastguard Worker
532*cc02d7e2SAndroid Build Coastguard WorkerThe test uses `--default_service_account` with GCE service account email and
533*cc02d7e2SAndroid Build Coastguard Worker`--oauth_scope` with the OAuth scope to use. For testing against
534*cc02d7e2SAndroid Build Coastguard Workergrpc-test.sandbox.googleapis.com, "https://www.googleapis.com/auth/xapi.zoo"
535*cc02d7e2SAndroid Build Coastguard Workershould
536*cc02d7e2SAndroid Build Coastguard Workerbe passed in as `--oauth_scope`.
537*cc02d7e2SAndroid Build Coastguard Worker
538*cc02d7e2SAndroid Build Coastguard WorkerServer features:
539*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
540*cc02d7e2SAndroid Build Coastguard Worker* [Echo Authenticated Username][]
541*cc02d7e2SAndroid Build Coastguard Worker* [Echo OAuth Scope][]
542*cc02d7e2SAndroid Build Coastguard Worker
543*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
544*cc02d7e2SAndroid Build Coastguard Worker 1. Client configures channel to use GCECredentials
545*cc02d7e2SAndroid Build Coastguard Worker 2. Client calls UnaryCall on the channel with:
546*cc02d7e2SAndroid Build Coastguard Worker
547*cc02d7e2SAndroid Build Coastguard Worker    ```
548*cc02d7e2SAndroid Build Coastguard Worker    {
549*cc02d7e2SAndroid Build Coastguard Worker      response_size: 314159
550*cc02d7e2SAndroid Build Coastguard Worker      payload:{
551*cc02d7e2SAndroid Build Coastguard Worker        body: 271828 bytes of zeros
552*cc02d7e2SAndroid Build Coastguard Worker      }
553*cc02d7e2SAndroid Build Coastguard Worker      fill_username: true
554*cc02d7e2SAndroid Build Coastguard Worker      fill_oauth_scope: true
555*cc02d7e2SAndroid Build Coastguard Worker    }
556*cc02d7e2SAndroid Build Coastguard Worker    ```
557*cc02d7e2SAndroid Build Coastguard Worker
558*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
559*cc02d7e2SAndroid Build Coastguard Worker* call was successful
560*cc02d7e2SAndroid Build Coastguard Worker* received SimpleResponse.username equals the value of
561*cc02d7e2SAndroid Build Coastguard Worker  `--default_service_account` flag
562*cc02d7e2SAndroid Build Coastguard Worker* received SimpleResponse.oauth_scope is in `--oauth_scope`
563*cc02d7e2SAndroid Build Coastguard Worker* response payload body is 314159 bytes in size
564*cc02d7e2SAndroid Build Coastguard Worker* clients are free to assert that the response payload body contents are zero
565*cc02d7e2SAndroid Build Coastguard Worker  and comparing the entire response message against a golden response
566*cc02d7e2SAndroid Build Coastguard Worker
567*cc02d7e2SAndroid Build Coastguard Worker### jwt_token_creds
568*cc02d7e2SAndroid Build Coastguard Worker
569*cc02d7e2SAndroid Build Coastguard WorkerThis test is only for cloud-to-prod path.
570*cc02d7e2SAndroid Build Coastguard Worker
571*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies unary calls succeed in sending messages while using JWT
572*cc02d7e2SAndroid Build Coastguard Workertoken (created by the project's key file)
573*cc02d7e2SAndroid Build Coastguard Worker
574*cc02d7e2SAndroid Build Coastguard WorkerTest caller should set flag `--service_account_key_file` with the
575*cc02d7e2SAndroid Build Coastguard Workerpath to json key file downloaded from
576*cc02d7e2SAndroid Build Coastguard Workerhttps://console.developers.google.com. Alternately, if using a
577*cc02d7e2SAndroid Build Coastguard Workerusable auth implementation, she may specify the file location in the environment
578*cc02d7e2SAndroid Build Coastguard Workervariable GOOGLE_APPLICATION_CREDENTIALS.
579*cc02d7e2SAndroid Build Coastguard Worker
580*cc02d7e2SAndroid Build Coastguard WorkerServer features:
581*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
582*cc02d7e2SAndroid Build Coastguard Worker* [Echo Authenticated Username][]
583*cc02d7e2SAndroid Build Coastguard Worker* [Echo OAuth Scope][]
584*cc02d7e2SAndroid Build Coastguard Worker
585*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
586*cc02d7e2SAndroid Build Coastguard Worker 1. Client configures the channel to use JWTTokenCredentials
587*cc02d7e2SAndroid Build Coastguard Worker 2. Client calls UnaryCall with:
588*cc02d7e2SAndroid Build Coastguard Worker
589*cc02d7e2SAndroid Build Coastguard Worker    ```
590*cc02d7e2SAndroid Build Coastguard Worker    {
591*cc02d7e2SAndroid Build Coastguard Worker      response_size: 314159
592*cc02d7e2SAndroid Build Coastguard Worker      payload:{
593*cc02d7e2SAndroid Build Coastguard Worker        body: 271828 bytes of zeros
594*cc02d7e2SAndroid Build Coastguard Worker      }
595*cc02d7e2SAndroid Build Coastguard Worker      fill_username: true
596*cc02d7e2SAndroid Build Coastguard Worker    }
597*cc02d7e2SAndroid Build Coastguard Worker    ```
598*cc02d7e2SAndroid Build Coastguard Worker
599*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
600*cc02d7e2SAndroid Build Coastguard Worker* call was successful
601*cc02d7e2SAndroid Build Coastguard Worker* received SimpleResponse.username is not empty and is in the json key file used
602*cc02d7e2SAndroid Build Coastguard Workerby the auth library. The client can optionally check the username matches the
603*cc02d7e2SAndroid Build Coastguard Workeremail address in the key file or equals the value of `--default_service_account`
604*cc02d7e2SAndroid Build Coastguard Workerflag.
605*cc02d7e2SAndroid Build Coastguard Worker* response payload body is 314159 bytes in size
606*cc02d7e2SAndroid Build Coastguard Worker* clients are free to assert that the response payload body contents are zero
607*cc02d7e2SAndroid Build Coastguard Worker  and comparing the entire response message against a golden response
608*cc02d7e2SAndroid Build Coastguard Worker
609*cc02d7e2SAndroid Build Coastguard Worker### oauth2_auth_token
610*cc02d7e2SAndroid Build Coastguard Worker
611*cc02d7e2SAndroid Build Coastguard WorkerThis test is only for cloud-to-prod path and some implementations may run
612*cc02d7e2SAndroid Build Coastguard Workerin GCE only.
613*cc02d7e2SAndroid Build Coastguard Worker
614*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies unary calls succeed in sending messages using an OAuth2 token
615*cc02d7e2SAndroid Build Coastguard Workerthat is obtained out of band. For the purpose of the test, the OAuth2 token is
616*cc02d7e2SAndroid Build Coastguard Workeractually obtained from a service account credentials or GCE credentials via the
617*cc02d7e2SAndroid Build Coastguard Workerlanguage-specific authorization library.
618*cc02d7e2SAndroid Build Coastguard Worker
619*cc02d7e2SAndroid Build Coastguard WorkerThe difference between this test and the other auth tests is that it
620*cc02d7e2SAndroid Build Coastguard Workerfirst uses the authorization library to obtain an authorization token.
621*cc02d7e2SAndroid Build Coastguard Worker
622*cc02d7e2SAndroid Build Coastguard WorkerThe test
623*cc02d7e2SAndroid Build Coastguard Worker- uses the flag `--service_account_key_file` with the path to a json key file
624*cc02d7e2SAndroid Build Coastguard Workerdownloaded from https://console.developers.google.com. Alternately, if using a
625*cc02d7e2SAndroid Build Coastguard Workerusable auth implementation, it may specify the file location in the environment
626*cc02d7e2SAndroid Build Coastguard Workervariable GOOGLE_APPLICATION_CREDENTIALS, *OR* if GCE credentials is used to
627*cc02d7e2SAndroid Build Coastguard Workerfetch the token, `--default_service_account` can be used to pass in GCE service
628*cc02d7e2SAndroid Build Coastguard Workeraccount email.
629*cc02d7e2SAndroid Build Coastguard Worker- uses the flag `--oauth_scope` for the oauth scope.  For testing against
630*cc02d7e2SAndroid Build Coastguard Workergrpc-test.sandbox.googleapis.com, "https://www.googleapis.com/auth/xapi.zoo"
631*cc02d7e2SAndroid Build Coastguard Workershould be passed as the `--oauth_scope`.
632*cc02d7e2SAndroid Build Coastguard Worker
633*cc02d7e2SAndroid Build Coastguard WorkerServer features:
634*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
635*cc02d7e2SAndroid Build Coastguard Worker* [Echo Authenticated Username][]
636*cc02d7e2SAndroid Build Coastguard Worker* [Echo OAuth Scope][]
637*cc02d7e2SAndroid Build Coastguard Worker
638*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
639*cc02d7e2SAndroid Build Coastguard Worker 1. Client uses the auth library to obtain an authorization token
640*cc02d7e2SAndroid Build Coastguard Worker 2. Client configures the channel to use AccessTokenCredentials with the access
641*cc02d7e2SAndroid Build Coastguard Worker    token obtained in step 1
642*cc02d7e2SAndroid Build Coastguard Worker 3. Client calls UnaryCall with the following message
643*cc02d7e2SAndroid Build Coastguard Worker
644*cc02d7e2SAndroid Build Coastguard Worker    ```
645*cc02d7e2SAndroid Build Coastguard Worker    {
646*cc02d7e2SAndroid Build Coastguard Worker      fill_username: true
647*cc02d7e2SAndroid Build Coastguard Worker      fill_oauth_scope: true
648*cc02d7e2SAndroid Build Coastguard Worker    }
649*cc02d7e2SAndroid Build Coastguard Worker    ```
650*cc02d7e2SAndroid Build Coastguard Worker
651*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
652*cc02d7e2SAndroid Build Coastguard Worker* call was successful
653*cc02d7e2SAndroid Build Coastguard Worker* received SimpleResponse.username is valid. Depending on whether a service
654*cc02d7e2SAndroid Build Coastguard Workeraccount key file or GCE credentials was used, client should check against the
655*cc02d7e2SAndroid Build Coastguard Workerjson key file or GCE default service account email.
656*cc02d7e2SAndroid Build Coastguard Worker* received SimpleResponse.oauth_scope is in `--oauth_scope`
657*cc02d7e2SAndroid Build Coastguard Worker
658*cc02d7e2SAndroid Build Coastguard Worker### per_rpc_creds
659*cc02d7e2SAndroid Build Coastguard Worker
660*cc02d7e2SAndroid Build Coastguard WorkerSimilar to the other auth tests, this test is only for cloud-to-prod path.
661*cc02d7e2SAndroid Build Coastguard Worker
662*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies unary calls succeed in sending messages using a JWT or a
663*cc02d7e2SAndroid Build Coastguard Workerservice account credentials set on the RPC.
664*cc02d7e2SAndroid Build Coastguard Worker
665*cc02d7e2SAndroid Build Coastguard WorkerThe test
666*cc02d7e2SAndroid Build Coastguard Worker- uses the flag `--service_account_key_file` with the path to a json key file
667*cc02d7e2SAndroid Build Coastguard Workerdownloaded from https://console.developers.google.com. Alternately, if using a
668*cc02d7e2SAndroid Build Coastguard Workerusable auth implementation, it may specify the file location in the environment
669*cc02d7e2SAndroid Build Coastguard Workervariable GOOGLE_APPLICATION_CREDENTIALS
670*cc02d7e2SAndroid Build Coastguard Worker- optionally uses the flag `--oauth_scope` for the oauth scope if implementer
671*cc02d7e2SAndroid Build Coastguard Workerwishes to use service account credential instead of JWT credential. For testing
672*cc02d7e2SAndroid Build Coastguard Workeragainst grpc-test.sandbox.googleapis.com, oauth scope
673*cc02d7e2SAndroid Build Coastguard Worker"https://www.googleapis.com/auth/xapi.zoo" should be used.
674*cc02d7e2SAndroid Build Coastguard Worker
675*cc02d7e2SAndroid Build Coastguard WorkerServer features:
676*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
677*cc02d7e2SAndroid Build Coastguard Worker* [Echo Authenticated Username][]
678*cc02d7e2SAndroid Build Coastguard Worker* [Echo OAuth Scope][]
679*cc02d7e2SAndroid Build Coastguard Worker
680*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
681*cc02d7e2SAndroid Build Coastguard Worker 1. Client configures the channel with just SSL credentials
682*cc02d7e2SAndroid Build Coastguard Worker 2. Client calls UnaryCall, setting per-call credentials to
683*cc02d7e2SAndroid Build Coastguard Worker    JWTTokenCredentials. The request is the following message
684*cc02d7e2SAndroid Build Coastguard Worker
685*cc02d7e2SAndroid Build Coastguard Worker    ```
686*cc02d7e2SAndroid Build Coastguard Worker    {
687*cc02d7e2SAndroid Build Coastguard Worker      fill_username: true
688*cc02d7e2SAndroid Build Coastguard Worker    }
689*cc02d7e2SAndroid Build Coastguard Worker    ```
690*cc02d7e2SAndroid Build Coastguard Worker
691*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
692*cc02d7e2SAndroid Build Coastguard Worker* call was successful
693*cc02d7e2SAndroid Build Coastguard Worker* received SimpleResponse.username is not empty and is in the json key file used
694*cc02d7e2SAndroid Build Coastguard Workerby the auth library. The client can optionally check the username matches the
695*cc02d7e2SAndroid Build Coastguard Workeremail address in the key file.
696*cc02d7e2SAndroid Build Coastguard Worker
697*cc02d7e2SAndroid Build Coastguard Worker### google_default_credentials
698*cc02d7e2SAndroid Build Coastguard Worker
699*cc02d7e2SAndroid Build Coastguard WorkerSimilar to the other auth tests, this test should only be run against prod
700*cc02d7e2SAndroid Build Coastguard Workerservers. Different from some of the other auth tests however, this test
701*cc02d7e2SAndroid Build Coastguard Workermay be also run from outside of GCP.
702*cc02d7e2SAndroid Build Coastguard Worker
703*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies unary calls succeed when the client uses
704*cc02d7e2SAndroid Build Coastguard WorkerGoogleDefaultCredentials. The path to a service account key file in the
705*cc02d7e2SAndroid Build Coastguard WorkerGOOGLE_APPLICATION_CREDENTIALS environment variable may or may not be
706*cc02d7e2SAndroid Build Coastguard Workerprovided by the test runner. For example, the test runner might set
707*cc02d7e2SAndroid Build Coastguard Workerthis environment when outside of GCP but keep it unset when on GCP.
708*cc02d7e2SAndroid Build Coastguard Worker
709*cc02d7e2SAndroid Build Coastguard WorkerThe test uses `--default_service_account` with GCE service account email.
710*cc02d7e2SAndroid Build Coastguard Worker
711*cc02d7e2SAndroid Build Coastguard WorkerServer features:
712*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
713*cc02d7e2SAndroid Build Coastguard Worker* [Echo Authenticated Username][]
714*cc02d7e2SAndroid Build Coastguard Worker
715*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
716*cc02d7e2SAndroid Build Coastguard Worker 1. Client configures the channel to use GoogleDefaultCredentials
717*cc02d7e2SAndroid Build Coastguard Worker     * Note: the term `GoogleDefaultCredentials` within the context
718*cc02d7e2SAndroid Build Coastguard Worker       of this test description refers to an API which encapsulates
719*cc02d7e2SAndroid Build Coastguard Worker       both "transport credentials" and "call credentials" and which
720*cc02d7e2SAndroid Build Coastguard Worker       is capable of transport creds auto-selection (including ALTS).
721*cc02d7e2SAndroid Build Coastguard Worker       Similar APIs involving only auto-selection of OAuth mechanisms
722*cc02d7e2SAndroid Build Coastguard Worker       might work for this test but aren't the intended subjects.
723*cc02d7e2SAndroid Build Coastguard Worker 2. Client calls UnaryCall with:
724*cc02d7e2SAndroid Build Coastguard Worker
725*cc02d7e2SAndroid Build Coastguard Worker    ```
726*cc02d7e2SAndroid Build Coastguard Worker    {
727*cc02d7e2SAndroid Build Coastguard Worker      fill_username: true
728*cc02d7e2SAndroid Build Coastguard Worker    }
729*cc02d7e2SAndroid Build Coastguard Worker    ```
730*cc02d7e2SAndroid Build Coastguard Worker
731*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
732*cc02d7e2SAndroid Build Coastguard Worker* call was successful
733*cc02d7e2SAndroid Build Coastguard Worker* received SimpleResponse.username matches the value of
734*cc02d7e2SAndroid Build Coastguard Worker  `--default_service_account`
735*cc02d7e2SAndroid Build Coastguard Worker
736*cc02d7e2SAndroid Build Coastguard Worker### compute_engine_channel_credentials
737*cc02d7e2SAndroid Build Coastguard Worker
738*cc02d7e2SAndroid Build Coastguard WorkerSimilar to the other auth tests, this test should only be run against prod
739*cc02d7e2SAndroid Build Coastguard Workerservers. Note that this test may only be ran on GCP.
740*cc02d7e2SAndroid Build Coastguard Worker
741*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies unary calls succeed when the client uses
742*cc02d7e2SAndroid Build Coastguard WorkerComputeEngineChannelCredentials. All that is needed by the test environment
743*cc02d7e2SAndroid Build Coastguard Workeris for the client to be running on GCP.
744*cc02d7e2SAndroid Build Coastguard Worker
745*cc02d7e2SAndroid Build Coastguard WorkerThe test uses `--default_service_account` with GCE service account email. This
746*cc02d7e2SAndroid Build Coastguard Workeremail must identify the default service account of the GCP VM that the test
747*cc02d7e2SAndroid Build Coastguard Workeris running on.
748*cc02d7e2SAndroid Build Coastguard Worker
749*cc02d7e2SAndroid Build Coastguard WorkerServer features:
750*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
751*cc02d7e2SAndroid Build Coastguard Worker* [Echo Authenticated Username][]
752*cc02d7e2SAndroid Build Coastguard Worker
753*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
754*cc02d7e2SAndroid Build Coastguard Worker 1. Client configures the channel to use ComputeEngineChannelCredentials
755*cc02d7e2SAndroid Build Coastguard Worker     * Note: the term `ComputeEngineChannelCredentials` within the context
756*cc02d7e2SAndroid Build Coastguard Worker       of this test description refers to an API which encapsulates
757*cc02d7e2SAndroid Build Coastguard Worker       both "transport credentials" and "call credentials" and which
758*cc02d7e2SAndroid Build Coastguard Worker       is capable of transport creds auto-selection (including ALTS).
759*cc02d7e2SAndroid Build Coastguard Worker       The exact name of the API may vary per language.
760*cc02d7e2SAndroid Build Coastguard Worker 2. Client calls UnaryCall with:
761*cc02d7e2SAndroid Build Coastguard Worker
762*cc02d7e2SAndroid Build Coastguard Worker    ```
763*cc02d7e2SAndroid Build Coastguard Worker    {
764*cc02d7e2SAndroid Build Coastguard Worker      fill_username: true
765*cc02d7e2SAndroid Build Coastguard Worker    }
766*cc02d7e2SAndroid Build Coastguard Worker    ```
767*cc02d7e2SAndroid Build Coastguard Worker
768*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
769*cc02d7e2SAndroid Build Coastguard Worker* call was successful
770*cc02d7e2SAndroid Build Coastguard Worker* received SimpleResponse.username matches the value of
771*cc02d7e2SAndroid Build Coastguard Worker  `--default_service_account`
772*cc02d7e2SAndroid Build Coastguard Worker
773*cc02d7e2SAndroid Build Coastguard Worker### custom_metadata
774*cc02d7e2SAndroid Build Coastguard Worker
775*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that custom metadata in either binary or ascii format can be
776*cc02d7e2SAndroid Build Coastguard Workersent as initial-metadata by the client and as both initial- and trailing-metadata
777*cc02d7e2SAndroid Build Coastguard Workerby the server.
778*cc02d7e2SAndroid Build Coastguard Worker
779*cc02d7e2SAndroid Build Coastguard WorkerServer features:
780*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
781*cc02d7e2SAndroid Build Coastguard Worker* [FullDuplexCall][]
782*cc02d7e2SAndroid Build Coastguard Worker* [Echo Metadata][]
783*cc02d7e2SAndroid Build Coastguard Worker
784*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
785*cc02d7e2SAndroid Build Coastguard Worker 1. The client attaches custom metadata with the following keys and values:
786*cc02d7e2SAndroid Build Coastguard Worker
787*cc02d7e2SAndroid Build Coastguard Worker    ```
788*cc02d7e2SAndroid Build Coastguard Worker    key: "x-grpc-test-echo-initial", value: "test_initial_metadata_value"
789*cc02d7e2SAndroid Build Coastguard Worker    key: "x-grpc-test-echo-trailing-bin", value: 0xababab
790*cc02d7e2SAndroid Build Coastguard Worker    ```
791*cc02d7e2SAndroid Build Coastguard Worker
792*cc02d7e2SAndroid Build Coastguard Worker    to a UnaryCall with request:
793*cc02d7e2SAndroid Build Coastguard Worker
794*cc02d7e2SAndroid Build Coastguard Worker    ```
795*cc02d7e2SAndroid Build Coastguard Worker    {
796*cc02d7e2SAndroid Build Coastguard Worker      response_size: 314159
797*cc02d7e2SAndroid Build Coastguard Worker      payload:{
798*cc02d7e2SAndroid Build Coastguard Worker        body: 271828 bytes of zeros
799*cc02d7e2SAndroid Build Coastguard Worker      }
800*cc02d7e2SAndroid Build Coastguard Worker    }
801*cc02d7e2SAndroid Build Coastguard Worker    ```
802*cc02d7e2SAndroid Build Coastguard Worker
803*cc02d7e2SAndroid Build Coastguard Worker 2. The client attaches custom metadata with the following keys and values:
804*cc02d7e2SAndroid Build Coastguard Worker
805*cc02d7e2SAndroid Build Coastguard Worker    ```
806*cc02d7e2SAndroid Build Coastguard Worker    key: "x-grpc-test-echo-initial", value: "test_initial_metadata_value"
807*cc02d7e2SAndroid Build Coastguard Worker    key: "x-grpc-test-echo-trailing-bin", value: 0xababab
808*cc02d7e2SAndroid Build Coastguard Worker    ```
809*cc02d7e2SAndroid Build Coastguard Worker
810*cc02d7e2SAndroid Build Coastguard Worker    to a FullDuplexCall with request:
811*cc02d7e2SAndroid Build Coastguard Worker
812*cc02d7e2SAndroid Build Coastguard Worker    ```
813*cc02d7e2SAndroid Build Coastguard Worker    {
814*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
815*cc02d7e2SAndroid Build Coastguard Worker        size: 314159
816*cc02d7e2SAndroid Build Coastguard Worker      }
817*cc02d7e2SAndroid Build Coastguard Worker      payload:{
818*cc02d7e2SAndroid Build Coastguard Worker        body: 271828 bytes of zeros
819*cc02d7e2SAndroid Build Coastguard Worker      }
820*cc02d7e2SAndroid Build Coastguard Worker    }
821*cc02d7e2SAndroid Build Coastguard Worker    ```
822*cc02d7e2SAndroid Build Coastguard Worker
823*cc02d7e2SAndroid Build Coastguard Worker    and then half-closes
824*cc02d7e2SAndroid Build Coastguard Worker
825*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
826*cc02d7e2SAndroid Build Coastguard Worker* call was successful
827*cc02d7e2SAndroid Build Coastguard Worker* metadata with key `"x-grpc-test-echo-initial"` and value
828*cc02d7e2SAndroid Build Coastguard Worker  `"test_initial_metadata_value"`is received in the initial metadata for calls
829*cc02d7e2SAndroid Build Coastguard Worker  in Procedure steps 1 and 2.
830*cc02d7e2SAndroid Build Coastguard Worker* metadata with key `"x-grpc-test-echo-trailing-bin"` and value `0xababab` is
831*cc02d7e2SAndroid Build Coastguard Worker  received in the trailing metadata for calls in Procedure steps 1 and 2.
832*cc02d7e2SAndroid Build Coastguard Worker
833*cc02d7e2SAndroid Build Coastguard Worker
834*cc02d7e2SAndroid Build Coastguard Worker
835*cc02d7e2SAndroid Build Coastguard Worker### status_code_and_message
836*cc02d7e2SAndroid Build Coastguard Worker
837*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies unary calls succeed in sending messages, and propagate back
838*cc02d7e2SAndroid Build Coastguard Workerstatus code and message sent along with the messages.
839*cc02d7e2SAndroid Build Coastguard Worker
840*cc02d7e2SAndroid Build Coastguard WorkerServer features:
841*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
842*cc02d7e2SAndroid Build Coastguard Worker* [FullDuplexCall][]
843*cc02d7e2SAndroid Build Coastguard Worker* [Echo Status][]
844*cc02d7e2SAndroid Build Coastguard Worker
845*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
846*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls UnaryCall with:
847*cc02d7e2SAndroid Build Coastguard Worker
848*cc02d7e2SAndroid Build Coastguard Worker    ```
849*cc02d7e2SAndroid Build Coastguard Worker    {
850*cc02d7e2SAndroid Build Coastguard Worker      response_status:{
851*cc02d7e2SAndroid Build Coastguard Worker        code: 2
852*cc02d7e2SAndroid Build Coastguard Worker        message: "test status message"
853*cc02d7e2SAndroid Build Coastguard Worker      }
854*cc02d7e2SAndroid Build Coastguard Worker    }
855*cc02d7e2SAndroid Build Coastguard Worker    ```
856*cc02d7e2SAndroid Build Coastguard Worker
857*cc02d7e2SAndroid Build Coastguard Worker 2. Client calls FullDuplexCall with:
858*cc02d7e2SAndroid Build Coastguard Worker
859*cc02d7e2SAndroid Build Coastguard Worker    ```
860*cc02d7e2SAndroid Build Coastguard Worker    {
861*cc02d7e2SAndroid Build Coastguard Worker      response_status:{
862*cc02d7e2SAndroid Build Coastguard Worker        code: 2
863*cc02d7e2SAndroid Build Coastguard Worker        message: "test status message"
864*cc02d7e2SAndroid Build Coastguard Worker      }
865*cc02d7e2SAndroid Build Coastguard Worker    }
866*cc02d7e2SAndroid Build Coastguard Worker    ```
867*cc02d7e2SAndroid Build Coastguard Worker
868*cc02d7e2SAndroid Build Coastguard Worker    and then half-closes
869*cc02d7e2SAndroid Build Coastguard Worker
870*cc02d7e2SAndroid Build Coastguard Worker
871*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
872*cc02d7e2SAndroid Build Coastguard Worker* received status code is the same as the sent code for both Procedure steps 1
873*cc02d7e2SAndroid Build Coastguard Worker  and 2
874*cc02d7e2SAndroid Build Coastguard Worker* received status message is the same as the sent message for both Procedure
875*cc02d7e2SAndroid Build Coastguard Worker  steps 1 and 2
876*cc02d7e2SAndroid Build Coastguard Worker
877*cc02d7e2SAndroid Build Coastguard Worker### special_status_message
878*cc02d7e2SAndroid Build Coastguard Worker
879*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies Unicode and whitespace is correctly processed in status
880*cc02d7e2SAndroid Build Coastguard Workermessage. "\t" is horizontal tab. "\r" is carriage return.  "\n" is line feed.
881*cc02d7e2SAndroid Build Coastguard Worker
882*cc02d7e2SAndroid Build Coastguard WorkerServer features:
883*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
884*cc02d7e2SAndroid Build Coastguard Worker* [Echo Status][]
885*cc02d7e2SAndroid Build Coastguard Worker
886*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
887*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls UnaryCall with:
888*cc02d7e2SAndroid Build Coastguard Worker
889*cc02d7e2SAndroid Build Coastguard Worker    ```
890*cc02d7e2SAndroid Build Coastguard Worker    {
891*cc02d7e2SAndroid Build Coastguard Worker      response_status:{
892*cc02d7e2SAndroid Build Coastguard Worker        code: 2
893*cc02d7e2SAndroid Build Coastguard Worker        message: "\t\ntest with whitespace\r\nand Unicode BMP ☺ and non-BMP ��\t\n"
894*cc02d7e2SAndroid Build Coastguard Worker      }
895*cc02d7e2SAndroid Build Coastguard Worker    }
896*cc02d7e2SAndroid Build Coastguard Worker    ```
897*cc02d7e2SAndroid Build Coastguard Worker
898*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
899*cc02d7e2SAndroid Build Coastguard Worker* received status code is the same as the sent code for Procedure step 1
900*cc02d7e2SAndroid Build Coastguard Worker* received status message is the same as the sent message for Procedure step 1,
901*cc02d7e2SAndroid Build Coastguard Worker  including all whitespace characters
902*cc02d7e2SAndroid Build Coastguard Worker
903*cc02d7e2SAndroid Build Coastguard Worker### unimplemented_method
904*cc02d7e2SAndroid Build Coastguard Worker
905*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that calling an unimplemented RPC method returns the
906*cc02d7e2SAndroid Build Coastguard WorkerUNIMPLEMENTED status code.
907*cc02d7e2SAndroid Build Coastguard Worker
908*cc02d7e2SAndroid Build Coastguard WorkerServer features:
909*cc02d7e2SAndroid Build Coastguard WorkerN/A
910*cc02d7e2SAndroid Build Coastguard Worker
911*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
912*cc02d7e2SAndroid Build Coastguard Worker* Client calls `grpc.testing.TestService/UnimplementedCall` with an empty
913*cc02d7e2SAndroid Build Coastguard Worker  request (defined as `grpc.testing.Empty`):
914*cc02d7e2SAndroid Build Coastguard Worker
915*cc02d7e2SAndroid Build Coastguard Worker    ```
916*cc02d7e2SAndroid Build Coastguard Worker    {
917*cc02d7e2SAndroid Build Coastguard Worker    }
918*cc02d7e2SAndroid Build Coastguard Worker    ```
919*cc02d7e2SAndroid Build Coastguard Worker
920*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
921*cc02d7e2SAndroid Build Coastguard Worker* received status code is 12 (UNIMPLEMENTED)
922*cc02d7e2SAndroid Build Coastguard Worker
923*cc02d7e2SAndroid Build Coastguard Worker### unimplemented_service
924*cc02d7e2SAndroid Build Coastguard Worker
925*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies calling an unimplemented server returns the UNIMPLEMENTED
926*cc02d7e2SAndroid Build Coastguard Workerstatus code.
927*cc02d7e2SAndroid Build Coastguard Worker
928*cc02d7e2SAndroid Build Coastguard WorkerServer features:
929*cc02d7e2SAndroid Build Coastguard WorkerN/A
930*cc02d7e2SAndroid Build Coastguard Worker
931*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
932*cc02d7e2SAndroid Build Coastguard Worker* Client calls `grpc.testing.UnimplementedService/UnimplementedCall` with an
933*cc02d7e2SAndroid Build Coastguard Worker  empty request (defined as `grpc.testing.Empty`)
934*cc02d7e2SAndroid Build Coastguard Worker
935*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
936*cc02d7e2SAndroid Build Coastguard Worker* received status code is 12 (UNIMPLEMENTED)
937*cc02d7e2SAndroid Build Coastguard Worker
938*cc02d7e2SAndroid Build Coastguard Worker### cancel_after_begin
939*cc02d7e2SAndroid Build Coastguard Worker
940*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that a request can be cancelled after metadata has been sent
941*cc02d7e2SAndroid Build Coastguard Workerbut before payloads are sent.
942*cc02d7e2SAndroid Build Coastguard Worker
943*cc02d7e2SAndroid Build Coastguard WorkerServer features:
944*cc02d7e2SAndroid Build Coastguard Worker* [StreamingInputCall][]
945*cc02d7e2SAndroid Build Coastguard Worker
946*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
947*cc02d7e2SAndroid Build Coastguard Worker 1. Client starts StreamingInputCall
948*cc02d7e2SAndroid Build Coastguard Worker 2. Client immediately cancels request
949*cc02d7e2SAndroid Build Coastguard Worker
950*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
951*cc02d7e2SAndroid Build Coastguard Worker* Call completed with status CANCELLED
952*cc02d7e2SAndroid Build Coastguard Worker
953*cc02d7e2SAndroid Build Coastguard Worker### cancel_after_first_response
954*cc02d7e2SAndroid Build Coastguard Worker
955*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that a request can be cancelled after receiving a message
956*cc02d7e2SAndroid Build Coastguard Workerfrom the server.
957*cc02d7e2SAndroid Build Coastguard Worker
958*cc02d7e2SAndroid Build Coastguard WorkerServer features:
959*cc02d7e2SAndroid Build Coastguard Worker* [FullDuplexCall][]
960*cc02d7e2SAndroid Build Coastguard Worker
961*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
962*cc02d7e2SAndroid Build Coastguard Worker 1. Client starts FullDuplexCall with
963*cc02d7e2SAndroid Build Coastguard Worker
964*cc02d7e2SAndroid Build Coastguard Worker    ```
965*cc02d7e2SAndroid Build Coastguard Worker    {
966*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
967*cc02d7e2SAndroid Build Coastguard Worker        size: 31415
968*cc02d7e2SAndroid Build Coastguard Worker      }
969*cc02d7e2SAndroid Build Coastguard Worker      payload:{
970*cc02d7e2SAndroid Build Coastguard Worker        body: 27182 bytes of zeros
971*cc02d7e2SAndroid Build Coastguard Worker      }
972*cc02d7e2SAndroid Build Coastguard Worker    }
973*cc02d7e2SAndroid Build Coastguard Worker    ```
974*cc02d7e2SAndroid Build Coastguard Worker
975*cc02d7e2SAndroid Build Coastguard Worker 2. After receiving a response, client cancels request
976*cc02d7e2SAndroid Build Coastguard Worker
977*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
978*cc02d7e2SAndroid Build Coastguard Worker* Call completed with status CANCELLED
979*cc02d7e2SAndroid Build Coastguard Worker
980*cc02d7e2SAndroid Build Coastguard Worker### timeout_on_sleeping_server
981*cc02d7e2SAndroid Build Coastguard Worker
982*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that an RPC request whose lifetime exceeds its configured
983*cc02d7e2SAndroid Build Coastguard Workertimeout value will end with the DeadlineExceeded status.
984*cc02d7e2SAndroid Build Coastguard Worker
985*cc02d7e2SAndroid Build Coastguard WorkerServer features:
986*cc02d7e2SAndroid Build Coastguard Worker* [FullDuplexCall][]
987*cc02d7e2SAndroid Build Coastguard Worker
988*cc02d7e2SAndroid Build Coastguard WorkerProcedure:
989*cc02d7e2SAndroid Build Coastguard Worker 1. Client calls FullDuplexCall with the following request and sets its timeout
990*cc02d7e2SAndroid Build Coastguard Worker    to 1ms
991*cc02d7e2SAndroid Build Coastguard Worker
992*cc02d7e2SAndroid Build Coastguard Worker    ```
993*cc02d7e2SAndroid Build Coastguard Worker    {
994*cc02d7e2SAndroid Build Coastguard Worker      payload:{
995*cc02d7e2SAndroid Build Coastguard Worker        body: 27182 bytes of zeros
996*cc02d7e2SAndroid Build Coastguard Worker      }
997*cc02d7e2SAndroid Build Coastguard Worker    }
998*cc02d7e2SAndroid Build Coastguard Worker    ```
999*cc02d7e2SAndroid Build Coastguard Worker
1000*cc02d7e2SAndroid Build Coastguard Worker 2. Client waits
1001*cc02d7e2SAndroid Build Coastguard Worker
1002*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
1003*cc02d7e2SAndroid Build Coastguard Worker* Call completed with status DEADLINE_EXCEEDED.
1004*cc02d7e2SAndroid Build Coastguard Worker
1005*cc02d7e2SAndroid Build Coastguard Worker### rpc_soak
1006*cc02d7e2SAndroid Build Coastguard Worker
1007*cc02d7e2SAndroid Build Coastguard WorkerThe client performs many large_unary RPCs in sequence over the same channel.
1008*cc02d7e2SAndroid Build Coastguard WorkerThe client records the latency and status of each RPC in some data structure.
1009*cc02d7e2SAndroid Build Coastguard WorkerIf the test ever consumes `soak_overall_timeout_seconds` seconds and still hasn't
1010*cc02d7e2SAndroid Build Coastguard Workercompleted `soak_iterations` RPCs, then the test should discontinue sending RPCs
1011*cc02d7e2SAndroid Build Coastguard Workeras soon as possible. After performing all RPCs, the test should examine
1012*cc02d7e2SAndroid Build Coastguard Workerpreviously recorded RPC latency and status results in a second pass and fail if
1013*cc02d7e2SAndroid Build Coastguard Workereither:
1014*cc02d7e2SAndroid Build Coastguard Worker
1015*cc02d7e2SAndroid Build Coastguard Workera) not all `soak_iterations` RPCs were completed
1016*cc02d7e2SAndroid Build Coastguard Worker
1017*cc02d7e2SAndroid Build Coastguard Workerb) the sum of RPCs that either completed with a non-OK status or exceeded
1018*cc02d7e2SAndroid Build Coastguard Worker   `max_acceptable_per_rpc_latency_ms` exceeds `soak_max_failures`
1019*cc02d7e2SAndroid Build Coastguard Worker
1020*cc02d7e2SAndroid Build Coastguard WorkerImplementations should use a timer with sub-millisecond precision to measure
1021*cc02d7e2SAndroid Build Coastguard Workerlatency. Also, implementations should avoid setting RPC deadlines and should
1022*cc02d7e2SAndroid Build Coastguard Workerinstead wait for each RPC to complete. Doing so provides more data for
1023*cc02d7e2SAndroid Build Coastguard Workerdebugging in case of failure. For example, if RPC deadlines are set to
1024*cc02d7e2SAndroid Build Coastguard Worker`soak_per_iteration_max_acceptable_latency_ms` and one of the RPCs hits that
1025*cc02d7e2SAndroid Build Coastguard Workerdeadline, it's not clear if the RPC was late by a millisecond or a minute.
1026*cc02d7e2SAndroid Build Coastguard Worker
1027*cc02d7e2SAndroid Build Coastguard WorkerIn order to make it easy to analyze results, implementations should log the
1028*cc02d7e2SAndroid Build Coastguard Workerresults of each iteration (i.e. RPC) in a format the matches the following
1029*cc02d7e2SAndroid Build Coastguard Workerregexes:
1030*cc02d7e2SAndroid Build Coastguard Worker
1031*cc02d7e2SAndroid Build Coastguard Worker- Upon success:
1032*cc02d7e2SAndroid Build Coastguard Worker  - `soak iteration: \d+ elapsed_ms: \d+ peer: \S+ succeeded`
1033*cc02d7e2SAndroid Build Coastguard Worker
1034*cc02d7e2SAndroid Build Coastguard Worker- Upon failure:
1035*cc02d7e2SAndroid Build Coastguard Worker  - `soak iteration: \d+ elapsed_ms: \d+ peer: \S+ failed:`
1036*cc02d7e2SAndroid Build Coastguard Worker
1037*cc02d7e2SAndroid Build Coastguard WorkerThis test must be configurable via a few different command line flags:
1038*cc02d7e2SAndroid Build Coastguard Worker
1039*cc02d7e2SAndroid Build Coastguard Worker* `soak_iterations`: Controls the number of RPCs to perform. This should
1040*cc02d7e2SAndroid Build Coastguard Worker  default to 10.
1041*cc02d7e2SAndroid Build Coastguard Worker
1042*cc02d7e2SAndroid Build Coastguard Worker* `soak_max_failures`: An inclusive upper limit on the number of RPC failures
1043*cc02d7e2SAndroid Build Coastguard Worker  that should be tolerated (i.e. after which the test process should
1044*cc02d7e2SAndroid Build Coastguard Worker  still exit 0). A failure is considered to be either a non-OK status or an RPC
1045*cc02d7e2SAndroid Build Coastguard Worker  whose latency exceeds `soak_per_iteration_max_acceptable_latency_ms`. This
1046*cc02d7e2SAndroid Build Coastguard Worker  should default to 0.
1047*cc02d7e2SAndroid Build Coastguard Worker
1048*cc02d7e2SAndroid Build Coastguard Worker* `soak_per_iteration_max_acceptable_latency_ms`: An upper limit on the latency
1049*cc02d7e2SAndroid Build Coastguard Worker  of a single RPC in order for that RPC to be considered successful. This
1050*cc02d7e2SAndroid Build Coastguard Worker  should default to 1000.
1051*cc02d7e2SAndroid Build Coastguard Worker
1052*cc02d7e2SAndroid Build Coastguard Worker* `soak_overall_timeout_seconds`: The overall number of seconds after which
1053*cc02d7e2SAndroid Build Coastguard Worker  the test should stop and fail if `soak_iterations` have not yet been
1054*cc02d7e2SAndroid Build Coastguard Worker  completed. This should default to
1055*cc02d7e2SAndroid Build Coastguard Worker  `soak_per_iteration_max_acceptable_latency_ms` * `soak_iterations`.
1056*cc02d7e2SAndroid Build Coastguard Worker
1057*cc02d7e2SAndroid Build Coastguard Worker* `soak_min_time_ms_between_rpcs`: The minimum time in milliseconds between
1058*cc02d7e2SAndroid Build Coastguard Worker  consecutive RPCs. Useful for limiting QPS.
1059*cc02d7e2SAndroid Build Coastguard Worker
1060*cc02d7e2SAndroid Build Coastguard WorkerThe following is optional but encouraged to improve debuggability:
1061*cc02d7e2SAndroid Build Coastguard Worker
1062*cc02d7e2SAndroid Build Coastguard Worker* Implementations should log the number of milliseconds that each RPC takes.
1063*cc02d7e2SAndroid Build Coastguard Worker  Additionally, implementations should use a histogram of RPC latencies
1064*cc02d7e2SAndroid Build Coastguard Worker  to log interesting latency percentiles at the end of the test (e.g. median,
1065*cc02d7e2SAndroid Build Coastguard Worker  90th, and max latency percentiles).
1066*cc02d7e2SAndroid Build Coastguard Worker
1067*cc02d7e2SAndroid Build Coastguard Worker### channel_soak
1068*cc02d7e2SAndroid Build Coastguard Worker
1069*cc02d7e2SAndroid Build Coastguard WorkerSimilar to rpc_soak, but this time each RPC is performed on a new channel. The
1070*cc02d7e2SAndroid Build Coastguard Workerchannel is created just before each RPC and is destroyed just after.
1071*cc02d7e2SAndroid Build Coastguard Worker
1072*cc02d7e2SAndroid Build Coastguard WorkerThis test is configured with the same command line flags that the rpc_soak test
1073*cc02d7e2SAndroid Build Coastguard Workeris configured with, with only one semantic difference: when measuring an RPCs
1074*cc02d7e2SAndroid Build Coastguard Workerlatency to see if it exceeds `soak_per_iteration_max_acceptable_latency_ms` or
1075*cc02d7e2SAndroid Build Coastguard Workernot, the creation of the channel should be included in that
1076*cc02d7e2SAndroid Build Coastguard Workerlatency measurement, but the teardown of that channel should **not** be
1077*cc02d7e2SAndroid Build Coastguard Workerincluded in that latency measurement (channel teardown semantics differ widely
1078*cc02d7e2SAndroid Build Coastguard Workerbetween languages). This latency measurement should also be the value that is
1079*cc02d7e2SAndroid Build Coastguard Workerlogged and recorded in the latency histogram.
1080*cc02d7e2SAndroid Build Coastguard Worker
1081*cc02d7e2SAndroid Build Coastguard Worker
1082*cc02d7e2SAndroid Build Coastguard Worker### orca_per_rpc
1083*cc02d7e2SAndroid Build Coastguard Worker[orca_per_rpc]: #orca_per_rpc
1084*cc02d7e2SAndroid Build Coastguard Worker
1085*cc02d7e2SAndroid Build Coastguard WorkerThe client verifies that a custom LB policy, which is integrated with ORCA APIs,
1086*cc02d7e2SAndroid Build Coastguard Workerwill receive per-query metric reports from the backend.
1087*cc02d7e2SAndroid Build Coastguard Worker
1088*cc02d7e2SAndroid Build Coastguard WorkerThe client will register the custom LB policy named
1089*cc02d7e2SAndroid Build Coastguard Worker`test_backend_metrics_load_balancer`, which using ORCA APIs already installed a
1090*cc02d7e2SAndroid Build Coastguard Workerper-query report listener. The interop-testing client will run with a service
1091*cc02d7e2SAndroid Build Coastguard Workerconfig to select the load balancing config (using argument
1092*cc02d7e2SAndroid Build Coastguard Worker`--service_config_json`), so that it effectively uses this newly registered
1093*cc02d7e2SAndroid Build Coastguard Workercustom LB policy. A load report reference can be passed from the call to the LB
1094*cc02d7e2SAndroid Build Coastguard Workerpolicy through, e.g. CallOptions, to receive metric reports. The LB policy will
1095*cc02d7e2SAndroid Build Coastguard Workerfill in the reference with the latest load report from the report listener.
1096*cc02d7e2SAndroid Build Coastguard WorkerThis way, together with server behaviors we can verify the expected metric
1097*cc02d7e2SAndroid Build Coastguard Workerreports are received.
1098*cc02d7e2SAndroid Build Coastguard Worker
1099*cc02d7e2SAndroid Build Coastguard WorkerServer features:
1100*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
1101*cc02d7e2SAndroid Build Coastguard Worker* [Backend Metrics Report][]
1102*cc02d7e2SAndroid Build Coastguard Worker
1103*cc02d7e2SAndroid Build Coastguard WorkerProcedures:
1104*cc02d7e2SAndroid Build Coastguard Worker* The client sends a unary request:
1105*cc02d7e2SAndroid Build Coastguard Worker    ```
1106*cc02d7e2SAndroid Build Coastguard Worker    {
1107*cc02d7e2SAndroid Build Coastguard Worker      orca_per_rpc_report:{
1108*cc02d7e2SAndroid Build Coastguard Worker        cpu_utilization: 0.8210
1109*cc02d7e2SAndroid Build Coastguard Worker        memory_utilization: 0.5847
1110*cc02d7e2SAndroid Build Coastguard Worker        request_cost: {
1111*cc02d7e2SAndroid Build Coastguard Worker          cost: 3456.32
1112*cc02d7e2SAndroid Build Coastguard Worker        }
1113*cc02d7e2SAndroid Build Coastguard Worker        utilization: {
1114*cc02d7e2SAndroid Build Coastguard Worker          util: 0.30499
1115*cc02d7e2SAndroid Build Coastguard Worker        }
1116*cc02d7e2SAndroid Build Coastguard Worker      }
1117*cc02d7e2SAndroid Build Coastguard Worker    }
1118*cc02d7e2SAndroid Build Coastguard Worker    ```
1119*cc02d7e2SAndroid Build Coastguard Worker
1120*cc02d7e2SAndroid Build Coastguard WorkerThe call carries a reference to receive the load report, e.g. using CallOptions.
1121*cc02d7e2SAndroid Build Coastguard WorkerThe reference is passed to the custom LB policy as part of the
1122*cc02d7e2SAndroid Build Coastguard Worker`OrcaPerRequestReportListener` API.
1123*cc02d7e2SAndroid Build Coastguard Worker
1124*cc02d7e2SAndroid Build Coastguard WorkerClient asserts:
1125*cc02d7e2SAndroid Build Coastguard Worker* The call is successful.
1126*cc02d7e2SAndroid Build Coastguard Worker* The per-query load report reference contains a metrics report that is
1127*cc02d7e2SAndroid Build Coastguard Workeridentical to the metrics data sent in the request shown above.
1128*cc02d7e2SAndroid Build Coastguard Worker
1129*cc02d7e2SAndroid Build Coastguard Worker### orca_oob
1130*cc02d7e2SAndroid Build Coastguard Worker
1131*cc02d7e2SAndroid Build Coastguard WorkerThe client verifies that a custom LB policy, which is integrated with ORCA APIs,
1132*cc02d7e2SAndroid Build Coastguard Workerwill receive out-of-band metric reports from the backend.
1133*cc02d7e2SAndroid Build Coastguard Worker
1134*cc02d7e2SAndroid Build Coastguard WorkerThe client will register the custom LB policy named
1135*cc02d7e2SAndroid Build Coastguard Worker`test_backend_metrics_load_balancer`. It has similar and additional functions as
1136*cc02d7e2SAndroid Build Coastguard Workerdescribed in the [orca_per_rpc][] test. We use ORCA APIs to install an
1137*cc02d7e2SAndroid Build Coastguard Workerout-of-band report listener (configure load report interval to be 1s) in the LB
1138*cc02d7e2SAndroid Build Coastguard Workerpolicy. The interop-testing client will run with a service config to select the
1139*cc02d7e2SAndroid Build Coastguard Workerload balancing config(using argument `--service_config_json`), so that it
1140*cc02d7e2SAndroid Build Coastguard Workereffectively uses this newly registered custom LB policy. A load report reference
1141*cc02d7e2SAndroid Build Coastguard Workercan be passed from the call to the LB policy through, e.g. CallOptions, to
1142*cc02d7e2SAndroid Build Coastguard Workerreceive metric reports. The test framework will fill in the reference with the
1143*cc02d7e2SAndroid Build Coastguard Workerlatest load report from the report listener. This way, together with server
1144*cc02d7e2SAndroid Build Coastguard Workerbehaviors we can verify the expected metric reports are received.
1145*cc02d7e2SAndroid Build Coastguard Worker
1146*cc02d7e2SAndroid Build Coastguard WorkerServer features:
1147*cc02d7e2SAndroid Build Coastguard Worker* [UnaryCall][]
1148*cc02d7e2SAndroid Build Coastguard Worker* [FullDuplexCall][]
1149*cc02d7e2SAndroid Build Coastguard Worker* [Backend Metrics Report][]
1150*cc02d7e2SAndroid Build Coastguard Worker
1151*cc02d7e2SAndroid Build Coastguard WorkerProcedures:
1152*cc02d7e2SAndroid Build Coastguard Worker1. Client starts a full duplex call and sends:
1153*cc02d7e2SAndroid Build Coastguard Worker    ```
1154*cc02d7e2SAndroid Build Coastguard Worker    {
1155*cc02d7e2SAndroid Build Coastguard Worker      orca_oob_report:{
1156*cc02d7e2SAndroid Build Coastguard Worker        cpu_utilization: 0.8210
1157*cc02d7e2SAndroid Build Coastguard Worker        memory_utilization: 0.5847
1158*cc02d7e2SAndroid Build Coastguard Worker        utilization: {
1159*cc02d7e2SAndroid Build Coastguard Worker          util: 0.30499
1160*cc02d7e2SAndroid Build Coastguard Worker        }
1161*cc02d7e2SAndroid Build Coastguard Worker      }
1162*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
1163*cc02d7e2SAndroid Build Coastguard Worker        size: 1
1164*cc02d7e2SAndroid Build Coastguard Worker      }
1165*cc02d7e2SAndroid Build Coastguard Worker    }
1166*cc02d7e2SAndroid Build Coastguard Worker    ```
1167*cc02d7e2SAndroid Build Coastguard Worker2. After getting a response, client waits up to 10 seconds (or a total of 30s
1168*cc02d7e2SAndroid Build Coastguard Workerfor the entire test case) to receive an OOB load report that matches the
1169*cc02d7e2SAndroid Build Coastguard Workerrequested load report in step 1. To wait for load report, client may inject a
1170*cc02d7e2SAndroid Build Coastguard Workercallback to the custom LB policy, or poll the result by doing empty unary call
1171*cc02d7e2SAndroid Build Coastguard Workerthat carries a reference, e.g. using CallOptions, that will be filled in by the
1172*cc02d7e2SAndroid Build Coastguard Workercustom LB policy as part of the `OrcaOobReportListener` API.
1173*cc02d7e2SAndroid Build Coastguard Worker3. Then client sends:
1174*cc02d7e2SAndroid Build Coastguard Worker    ```
1175*cc02d7e2SAndroid Build Coastguard Worker    {
1176*cc02d7e2SAndroid Build Coastguard Worker      orca_oob_report:{
1177*cc02d7e2SAndroid Build Coastguard Worker        cpu_utilization: 0.29309
1178*cc02d7e2SAndroid Build Coastguard Worker        memory_utilization: 0.2
1179*cc02d7e2SAndroid Build Coastguard Worker        utilization: {
1180*cc02d7e2SAndroid Build Coastguard Worker          util: 0.2039
1181*cc02d7e2SAndroid Build Coastguard Worker        }
1182*cc02d7e2SAndroid Build Coastguard Worker      }
1183*cc02d7e2SAndroid Build Coastguard Worker      response_parameters:{
1184*cc02d7e2SAndroid Build Coastguard Worker        size: 1
1185*cc02d7e2SAndroid Build Coastguard Worker      }
1186*cc02d7e2SAndroid Build Coastguard Worker    }
1187*cc02d7e2SAndroid Build Coastguard Worker    ```
1188*cc02d7e2SAndroid Build Coastguard Worker4. After getting a response, client waits up to 10 seconds (or a total of 30s
1189*cc02d7e2SAndroid Build Coastguard Workerfor the entire test case) to receive an OOB load report that matches the
1190*cc02d7e2SAndroid Build Coastguard Workerrequested load report in step 3. Similar to step 2.
1191*cc02d7e2SAndroid Build Coastguard Worker5. Client half closes the stream, and asserts the streaming call is successful.
1192*cc02d7e2SAndroid Build Coastguard Worker
1193*cc02d7e2SAndroid Build Coastguard Worker### Experimental Tests
1194*cc02d7e2SAndroid Build Coastguard Worker
1195*cc02d7e2SAndroid Build Coastguard WorkerThese tests are not yet standardized, and are not yet implemented in all
1196*cc02d7e2SAndroid Build Coastguard Workerlanguages. Therefore they are not part of our interop matrix.
1197*cc02d7e2SAndroid Build Coastguard Worker
1198*cc02d7e2SAndroid Build Coastguard Worker#### long_lived_channel
1199*cc02d7e2SAndroid Build Coastguard Worker
1200*cc02d7e2SAndroid Build Coastguard WorkerThe client performs a number of large_unary RPCs over a single long-lived
1201*cc02d7e2SAndroid Build Coastguard Workerchannel with a fixed but configurable interval between each RPC.
1202*cc02d7e2SAndroid Build Coastguard Worker
1203*cc02d7e2SAndroid Build Coastguard Worker#### concurrent_large_unary
1204*cc02d7e2SAndroid Build Coastguard Worker
1205*cc02d7e2SAndroid Build Coastguard WorkerStatus: TODO
1206*cc02d7e2SAndroid Build Coastguard Worker
1207*cc02d7e2SAndroid Build Coastguard WorkerClient performs 1000 large_unary tests in parallel on the same channel.
1208*cc02d7e2SAndroid Build Coastguard Worker
1209*cc02d7e2SAndroid Build Coastguard Worker#### Flow control. Pushback at client for large messages (TODO: fix name)
1210*cc02d7e2SAndroid Build Coastguard Worker
1211*cc02d7e2SAndroid Build Coastguard WorkerStatus: TODO
1212*cc02d7e2SAndroid Build Coastguard Worker
1213*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that a client sending faster than a server can drain sees
1214*cc02d7e2SAndroid Build Coastguard Workerpushback (i.e., attempts to send succeed only after appropriate delays).
1215*cc02d7e2SAndroid Build Coastguard Worker
1216*cc02d7e2SAndroid Build Coastguard Worker### TODO Tests
1217*cc02d7e2SAndroid Build Coastguard Worker
1218*cc02d7e2SAndroid Build Coastguard Worker#### High priority:
1219*cc02d7e2SAndroid Build Coastguard Worker
1220*cc02d7e2SAndroid Build Coastguard WorkerPropagation of status code and message (yangg)
1221*cc02d7e2SAndroid Build Coastguard Worker
1222*cc02d7e2SAndroid Build Coastguard WorkerMultiple thousand simultaneous calls on same Channel (ctiller)
1223*cc02d7e2SAndroid Build Coastguard Worker
1224*cc02d7e2SAndroid Build Coastguard WorkerMetadata: client headers, server headers + trailers, binary+ascii
1225*cc02d7e2SAndroid Build Coastguard Worker
1226*cc02d7e2SAndroid Build Coastguard Worker#### Normal priority:
1227*cc02d7e2SAndroid Build Coastguard Worker
1228*cc02d7e2SAndroid Build Coastguard WorkerCancel before start (ctiller)
1229*cc02d7e2SAndroid Build Coastguard Worker
1230*cc02d7e2SAndroid Build Coastguard WorkerCancel after sent first message (ctiller)
1231*cc02d7e2SAndroid Build Coastguard Worker
1232*cc02d7e2SAndroid Build Coastguard WorkerCancel after received headers (ctiller)
1233*cc02d7e2SAndroid Build Coastguard Worker
1234*cc02d7e2SAndroid Build Coastguard WorkerTimeout but completed before expire (zhaoq)
1235*cc02d7e2SAndroid Build Coastguard Worker
1236*cc02d7e2SAndroid Build Coastguard WorkerMultiple thousand simultaneous calls timeout on same Channel (ctiller)
1237*cc02d7e2SAndroid Build Coastguard Worker
1238*cc02d7e2SAndroid Build Coastguard Worker#### Lower priority:
1239*cc02d7e2SAndroid Build Coastguard Worker
1240*cc02d7e2SAndroid Build Coastguard WorkerFlow control. Pushback at client for large messages (abhishek)
1241*cc02d7e2SAndroid Build Coastguard Worker
1242*cc02d7e2SAndroid Build Coastguard WorkerFlow control. Pushback at server for large messages (abhishek)
1243*cc02d7e2SAndroid Build Coastguard Worker
1244*cc02d7e2SAndroid Build Coastguard WorkerGoing over max concurrent streams doesn't fail (client controls itself)
1245*cc02d7e2SAndroid Build Coastguard Worker(abhishek)
1246*cc02d7e2SAndroid Build Coastguard Worker
1247*cc02d7e2SAndroid Build Coastguard WorkerRPC method not implemented (yangg)
1248*cc02d7e2SAndroid Build Coastguard Worker
1249*cc02d7e2SAndroid Build Coastguard WorkerMultiple thousand simultaneous calls on different Channels (ctiller)
1250*cc02d7e2SAndroid Build Coastguard Worker
1251*cc02d7e2SAndroid Build Coastguard WorkerFailed TLS hostname verification (ejona?)
1252*cc02d7e2SAndroid Build Coastguard Worker
1253*cc02d7e2SAndroid Build Coastguard WorkerLarge amount of headers to cause CONTINUATIONs; 63K of 'X's, all in one header.
1254*cc02d7e2SAndroid Build Coastguard Worker
1255*cc02d7e2SAndroid Build Coastguard Worker#### To priorize:
1256*cc02d7e2SAndroid Build Coastguard Worker
1257*cc02d7e2SAndroid Build Coastguard WorkerStart streaming RPC but don't send any requests, server responds
1258*cc02d7e2SAndroid Build Coastguard Worker
1259*cc02d7e2SAndroid Build Coastguard Worker### Postponed Tests
1260*cc02d7e2SAndroid Build Coastguard Worker
1261*cc02d7e2SAndroid Build Coastguard WorkerResilience to buggy servers: These tests would verify that a client application
1262*cc02d7e2SAndroid Build Coastguard Workerisn't affected negatively by the responses put on the wire by a buggy server
1263*cc02d7e2SAndroid Build Coastguard Worker(e.g. the client library won't make the application crash).
1264*cc02d7e2SAndroid Build Coastguard Worker
1265*cc02d7e2SAndroid Build Coastguard WorkerReconnect after transport failure
1266*cc02d7e2SAndroid Build Coastguard Worker
1267*cc02d7e2SAndroid Build Coastguard WorkerReconnect backoff
1268*cc02d7e2SAndroid Build Coastguard Worker
1269*cc02d7e2SAndroid Build Coastguard WorkerFuzz testing
1270*cc02d7e2SAndroid Build Coastguard Worker
1271*cc02d7e2SAndroid Build Coastguard Worker
1272*cc02d7e2SAndroid Build Coastguard WorkerServer
1273*cc02d7e2SAndroid Build Coastguard Worker------
1274*cc02d7e2SAndroid Build Coastguard Worker
1275*cc02d7e2SAndroid Build Coastguard WorkerServers implement various named features for clients to test with. Server
1276*cc02d7e2SAndroid Build Coastguard Workerfeatures are orthogonal. If a server implements a feature, it is always
1277*cc02d7e2SAndroid Build Coastguard Workeravailable for clients. Names are simple descriptions for developer
1278*cc02d7e2SAndroid Build Coastguard Workercommunication and tracking.
1279*cc02d7e2SAndroid Build Coastguard Worker
1280*cc02d7e2SAndroid Build Coastguard WorkerServers should accept these arguments:
1281*cc02d7e2SAndroid Build Coastguard Worker
1282*cc02d7e2SAndroid Build Coastguard Worker* --port=PORT
1283*cc02d7e2SAndroid Build Coastguard Worker
1284*cc02d7e2SAndroid Build Coastguard Worker    * The port to listen on. For example, "8080"
1285*cc02d7e2SAndroid Build Coastguard Worker
1286*cc02d7e2SAndroid Build Coastguard Worker* --use_tls=BOOLEAN
1287*cc02d7e2SAndroid Build Coastguard Worker
1288*cc02d7e2SAndroid Build Coastguard Worker    * Whether to use a plaintext or encrypted connection
1289*cc02d7e2SAndroid Build Coastguard Worker
1290*cc02d7e2SAndroid Build Coastguard WorkerServers must support TLS with ALPN. They should use
1291*cc02d7e2SAndroid Build Coastguard Worker[server1.pem](https://github.com/grpc/grpc/blob/master/src/core/tsi/test_creds/server1.pem)
1292*cc02d7e2SAndroid Build Coastguard Workerfor their certificate.
1293*cc02d7e2SAndroid Build Coastguard Worker
1294*cc02d7e2SAndroid Build Coastguard Worker### EmptyCall
1295*cc02d7e2SAndroid Build Coastguard Worker[EmptyCall]: #emptycall
1296*cc02d7e2SAndroid Build Coastguard Worker
1297*cc02d7e2SAndroid Build Coastguard WorkerServer implements EmptyCall which immediately returns the empty message.
1298*cc02d7e2SAndroid Build Coastguard Worker
1299*cc02d7e2SAndroid Build Coastguard Worker### UnaryCall
1300*cc02d7e2SAndroid Build Coastguard Worker[UnaryCall]: #unarycall
1301*cc02d7e2SAndroid Build Coastguard Worker
1302*cc02d7e2SAndroid Build Coastguard WorkerServer implements UnaryCall which immediately returns a SimpleResponse with a
1303*cc02d7e2SAndroid Build Coastguard Workerpayload body of size `SimpleRequest.response_size` bytes and type as appropriate
1304*cc02d7e2SAndroid Build Coastguard Workerfor the `SimpleRequest.response_type`. If the server does not support the
1305*cc02d7e2SAndroid Build Coastguard Worker`response_type`, then it should fail the RPC with `INVALID_ARGUMENT`.
1306*cc02d7e2SAndroid Build Coastguard Worker
1307*cc02d7e2SAndroid Build Coastguard Worker### CacheableUnaryCall
1308*cc02d7e2SAndroid Build Coastguard Worker[CacheableUnaryCall]: #cacheableunarycall
1309*cc02d7e2SAndroid Build Coastguard Worker
1310*cc02d7e2SAndroid Build Coastguard WorkerServer gets the default SimpleRequest proto as the request. The content of the
1311*cc02d7e2SAndroid Build Coastguard Workerrequest is ignored. It returns the SimpleResponse proto with the payload set
1312*cc02d7e2SAndroid Build Coastguard Workerto current timestamp.  The timestamp is an integer representing current time
1313*cc02d7e2SAndroid Build Coastguard Workerwith nanosecond resolution. This integer is formatted as ASCII decimal in the
1314*cc02d7e2SAndroid Build Coastguard Workerresponse. The format is not really important as long as the response payload
1315*cc02d7e2SAndroid Build Coastguard Workeris different for each request. In addition it adds
1316*cc02d7e2SAndroid Build Coastguard Worker  1. cache control headers such that the response can be cached by proxies in
1317*cc02d7e2SAndroid Build Coastguard Worker     the response path. Server should be behind a caching proxy for this test
1318*cc02d7e2SAndroid Build Coastguard Worker     to pass. Currently we set the max-age to 60 seconds.
1319*cc02d7e2SAndroid Build Coastguard Worker
1320*cc02d7e2SAndroid Build Coastguard Worker### CompressedResponse
1321*cc02d7e2SAndroid Build Coastguard Worker[CompressedResponse]: #compressedresponse
1322*cc02d7e2SAndroid Build Coastguard Worker
1323*cc02d7e2SAndroid Build Coastguard WorkerWhen the client sets `response_compressed` to true, the server's response is
1324*cc02d7e2SAndroid Build Coastguard Workersent back compressed. Note that `response_compressed` is present on both
1325*cc02d7e2SAndroid Build Coastguard Worker`SimpleRequest` (unary) and `StreamingOutputCallRequest` (streaming).
1326*cc02d7e2SAndroid Build Coastguard Worker
1327*cc02d7e2SAndroid Build Coastguard Worker### CompressedRequest
1328*cc02d7e2SAndroid Build Coastguard Worker[CompressedRequest]: #compressedrequest
1329*cc02d7e2SAndroid Build Coastguard Worker
1330*cc02d7e2SAndroid Build Coastguard WorkerWhen the client sets `expect_compressed` to true, the server expects the client
1331*cc02d7e2SAndroid Build Coastguard Workerrequest to be compressed. If it's not, it fails the RPC with `INVALID_ARGUMENT`.
1332*cc02d7e2SAndroid Build Coastguard WorkerNote that `response_compressed` is present on both `SimpleRequest` (unary) and
1333*cc02d7e2SAndroid Build Coastguard Worker`StreamingOutputCallRequest` (streaming).
1334*cc02d7e2SAndroid Build Coastguard Worker
1335*cc02d7e2SAndroid Build Coastguard Worker### StreamingInputCall
1336*cc02d7e2SAndroid Build Coastguard Worker[StreamingInputCall]: #streaminginputcall
1337*cc02d7e2SAndroid Build Coastguard Worker
1338*cc02d7e2SAndroid Build Coastguard WorkerServer implements StreamingInputCall which upon half close immediately returns
1339*cc02d7e2SAndroid Build Coastguard Workera StreamingInputCallResponse where aggregated_payload_size is the sum of all
1340*cc02d7e2SAndroid Build Coastguard Workerrequest payload bodies received.
1341*cc02d7e2SAndroid Build Coastguard Worker
1342*cc02d7e2SAndroid Build Coastguard Worker### StreamingOutputCall
1343*cc02d7e2SAndroid Build Coastguard Worker[StreamingOutputCall]: #streamingoutputcall
1344*cc02d7e2SAndroid Build Coastguard Worker
1345*cc02d7e2SAndroid Build Coastguard WorkerServer implements StreamingOutputCall by replying, in order, with one
1346*cc02d7e2SAndroid Build Coastguard WorkerStreamingOutputCallResponse for each ResponseParameters in
1347*cc02d7e2SAndroid Build Coastguard WorkerStreamingOutputCallRequest. Each StreamingOutputCallResponse should have a
1348*cc02d7e2SAndroid Build Coastguard Workerpayload body of size ResponseParameters.size bytes, as specified by its
1349*cc02d7e2SAndroid Build Coastguard Workerrespective ResponseParameters. After sending all responses, it closes with OK.
1350*cc02d7e2SAndroid Build Coastguard Worker
1351*cc02d7e2SAndroid Build Coastguard Worker### FullDuplexCall
1352*cc02d7e2SAndroid Build Coastguard Worker[FullDuplexCall]: #fullduplexcall
1353*cc02d7e2SAndroid Build Coastguard Worker
1354*cc02d7e2SAndroid Build Coastguard WorkerServer implements FullDuplexCall by replying, in order, with one
1355*cc02d7e2SAndroid Build Coastguard WorkerStreamingOutputCallResponse for each ResponseParameters in each
1356*cc02d7e2SAndroid Build Coastguard WorkerStreamingOutputCallRequest. Each StreamingOutputCallResponse should have a
1357*cc02d7e2SAndroid Build Coastguard Workerpayload body of size ResponseParameters.size bytes, as specified by its
1358*cc02d7e2SAndroid Build Coastguard Workerrespective ResponseParameters. After receiving half close and sending all
1359*cc02d7e2SAndroid Build Coastguard Workerresponses, it closes with OK.
1360*cc02d7e2SAndroid Build Coastguard Worker
1361*cc02d7e2SAndroid Build Coastguard Worker### Echo Status
1362*cc02d7e2SAndroid Build Coastguard Worker[Echo Status]: #echo-status
1363*cc02d7e2SAndroid Build Coastguard WorkerWhen the client sends a response_status in the request payload, the server closes
1364*cc02d7e2SAndroid Build Coastguard Workerthe stream with the status code and message contained within said response_status.
1365*cc02d7e2SAndroid Build Coastguard WorkerThe server will not process any further messages on the stream sent by the client.
1366*cc02d7e2SAndroid Build Coastguard WorkerThis can be used by clients to verify correct handling of different status codes and
1367*cc02d7e2SAndroid Build Coastguard Workerassociated status messages end-to-end.
1368*cc02d7e2SAndroid Build Coastguard Worker
1369*cc02d7e2SAndroid Build Coastguard Worker### Echo Metadata
1370*cc02d7e2SAndroid Build Coastguard Worker[Echo Metadata]: #echo-metadata
1371*cc02d7e2SAndroid Build Coastguard WorkerWhen the client sends metadata with the key `"x-grpc-test-echo-initial"` with its
1372*cc02d7e2SAndroid Build Coastguard Workerrequest, the server sends back exactly this key and the corresponding value back to
1373*cc02d7e2SAndroid Build Coastguard Workerthe client as part of initial metadata. When the client sends metadata with the key
1374*cc02d7e2SAndroid Build Coastguard Worker`"x-grpc-test-echo-trailing-bin"` with its request, the server sends back exactly this
1375*cc02d7e2SAndroid Build Coastguard Workerkey and the corresponding value back to the client as trailing metadata.
1376*cc02d7e2SAndroid Build Coastguard Worker
1377*cc02d7e2SAndroid Build Coastguard Worker### Observe ResponseParameters.interval_us
1378*cc02d7e2SAndroid Build Coastguard Worker[Observe ResponseParameters.interval_us]: #observe-responseparametersinterval_us
1379*cc02d7e2SAndroid Build Coastguard Worker
1380*cc02d7e2SAndroid Build Coastguard WorkerIn StreamingOutputCall and FullDuplexCall, server delays sending a
1381*cc02d7e2SAndroid Build Coastguard WorkerStreamingOutputCallResponse by the ResponseParameters' `interval_us` for that
1382*cc02d7e2SAndroid Build Coastguard Workerparticular response, relative to the last response sent. That is, `interval_us`
1383*cc02d7e2SAndroid Build Coastguard Workeracts like a sleep *before* sending the response and accumulates from one
1384*cc02d7e2SAndroid Build Coastguard Workerresponse to the next.
1385*cc02d7e2SAndroid Build Coastguard Worker
1386*cc02d7e2SAndroid Build Coastguard WorkerInteraction with flow control is unspecified.
1387*cc02d7e2SAndroid Build Coastguard Worker
1388*cc02d7e2SAndroid Build Coastguard Worker### Echo Auth Information
1389*cc02d7e2SAndroid Build Coastguard Worker
1390*cc02d7e2SAndroid Build Coastguard WorkerStatus: Pending
1391*cc02d7e2SAndroid Build Coastguard Worker
1392*cc02d7e2SAndroid Build Coastguard Worker#### Echo Authenticated Username
1393*cc02d7e2SAndroid Build Coastguard Worker[Echo Authenticated Username]: #echo-authenticated-username
1394*cc02d7e2SAndroid Build Coastguard Worker
1395*cc02d7e2SAndroid Build Coastguard WorkerIf a SimpleRequest has fill_username=true and that request was successfully
1396*cc02d7e2SAndroid Build Coastguard Workerauthenticated, then the SimpleResponse should have username filled with the
1397*cc02d7e2SAndroid Build Coastguard Workercanonical form of the authenticated source. The canonical form is dependent on
1398*cc02d7e2SAndroid Build Coastguard Workerthe authentication method, but is likely to be a base 10 integer identifier or
1399*cc02d7e2SAndroid Build Coastguard Workeran email address.
1400*cc02d7e2SAndroid Build Coastguard Worker
1401*cc02d7e2SAndroid Build Coastguard Worker#### Echo OAuth scope
1402*cc02d7e2SAndroid Build Coastguard Worker[Echo OAuth Scope]: #echo-oauth-scope
1403*cc02d7e2SAndroid Build Coastguard Worker
1404*cc02d7e2SAndroid Build Coastguard WorkerIf a SimpleRequest has `fill_oauth_scope=true` and that request was successfully
1405*cc02d7e2SAndroid Build Coastguard Workerauthenticated via OAuth, then the SimpleResponse should have oauth_scope filled
1406*cc02d7e2SAndroid Build Coastguard Workerwith the scope of the method being invoked.
1407*cc02d7e2SAndroid Build Coastguard Worker
1408*cc02d7e2SAndroid Build Coastguard WorkerAlthough a general server-side feature, most test servers won't implement this
1409*cc02d7e2SAndroid Build Coastguard Workerfeature. The TLS server `grpc-test.sandbox.googleapis.com:443` supports this
1410*cc02d7e2SAndroid Build Coastguard Workerfeature. It requires at least the OAuth scope
1411*cc02d7e2SAndroid Build Coastguard Worker`https://www.googleapis.com/auth/xapi.zoo` for authentication to succeed.
1412*cc02d7e2SAndroid Build Coastguard Worker
1413*cc02d7e2SAndroid Build Coastguard WorkerDiscussion:
1414*cc02d7e2SAndroid Build Coastguard Worker
1415*cc02d7e2SAndroid Build Coastguard WorkerIdeally, this would be communicated via metadata and not in the
1416*cc02d7e2SAndroid Build Coastguard Workerrequest/response, but we want to use this test in code paths that don't yet
1417*cc02d7e2SAndroid Build Coastguard Workerfully communicate metadata.
1418*cc02d7e2SAndroid Build Coastguard Worker
1419*cc02d7e2SAndroid Build Coastguard Worker### Backend metrics report
1420*cc02d7e2SAndroid Build Coastguard Worker[Backend Metrics Report]: #backend-metrics-report
1421*cc02d7e2SAndroid Build Coastguard Worker
1422*cc02d7e2SAndroid Build Coastguard WorkerServer reports backend metrics data in both per-query and out-of-band cases,
1423*cc02d7e2SAndroid Build Coastguard Workerechoing metrics data from the unary or fullDuplex call.
1424*cc02d7e2SAndroid Build Coastguard Worker
1425*cc02d7e2SAndroid Build Coastguard WorkerUsing ORCA APIs we install the per-query metrics reporting server interceptor,
1426*cc02d7e2SAndroid Build Coastguard Workerso that it can attach metrics per RPC. We also register the `OpenRCAService`
1427*cc02d7e2SAndroid Build Coastguard Workerimplementation to the server, so that it can report metrics periodically.
1428*cc02d7e2SAndroid Build Coastguard WorkerThe minimum report interval in the ORCA service is set to 1 sec.
1429*cc02d7e2SAndroid Build Coastguard Worker
1430*cc02d7e2SAndroid Build Coastguard WorkerIf `SimpleRequest.orca_per_rpc_report` is set in unary call, the server will add
1431*cc02d7e2SAndroid Build Coastguard Workerthe metric data from `orca_per_rpc_report` to the RPC using the language's
1432*cc02d7e2SAndroid Build Coastguard WorkerCallMetricRecorder.
1433*cc02d7e2SAndroid Build Coastguard Worker
1434*cc02d7e2SAndroid Build Coastguard WorkerIf `SimpleRequest.orca_oob_report` is set in fullDuplexCall call, the server
1435*cc02d7e2SAndroid Build Coastguard Workerwill first clear all the previous metrics data, and then add utilization metrics
1436*cc02d7e2SAndroid Build Coastguard Workerfrom `orca_oob_report` to the `OpenRCAService`.
1437*cc02d7e2SAndroid Build Coastguard WorkerThe server implementation should use a lock or similar mechanism to allow only
1438*cc02d7e2SAndroid Build Coastguard Workerone client to control the server's out-of-band reports until the end of the RPC.
1439