xref: /aosp_15_r20/external/grpc-grpc/doc/xds-test-descriptions.md (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker# xDS (Load-Balancing) Interop Test Case Descriptions
2*cc02d7e2SAndroid Build Coastguard Worker
3*cc02d7e2SAndroid Build Coastguard WorkerClient and server use [test.proto](../src/proto/grpc/testing/test.proto).
4*cc02d7e2SAndroid Build Coastguard Worker
5*cc02d7e2SAndroid Build Coastguard Worker## Server
6*cc02d7e2SAndroid Build Coastguard Worker
7*cc02d7e2SAndroid Build Coastguard WorkerThe code for the xDS test server can be found at:
8*cc02d7e2SAndroid Build Coastguard Worker[Java](https://github.com/grpc/grpc-java/blob/master/interop-testing/src/main/java/io/grpc/testing/integration/XdsTestServer.java) (other language implementations are in progress).
9*cc02d7e2SAndroid Build Coastguard Worker
10*cc02d7e2SAndroid Build Coastguard WorkerServer should accept these arguments:
11*cc02d7e2SAndroid Build Coastguard Worker
12*cc02d7e2SAndroid Build Coastguard Worker*   --port=PORT
13*cc02d7e2SAndroid Build Coastguard Worker    *   The port the test server will run on.
14*cc02d7e2SAndroid Build Coastguard Worker*   --maintenance_port=PORT
15*cc02d7e2SAndroid Build Coastguard Worker    *   The port for the maintenance server running health, channelz, and admin(CSDS) services.
16*cc02d7e2SAndroid Build Coastguard Worker*   --secure_mode=BOOLEAN
17*cc02d7e2SAndroid Build Coastguard Worker    *   When set to true it uses XdsServerCredentials with the test server for security test cases.
18*cc02d7e2SAndroid Build Coastguard Worker        In case of secure mode, port and maintenance_port should be different.
19*cc02d7e2SAndroid Build Coastguard Worker
20*cc02d7e2SAndroid Build Coastguard WorkerIn addition, when handling requests, if the initial request metadata contains the `rpc-behavior` key, it should modify its handling of the request as follows:
21*cc02d7e2SAndroid Build Coastguard Worker
22*cc02d7e2SAndroid Build Coastguard Worker - If the value matches `sleep-<int>`, the server should wait the specified number of seconds before resuming behavior matching and RPC processing.
23*cc02d7e2SAndroid Build Coastguard Worker - If the value matches `keep-open`, the server should never respond to the request and behavior matching ends.
24*cc02d7e2SAndroid Build Coastguard Worker - If the value matches `error-code-<int>`, the server should respond with the specified status code and behavior matching ends.
25*cc02d7e2SAndroid Build Coastguard Worker - If the value matches `succeed-on-retry-attempt-<int>`, and the value of the `grpc-previous-rpc-attempts` metadata field is equal to the specified number, the normal RPC processing should resume and behavior matching ends.
26*cc02d7e2SAndroid Build Coastguard Worker - A value can have a prefix `hostname=<string>` followed by a space. In that case, the rest of the value should only be applied if the specified hostname matches the server's hostname.
27*cc02d7e2SAndroid Build Coastguard Worker
28*cc02d7e2SAndroid Build Coastguard WorkerThe `rpc-behavior` header value can have multiple options separated by commas. In that case, the value should be split by commas and the options should be applied in the order specified. If a request has multiple `rpc-behavior` metadata values, each one should be processed that way in order.
29*cc02d7e2SAndroid Build Coastguard Worker
30*cc02d7e2SAndroid Build Coastguard Worker## Client
31*cc02d7e2SAndroid Build Coastguard Worker
32*cc02d7e2SAndroid Build Coastguard WorkerThe base behavior of the xDS test client is to send a constant QPS of unary
33*cc02d7e2SAndroid Build Coastguard Workermessages and record the remote-peer distribution of the responses. Further, the
34*cc02d7e2SAndroid Build Coastguard Workerclient must expose an implementation of the `LoadBalancerStatsService` gRPC
35*cc02d7e2SAndroid Build Coastguard Workerservice to allow the test driver to validate the load balancing behavior for a
36*cc02d7e2SAndroid Build Coastguard Workerparticular test case (see below for more details).
37*cc02d7e2SAndroid Build Coastguard Worker
38*cc02d7e2SAndroid Build Coastguard WorkerThe code for the xDS test client can be at:
39*cc02d7e2SAndroid Build Coastguard Worker[Java](https://github.com/grpc/grpc-java/blob/master/interop-testing/src/main/java/io/grpc/testing/integration/XdsTestClient.java) (other language implementations are in progress).
40*cc02d7e2SAndroid Build Coastguard Worker
41*cc02d7e2SAndroid Build Coastguard WorkerClients should accept these arguments:
42*cc02d7e2SAndroid Build Coastguard Worker
43*cc02d7e2SAndroid Build Coastguard Worker*   --fail_on_failed_rpcs=BOOL
44*cc02d7e2SAndroid Build Coastguard Worker    *   If true, the client should exit with a non-zero return code if any RPCs
45*cc02d7e2SAndroid Build Coastguard Worker        fail after at least one RPC has succeeded, indicating a valid xDS config
46*cc02d7e2SAndroid Build Coastguard Worker        was received. This accounts for any startup-related delays in receiving
47*cc02d7e2SAndroid Build Coastguard Worker        an initial config from the load balancer. Default is false.
48*cc02d7e2SAndroid Build Coastguard Worker*   --num_channels=CHANNELS
49*cc02d7e2SAndroid Build Coastguard Worker    *   The number of channels to create to the server.
50*cc02d7e2SAndroid Build Coastguard Worker*   --qps=QPS
51*cc02d7e2SAndroid Build Coastguard Worker    *   The QPS per channel.
52*cc02d7e2SAndroid Build Coastguard Worker*   --server=HOSTNAME:PORT
53*cc02d7e2SAndroid Build Coastguard Worker    *   The server host to connect to. For example, "localhost:8080"
54*cc02d7e2SAndroid Build Coastguard Worker*   --stats_port=PORT
55*cc02d7e2SAndroid Build Coastguard Worker    *   The port for to expose the client's `LoadBalancerStatsService`
56*cc02d7e2SAndroid Build Coastguard Worker        implementation.
57*cc02d7e2SAndroid Build Coastguard Worker*   --rpc_timeout_sec=SEC
58*cc02d7e2SAndroid Build Coastguard Worker    *   The timeout to set on all outbound RPCs. Default is 20.
59*cc02d7e2SAndroid Build Coastguard Worker*   --secure_mode=BOOLEAN
60*cc02d7e2SAndroid Build Coastguard Worker    *   When set to true it uses XdsChannelCredentials with the test client for security test cases.
61*cc02d7e2SAndroid Build Coastguard Worker
62*cc02d7e2SAndroid Build Coastguard Worker### XdsUpdateClientConfigureService
63*cc02d7e2SAndroid Build Coastguard Worker
64*cc02d7e2SAndroid Build Coastguard WorkerThe xDS test client's behavior can be dynamically changed in the middle of tests.
65*cc02d7e2SAndroid Build Coastguard WorkerThis is achieved by invoking the `XdsUpdateClientConfigureService` gRPC service
66*cc02d7e2SAndroid Build Coastguard Workeron the test client. This can be useful for tests requiring special client behaviors
67*cc02d7e2SAndroid Build Coastguard Workerthat are not desirable at test initialization and client warmup. The service is
68*cc02d7e2SAndroid Build Coastguard Workerdefined as:
69*cc02d7e2SAndroid Build Coastguard Worker
70*cc02d7e2SAndroid Build Coastguard Worker```
71*cc02d7e2SAndroid Build Coastguard Workermessage ClientConfigureRequest {
72*cc02d7e2SAndroid Build Coastguard Worker  // Type of RPCs to send.
73*cc02d7e2SAndroid Build Coastguard Worker  enum RpcType {
74*cc02d7e2SAndroid Build Coastguard Worker    EMPTY_CALL = 0;
75*cc02d7e2SAndroid Build Coastguard Worker    UNARY_CALL = 1;
76*cc02d7e2SAndroid Build Coastguard Worker  }
77*cc02d7e2SAndroid Build Coastguard Worker
78*cc02d7e2SAndroid Build Coastguard Worker  // Metadata to be attached for the given type of RPCs.
79*cc02d7e2SAndroid Build Coastguard Worker  message Metadata {
80*cc02d7e2SAndroid Build Coastguard Worker    RpcType type = 1;
81*cc02d7e2SAndroid Build Coastguard Worker    string key = 2;
82*cc02d7e2SAndroid Build Coastguard Worker    string value = 3;
83*cc02d7e2SAndroid Build Coastguard Worker  }
84*cc02d7e2SAndroid Build Coastguard Worker
85*cc02d7e2SAndroid Build Coastguard Worker  // The types of RPCs the client sends.
86*cc02d7e2SAndroid Build Coastguard Worker  repeated RpcType types = 1;
87*cc02d7e2SAndroid Build Coastguard Worker  // The collection of custom metadata to be attached to RPCs sent by the client.
88*cc02d7e2SAndroid Build Coastguard Worker  repeated Metadata metadata = 2;
89*cc02d7e2SAndroid Build Coastguard Worker  // The deadline to use, in seconds, for all RPCs.  If unset or zero, the
90*cc02d7e2SAndroid Build Coastguard Worker  // client will use the default from the command-line.
91*cc02d7e2SAndroid Build Coastguard Worker  int32 timeout_sec = 3;
92*cc02d7e2SAndroid Build Coastguard Worker}
93*cc02d7e2SAndroid Build Coastguard Worker
94*cc02d7e2SAndroid Build Coastguard Workermessage ClientConfigureResponse {}
95*cc02d7e2SAndroid Build Coastguard Worker
96*cc02d7e2SAndroid Build Coastguard Workerservice XdsUpdateClientConfigureService {
97*cc02d7e2SAndroid Build Coastguard Worker  // Update the tes client's configuration.
98*cc02d7e2SAndroid Build Coastguard Worker  rpc Configure(ClientConfigureRequest) returns (ClientConfigureResponse);
99*cc02d7e2SAndroid Build Coastguard Worker}
100*cc02d7e2SAndroid Build Coastguard Worker```
101*cc02d7e2SAndroid Build Coastguard Worker
102*cc02d7e2SAndroid Build Coastguard WorkerThe test client changes its behavior right after receiving the
103*cc02d7e2SAndroid Build Coastguard Worker`ClientConfigureRequest`. Currently it only supports configuring the type(s)
104*cc02d7e2SAndroid Build Coastguard Workerof RPCs sent by the test client, metadata attached to each type of RPCs, and the timeout.
105*cc02d7e2SAndroid Build Coastguard Worker
106*cc02d7e2SAndroid Build Coastguard Worker## Test Driver
107*cc02d7e2SAndroid Build Coastguard Worker
108*cc02d7e2SAndroid Build Coastguard WorkerNote that, unlike our other interop tests, neither the client nor the server has
109*cc02d7e2SAndroid Build Coastguard Workerany notion of which of the following test scenarios is under test. Instead, a
110*cc02d7e2SAndroid Build Coastguard Workerseparate test driver is responsible for configuring the load balancer and the
111*cc02d7e2SAndroid Build Coastguard Workerserver backends, running the client, and then querying the client's
112*cc02d7e2SAndroid Build Coastguard Worker`LoadBalancerStatsService` to validate load balancer behavior for each of the
113*cc02d7e2SAndroid Build Coastguard Workertests described below.
114*cc02d7e2SAndroid Build Coastguard Worker
115*cc02d7e2SAndroid Build Coastguard Worker## LoadBalancerStatsService
116*cc02d7e2SAndroid Build Coastguard Worker
117*cc02d7e2SAndroid Build Coastguard WorkerThe service is defined as:
118*cc02d7e2SAndroid Build Coastguard Worker
119*cc02d7e2SAndroid Build Coastguard Worker```
120*cc02d7e2SAndroid Build Coastguard Workermessage LoadBalancerStatsRequest {
121*cc02d7e2SAndroid Build Coastguard Worker  // Request stats for the next num_rpcs sent by client.
122*cc02d7e2SAndroid Build Coastguard Worker  int32 num_rpcs = 1;
123*cc02d7e2SAndroid Build Coastguard Worker  // If num_rpcs have not completed within timeout_sec, return partial results.
124*cc02d7e2SAndroid Build Coastguard Worker  int32 timeout_sec = 2;
125*cc02d7e2SAndroid Build Coastguard Worker}
126*cc02d7e2SAndroid Build Coastguard Worker
127*cc02d7e2SAndroid Build Coastguard Workermessage LoadBalancerStatsResponse {
128*cc02d7e2SAndroid Build Coastguard Worker  message RpcsByPeer {
129*cc02d7e2SAndroid Build Coastguard Worker    // The number of completed RPCs for each peer.
130*cc02d7e2SAndroid Build Coastguard Worker    map<string, int32> rpcs_by_peer = 1;
131*cc02d7e2SAndroid Build Coastguard Worker  }
132*cc02d7e2SAndroid Build Coastguard Worker  // The number of completed RPCs for each peer.
133*cc02d7e2SAndroid Build Coastguard Worker  map<string, int32> rpcs_by_peer = 1;
134*cc02d7e2SAndroid Build Coastguard Worker  // The number of RPCs that failed to record a remote peer.
135*cc02d7e2SAndroid Build Coastguard Worker  int32 num_failures = 2;
136*cc02d7e2SAndroid Build Coastguard Worker  map<string, RpcsByPeer> rpcs_by_method = 3;
137*cc02d7e2SAndroid Build Coastguard Worker}
138*cc02d7e2SAndroid Build Coastguard Worker
139*cc02d7e2SAndroid Build Coastguard Workermessage LoadBalancerAccumulatedStatsRequest {}
140*cc02d7e2SAndroid Build Coastguard Worker
141*cc02d7e2SAndroid Build Coastguard Workermessage LoadBalancerAccumulatedStatsResponse {
142*cc02d7e2SAndroid Build Coastguard Worker  // The total number of RPCs have ever issued for each type.
143*cc02d7e2SAndroid Build Coastguard Worker  // Deprecated: use stats_per_method.rpcs_started instead.
144*cc02d7e2SAndroid Build Coastguard Worker  map<string, int32> num_rpcs_started_by_method = 1 [deprecated = true];
145*cc02d7e2SAndroid Build Coastguard Worker  // The total number of RPCs have ever completed successfully for each type.
146*cc02d7e2SAndroid Build Coastguard Worker  // Deprecated: use stats_per_method.result instead.
147*cc02d7e2SAndroid Build Coastguard Worker  map<string, int32> num_rpcs_succeeded_by_method = 2 [deprecated = true];
148*cc02d7e2SAndroid Build Coastguard Worker  // The total number of RPCs have ever failed for each type.
149*cc02d7e2SAndroid Build Coastguard Worker  // Deprecated: use stats_per_method.result instead.
150*cc02d7e2SAndroid Build Coastguard Worker  map<string, int32> num_rpcs_failed_by_method = 3 [deprecated = true];
151*cc02d7e2SAndroid Build Coastguard Worker
152*cc02d7e2SAndroid Build Coastguard Worker  message MethodStats {
153*cc02d7e2SAndroid Build Coastguard Worker    // The number of RPCs that were started for this method.
154*cc02d7e2SAndroid Build Coastguard Worker    int32 rpcs_started = 1;
155*cc02d7e2SAndroid Build Coastguard Worker
156*cc02d7e2SAndroid Build Coastguard Worker    // The number of RPCs that completed with each status for this method.  The
157*cc02d7e2SAndroid Build Coastguard Worker    // key is the integral value of a google.rpc.Code; the value is the count.
158*cc02d7e2SAndroid Build Coastguard Worker    map<int32, int32> result = 2;
159*cc02d7e2SAndroid Build Coastguard Worker  }
160*cc02d7e2SAndroid Build Coastguard Worker
161*cc02d7e2SAndroid Build Coastguard Worker  // Per-method RPC statistics.  The key is the RpcType in string form; e.g.
162*cc02d7e2SAndroid Build Coastguard Worker  // 'EMPTY_CALL' or 'UNARY_CALL'
163*cc02d7e2SAndroid Build Coastguard Worker  map<string, MethodStats> stats_per_method = 4;
164*cc02d7e2SAndroid Build Coastguard Worker}
165*cc02d7e2SAndroid Build Coastguard Worker
166*cc02d7e2SAndroid Build Coastguard Workerservice LoadBalancerStatsService {
167*cc02d7e2SAndroid Build Coastguard Worker  // Gets the backend distribution for RPCs sent by a test client.
168*cc02d7e2SAndroid Build Coastguard Worker  rpc GetClientStats(LoadBalancerStatsRequest)
169*cc02d7e2SAndroid Build Coastguard Worker      returns (LoadBalancerStatsResponse) {}
170*cc02d7e2SAndroid Build Coastguard Worker  // Gets the accumulated stats for RPCs sent by a test client.
171*cc02d7e2SAndroid Build Coastguard Worker  rpc GetClientAccumulatedStats(LoadBalancerAccumulatedStatsRequest)
172*cc02d7e2SAndroid Build Coastguard Worker      returns (LoadBalancerAccumulatedStatsResponse) {}
173*cc02d7e2SAndroid Build Coastguard Worker}
174*cc02d7e2SAndroid Build Coastguard Worker```
175*cc02d7e2SAndroid Build Coastguard Worker
176*cc02d7e2SAndroid Build Coastguard WorkerNote that the `LoadBalancerStatsResponse` contains the remote peer distribution
177*cc02d7e2SAndroid Build Coastguard Workerof the next `num_rpcs` *sent* by the client after receiving the
178*cc02d7e2SAndroid Build Coastguard Worker`LoadBalancerStatsRequest`. It is important that the remote peer distribution be
179*cc02d7e2SAndroid Build Coastguard Workerrecorded for a block of consecutive outgoing RPCs, to validate the intended
180*cc02d7e2SAndroid Build Coastguard Workerdistribution from the load balancer, rather than just looking at the next
181*cc02d7e2SAndroid Build Coastguard Worker`num_rpcs` responses received from backends, as different backends may respond
182*cc02d7e2SAndroid Build Coastguard Workerat different rates.
183*cc02d7e2SAndroid Build Coastguard Worker
184*cc02d7e2SAndroid Build Coastguard Worker## Test Cases
185*cc02d7e2SAndroid Build Coastguard Worker
186*cc02d7e2SAndroid Build Coastguard Worker### ping_pong
187*cc02d7e2SAndroid Build Coastguard Worker
188*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that every backend receives traffic.
189*cc02d7e2SAndroid Build Coastguard Worker
190*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
191*cc02d7e2SAndroid Build Coastguard Worker
192*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
193*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
194*cc02d7e2SAndroid Build Coastguard Worker1.  --fail_on_failed_rpc=true
195*cc02d7e2SAndroid Build Coastguard Worker
196*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
197*cc02d7e2SAndroid Build Coastguard Worker
198*cc02d7e2SAndroid Build Coastguard Worker1.  4 backends are created in a single managed instance group (MIG).
199*cc02d7e2SAndroid Build Coastguard Worker
200*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
201*cc02d7e2SAndroid Build Coastguard Worker
202*cc02d7e2SAndroid Build Coastguard Worker1.  All backends receive at least one RPC
203*cc02d7e2SAndroid Build Coastguard Worker
204*cc02d7e2SAndroid Build Coastguard Worker### round_robin
205*cc02d7e2SAndroid Build Coastguard Worker
206*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that RPCs are evenly routed according to an unweighted round
207*cc02d7e2SAndroid Build Coastguard Workerrobin policy.
208*cc02d7e2SAndroid Build Coastguard Worker
209*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
210*cc02d7e2SAndroid Build Coastguard Worker
211*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
212*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
213*cc02d7e2SAndroid Build Coastguard Worker1.  --fail_on_failed_rpc=true
214*cc02d7e2SAndroid Build Coastguard Worker
215*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
216*cc02d7e2SAndroid Build Coastguard Worker
217*cc02d7e2SAndroid Build Coastguard Worker1.  4 backends are created in a single MIG.
218*cc02d7e2SAndroid Build Coastguard Worker
219*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts that:
220*cc02d7e2SAndroid Build Coastguard Worker
221*cc02d7e2SAndroid Build Coastguard Worker1.  Once all backends receive at least one RPC, the following 100 RPCs are
222*cc02d7e2SAndroid Build Coastguard Worker    evenly distributed across the 4 backends.
223*cc02d7e2SAndroid Build Coastguard Worker
224*cc02d7e2SAndroid Build Coastguard Worker### backends_restart
225*cc02d7e2SAndroid Build Coastguard Worker
226*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the load balancer will resume sending traffic to a set
227*cc02d7e2SAndroid Build Coastguard Workerof backends that is stopped and then resumed.
228*cc02d7e2SAndroid Build Coastguard Worker
229*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
230*cc02d7e2SAndroid Build Coastguard Worker
231*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
232*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
233*cc02d7e2SAndroid Build Coastguard Worker
234*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
235*cc02d7e2SAndroid Build Coastguard Worker
236*cc02d7e2SAndroid Build Coastguard Worker1.  4 backends are created in a single MIG.
237*cc02d7e2SAndroid Build Coastguard Worker
238*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
239*cc02d7e2SAndroid Build Coastguard Worker
240*cc02d7e2SAndroid Build Coastguard Worker1.  All backends receive at least one RPC.
241*cc02d7e2SAndroid Build Coastguard Worker
242*cc02d7e2SAndroid Build Coastguard WorkerThe test driver records the peer distribution for a subsequent block of 100 RPCs
243*cc02d7e2SAndroid Build Coastguard Workerthen stops the backends.
244*cc02d7e2SAndroid Build Coastguard Worker
245*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
246*cc02d7e2SAndroid Build Coastguard Worker
247*cc02d7e2SAndroid Build Coastguard Worker1.  No RPCs from the client are successful.
248*cc02d7e2SAndroid Build Coastguard Worker
249*cc02d7e2SAndroid Build Coastguard WorkerThe test driver resumes the backends.
250*cc02d7e2SAndroid Build Coastguard Worker
251*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
252*cc02d7e2SAndroid Build Coastguard Worker
253*cc02d7e2SAndroid Build Coastguard Worker1.  Once all backends receive at least one RPC, the distribution for a block of
254*cc02d7e2SAndroid Build Coastguard Worker    100 RPCs is the same as the distribution recorded prior to restart.
255*cc02d7e2SAndroid Build Coastguard Worker
256*cc02d7e2SAndroid Build Coastguard Worker### secondary_locality_gets_requests_on_primary_failure
257*cc02d7e2SAndroid Build Coastguard Worker
258*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that backends in a secondary locality receive traffic when
259*cc02d7e2SAndroid Build Coastguard Workerall backends in the primary locality fail.
260*cc02d7e2SAndroid Build Coastguard Worker
261*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
262*cc02d7e2SAndroid Build Coastguard Worker
263*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
264*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
265*cc02d7e2SAndroid Build Coastguard Worker
266*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
267*cc02d7e2SAndroid Build Coastguard Worker
268*cc02d7e2SAndroid Build Coastguard Worker1.  The primary MIG with 2 backends in the same zone as the client
269*cc02d7e2SAndroid Build Coastguard Worker1.  The secondary MIG with 2 backends in a different zone
270*cc02d7e2SAndroid Build Coastguard Worker
271*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
272*cc02d7e2SAndroid Build Coastguard Worker
273*cc02d7e2SAndroid Build Coastguard Worker1.  All backends in the primary locality receive at least 1 RPC.
274*cc02d7e2SAndroid Build Coastguard Worker1.  No backends in the secondary locality receive RPCs.
275*cc02d7e2SAndroid Build Coastguard Worker
276*cc02d7e2SAndroid Build Coastguard WorkerThe test driver stops the backends in the primary locality.
277*cc02d7e2SAndroid Build Coastguard Worker
278*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
279*cc02d7e2SAndroid Build Coastguard Worker
280*cc02d7e2SAndroid Build Coastguard Worker1.  All backends in the secondary locality receive at least 1 RPC.
281*cc02d7e2SAndroid Build Coastguard Worker
282*cc02d7e2SAndroid Build Coastguard WorkerThe test driver resumes the backends in the primary locality.
283*cc02d7e2SAndroid Build Coastguard Worker
284*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
285*cc02d7e2SAndroid Build Coastguard Worker
286*cc02d7e2SAndroid Build Coastguard Worker1.  All backends in the primary locality receive at least 1 RPC.
287*cc02d7e2SAndroid Build Coastguard Worker1.  No backends in the secondary locality receive RPCs.
288*cc02d7e2SAndroid Build Coastguard Worker
289*cc02d7e2SAndroid Build Coastguard Worker### secondary_locality_gets_no_requests_on_partial_primary_failure
290*cc02d7e2SAndroid Build Coastguard Worker
291*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that backends in a failover locality do not receive traffic
292*cc02d7e2SAndroid Build Coastguard Workerwhen at least one of the backends in the primary locality remain healthy.
293*cc02d7e2SAndroid Build Coastguard Worker
294*cc02d7e2SAndroid Build Coastguard Worker**Note:** Future TD features may change the expected behavior and require
295*cc02d7e2SAndroid Build Coastguard Workerchanges to this test case.
296*cc02d7e2SAndroid Build Coastguard Worker
297*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
298*cc02d7e2SAndroid Build Coastguard Worker
299*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
300*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
301*cc02d7e2SAndroid Build Coastguard Worker
302*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
303*cc02d7e2SAndroid Build Coastguard Worker
304*cc02d7e2SAndroid Build Coastguard Worker1.  The primary MIG with 2 backends in the same zone as the client
305*cc02d7e2SAndroid Build Coastguard Worker1.  The secondary MIG with 2 backends in a different zone
306*cc02d7e2SAndroid Build Coastguard Worker
307*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
308*cc02d7e2SAndroid Build Coastguard Worker
309*cc02d7e2SAndroid Build Coastguard Worker1.  All backends in the primary locality receive at least 1 RPC.
310*cc02d7e2SAndroid Build Coastguard Worker1.  No backends in the secondary locality receive RPCs.
311*cc02d7e2SAndroid Build Coastguard Worker
312*cc02d7e2SAndroid Build Coastguard WorkerThe test driver stops one of the backends in the primary locality.
313*cc02d7e2SAndroid Build Coastguard Worker
314*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
315*cc02d7e2SAndroid Build Coastguard Worker
316*cc02d7e2SAndroid Build Coastguard Worker1.  All backends in the primary locality receive at least 1 RPC.
317*cc02d7e2SAndroid Build Coastguard Worker1.  No backends in the secondary locality receive RPCs.
318*cc02d7e2SAndroid Build Coastguard Worker
319*cc02d7e2SAndroid Build Coastguard Worker### remove_instance_group
320*cc02d7e2SAndroid Build Coastguard Worker
321*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that a remaining instance group can successfully serve RPCs
322*cc02d7e2SAndroid Build Coastguard Workerafter removal of another instance group in the same zone.
323*cc02d7e2SAndroid Build Coastguard Worker
324*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
325*cc02d7e2SAndroid Build Coastguard Worker
326*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
327*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
328*cc02d7e2SAndroid Build Coastguard Worker
329*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
330*cc02d7e2SAndroid Build Coastguard Worker
331*cc02d7e2SAndroid Build Coastguard Worker1.  Two MIGs with two backends each, using rate balancing mode.
332*cc02d7e2SAndroid Build Coastguard Worker
333*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
334*cc02d7e2SAndroid Build Coastguard Worker
335*cc02d7e2SAndroid Build Coastguard Worker1.  All backends receive at least one RPC.
336*cc02d7e2SAndroid Build Coastguard Worker
337*cc02d7e2SAndroid Build Coastguard WorkerThe test driver removes one MIG.
338*cc02d7e2SAndroid Build Coastguard Worker
339*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
340*cc02d7e2SAndroid Build Coastguard Worker
341*cc02d7e2SAndroid Build Coastguard Worker1.  All RPCs are directed to the two remaining backends (no RPC failures).
342*cc02d7e2SAndroid Build Coastguard Worker
343*cc02d7e2SAndroid Build Coastguard Worker### change_backend_service
344*cc02d7e2SAndroid Build Coastguard Worker
345*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the backend service can be replaced and traffic routed
346*cc02d7e2SAndroid Build Coastguard Workerto the new backends.
347*cc02d7e2SAndroid Build Coastguard Worker
348*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
349*cc02d7e2SAndroid Build Coastguard Worker
350*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
351*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
352*cc02d7e2SAndroid Build Coastguard Worker1.  --fail_on_failed_rpc=true
353*cc02d7e2SAndroid Build Coastguard Worker
354*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
355*cc02d7e2SAndroid Build Coastguard Worker
356*cc02d7e2SAndroid Build Coastguard Worker1.  One MIG with two backends
357*cc02d7e2SAndroid Build Coastguard Worker
358*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
359*cc02d7e2SAndroid Build Coastguard Worker
360*cc02d7e2SAndroid Build Coastguard Worker1.  All backends receive at least one RPC.
361*cc02d7e2SAndroid Build Coastguard Worker
362*cc02d7e2SAndroid Build Coastguard WorkerThe test driver creates a new backend service containing a MIG with two backends
363*cc02d7e2SAndroid Build Coastguard Workerand changes the TD URL map to point to this new backend service.
364*cc02d7e2SAndroid Build Coastguard Worker
365*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
366*cc02d7e2SAndroid Build Coastguard Worker
367*cc02d7e2SAndroid Build Coastguard Worker1.  All RPCs are directed to the new backend service.
368*cc02d7e2SAndroid Build Coastguard Worker
369*cc02d7e2SAndroid Build Coastguard Worker### traffic_splitting
370*cc02d7e2SAndroid Build Coastguard Worker
371*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the traffic will be distributed between backend
372*cc02d7e2SAndroid Build Coastguard Workerservices with the correct weights when route action is set to weighted
373*cc02d7e2SAndroid Build Coastguard Workerbackend services.
374*cc02d7e2SAndroid Build Coastguard Worker
375*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
376*cc02d7e2SAndroid Build Coastguard Worker
377*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
378*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
379*cc02d7e2SAndroid Build Coastguard Worker
380*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
381*cc02d7e2SAndroid Build Coastguard Worker
382*cc02d7e2SAndroid Build Coastguard Worker1.  One MIG with one backend
383*cc02d7e2SAndroid Build Coastguard Worker
384*cc02d7e2SAndroid Build Coastguard WorkerAssert:
385*cc02d7e2SAndroid Build Coastguard Worker
386*cc02d7e2SAndroid Build Coastguard Worker1. Once all backends receive at least one RPC, the following 1000 RPCs are
387*cc02d7e2SAndroid Build Coastguard Workerall sent to MIG_a.
388*cc02d7e2SAndroid Build Coastguard Worker
389*cc02d7e2SAndroid Build Coastguard WorkerThe test driver adds a new MIG with 1 backend, and changes the route action
390*cc02d7e2SAndroid Build Coastguard Workerto weighted backend services with {a: 20, b: 80}.
391*cc02d7e2SAndroid Build Coastguard Worker
392*cc02d7e2SAndroid Build Coastguard WorkerAssert:
393*cc02d7e2SAndroid Build Coastguard Worker
394*cc02d7e2SAndroid Build Coastguard Worker1. Once all backends receive at least one RPC, the following 1000 RPCs are
395*cc02d7e2SAndroid Build Coastguard Workerdistributed across the 2 backends as a: 20, b: 80.
396*cc02d7e2SAndroid Build Coastguard Worker### path_matching
397*cc02d7e2SAndroid Build Coastguard Worker
398*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the traffic for a certain RPC can be routed to a
399*cc02d7e2SAndroid Build Coastguard Workerspecific cluster based on the RPC path.
400*cc02d7e2SAndroid Build Coastguard Worker
401*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
402*cc02d7e2SAndroid Build Coastguard Worker
403*cc02d7e2SAndroid Build Coastguard Worker1.  –num_channels=1
404*cc02d7e2SAndroid Build Coastguard Worker1.  –qps=10
405*cc02d7e2SAndroid Build Coastguard Worker1.  –fail_on_failed_rpc=true
406*cc02d7e2SAndroid Build Coastguard Worker1.  –rpc=“EmptyCall,UnaryCall”
407*cc02d7e2SAndroid Build Coastguard Worker
408*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
409*cc02d7e2SAndroid Build Coastguard Worker
410*cc02d7e2SAndroid Build Coastguard Worker1.  2 MIGs, each with 1 backend
411*cc02d7e2SAndroid Build Coastguard Worker1.  routes
412*cc02d7e2SAndroid Build Coastguard Worker    - “/”: MIG_default
413*cc02d7e2SAndroid Build Coastguard Worker
414*cc02d7e2SAndroid Build Coastguard WorkerAssert:
415*cc02d7e2SAndroid Build Coastguard Worker
416*cc02d7e2SAndroid Build Coastguard Worker1.  UnaryCall RPCs are sent to MIG_default
417*cc02d7e2SAndroid Build Coastguard Worker1.  EmptyCall RPCs are sent to MIG_default
418*cc02d7e2SAndroid Build Coastguard Worker
419*cc02d7e2SAndroid Build Coastguard WorkerThe test driver changes route and asserts RPCs are sent to expected backends. **Note** that the default route `"/"` is always pointing to MIG_default, so all RPCs not matching the new route will be sent to MIG_default.
420*cc02d7e2SAndroid Build Coastguard Worker
421*cc02d7e2SAndroid Build Coastguard Worker- {path: `/grpc.testing.TestService/EmptyCall`}: MIG_2
422*cc02d7e2SAndroid Build Coastguard Worker  - UnaryCall -> MIG_default
423*cc02d7e2SAndroid Build Coastguard Worker  - EmptyCall -> MIG_2
424*cc02d7e2SAndroid Build Coastguard Worker
425*cc02d7e2SAndroid Build Coastguard Worker- {prefix: `/grpc.testing.TestService/Unary`}: MIG_2
426*cc02d7e2SAndroid Build Coastguard Worker  - UnaryCall -> MIG_2
427*cc02d7e2SAndroid Build Coastguard Worker  - EmptyCall -> MIG_default
428*cc02d7e2SAndroid Build Coastguard Worker
429*cc02d7e2SAndroid Build Coastguard Worker- {prefix: `/grpc.testing.TestService/Unary`}: MIG_default & {path: `/grpc.testing.TestService/EmptyCall`}: MIG_2
430*cc02d7e2SAndroid Build Coastguard Worker  - UnaryCall -> MIG_default
431*cc02d7e2SAndroid Build Coastguard Worker  - EmptyCall -> MIG_2
432*cc02d7e2SAndroid Build Coastguard Worker
433*cc02d7e2SAndroid Build Coastguard Worker- {regex: `^\/.*\/UnaryCall$`}: MIG_2
434*cc02d7e2SAndroid Build Coastguard Worker  - UnaryCall -> MIG_2
435*cc02d7e2SAndroid Build Coastguard Worker  - EmptyCall -> MIG_default
436*cc02d7e2SAndroid Build Coastguard Worker
437*cc02d7e2SAndroid Build Coastguard Worker- {path: `/gRpC.tEsTinG.tEstseRvice/empTycaLl`, ignoreCase: `True`}: MIG_2
438*cc02d7e2SAndroid Build Coastguard Worker  - UnaryCall -> MIG_default
439*cc02d7e2SAndroid Build Coastguard Worker  - EmptyCall -> MIG_2
440*cc02d7e2SAndroid Build Coastguard Worker
441*cc02d7e2SAndroid Build Coastguard Worker### header_matching
442*cc02d7e2SAndroid Build Coastguard Worker
443*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the traffic for a certain RPC can be routed to a
444*cc02d7e2SAndroid Build Coastguard Workerspecific cluster based on the RPC header (metadata).
445*cc02d7e2SAndroid Build Coastguard Worker
446*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
447*cc02d7e2SAndroid Build Coastguard Worker
448*cc02d7e2SAndroid Build Coastguard Worker1.  –num_channels=1
449*cc02d7e2SAndroid Build Coastguard Worker1.  –qps=10
450*cc02d7e2SAndroid Build Coastguard Worker1.  –fail_on_failed_rpc=true
451*cc02d7e2SAndroid Build Coastguard Worker1.  –rpc=“EmptyCall,UnaryCall”
452*cc02d7e2SAndroid Build Coastguard Worker1.  –rpc=“EmptyCall:xds_md:exact_match”
453*cc02d7e2SAndroid Build Coastguard Worker
454*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
455*cc02d7e2SAndroid Build Coastguard Worker
456*cc02d7e2SAndroid Build Coastguard Worker1.  2 MIGs, each with 1 backend
457*cc02d7e2SAndroid Build Coastguard Worker1.  routes
458*cc02d7e2SAndroid Build Coastguard Worker    - “/”: MIG_default
459*cc02d7e2SAndroid Build Coastguard Worker
460*cc02d7e2SAndroid Build Coastguard WorkerAssert:
461*cc02d7e2SAndroid Build Coastguard Worker
462*cc02d7e2SAndroid Build Coastguard Worker1.  UnaryCall RPCs are sent to MIG_default
463*cc02d7e2SAndroid Build Coastguard Worker1.  EmptyCall RPCs are sent to MIG_default
464*cc02d7e2SAndroid Build Coastguard Worker
465*cc02d7e2SAndroid Build Coastguard WorkerThe test driver changes route and asserts RPCs are sent to expected backends. **Note** that the default route `"/"` is always pointing to MIG_default, so all RPCs not matching the new route will be sent to MIG_default.
466*cc02d7e2SAndroid Build Coastguard Worker
467*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md`, exact: `empty_ytpme`}: MIG_2
468*cc02d7e2SAndroid Build Coastguard Worker	- Unary -> MIG_default
469*cc02d7e2SAndroid Build Coastguard Worker	- Empty -> MIG_2
470*cc02d7e2SAndroid Build Coastguard Worker
471*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md`, prefix: `un`}: MIG_2
472*cc02d7e2SAndroid Build Coastguard Worker	- `un` is the prefix of metadata sent with UnaryCall
473*cc02d7e2SAndroid Build Coastguard Worker	- Unary -> MIG_2
474*cc02d7e2SAndroid Build Coastguard Worker	- Empty -> MIG_default
475*cc02d7e2SAndroid Build Coastguard Worker
476*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md`, suffix: `me`}: MIG_2
477*cc02d7e2SAndroid Build Coastguard Worker	- `me` is the suffix of metadata sent with EmptyCall
478*cc02d7e2SAndroid Build Coastguard Worker	- Unary -> MIG_default
479*cc02d7e2SAndroid Build Coastguard Worker	- Empty to MIG_2
480*cc02d7e2SAndroid Build Coastguard Worker
481*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md_numeric`, present: `True`}: MIG_2
482*cc02d7e2SAndroid Build Coastguard Worker	- Unary is sent with the metadata, so will be sent to alternative
483*cc02d7e2SAndroid Build Coastguard Worker	- Unary -> MIG_2
484*cc02d7e2SAndroid Build Coastguard Worker	- Empty -> MIG_default
485*cc02d7e2SAndroid Build Coastguard Worker
486*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md`, exact: `unary_yranu`, invert: `True`}: MIG_2
487*cc02d7e2SAndroid Build Coastguard Worker	- Unary is sent with the metadata, so this will not match Unary, but will match Empty
488*cc02d7e2SAndroid Build Coastguard Worker	- Unary -> MIG_default
489*cc02d7e2SAndroid Build Coastguard Worker	- Empty to MIG_2
490*cc02d7e2SAndroid Build Coastguard Worker
491*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md_numeric`, range `[100,200]`}: MIG_2
492*cc02d7e2SAndroid Build Coastguard Worker	- Unary is sent with the metadata in range
493*cc02d7e2SAndroid Build Coastguard Worker	- Unary -> MIG_2
494*cc02d7e2SAndroid Build Coastguard Worker	- Empty -> MIG_default
495*cc02d7e2SAndroid Build Coastguard Worker
496*cc02d7e2SAndroid Build Coastguard Worker- {header `xds_md`, regex: `^em.*me$`}: MIG_2
497*cc02d7e2SAndroid Build Coastguard Worker	- EmptyCall is sent with the metadata
498*cc02d7e2SAndroid Build Coastguard Worker	- Unary -> MIG_default
499*cc02d7e2SAndroid Build Coastguard Worker	- Empty -> MIG_2
500*cc02d7e2SAndroid Build Coastguard Worker
501*cc02d7e2SAndroid Build Coastguard Worker### gentle_failover
502*cc02d7e2SAndroid Build Coastguard Worker
503*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that traffic is partially diverted to a secondary locality
504*cc02d7e2SAndroid Build Coastguard Workerwhen > 50% of the instances in the primary locality are unhealthy.
505*cc02d7e2SAndroid Build Coastguard Worker
506*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
507*cc02d7e2SAndroid Build Coastguard Worker
508*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
509*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
510*cc02d7e2SAndroid Build Coastguard Worker
511*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
512*cc02d7e2SAndroid Build Coastguard Worker
513*cc02d7e2SAndroid Build Coastguard Worker1.  The primary MIG with 3 backends in the same zone as the client
514*cc02d7e2SAndroid Build Coastguard Worker1.  The secondary MIG with 2 backends in a different zone
515*cc02d7e2SAndroid Build Coastguard Worker
516*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
517*cc02d7e2SAndroid Build Coastguard Worker
518*cc02d7e2SAndroid Build Coastguard Worker1.  All backends in the primary locality receive at least 1 RPC.
519*cc02d7e2SAndroid Build Coastguard Worker1.  No backends in the secondary locality receive RPCs.
520*cc02d7e2SAndroid Build Coastguard Worker
521*cc02d7e2SAndroid Build Coastguard WorkerThe test driver stops 2 of 3 backends in the primary locality.
522*cc02d7e2SAndroid Build Coastguard Worker
523*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
524*cc02d7e2SAndroid Build Coastguard Worker
525*cc02d7e2SAndroid Build Coastguard Worker1.  All backends in the secondary locality receive at least 1 RPC.
526*cc02d7e2SAndroid Build Coastguard Worker1.  The remaining backend in the primary locality receives at least 1 RPC.
527*cc02d7e2SAndroid Build Coastguard Worker
528*cc02d7e2SAndroid Build Coastguard WorkerThe test driver resumes the backends in the primary locality.
529*cc02d7e2SAndroid Build Coastguard Worker
530*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
531*cc02d7e2SAndroid Build Coastguard Worker
532*cc02d7e2SAndroid Build Coastguard Worker1.  All backends in the primary locality receive at least 1 RPC.
533*cc02d7e2SAndroid Build Coastguard Worker1.  No backends in the secondary locality receive RPCs.
534*cc02d7e2SAndroid Build Coastguard Worker
535*cc02d7e2SAndroid Build Coastguard Worker
536*cc02d7e2SAndroid Build Coastguard Worker### load_based_failover
537*cc02d7e2SAndroid Build Coastguard Worker
538*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that traffic is partially diverted to a secondary locality
539*cc02d7e2SAndroid Build Coastguard Workerwhen the QPS is greater than the configured RPS in the priority locality.
540*cc02d7e2SAndroid Build Coastguard Worker
541*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
542*cc02d7e2SAndroid Build Coastguard Worker
543*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
544*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
545*cc02d7e2SAndroid Build Coastguard Worker
546*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
547*cc02d7e2SAndroid Build Coastguard Worker
548*cc02d7e2SAndroid Build Coastguard Worker1.  The primary MIG with 2 backends in the same zone as the client
549*cc02d7e2SAndroid Build Coastguard Worker1.  The secondary MIG with 2 backends in a different zone
550*cc02d7e2SAndroid Build Coastguard Worker
551*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
552*cc02d7e2SAndroid Build Coastguard Worker
553*cc02d7e2SAndroid Build Coastguard Worker1.  All backends in the primary locality receive at least 1 RPC.
554*cc02d7e2SAndroid Build Coastguard Worker1.  No backends in the secondary locality receive RPCs.
555*cc02d7e2SAndroid Build Coastguard Worker
556*cc02d7e2SAndroid Build Coastguard WorkerThe test driver sets `balancingMode` is `RATE`, and `maxRate` to 20 in the primary locality.
557*cc02d7e2SAndroid Build Coastguard Worker
558*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
559*cc02d7e2SAndroid Build Coastguard Worker
560*cc02d7e2SAndroid Build Coastguard Worker1.  All backends in the primary locality receive at least 1 RPC.
561*cc02d7e2SAndroid Build Coastguard Worker1.  All backends in the secondary locality receive at least 1 RPC.
562*cc02d7e2SAndroid Build Coastguard Worker
563*cc02d7e2SAndroid Build Coastguard WorkerThe test driver set `maxRate` to 120 in the primary locality.
564*cc02d7e2SAndroid Build Coastguard Worker
565*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
566*cc02d7e2SAndroid Build Coastguard Worker
567*cc02d7e2SAndroid Build Coastguard Worker1.  All backends in the primary locality receive at least 1 RPC.
568*cc02d7e2SAndroid Build Coastguard Worker1.  No backends in the secondary locality receive RPCs.
569*cc02d7e2SAndroid Build Coastguard Worker
570*cc02d7e2SAndroid Build Coastguard Worker
571*cc02d7e2SAndroid Build Coastguard Worker### circuit_breaking
572*cc02d7e2SAndroid Build Coastguard Worker
573*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the maximum number of outstanding requests is limited
574*cc02d7e2SAndroid Build Coastguard Workerby circuit breakers of the backend service.
575*cc02d7e2SAndroid Build Coastguard Worker
576*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
577*cc02d7e2SAndroid Build Coastguard Worker
578*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
579*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
580*cc02d7e2SAndroid Build Coastguard Worker
581*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
582*cc02d7e2SAndroid Build Coastguard Worker
583*cc02d7e2SAndroid Build Coastguard Worker1.  Two MIGs with each having two backends.
584*cc02d7e2SAndroid Build Coastguard Worker
585*cc02d7e2SAndroid Build Coastguard WorkerThe test driver configures the backend services with:
586*cc02d7e2SAndroid Build Coastguard Worker
587*cc02d7e2SAndroid Build Coastguard Worker1. path{“/grpc.testing.TestService/UnaryCall"}: MIG_1
588*cc02d7e2SAndroid Build Coastguard Worker1. path{“/grpc.testing.TestService/EmptyCall"}: MIG_2
589*cc02d7e2SAndroid Build Coastguard Worker1. MIG_1 circuit_breakers with max_requests = 500
590*cc02d7e2SAndroid Build Coastguard Worker1. MIG_2 circuit breakers with max_requests = 1000
591*cc02d7e2SAndroid Build Coastguard Worker
592*cc02d7e2SAndroid Build Coastguard WorkerThe test driver configures the test client to send both UnaryCall and EmptyCall,
593*cc02d7e2SAndroid Build Coastguard Workerwith all RPCs keep-open.
594*cc02d7e2SAndroid Build Coastguard Worker
595*cc02d7e2SAndroid Build Coastguard WorkerAssert:
596*cc02d7e2SAndroid Build Coastguard Worker
597*cc02d7e2SAndroid Build Coastguard Worker1.  After reaching steady state, there are 500 UnaryCall RPCs in-flight
598*cc02d7e2SAndroid Build Coastguard Workerand 1000 EmptyCall RPCs in-flight.
599*cc02d7e2SAndroid Build Coastguard Worker
600*cc02d7e2SAndroid Build Coastguard WorkerThe test driver updates MIG_1's circuit breakers with max_request = 800.
601*cc02d7e2SAndroid Build Coastguard Worker
602*cc02d7e2SAndroid Build Coastguard WorkerTest driver asserts:
603*cc02d7e2SAndroid Build Coastguard Worker
604*cc02d7e2SAndroid Build Coastguard Worker1.  After reaching steady state, there are 800 UnaryCall RPCs in-flight.
605*cc02d7e2SAndroid Build Coastguard Worker
606*cc02d7e2SAndroid Build Coastguard Worker### timeout
607*cc02d7e2SAndroid Build Coastguard Worker
608*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that traffic along a route with a `max_stream_duration` set
609*cc02d7e2SAndroid Build Coastguard Workerwill cause timeouts on streams open longer than that duration.
610*cc02d7e2SAndroid Build Coastguard Worker
611*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
612*cc02d7e2SAndroid Build Coastguard Worker
613*cc02d7e2SAndroid Build Coastguard Worker1. `--num_channels=1`
614*cc02d7e2SAndroid Build Coastguard Worker1. `--qps=100`
615*cc02d7e2SAndroid Build Coastguard Worker
616*cc02d7e2SAndroid Build Coastguard WorkerRoute Configuration:
617*cc02d7e2SAndroid Build Coastguard Worker
618*cc02d7e2SAndroid Build Coastguard WorkerTwo routes:
619*cc02d7e2SAndroid Build Coastguard Worker
620*cc02d7e2SAndroid Build Coastguard Worker1. Path match for `/grpc.testing.TestService/UnaryCall`, with a `route_action`
621*cc02d7e2SAndroid Build Coastguard Worker   containing `max_stream_duration` of 3 seconds.
622*cc02d7e2SAndroid Build Coastguard Worker1. Default route containing no `max_stream_duration` setting.
623*cc02d7e2SAndroid Build Coastguard Worker
624*cc02d7e2SAndroid Build Coastguard WorkerThere are four sub-tests:
625*cc02d7e2SAndroid Build Coastguard Worker
626*cc02d7e2SAndroid Build Coastguard Worker1. `app_timeout_exceeded`
627*cc02d7e2SAndroid Build Coastguard Worker   1. Test client configured to send UnaryCall RPCs with a 1s application
628*cc02d7e2SAndroid Build Coastguard Worker      timeout, and metadata of `rpc-behavior: sleep-2`.
629*cc02d7e2SAndroid Build Coastguard Worker   1. Test driver asserts client recieves ~100% status `DEADLINE_EXCEEDED`.
630*cc02d7e2SAndroid Build Coastguard Worker1. `timeout_not_exceeded`
631*cc02d7e2SAndroid Build Coastguard Worker   1. Test client configured to send UnaryCall RPCs with the default
632*cc02d7e2SAndroid Build Coastguard Worker      application timeout (20 seconds), and no metadata.
633*cc02d7e2SAndroid Build Coastguard Worker   1. Test driver asserts client recieves ~100% status `OK`.
634*cc02d7e2SAndroid Build Coastguard Worker1. `timeout_exceeded` (executed with the below test case)
635*cc02d7e2SAndroid Build Coastguard Worker1. `timeout_different_route`
636*cc02d7e2SAndroid Build Coastguard Worker   1. Test client configured to send UnaryCall RPCs and EmptyCall RPCs with
637*cc02d7e2SAndroid Build Coastguard Worker      the default application timeout (20 seconds), and metadata of
638*cc02d7e2SAndroid Build Coastguard Worker      `rpc-behavior: sleep-4`.
639*cc02d7e2SAndroid Build Coastguard Worker   1. Test driver asserts client recieves ~100% status `OK` for EmptyCall
640*cc02d7e2SAndroid Build Coastguard Worker      and ~100% status `DEADLINE_EXCEEDED` for UnaryCall.
641*cc02d7e2SAndroid Build Coastguard Worker
642*cc02d7e2SAndroid Build Coastguard Worker### api_listener
643*cc02d7e2SAndroid Build Coastguard WorkerThe test case verifies a specific use case where it creates a second TD API
644*cc02d7e2SAndroid Build Coastguard Workerlistener using the same name as the existing one and then delete the old one.
645*cc02d7e2SAndroid Build Coastguard WorkerThe test driver verifies this is a safe way to update the API listener
646*cc02d7e2SAndroid Build Coastguard Workerconfiguration while keep using the existing name.
647*cc02d7e2SAndroid Build Coastguard Worker
648*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
649*cc02d7e2SAndroid Build Coastguard Worker
650*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
651*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
652*cc02d7e2SAndroid Build Coastguard Worker
653*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
654*cc02d7e2SAndroid Build Coastguard Worker
655*cc02d7e2SAndroid Build Coastguard Worker1.  One MIG with two backends.
656*cc02d7e2SAndroid Build Coastguard Worker
657*cc02d7e2SAndroid Build Coastguard WorkerAssert:
658*cc02d7e2SAndroid Build Coastguard Worker
659*cc02d7e2SAndroid Build Coastguard WorkerThe test driver configuration steps:
660*cc02d7e2SAndroid Build Coastguard Worker1. The test driver creates the first set of forwarding rule + target proxy +
661*cc02d7e2SAndroid Build Coastguard WorkerURL map with a test host name.
662*cc02d7e2SAndroid Build Coastguard Worker1. Then the test driver creates a second set of forwarding rule + target proxy +
663*cc02d7e2SAndroid Build Coastguard WorkerURL map with the same test host name.
664*cc02d7e2SAndroid Build Coastguard Worker1. The test driver deletes the first set of configurations in step 1.
665*cc02d7e2SAndroid Build Coastguard Worker
666*cc02d7e2SAndroid Build Coastguard WorkerThe test driver verifies, at each configuration step, the traffic is always able
667*cc02d7e2SAndroid Build Coastguard Workerto reach the designated hosts.
668*cc02d7e2SAndroid Build Coastguard Worker
669*cc02d7e2SAndroid Build Coastguard Worker### metadata_filter
670*cc02d7e2SAndroid Build Coastguard WorkerThis test case verifies that metadata filter configurations in URL map match
671*cc02d7e2SAndroid Build Coastguard Workerrule are effective at Traffic Director for routing selection against downstream
672*cc02d7e2SAndroid Build Coastguard Workernode metadata.
673*cc02d7e2SAndroid Build Coastguard Worker
674*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
675*cc02d7e2SAndroid Build Coastguard Worker
676*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
677*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
678*cc02d7e2SAndroid Build Coastguard Worker
679*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
680*cc02d7e2SAndroid Build Coastguard Worker
681*cc02d7e2SAndroid Build Coastguard Worker1.  Two MIGs in the same zone, each having two backends.
682*cc02d7e2SAndroid Build Coastguard Worker
683*cc02d7e2SAndroid Build Coastguard WorkerThere are four test sub-cases:
684*cc02d7e2SAndroid Build Coastguard Worker1. Test `MATCH_ALL` metadata filter criteria.
685*cc02d7e2SAndroid Build Coastguard Worker1. Test `MATCH_ANY` metadata filter criteria.
686*cc02d7e2SAndroid Build Coastguard Worker1. Test mixed `MATCH_ALL` and `MATCH_ANY` metadata filter criteria.
687*cc02d7e2SAndroid Build Coastguard Worker1. Test when multiple match rules with metadata filter all match.
688*cc02d7e2SAndroid Build Coastguard Worker
689*cc02d7e2SAndroid Build Coastguard WorkerAssert:
690*cc02d7e2SAndroid Build Coastguard Worker
691*cc02d7e2SAndroid Build Coastguard WorkerAt each test sub-case described above, the test driver configures
692*cc02d7e2SAndroid Build Coastguard Workerand verifies:
693*cc02d7e2SAndroid Build Coastguard Worker
694*cc02d7e2SAndroid Build Coastguard Worker1. Set default URL map, and verify traffic goes to the original backend hosts.
695*cc02d7e2SAndroid Build Coastguard Worker1. Then patch URL map to update the match rule with metadata filter
696*cc02d7e2SAndroid Build Coastguard Workerconfiguration under test added.
697*cc02d7e2SAndroid Build Coastguard Worker1. Then it verifies traffic switches to alternate backend service hosts.
698*cc02d7e2SAndroid Build Coastguard Worker
699*cc02d7e2SAndroid Build Coastguard WorkerThis way, we test that TD correctly evaluates both matching and non-matching
700*cc02d7e2SAndroid Build Coastguard Workerconfiguration scenario.
701*cc02d7e2SAndroid Build Coastguard Worker
702*cc02d7e2SAndroid Build Coastguard Worker### forwarding_rule_port_match
703*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that request server uri port should match with the GCP
704*cc02d7e2SAndroid Build Coastguard Workerforwarding rule configuration port.
705*cc02d7e2SAndroid Build Coastguard Worker
706*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
707*cc02d7e2SAndroid Build Coastguard Worker
708*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
709*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
710*cc02d7e2SAndroid Build Coastguard Worker
711*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
712*cc02d7e2SAndroid Build Coastguard Worker
713*cc02d7e2SAndroid Build Coastguard Worker1.  One MIG with two backends.
714*cc02d7e2SAndroid Build Coastguard Worker
715*cc02d7e2SAndroid Build Coastguard WorkerAssert:
716*cc02d7e2SAndroid Build Coastguard Worker1. The test driver configures matching port in the forwarding rule and in the
717*cc02d7e2SAndroid Build Coastguard Workerrequest server uri, then verifies traffic reaches backend service instances.
718*cc02d7e2SAndroid Build Coastguard Worker1. The test driver updates the forwarding rule to use a different port, then
719*cc02d7e2SAndroid Build Coastguard Workerverifies that the traffic stops going to those backend service instances.
720*cc02d7e2SAndroid Build Coastguard Worker
721*cc02d7e2SAndroid Build Coastguard Worker### forwarding_rule_default_port
722*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that omitting port in the request server uri should only
723*cc02d7e2SAndroid Build Coastguard Workermatch with the default port(80) configuration in the forwarding rule.
724*cc02d7e2SAndroid Build Coastguard WorkerIn addition, request server uri port should exactly match that in the URL map
725*cc02d7e2SAndroid Build Coastguard Workerhost rule, as described in
726*cc02d7e2SAndroid Build Coastguard Worker[public doc](https://cloud.google.com/traffic-director/docs/proxyless-overview#proxyless-url-map).
727*cc02d7e2SAndroid Build Coastguard Worker
728*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
729*cc02d7e2SAndroid Build Coastguard Worker
730*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
731*cc02d7e2SAndroid Build Coastguard Worker1.  --qps=100
732*cc02d7e2SAndroid Build Coastguard Worker
733*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
734*cc02d7e2SAndroid Build Coastguard Worker
735*cc02d7e2SAndroid Build Coastguard Worker1.  One MIG with two backends.
736*cc02d7e2SAndroid Build Coastguard Worker
737*cc02d7e2SAndroid Build Coastguard WorkerAssert:
738*cc02d7e2SAndroid Build Coastguard Worker
739*cc02d7e2SAndroid Build Coastguard WorkerTest driver configures and verifies:
740*cc02d7e2SAndroid Build Coastguard Worker1. No traffic goes to backends when configuring the target URI
741*cc02d7e2SAndroid Build Coastguard Worker`xds:///myservice`, the forwarding rule with port *x != 80*, the URL map
742*cc02d7e2SAndroid Build Coastguard Workerhost rule `myservice::x`.
743*cc02d7e2SAndroid Build Coastguard Worker1. Traffic goes to backends when configuring the target URI `xds:///myservice`,
744*cc02d7e2SAndroid Build Coastguard Workerthe forwarding rule port `80` and the URL map host rule `myservice`.
745*cc02d7e2SAndroid Build Coastguard Worker1. No traffic goes to backends when configuring the target URI
746*cc02d7e2SAndroid Build Coastguard Worker`xds:///myservice`, the forwarding rule port `80` and the host rule
747*cc02d7e2SAndroid Build Coastguard Worker`myservice::80`.
748*cc02d7e2SAndroid Build Coastguard Worker
749*cc02d7e2SAndroid Build Coastguard Worker### outlier_detection
750*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that the client applies the outlier detection configuration
751*cc02d7e2SAndroid Build Coastguard Workerand temporarily drops traffic to a server that fails requests.
752*cc02d7e2SAndroid Build Coastguard Worker
753*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
754*cc02d7e2SAndroid Build Coastguard Worker
755*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
756*cc02d7e2SAndroid Build Coastguard Worker2.  --qps=100
757*cc02d7e2SAndroid Build Coastguard Worker
758*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
759*cc02d7e2SAndroid Build Coastguard Worker
760*cc02d7e2SAndroid Build Coastguard Worker1.  One MIG with five backends, with a `backendService` configuration with the
761*cc02d7e2SAndroid Build Coastguard Worker    following `outlierDetection` entry
762*cc02d7e2SAndroid Build Coastguard Worker    ```json
763*cc02d7e2SAndroid Build Coastguard Worker    {
764*cc02d7e2SAndroid Build Coastguard Worker      "interval": {
765*cc02d7e2SAndroid Build Coastguard Worker        "seconds": 2,
766*cc02d7e2SAndroid Build Coastguard Worker        "nanos": 0
767*cc02d7e2SAndroid Build Coastguard Worker      },
768*cc02d7e2SAndroid Build Coastguard Worker      "successRateRequestVolume": 20
769*cc02d7e2SAndroid Build Coastguard Worker    }
770*cc02d7e2SAndroid Build Coastguard Worker    ```
771*cc02d7e2SAndroid Build Coastguard WorkerAssert:
772*cc02d7e2SAndroid Build Coastguard Worker
773*cc02d7e2SAndroid Build Coastguard Worker1.  The test driver asserts that traffic is equally distribted among the
774*cc02d7e2SAndroid Build Coastguard Workerfive backends, and all requests end with the `OK` status.
775*cc02d7e2SAndroid Build Coastguard Worker2.  The test driver chooses one of the five backends to fail requests, and
776*cc02d7e2SAndroid Build Coastguard Workerconfigures the client to send the metadata
777*cc02d7e2SAndroid Build Coastguard Worker`rpc-behavior: hostname=<chosen backend> error-code-2`. The driver asserts
778*cc02d7e2SAndroid Build Coastguard Workerthat during some 10-second interval, all traffic goes to the other four
779*cc02d7e2SAndroid Build Coastguard Workerbackends and all requests end with the `OK` status.
780*cc02d7e2SAndroid Build Coastguard Worker3.  The test driver removes the client configuration to send metadata. The
781*cc02d7e2SAndroid Build Coastguard Workerdriver asserts that during some 10-second interval, traffic is equally
782*cc02d7e2SAndroid Build Coastguard Workerdistributed among the five backends, and all requests end with the `OK` status.
783*cc02d7e2SAndroid Build Coastguard Worker
784*cc02d7e2SAndroid Build Coastguard Worker### custom_lb
785*cc02d7e2SAndroid Build Coastguard WorkerThis test verifies that a custom load balancer policy can be configured in the
786*cc02d7e2SAndroid Build Coastguard Workerclient. It also verifies that when given a list of policies the client can
787*cc02d7e2SAndroid Build Coastguard Workerignore a bad one and try the next one on the list until it finds a good one.
788*cc02d7e2SAndroid Build Coastguard Worker
789*cc02d7e2SAndroid Build Coastguard WorkerClient parameters:
790*cc02d7e2SAndroid Build Coastguard Worker
791*cc02d7e2SAndroid Build Coastguard Worker1.  --num_channels=1
792*cc02d7e2SAndroid Build Coastguard Worker2.  --qps=100
793*cc02d7e2SAndroid Build Coastguard Worker
794*cc02d7e2SAndroid Build Coastguard WorkerLoad balancer configuration:
795*cc02d7e2SAndroid Build Coastguard Worker
796*cc02d7e2SAndroid Build Coastguard WorkerOne MIG with a single backend.
797*cc02d7e2SAndroid Build Coastguard Worker
798*cc02d7e2SAndroid Build Coastguard WorkerThe `backendService` will have the following `localityLbPolicies` entry:
799*cc02d7e2SAndroid Build Coastguard Worker```json
800*cc02d7e2SAndroid Build Coastguard Worker[
801*cc02d7e2SAndroid Build Coastguard Worker  {
802*cc02d7e2SAndroid Build Coastguard Worker    "customPolicy": {
803*cc02d7e2SAndroid Build Coastguard Worker      "name": "test.ThisLoadBalancerDoesNotExist",
804*cc02d7e2SAndroid Build Coastguard Worker      "data": "{ \"foo\": \"bar\" }"
805*cc02d7e2SAndroid Build Coastguard Worker    }
806*cc02d7e2SAndroid Build Coastguard Worker  },
807*cc02d7e2SAndroid Build Coastguard Worker  {
808*cc02d7e2SAndroid Build Coastguard Worker    "customPolicy": {
809*cc02d7e2SAndroid Build Coastguard Worker      "name": "test.RpcBehaviorLoadBalancer",
810*cc02d7e2SAndroid Build Coastguard Worker      "data": "{ \"rpcBehavior\": \"error-code-15\" }"
811*cc02d7e2SAndroid Build Coastguard Worker    }
812*cc02d7e2SAndroid Build Coastguard Worker  }
813*cc02d7e2SAndroid Build Coastguard Worker]
814*cc02d7e2SAndroid Build Coastguard Worker```
815*cc02d7e2SAndroid Build Coastguard Worker
816*cc02d7e2SAndroid Build Coastguard WorkerThe client **should not** implement the `test.ThisLoadBalancerDoesNotExist`, but
817*cc02d7e2SAndroid Build Coastguard Workerit **should** implement `test.RpcBehaviorLoadBalancer`. The
818*cc02d7e2SAndroid Build Coastguard Worker`RpcBehaviorLoadBalancer` implementation should set the rpcBehavior request
819*cc02d7e2SAndroid Build Coastguard Workerheader based on the configuration it is provided. The `rpcBehavior` field value
820*cc02d7e2SAndroid Build Coastguard Workerin the config should be used as the header value.
821*cc02d7e2SAndroid Build Coastguard Worker
822*cc02d7e2SAndroid Build Coastguard WorkerAssert:
823*cc02d7e2SAndroid Build Coastguard Worker
824*cc02d7e2SAndroid Build Coastguard Worker1. The first custom policy is ignored as the client does not have an
825*cc02d7e2SAndroid Build Coastguard Workerimplementation for it.
826*cc02d7e2SAndroid Build Coastguard Worker2. The second policy, that **is** implemented by the client, has been applied
827*cc02d7e2SAndroid Build Coastguard Workerby the client. This can be asserted by confirming that each request has
828*cc02d7e2SAndroid Build Coastguard Workerfailed with the configured error code 15 (DATA_LOSS). We should get this error
829*cc02d7e2SAndroid Build Coastguard Workerbecause the test server knows to look for the `rpcBehavior` header and fail
830*cc02d7e2SAndroid Build Coastguard Workera request with a provided error code.
831*cc02d7e2SAndroid Build Coastguard Worker
832*cc02d7e2SAndroid Build Coastguard WorkerNote that while this test is for load balancing, we can get by with a single
833*cc02d7e2SAndroid Build Coastguard Workerbackend as our test load balancer does not perform any actual load balancing,
834*cc02d7e2SAndroid Build Coastguard Workerinstead only applying the `rpcBehavior` header to each request.
835