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