Index: third_party/grpc/doc/interop-test-descriptions.md |
diff --git a/third_party/grpc/doc/interop-test-descriptions.md b/third_party/grpc/doc/interop-test-descriptions.md |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3beb1d11f4a8f2a28164376dadc704ada27f3030 |
--- /dev/null |
+++ b/third_party/grpc/doc/interop-test-descriptions.md |
@@ -0,0 +1,1044 @@ |
+Interoperability Test Case Descriptions |
+======================================= |
+ |
+Client and server use |
+[test.proto](../src/proto/grpc/testing/test.proto) |
+and the [gRPC over HTTP/2 v2 protocol](./PROTOCOL-HTTP2.md). |
+ |
+Client |
+------ |
+ |
+Clients implement test cases that test certain functionally. Each client is |
+provided the test case it is expected to run as a command-line parameter. Names |
+should be lowercase and without spaces. |
+ |
+Clients should accept these arguments: |
+* --server_host=HOSTNAME |
+ * The server host to connect to. For example, "localhost" or "127.0.0.1" |
+* --server_host_override=HOSTNAME |
+ * The server host to claim to be connecting to, for use in TLS and HTTP/2 |
+ :authority header. If unspecified, the value of --server_host will be |
+ used |
+* --server_port=PORT |
+ * The server port to connect to. For example, "8080" |
+* --test_case=TESTCASE |
+ * The name of the test case to execute. For example, "empty_unary" |
+* --use_tls=BOOLEAN |
+ * Whether to use a plaintext or encrypted connection |
+* --use_test_ca=BOOLEAN |
+ * Whether to replace platform root CAs with |
+ [ca.pem](https://github.com/grpc/grpc/blob/master/src/core/tsi/test_creds/ca.pem) |
+ as the CA root |
+* --default_service_account=ACCOUNT_EMAIL |
+ * Email of the GCE default service account. Only applicable |
+ for compute_engine_creds test. |
+* --oauth_scope=SCOPE |
+ * OAuth scope. For example, "https://www.googleapis.com/auth/xapi.zoo" |
+* --service_account_key_file=PATH |
+ * The path to the service account JSON key file generated from GCE developer |
+ console. |
+ |
+Clients must support TLS with ALPN. Clients must not disable certificate |
+checking. |
+ |
+### empty_unary |
+ |
+This test verifies that implementations support zero-size messages. Ideally, |
+client implementations would verify that the request and response were zero |
+bytes serialized, but this is generally prohibitive to perform, so is not |
+required. |
+ |
+Server features: |
+* [EmptyCall][] |
+ |
+Procedure: |
+ 1. Client calls EmptyCall with the default Empty message |
+ |
+Client asserts: |
+* call was successful |
+* response is non-null |
+ |
+*It may be possible to use UnaryCall instead of EmptyCall, but it is harder to |
+ensure that the proto serialized to zero bytes.* |
+ |
+### large_unary |
+ |
+This test verifies unary calls succeed in sending messages, and touches on flow |
+control (even if compression is enabled on the channel). |
+ |
+Server features: |
+* [UnaryCall][] |
+* [Compressable Payload][] |
+ |
+Procedure: |
+ 1. Client calls UnaryCall with: |
+ |
+ ``` |
+ { |
+ response_type: COMPRESSABLE |
+ response_size: 314159 |
+ payload:{ |
+ body: 271828 bytes of zeros |
+ } |
+ } |
+ ``` |
+ |
+Client asserts: |
+* call was successful |
+* response payload type is COMPRESSABLE |
+* response payload body is 314159 bytes in size |
+* clients are free to assert that the response payload body contents are zero |
+ and comparing the entire response message against a golden response |
+ |
+### large_compressed_unary |
+ |
+This test verifies compressed unary calls succeed in sending messages. It |
+sends one unary request for every combination of compression algorithm and |
+payload type. |
+ |
+In all scenarios, whether compression was actually performed is determined by |
+the compression bit in the response's message flags. The response's compression |
+value indicates which algorithm was used if said compression bit is set. |
+ |
+ |
+Server features: |
+* [UnaryCall][] |
+* [Compressable Payload][] |
+* [Uncompressable Payload][] |
+* [Random Payload][] |
+ |
+Procedure: |
+ 1. Client calls UnaryCall with: |
+ |
+ ``` |
+ { |
+ response_compression: <one of {NONE, GZIP, DEFLATE}> |
+ response_type: COMPRESSABLE |
+ response_size: 314159 |
+ payload:{ |
+ body: 271828 bytes of zeros |
+ } |
+ } |
+ ``` |
+ Client asserts: |
+ * call was successful |
+ * response payload type is COMPRESSABLE |
+ * response compression is consistent with the requested one. |
+ * if `response_compression == NONE`, the response MUST NOT have the |
+ compressed message flag set. |
+ * if `response_compression != NONE`, the response MUST have the compressed |
+ message flag set. |
+ * response payload body is 314159 bytes in size |
+ * clients are free to assert that the response payload body contents are |
+ zero and comparing the entire response message against a golden response |
+ |
+ |
+ 2. Client calls UnaryCall with: |
+ ``` |
+ { |
+ response_compression: <one of {NONE, GZIP, DEFLATE}> |
+ response_type: UNCOMPRESSABLE |
+ response_size: 314159 |
+ payload:{ |
+ body: 271828 bytes of zeros |
+ } |
+ } |
+ ``` |
+ Client asserts: |
+ * call was successful |
+ * response payload type is UNCOMPRESSABLE |
+ * response compression is consistent with the requested one. |
+ * the response MUST NOT have the compressed message flag set. |
+ * response payload body is 314159 bytes in size |
+ * clients are free to assert that the response payload body contents are |
+ identical to the golden uncompressable data at `test/cpp/interop/rnd.dat`. |
+ |
+ |
+ 3. Client calls UnaryCall with: |
+ ``` |
+ { |
+ response_compression: <one of {NONE, GZIP, DEFLATE}> |
+ response_type: RANDOM |
+ response_size: 314159 |
+ payload:{ |
+ body: 271828 bytes of zeros |
+ } |
+ } |
+ ``` |
+ Client asserts: |
+ * call was successful |
+ * response payload type is either COMPRESSABLE or UNCOMPRESSABLE |
+ * the behavior is consistent with the randomly chosen incoming payload type, |
+ as described in their respective sections. |
+ |
+### client_streaming |
+ |
+This test verifies that client-only streaming succeeds. |
+ |
+Server features: |
+* [StreamingInputCall][] |
+* [Compressable Payload][] |
+ |
+Procedure: |
+ 1. Client calls StreamingInputCall |
+ 2. Client sends: |
+ |
+ ``` |
+ { |
+ payload:{ |
+ body: 27182 bytes of zeros |
+ } |
+ } |
+ ``` |
+ |
+ 3. Client then sends: |
+ |
+ ``` |
+ { |
+ payload:{ |
+ body: 8 bytes of zeros |
+ } |
+ } |
+ ``` |
+ |
+ 4. Client then sends: |
+ |
+ ``` |
+ { |
+ payload:{ |
+ body: 1828 bytes of zeros |
+ } |
+ } |
+ ``` |
+ |
+ 5. Client then sends: |
+ |
+ ``` |
+ { |
+ payload:{ |
+ body: 45904 bytes of zeros |
+ } |
+ } |
+ ``` |
+ |
+ 6. Client half-closes |
+ |
+Client asserts: |
+* call was successful |
+* response aggregated_payload_size is 74922 |
+ |
+### server_streaming |
+ |
+This test verifies that server-only streaming succeeds. |
+ |
+Server features: |
+* [StreamingOutputCall][] |
+* [Compressable Payload][] |
+ |
+Procedure: |
+ 1. Client calls StreamingOutputCall with: |
+ |
+ ``` |
+ { |
+ response_type:COMPRESSABLE |
+ response_parameters:{ |
+ size: 31415 |
+ } |
+ response_parameters:{ |
+ size: 9 |
+ } |
+ response_parameters:{ |
+ size: 2653 |
+ } |
+ response_parameters:{ |
+ size: 58979 |
+ } |
+ } |
+ ``` |
+ |
+Client asserts: |
+* call was successful |
+* exactly four responses |
+* response payloads are COMPRESSABLE |
+* response payload bodies are sized (in order): 31415, 9, 2653, 58979 |
+* clients are free to assert that the response payload body contents are zero |
+ and comparing the entire response messages against golden responses |
+ |
+### server_compressed_streaming |
+ |
+This test verifies that server-only compressed streaming succeeds. |
+ |
+Server features: |
+* [StreamingOutputCall][] |
+* [Compressable Payload][] |
+* [Uncompressable Payload][] |
+* [Random Payload][] |
+ |
+ |
+Procedure: |
+ 1. Client calls StreamingOutputCall with: |
+ |
+ ``` |
+ { |
+ response_compression: <one of {NONE, GZIP, DEFLATE}> |
+ response_type:COMPRESSABLE |
+ response_parameters:{ |
+ size: 31415 |
+ } |
+ response_parameters:{ |
+ size: 9 |
+ } |
+ response_parameters:{ |
+ size: 2653 |
+ } |
+ response_parameters:{ |
+ size: 58979 |
+ } |
+ } |
+ ``` |
+ |
+ Client asserts: |
+ * call was successful |
+ * exactly four responses |
+ * response payloads are COMPRESSABLE |
+ * response compression is consistent with the requested one. |
+ * if `response_compression == NONE`, the response MUST NOT have the |
+ compressed message flag set. |
+ * if `response_compression != NONE`, the response MUST have the compressed |
+ message flag set. |
+ * response payload bodies are sized (in order): 31415, 9, 2653, 58979 |
+ * clients are free to assert that the response payload body contents are |
+ zero and comparing the entire response messages against golden responses |
+ |
+ |
+ 2. Client calls StreamingOutputCall with: |
+ |
+ ``` |
+ { |
+ response_compression: <one of {NONE, GZIP, DEFLATE}> |
+ response_type:UNCOMPRESSABLE |
+ response_parameters:{ |
+ size: 31415 |
+ } |
+ response_parameters:{ |
+ size: 9 |
+ } |
+ response_parameters:{ |
+ size: 2653 |
+ } |
+ response_parameters:{ |
+ size: 58979 |
+ } |
+ } |
+ ``` |
+ |
+ Client asserts: |
+ * call was successful |
+ * exactly four responses |
+ * response payloads are UNCOMPRESSABLE |
+ * response compressions are consistent with the requested one. |
+ * the responses MUST NOT have the compressed message flag set. |
+ * response payload bodies are sized (in order): 31415, 9, 2653, 58979 |
+ * clients are free to assert that the body of the responses are identical to |
+ the golden uncompressable data at `test/cpp/interop/rnd.dat`. |
+ |
+ |
+ 3. Client calls StreamingOutputCall with: |
+ |
+ ``` |
+ { |
+ response_compression: <one of {NONE, GZIP, DEFLATE}> |
+ response_type:RANDOM |
+ response_parameters:{ |
+ size: 31415 |
+ } |
+ response_parameters:{ |
+ size: 9 |
+ } |
+ response_parameters:{ |
+ size: 2653 |
+ } |
+ response_parameters:{ |
+ size: 58979 |
+ } |
+ } |
+ ``` |
+ |
+ Client asserts: |
+ * call was successful |
+ * response payload type is either COMPRESSABLE or UNCOMPRESSABLE |
+ * the behavior is consistent with the randomly chosen incoming payload type, |
+ as described in their respective sections. |
+ |
+### ping_pong |
+ |
+This test verifies that full duplex bidi is supported. |
+ |
+Server features: |
+* [FullDuplexCall][] |
+* [Compressable Payload][] |
+ |
+Procedure: |
+ 1. Client calls FullDuplexCall with: |
+ |
+ ``` |
+ { |
+ response_type: COMPRESSABLE |
+ response_parameters:{ |
+ size: 31415 |
+ } |
+ payload:{ |
+ body: 27182 bytes of zeros |
+ } |
+ } |
+ ``` |
+ |
+ 2. After getting a reply, it sends: |
+ |
+ ``` |
+ { |
+ response_type: COMPRESSABLE |
+ response_parameters:{ |
+ size: 9 |
+ } |
+ payload:{ |
+ body: 8 bytes of zeros |
+ } |
+ } |
+ ``` |
+ |
+ 3. After getting a reply, it sends: |
+ |
+ ``` |
+ { |
+ response_type: COMPRESSABLE |
+ response_parameters:{ |
+ size: 2653 |
+ } |
+ payload:{ |
+ body: 1828 bytes of zeros |
+ } |
+ } |
+ ``` |
+ |
+ 4. After getting a reply, it sends: |
+ |
+ ``` |
+ { |
+ response_type: COMPRESSABLE |
+ response_parameters:{ |
+ size: 58979 |
+ } |
+ payload:{ |
+ body: 45904 bytes of zeros |
+ } |
+ } |
+ ``` |
+ |
+ 5. After getting a reply, client half-closes |
+ |
+Client asserts: |
+* call was successful |
+* exactly four responses |
+* response payloads are COMPRESSABLE |
+* response payload bodies are sized (in order): 31415, 9, 2653, 58979 |
+* clients are free to assert that the response payload body contents are zero |
+ and comparing the entire response messages against golden responses |
+ |
+### empty_stream |
+ |
+This test verifies that streams support having zero-messages in both |
+directions. |
+ |
+Server features: |
+* [FullDuplexCall][] |
+ |
+Procedure: |
+ 1. Client calls FullDuplexCall and then half-closes |
+ |
+Client asserts: |
+* call was successful |
+* exactly zero responses |
+ |
+### compute_engine_creds |
+ |
+This test is only for cloud-to-prod path. |
+ |
+This test verifies unary calls succeed in sending messages while using Service |
+Credentials from GCE metadata server. The client instance needs to be created |
+with desired oauth scope. |
+ |
+The test uses `--default_service_account` with GCE service account email and |
+`--oauth_scope` with the OAuth scope to use. For testing against |
+grpc-test.sandbox.googleapis.com, "https://www.googleapis.com/auth/xapi.zoo" should |
+be passed in as `--oauth_scope`. |
+ |
+Server features: |
+* [UnaryCall][] |
+* [Compressable Payload][] |
+* [Echo Authenticated Username][] |
+* [Echo OAuth Scope][] |
+ |
+Procedure: |
+ 1. Client configures channel to use GCECredentials |
+ 2. Client calls UnaryCall on the channel with: |
+ |
+ ``` |
+ { |
+ response_type: COMPRESSABLE |
+ response_size: 314159 |
+ payload:{ |
+ body: 271828 bytes of zeros |
+ } |
+ fill_username: true |
+ fill_oauth_scope: true |
+ } |
+ ``` |
+ |
+Client asserts: |
+* call was successful |
+* received SimpleResponse.username equals the value of `--default_service_account` flag |
+* received SimpleResponse.oauth_scope is in `--oauth_scope` |
+* response payload body is 314159 bytes in size |
+* clients are free to assert that the response payload body contents are zero |
+ and comparing the entire response message against a golden response |
+ |
+### jwt_token_creds |
+ |
+This test is only for cloud-to-prod path. |
+ |
+This test verifies unary calls succeed in sending messages while using JWT |
+token (created by the project's key file) |
+ |
+Test caller should set flag `--service_account_key_file` with the |
+path to json key file downloaded from |
+https://console.developers.google.com. Alternately, if using a |
+usable auth implementation, she may specify the file location in the environment |
+variable GOOGLE_APPLICATION_CREDENTIALS. |
+ |
+Server features: |
+* [UnaryCall][] |
+* [Compressable Payload][] |
+* [Echo Authenticated Username][] |
+* [Echo OAuth Scope][] |
+ |
+Procedure: |
+ 1. Client configures the channel to use JWTTokenCredentials |
+ 2. Client calls UnaryCall with: |
+ |
+ ``` |
+ { |
+ response_type: COMPRESSABLE |
+ response_size: 314159 |
+ payload:{ |
+ body: 271828 bytes of zeros |
+ } |
+ fill_username: true |
+ } |
+ ``` |
+ |
+Client asserts: |
+* call was successful |
+* received SimpleResponse.username is not empty and is in the json key file used |
+by the auth library. The client can optionally check the username matches the |
+email address in the key file or equals the value of `--default_service_account` flag. |
+* response payload body is 314159 bytes in size |
+* clients are free to assert that the response payload body contents are zero |
+ and comparing the entire response message against a golden response |
+ |
+### oauth2_auth_token |
+ |
+This test is only for cloud-to-prod path and some implementations may run |
+in GCE only. |
+ |
+This test verifies unary calls succeed in sending messages using an OAuth2 token |
+that is obtained out of band. For the purpose of the test, the OAuth2 token is |
+actually obtained from a service account credentials or GCE credentials via the |
+language-specific authorization library. |
+ |
+The difference between this test and the other auth tests is that it |
+first uses the authorization library to obtain an authorization token. |
+ |
+The test |
+- uses the flag `--service_account_key_file` with the path to a json key file |
+downloaded from https://console.developers.google.com. Alternately, if using a |
+usable auth implementation, it may specify the file location in the environment |
+variable GOOGLE_APPLICATION_CREDENTIALS, *OR* if GCE credentials is used to |
+fetch the token, `--default_service_account` can be used to pass in GCE service |
+account email. |
+- uses the flag `--oauth_scope` for the oauth scope. For testing against |
+grpc-test.sandbox.googleapis.com, "https://www.googleapis.com/auth/xapi.zoo" should |
+be passed as the `--oauth_scope`. |
+ |
+Server features: |
+* [UnaryCall][] |
+* [Compressable Payload][] |
+* [Echo Authenticated Username][] |
+* [Echo OAuth Scope][] |
+ |
+Procedure: |
+ 1. Client uses the auth library to obtain an authorization token |
+ 2. Client configures the channel to use AccessTokenCredentials with the access token obtained in step 1 |
+ 3. Client calls UnaryCall with the following message |
+ |
+ ``` |
+ { |
+ fill_username: true |
+ fill_oauth_scope: true |
+ } |
+ ``` |
+ |
+Client asserts: |
+* call was successful |
+* received SimpleResponse.username is valid. Depending on whether a service |
+account key file or GCE credentials was used, client should check against the |
+json key file or GCE default service account email. |
+* received SimpleResponse.oauth_scope is in `--oauth_scope` |
+ |
+### per_rpc_creds |
+ |
+Similar to the other auth tests, this test is only for cloud-to-prod path. |
+ |
+This test verifies unary calls succeed in sending messages using a JWT or a service account |
+credentials set on the RPC. |
+ |
+The test |
+- uses the flag `--service_account_key_file` with the path to a json key file |
+downloaded from https://console.developers.google.com. Alternately, if using a |
+usable auth implementation, it may specify the file location in the environment |
+variable GOOGLE_APPLICATION_CREDENTIALS |
+- optionally uses the flag `--oauth_scope` for the oauth scope if implementator |
+wishes to use service account credential instead of JWT credential. For testing |
+against grpc-test.sandbox.googleapis.com, oauth scope |
+"https://www.googleapis.com/auth/xapi.zoo" should be used. |
+ |
+Server features: |
+* [UnaryCall][] |
+* [Compressable Payload][] |
+* [Echo Authenticated Username][] |
+* [Echo OAuth Scope][] |
+ |
+Procedure: |
+ 1. Client configures the channel with just SSL credentials |
+ 2. Client calls UnaryCall, setting per-call credentials to |
+ JWTTokenCredentials. The request is the following message |
+ |
+ ``` |
+ { |
+ fill_username: true |
+ } |
+ ``` |
+ |
+Client asserts: |
+* call was successful |
+* received SimpleResponse.username is not empty and is in the json key file used |
+by the auth library. The client can optionally check the username matches the |
+email address in the key file. |
+ |
+ |
+### custom_metadata |
+ |
+This test verifies that custom metadata in either binary or ascii format can be |
+sent as initial-metadata by the client and as both initial- and trailing-metadata |
+by the server. |
+ |
+Server features: |
+* [UnaryCall][] |
+* [FullDuplexCall][] |
+* [Compressable Payload][] |
+* [Echo Metadata][] |
+ |
+Procedure: |
+ 1. The client attaches custom metadata with the following keys and values: |
+ |
+ ``` |
+ key: "x-grpc-test-echo-initial", value: "test_initial_metadata_value" |
+ key: "x-grpc-test-echo-trailing-bin", value: 0xababab |
+ ``` |
+ |
+ to a UnaryCall with request: |
+ |
+ ``` |
+ { |
+ response_type: COMPRESSABLE |
+ response_size: 314159 |
+ payload:{ |
+ body: 271828 bytes of zeros |
+ } |
+ } |
+ ``` |
+ |
+ 2. The client attaches custom metadata with the following keys and values: |
+ |
+ ``` |
+ key: "x-grpc-test-echo-initial", value: "test_initial_metadata_value" |
+ key: "x-grpc-test-echo-trailing-bin", value: 0xababab |
+ ``` |
+ |
+ to a FullDuplexCall with request: |
+ |
+ ``` |
+ { |
+ response_type: COMPRESSABLE |
+ response_size: 314159 |
+ payload:{ |
+ body: 271828 bytes of zeros |
+ } |
+ } |
+ ``` |
+ |
+ and then half-closes |
+ |
+Client asserts: |
+* call was successful |
+* metadata with key `"x-grpc-test-echo-initial"` and value |
+ `"test_initial_metadata_value"`is received in the initial metadata for calls |
+ in Procedure steps 1 and 2. |
+* metadata with key `"x-grpc-test-echo-trailing-bin"` and value `0xababab` is |
+ received in the trailing metadata for calls in Procedure steps 1 and 2. |
+ |
+ |
+ |
+### status_code_and_message |
+ |
+This test verifies unary calls succeed in sending messages, and propagate back |
+status code and message sent along with the messages. |
+ |
+Server features: |
+* [UnaryCall][] |
+* [FullDuplexCall][] |
+* [Echo Status][] |
+ |
+Procedure: |
+ 1. Client calls UnaryCall with: |
+ |
+ ``` |
+ { |
+ response_status:{ |
+ code: 2 |
+ message: "test status message" |
+ } |
+ } |
+ ``` |
+ |
+ 2. Client calls FullDuplexCall with: |
+ |
+ ``` |
+ { |
+ response_status:{ |
+ code: 2 |
+ message: "test status message" |
+ } |
+ } |
+ ``` |
+ |
+ and then half-closes |
+ |
+ |
+Client asserts: |
+* received status code is the same as the sent code for both Procedure steps 1 |
+ and 2 |
+* received status message is the same as the sent message for both Procedure |
+ steps 1 and 2 |
+ |
+### unimplemented_method |
+ |
+Status: Ready for implementation. Blocking beta. |
+ |
+This test verifies calling unimplemented RPC method returns the UNIMPLEMENTED status code. |
+ |
+Server features: |
+N/A |
+ |
+Procedure: |
+* Client calls `grpc.testing.UnimplementedService/UnimplementedCall` with an |
+ empty request (defined as `grpc.testing.Empty`): |
+ |
+ ``` |
+ { |
+ } |
+ ``` |
+ |
+Client asserts: |
+* received status code is 12 (UNIMPLEMENTED) |
+* received status message is empty or null/unset |
+ |
+### cancel_after_begin |
+ |
+This test verifies that a request can be cancelled after metadata has been sent |
+but before payloads are sent. |
+ |
+Server features: |
+* [StreamingInputCall][] |
+ |
+Procedure: |
+ 1. Client starts StreamingInputCall |
+ 2. Client immediately cancels request |
+ |
+Client asserts: |
+* Call completed with status CANCELLED |
+ |
+### cancel_after_first_response |
+ |
+This test verifies that a request can be cancelled after receiving a message |
+from the server. |
+ |
+Server features: |
+* [FullDuplexCall][] |
+* [Compressable Payload][] |
+ |
+Procedure: |
+ 1. Client starts FullDuplexCall with |
+ |
+ ``` |
+ { |
+ response_type: COMPRESSABLE |
+ response_parameters:{ |
+ size: 31415 |
+ } |
+ payload:{ |
+ body: 27182 bytes of zeros |
+ } |
+ } |
+ ``` |
+ |
+ 2. After receiving a response, client cancels request |
+ |
+Client asserts: |
+* Call completed with status CANCELLED |
+ |
+### timeout_on_sleeping_server |
+ |
+This test verifies that an RPC request whose lifetime exceeds its configured |
+timeout value will end with the DeadlineExceeded status. |
+ |
+Server features: |
+* [FullDuplexCall][] |
+ |
+Procedure: |
+ 1. Client calls FullDuplexCall with the following request and sets its timeout |
+ to 1ms |
+ |
+ ``` |
+ { |
+ payload:{ |
+ body: 27182 bytes of zeros |
+ } |
+ } |
+ ``` |
+ |
+ 2. Client waits |
+ |
+Client asserts: |
+* Call completed with status DEADLINE_EXCEEDED. |
+ |
+### concurrent_large_unary |
+ |
+Status: TODO |
+ |
+Client performs 1000 large_unary tests in parallel on the same channel. |
+ |
+### Flow control. Pushback at client for large messages (TODO: fix name) |
+ |
+Status: TODO |
+ |
+This test verifies that a client sending faster than a server can drain sees |
+pushback (i.e., attempts to send succeed only after appropriate delays). |
+ |
+### TODO Tests |
+ |
+#### High priority: |
+ |
+Propagation of status code and message (yangg) |
+ |
+Multiple thousand simultaneous calls on same Channel (ctiller) |
+ |
+Metadata: client headers, server headers + trailers, binary+ascii |
+ |
+#### Normal priority: |
+ |
+Cancel before start (ctiller) |
+ |
+Cancel after sent first message (ctiller) |
+ |
+Cancel after received headers (ctiller) |
+ |
+Timeout but completed before expire (zhaoq) |
+ |
+Multiple thousand simultaneous calls timeout on same Channel (ctiller) |
+ |
+#### Lower priority: |
+ |
+Flow control. Pushback at client for large messages (abhishek) |
+ |
+Flow control. Pushback at server for large messages (abhishek) |
+ |
+Going over max concurrent streams doesn't fail (client controls itself) |
+(abhishek) |
+ |
+RPC method not implemented (yangg) |
+ |
+Multiple thousand simultaneous calls on different Channels (ctiller) |
+ |
+Failed TLS hostname verification (ejona?) |
+ |
+Large amount of headers to cause CONTINUATIONs; 63K of 'X's, all in one header. |
+ |
+#### To priorize: |
+ |
+Start streaming RPC but don't send any requests, server responds |
+ |
+### Postponed Tests |
+ |
+Resilience to buggy servers: These tests would verify that a client application |
+isn't affected negatively by the responses put on the wire by a buggy server |
+(e.g. the client library won't make the application crash). |
+ |
+Reconnect after transport failure |
+ |
+Reconnect backoff |
+ |
+Fuzz testing |
+ |
+ |
+Server |
+------ |
+ |
+Servers implement various named features for clients to test with. Server |
+features are orthogonal. If a server implements a feature, it is always |
+available for clients. Names are simple descriptions for developer |
+communication and tracking. |
+ |
+Servers should accept these arguments: |
+ |
+* --port=PORT |
+ |
+ * The port to listen on. For example, "8080" |
+ |
+* --use_tls=BOOLEAN |
+ |
+ * Whether to use a plaintext or encrypted connection |
+ |
+Servers must support TLS with ALPN. They should use |
+[server1.pem](https://github.com/grpc/grpc/blob/master/src/core/tsi/test_creds/server1.pem) |
+for their certificate. |
+ |
+### EmptyCall |
+[EmptyCall]: #emptycall |
+ |
+Server implements EmptyCall which immediately returns the empty message. |
+ |
+### UnaryCall |
+[UnaryCall]: #unarycall |
+ |
+Server implements UnaryCall which immediately returns a SimpleResponse with a |
+payload body of size SimpleRequest.response_size bytes and type as appropriate |
+for the SimpleRequest.response_type. If the server does not support the |
+response_type, then it should fail the RPC with INVALID_ARGUMENT. |
+ |
+### StreamingInputCall |
+[StreamingInputCall]: #streaminginputcall |
+ |
+Server implements StreamingInputCall which upon half close immediately returns |
+a StreamingInputCallResponse where aggregated_payload_size is the sum of all |
+request payload bodies received. |
+ |
+### StreamingOutputCall |
+[StreamingOutputCall]: #streamingoutputcall |
+ |
+Server implements StreamingOutputCall by replying, in order, with one |
+StreamingOutputCallResponses for each ResponseParameters in |
+StreamingOutputCallRequest. Each StreamingOutputCallResponses should have a |
+payload body of size ResponseParameters.size bytes, as specified by its |
+respective ResponseParameters. After sending all responses, it closes with OK. |
+ |
+### FullDuplexCall |
+[FullDuplexCall]: #fullduplexcall |
+ |
+Server implements FullDuplexCall by replying, in order, with one |
+StreamingOutputCallResponses for each ResponseParameters in each |
+StreamingOutputCallRequest. Each StreamingOutputCallResponses should have a |
+payload body of size ResponseParameters.size bytes, as specified by its |
+respective ResponseParameters. After receiving half close and sending all |
+responses, it closes with OK. |
+ |
+### Compressable Payload |
+[Compressable Payload]: #compressable-payload |
+ |
+When the client requests COMPRESSABLE payload, the response includes a payload |
+of the size requested containing all zeros and the payload type is |
+COMPRESSABLE. |
+ |
+### Uncompressable Payload |
+[Uncompressable Payload]: #uncompressable-payload |
+ |
+When the client requests UNCOMPRESSABLE payload, the response includes a payload |
+of the size requested containing uncompressable data and the payload type is |
+UNCOMPRESSABLE. A 512 kB dump from /dev/urandom is the current golden data, |
+stored at `test/cpp/interop/rnd.dat` |
+ |
+### Random Payload |
+[Random Payload]: #random-payload |
+ |
+When the client requests RANDOM payload, the response includes either a randomly |
+chosen COMPRESSABLE or UNCOMPRESSABLE payload. The data and the payload type |
+will be consistent with this choice. |
+ |
+### Echo Status |
+[Echo Status]: #echo-status |
+When the client sends a response_status in the request payload, the server closes |
+the stream with the status code and messsage contained within said response_status. |
+The server will not process any further messages on the stream sent by the client. |
+This can be used by clients to verify correct handling of different status codes and |
+associated status messages end-to-end. |
+ |
+### Echo Metadata |
+[Echo Metadata]: #echo-metadata |
+When the client sends metadata with the key `"x-grpc-test-echo-initial"` with its |
+request, the server sends back exactly this key and the corresponding value back to |
+the client as part of initial metadata. When the client sends metadata with the key |
+`"x-grpc-test-echo-trailing-bin"` with its request, the server sends back exactly this |
+key and the corresponding value back to the client as trailing metadata. |
+ |
+### Observe ResponseParameters.interval_us |
+[Observe ResponseParameters.interval_us]: #observe-responseparametersinterval_us |
+ |
+In StreamingOutputCall and FullDuplexCall, server delays sending a |
+StreamingOutputCallResponse by the ResponseParameters's interval_us for that |
+particular response, relative to the last response sent. That is, interval_us |
+acts like a sleep *before* sending the response and accumulates from one |
+response to the next. |
+ |
+Interaction with flow control is unspecified. |
+ |
+### Echo Auth Information |
+ |
+Status: Pending |
+ |
+#### Echo Authenticated Username |
+[Echo Authenticated Username]: #echo-authenticated-username |
+ |
+If a SimpleRequest has fill_username=true and that request was successfully |
+authenticated, then the SimpleResponse should have username filled with the |
+canonical form of the authenticated source. The canonical form is dependent on |
+the authentication method, but is likely to be a base 10 integer identifier or |
+an email address. |
+ |
+#### Echo OAuth scope |
+[Echo OAuth Scope]: #echo-oauth-scope |
+ |
+If a SimpleRequest has fill_oauth_scope=true and that request was successfully |
+authenticated via OAuth, then the SimpleResponse should have oauth_scope filled |
+with the scope of the method being invoked. |
+ |
+Although a general server-side feature, most test servers won't implement this |
+feature. The TLS server grpc-test.sandbox.googleapis.com:443 supports this feature. |
+It requires at least the OAuth scope |
+`https://www.googleapis.com/auth/xapi.zoo` for authentication to succeed. |
+ |
+Discussion: |
+ |
+Ideally, this would be communicated via metadata and not in the |
+request/response, but we want to use this test in code paths that don't yet |
+fully communicate metadata. |
+ |