blob: ec3050ad45f6e5597d61463b25e29e96aa601afa [file] [log] [blame]
Muxi Yan121e7892017-07-12 12:30:41 -07001/*
2 *
3 * Copyright 2015 gRPC authors.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 */
18
19#include "test/core/end2end/end2end_tests.h"
20
21#include <stdio.h>
22#include <string.h>
23
24#include <grpc/byte_buffer.h>
25#include <grpc/byte_buffer_reader.h>
26#include <grpc/compression.h>
27#include <grpc/support/alloc.h>
28#include <grpc/support/log.h>
29#include <grpc/support/string_util.h>
30#include <grpc/support/time.h>
31#include <grpc/support/useful.h>
32
33#include "src/core/lib/channel/channel_args.h"
34#include "src/core/lib/surface/call.h"
35#include "src/core/lib/surface/call_test_only.h"
36#include "src/core/lib/transport/static_metadata.h"
37#include "test/core/end2end/cq_verifier.h"
38
Craig Tillerbaa14a92017-11-03 09:09:36 -070039static void* tag(intptr_t t) { return (void*)t; }
Muxi Yan121e7892017-07-12 12:30:41 -070040
41static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
Craig Tillerbaa14a92017-11-03 09:09:36 -070042 const char* test_name,
43 grpc_channel_args* client_args,
44 grpc_channel_args* server_args) {
Muxi Yan121e7892017-07-12 12:30:41 -070045 grpc_end2end_test_fixture f;
46 gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
47 f = config.create_fixture(client_args, server_args);
48 config.init_server(&f, server_args);
49 config.init_client(&f, client_args);
50 return f;
51}
52
53static gpr_timespec n_seconds_from_now(int n) {
54 return grpc_timeout_seconds_to_deadline(n);
55}
56
57static gpr_timespec five_seconds_from_now(void) {
58 return n_seconds_from_now(5);
59}
60
Craig Tillerbaa14a92017-11-03 09:09:36 -070061static void drain_cq(grpc_completion_queue* cq) {
Muxi Yan121e7892017-07-12 12:30:41 -070062 grpc_event ev;
63 do {
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080064 ev = grpc_completion_queue_next(cq, five_seconds_from_now(), nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -070065 } while (ev.type != GRPC_QUEUE_SHUTDOWN);
66}
67
Craig Tillerbaa14a92017-11-03 09:09:36 -070068static void shutdown_server(grpc_end2end_test_fixture* f) {
Muxi Yan121e7892017-07-12 12:30:41 -070069 if (!f->server) return;
70 grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
71 GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
72 grpc_timeout_seconds_to_deadline(5),
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080073 nullptr)
Muxi Yan121e7892017-07-12 12:30:41 -070074 .type == GRPC_OP_COMPLETE);
75 grpc_server_destroy(f->server);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080076 f->server = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -070077}
78
Craig Tillerbaa14a92017-11-03 09:09:36 -070079static void shutdown_client(grpc_end2end_test_fixture* f) {
Muxi Yan121e7892017-07-12 12:30:41 -070080 if (!f->client) return;
81 grpc_channel_destroy(f->client);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080082 f->client = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -070083}
84
Craig Tillerbaa14a92017-11-03 09:09:36 -070085static void end_test(grpc_end2end_test_fixture* f) {
Muxi Yan121e7892017-07-12 12:30:41 -070086 shutdown_server(f);
87 shutdown_client(f);
88
89 grpc_completion_queue_shutdown(f->cq);
90 drain_cq(f->cq);
91 grpc_completion_queue_destroy(f->cq);
92 grpc_completion_queue_destroy(f->shutdown_cq);
93}
94
95static void request_for_disabled_algorithm(
Craig Tillerbaa14a92017-11-03 09:09:36 -070096 grpc_end2end_test_config config, const char* test_name,
Muxi Yan121e7892017-07-12 12:30:41 -070097 uint32_t send_flags_bitmask,
Muxi Yan68a0fd52017-07-21 09:26:04 -070098 grpc_stream_compression_algorithm algorithm_to_disable,
99 grpc_stream_compression_algorithm requested_client_compression_algorithm,
Craig Tillerbaa14a92017-11-03 09:09:36 -0700100 grpc_status_code expected_error, grpc_metadata* client_metadata) {
101 grpc_call* c;
102 grpc_call* s;
Muxi Yan121e7892017-07-12 12:30:41 -0700103 grpc_slice request_payload_slice;
Craig Tillerbaa14a92017-11-03 09:09:36 -0700104 grpc_byte_buffer* request_payload;
105 grpc_channel_args* client_args;
106 grpc_channel_args* server_args;
Muxi Yan121e7892017-07-12 12:30:41 -0700107 grpc_end2end_test_fixture f;
108 grpc_op ops[6];
Craig Tillerbaa14a92017-11-03 09:09:36 -0700109 grpc_op* op;
Muxi Yan121e7892017-07-12 12:30:41 -0700110 grpc_metadata_array initial_metadata_recv;
111 grpc_metadata_array trailing_metadata_recv;
112 grpc_metadata_array request_metadata_recv;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800113 grpc_byte_buffer* request_payload_recv = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700114 grpc_call_details call_details;
115 grpc_status_code status;
116 grpc_call_error error;
117 grpc_slice details;
118 int was_cancelled = 2;
Craig Tillerbaa14a92017-11-03 09:09:36 -0700119 cq_verifier* cqv;
Muxi Yan121e7892017-07-12 12:30:41 -0700120 char str[1024];
121
122 memset(str, 'x', 1023);
123 str[1023] = '\0';
124 request_payload_slice = grpc_slice_from_copied_string(str);
125 request_payload = grpc_raw_byte_buffer_create(&request_payload_slice, 1);
126
Muxi Yan68a0fd52017-07-21 09:26:04 -0700127 client_args = grpc_channel_args_set_stream_compression_algorithm(
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800128 nullptr, requested_client_compression_algorithm);
Muxi Yan68a0fd52017-07-21 09:26:04 -0700129 server_args = grpc_channel_args_set_stream_compression_algorithm(
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800130 nullptr, GRPC_STREAM_COMPRESS_NONE);
Muxi Yan121e7892017-07-12 12:30:41 -0700131 {
Yash Tibrewal8cf14702017-12-06 09:47:54 -0800132 grpc_core::ExecCtx exec_ctx;
Muxi Yan68a0fd52017-07-21 09:26:04 -0700133 server_args = grpc_channel_args_stream_compression_algorithm_set_state(
Yash Tibrewal8cf14702017-12-06 09:47:54 -0800134 &server_args, algorithm_to_disable, false);
Muxi Yan121e7892017-07-12 12:30:41 -0700135 }
136
137 f = begin_test(config, test_name, client_args, server_args);
138 cqv = cq_verifier_create(f.cq);
139
140 gpr_timespec deadline = five_seconds_from_now();
141 c = grpc_channel_create_call(
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800142 f.client, nullptr, GRPC_PROPAGATE_DEFAULTS, f.cq,
Muxi Yan121e7892017-07-12 12:30:41 -0700143 grpc_slice_from_static_string("/foo"),
144 get_host_override_slice("foo.test.google.fr:1234", config), deadline,
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800145 nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700146 GPR_ASSERT(c);
147
148 grpc_metadata_array_init(&initial_metadata_recv);
149 grpc_metadata_array_init(&trailing_metadata_recv);
150 grpc_metadata_array_init(&request_metadata_recv);
151 grpc_call_details_init(&call_details);
152
Muxi Yan4b527a72017-09-20 13:35:05 -0700153 error =
154 grpc_server_request_call(f.server, &s, &call_details,
155 &request_metadata_recv, f.cq, f.cq, tag(101));
156 GPR_ASSERT(GRPC_CALL_OK == error);
157
Muxi Yan121e7892017-07-12 12:30:41 -0700158 memset(ops, 0, sizeof(ops));
159 op = ops;
160 op->op = GRPC_OP_SEND_INITIAL_METADATA;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800161 if (client_metadata != nullptr) {
Muxi Yan121e7892017-07-12 12:30:41 -0700162 op->data.send_initial_metadata.count = 1;
163 op->data.send_initial_metadata.metadata = client_metadata;
164 } else {
165 op->data.send_initial_metadata.count = 0;
166 }
167 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800168 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700169 op++;
170 op->op = GRPC_OP_SEND_MESSAGE;
171 op->data.send_message.send_message = request_payload;
172 op->flags = send_flags_bitmask;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800173 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700174 op++;
175 op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
176 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800177 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700178 op++;
179 op->op = GRPC_OP_RECV_INITIAL_METADATA;
180 op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv;
181 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800182 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700183 op++;
184 op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
185 op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
186 op->data.recv_status_on_client.status = &status;
187 op->data.recv_status_on_client.status_details = &details;
188 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800189 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700190 op++;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800191 error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(1), nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700192 GPR_ASSERT(GRPC_CALL_OK == error);
193
Muxi Yan121e7892017-07-12 12:30:41 -0700194 CQ_EXPECT_COMPLETION(cqv, tag(101), true);
Yash Tibrewalbdf998a2017-09-27 17:07:43 -0700195 CQ_EXPECT_COMPLETION(cqv, tag(1), true);
Muxi Yan121e7892017-07-12 12:30:41 -0700196 cq_verify(cqv);
197
198 op = ops;
199 op->op = GRPC_OP_SEND_INITIAL_METADATA;
200 op->data.send_initial_metadata.count = 0;
201 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800202 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700203 op++;
204 op->op = GRPC_OP_RECV_MESSAGE;
205 op->data.recv_message.recv_message = &request_payload_recv;
206 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800207 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700208 op++;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800209 error = grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(102), nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700210 GPR_ASSERT(GRPC_CALL_OK == error);
211
212 CQ_EXPECT_COMPLETION(cqv, tag(102), false);
213
214 op = ops;
215 op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
216 op->data.recv_close_on_server.cancelled = &was_cancelled;
217 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800218 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700219 op++;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800220 error = grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(103), nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700221 GPR_ASSERT(GRPC_CALL_OK == error);
222
223 CQ_EXPECT_COMPLETION(cqv, tag(103), true);
Muxi Yan121e7892017-07-12 12:30:41 -0700224 cq_verify(cqv);
225
226 /* call was cancelled (closed) ... */
227 GPR_ASSERT(was_cancelled != 0);
228 /* with a certain error */
229 GPR_ASSERT(status == expected_error);
230
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800231 const char* algo_name = nullptr;
Muxi Yan68a0fd52017-07-21 09:26:04 -0700232 GPR_ASSERT(
233 grpc_stream_compression_algorithm_name(algorithm_to_disable, &algo_name));
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800234 char* expected_details = nullptr;
Muxi Yan68a0fd52017-07-21 09:26:04 -0700235 gpr_asprintf(&expected_details,
236 "Stream compression algorithm '%s' is disabled.", algo_name);
Muxi Yan121e7892017-07-12 12:30:41 -0700237 /* and we expect a specific reason for it */
238 GPR_ASSERT(0 == grpc_slice_str_cmp(details, expected_details));
239 gpr_free(expected_details);
240 GPR_ASSERT(0 == grpc_slice_str_cmp(call_details.method, "/foo"));
241 validate_host_override_string("foo.test.google.fr:1234", call_details.host,
242 config);
243
244 grpc_slice_unref(details);
245 grpc_metadata_array_destroy(&initial_metadata_recv);
246 grpc_metadata_array_destroy(&trailing_metadata_recv);
247 grpc_metadata_array_destroy(&request_metadata_recv);
248 grpc_call_details_destroy(&call_details);
249
250 grpc_call_unref(c);
251 grpc_call_unref(s);
252
253 cq_verifier_destroy(cqv);
254
255 grpc_slice_unref(request_payload_slice);
256 grpc_byte_buffer_destroy(request_payload);
257 grpc_byte_buffer_destroy(request_payload_recv);
258
259 {
Yash Tibrewal8cf14702017-12-06 09:47:54 -0800260 grpc_core::ExecCtx exec_ctx;
261 grpc_channel_args_destroy(client_args);
262 grpc_channel_args_destroy(server_args);
Muxi Yan121e7892017-07-12 12:30:41 -0700263 }
264
265 end_test(&f);
266 config.tear_down_data(&f);
267}
268
269static void request_with_payload_template(
Craig Tillerbaa14a92017-11-03 09:09:36 -0700270 grpc_end2end_test_config config, const char* test_name,
Muxi Yan121e7892017-07-12 12:30:41 -0700271 uint32_t client_send_flags_bitmask,
Muxi Yan68a0fd52017-07-21 09:26:04 -0700272 grpc_stream_compression_algorithm
273 default_client_channel_compression_algorithm,
274 grpc_stream_compression_algorithm
275 default_server_channel_compression_algorithm,
276 grpc_stream_compression_algorithm expected_client_compression_algorithm,
277 grpc_stream_compression_algorithm expected_server_compression_algorithm,
Craig Tillerbaa14a92017-11-03 09:09:36 -0700278 grpc_metadata* client_init_metadata, bool set_server_level,
Muxi Yan68a0fd52017-07-21 09:26:04 -0700279 grpc_stream_compression_level server_compression_level,
280 bool send_message_before_initial_metadata,
281 bool set_default_server_message_compression_algorithm,
282 grpc_compression_algorithm default_server_message_compression_algorithm) {
Craig Tillerbaa14a92017-11-03 09:09:36 -0700283 grpc_call* c;
284 grpc_call* s;
Muxi Yan121e7892017-07-12 12:30:41 -0700285 grpc_slice request_payload_slice;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800286 grpc_byte_buffer* request_payload = nullptr;
Craig Tillerbaa14a92017-11-03 09:09:36 -0700287 grpc_channel_args* client_args;
288 grpc_channel_args* server_args;
Muxi Yan121e7892017-07-12 12:30:41 -0700289 grpc_end2end_test_fixture f;
290 grpc_op ops[6];
Craig Tillerbaa14a92017-11-03 09:09:36 -0700291 grpc_op* op;
Muxi Yan121e7892017-07-12 12:30:41 -0700292 grpc_metadata_array initial_metadata_recv;
293 grpc_metadata_array trailing_metadata_recv;
294 grpc_metadata_array request_metadata_recv;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800295 grpc_byte_buffer* request_payload_recv = nullptr;
Craig Tillerbaa14a92017-11-03 09:09:36 -0700296 grpc_byte_buffer* response_payload;
297 grpc_byte_buffer* response_payload_recv;
Muxi Yan121e7892017-07-12 12:30:41 -0700298 grpc_call_details call_details;
299 grpc_status_code status;
300 grpc_call_error error;
301 grpc_slice details;
302 int was_cancelled = 2;
Craig Tillerbaa14a92017-11-03 09:09:36 -0700303 cq_verifier* cqv;
Muxi Yan121e7892017-07-12 12:30:41 -0700304 char request_str[1024];
305 char response_str[1024];
306
307 memset(request_str, 'x', 1023);
308 request_str[1023] = '\0';
309
310 memset(response_str, 'y', 1023);
311 response_str[1023] = '\0';
312
313 request_payload_slice = grpc_slice_from_copied_string(request_str);
314 grpc_slice response_payload_slice =
315 grpc_slice_from_copied_string(response_str);
316
Muxi Yan68a0fd52017-07-21 09:26:04 -0700317 client_args = grpc_channel_args_set_stream_compression_algorithm(
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800318 nullptr, default_client_channel_compression_algorithm);
Muxi Yan68a0fd52017-07-21 09:26:04 -0700319 if (set_default_server_message_compression_algorithm) {
320 server_args = grpc_channel_args_set_compression_algorithm(
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800321 nullptr, default_server_message_compression_algorithm);
Muxi Yan68a0fd52017-07-21 09:26:04 -0700322 } else {
323 server_args = grpc_channel_args_set_stream_compression_algorithm(
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800324 nullptr, default_server_channel_compression_algorithm);
Muxi Yan68a0fd52017-07-21 09:26:04 -0700325 }
Muxi Yan121e7892017-07-12 12:30:41 -0700326
327 f = begin_test(config, test_name, client_args, server_args);
328 cqv = cq_verifier_create(f.cq);
329
330 gpr_timespec deadline = five_seconds_from_now();
331 c = grpc_channel_create_call(
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800332 f.client, nullptr, GRPC_PROPAGATE_DEFAULTS, f.cq,
Muxi Yan121e7892017-07-12 12:30:41 -0700333 grpc_slice_from_static_string("/foo"),
334 get_host_override_slice("foo.test.google.fr:1234", config), deadline,
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800335 nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700336 GPR_ASSERT(c);
337
338 grpc_metadata_array_init(&initial_metadata_recv);
339 grpc_metadata_array_init(&trailing_metadata_recv);
340 grpc_metadata_array_init(&request_metadata_recv);
341 grpc_call_details_init(&call_details);
342
343 if (send_message_before_initial_metadata) {
344 request_payload = grpc_raw_byte_buffer_create(&request_payload_slice, 1);
345 memset(ops, 0, sizeof(ops));
346 op = ops;
347 op->op = GRPC_OP_SEND_MESSAGE;
348 op->data.send_message.send_message = request_payload;
349 op->flags = client_send_flags_bitmask;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800350 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700351 op++;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800352 error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(2), nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700353 GPR_ASSERT(GRPC_CALL_OK == error);
354 CQ_EXPECT_COMPLETION(cqv, tag(2), true);
355 }
356
357 memset(ops, 0, sizeof(ops));
358 op = ops;
359 op->op = GRPC_OP_SEND_INITIAL_METADATA;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800360 if (client_init_metadata != nullptr) {
Muxi Yan121e7892017-07-12 12:30:41 -0700361 op->data.send_initial_metadata.count = 1;
362 op->data.send_initial_metadata.metadata = client_init_metadata;
363 } else {
364 op->data.send_initial_metadata.count = 0;
365 }
366 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800367 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700368 op++;
369 op->op = GRPC_OP_RECV_INITIAL_METADATA;
370 op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv;
371 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800372 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700373 op++;
374 op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
375 op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
376 op->data.recv_status_on_client.status = &status;
377 op->data.recv_status_on_client.status_details = &details;
378 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800379 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700380 op++;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800381 error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(1), nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700382 GPR_ASSERT(GRPC_CALL_OK == error);
383
384 error =
385 grpc_server_request_call(f.server, &s, &call_details,
386 &request_metadata_recv, f.cq, f.cq, tag(100));
387 GPR_ASSERT(GRPC_CALL_OK == error);
388 CQ_EXPECT_COMPLETION(cqv, tag(100), true);
389 cq_verify(cqv);
390
391 GPR_ASSERT(GPR_BITCOUNT(grpc_call_test_only_get_encodings_accepted_by_peer(
392 s)) == GRPC_COMPRESS_ALGORITHMS_COUNT);
393 GPR_ASSERT(GPR_BITGET(grpc_call_test_only_get_encodings_accepted_by_peer(s),
394 GRPC_COMPRESS_NONE) != 0);
395 GPR_ASSERT(GPR_BITGET(grpc_call_test_only_get_encodings_accepted_by_peer(s),
396 GRPC_COMPRESS_DEFLATE) != 0);
397 GPR_ASSERT(GPR_BITGET(grpc_call_test_only_get_encodings_accepted_by_peer(s),
398 GRPC_COMPRESS_GZIP) != 0);
Muxi Yan68a0fd52017-07-21 09:26:04 -0700399 GPR_ASSERT(
400 GPR_BITCOUNT(grpc_call_test_only_get_stream_encodings_accepted_by_peer(
401 s)) == GRPC_STREAM_COMPRESS_ALGORITHMS_COUNT);
402 GPR_ASSERT(
403 GPR_BITGET(grpc_call_test_only_get_stream_encodings_accepted_by_peer(s),
404 GRPC_STREAM_COMPRESS_NONE) != 0);
405 GPR_ASSERT(
406 GPR_BITGET(grpc_call_test_only_get_stream_encodings_accepted_by_peer(s),
407 GRPC_STREAM_COMPRESS_GZIP) != 0);
Muxi Yan121e7892017-07-12 12:30:41 -0700408
409 memset(ops, 0, sizeof(ops));
410 op = ops;
411 op->op = GRPC_OP_SEND_INITIAL_METADATA;
412 op->data.send_initial_metadata.count = 0;
413 if (set_server_level) {
Muxi Yan68a0fd52017-07-21 09:26:04 -0700414 op->data.send_initial_metadata.maybe_stream_compression_level.is_set = true;
415 op->data.send_initial_metadata.maybe_stream_compression_level.level =
Muxi Yan121e7892017-07-12 12:30:41 -0700416 server_compression_level;
417 }
418 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800419 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700420 op++;
421 op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
422 op->data.recv_close_on_server.cancelled = &was_cancelled;
423 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800424 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700425 op++;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800426 error = grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(101), nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700427 GPR_ASSERT(GRPC_CALL_OK == error);
428
429 for (int i = 0; i < 2; i++) {
430 response_payload = grpc_raw_byte_buffer_create(&response_payload_slice, 1);
431
432 if (i > 0 || !send_message_before_initial_metadata) {
433 request_payload = grpc_raw_byte_buffer_create(&request_payload_slice, 1);
434 memset(ops, 0, sizeof(ops));
435 op = ops;
436 op->op = GRPC_OP_SEND_MESSAGE;
437 op->data.send_message.send_message = request_payload;
438 op->flags = client_send_flags_bitmask;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800439 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700440 op++;
Craig Tillerbe98d242017-11-10 15:26:57 -0800441 error =
442 grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(2), nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700443 GPR_ASSERT(GRPC_CALL_OK == error);
444 CQ_EXPECT_COMPLETION(cqv, tag(2), 1);
445 }
446
447 memset(ops, 0, sizeof(ops));
448 op = ops;
449 op->op = GRPC_OP_RECV_MESSAGE;
450 op->data.recv_message.recv_message = &request_payload_recv;
451 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800452 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700453 op++;
Craig Tillerbe98d242017-11-10 15:26:57 -0800454 error =
455 grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(102), nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700456 GPR_ASSERT(GRPC_CALL_OK == error);
457
458 CQ_EXPECT_COMPLETION(cqv, tag(102), 1);
459 cq_verify(cqv);
460
461 GPR_ASSERT(request_payload_recv->type == GRPC_BB_RAW);
462 GPR_ASSERT(byte_buffer_eq_string(request_payload_recv, request_str));
463
464 memset(ops, 0, sizeof(ops));
465 op = ops;
466 op->op = GRPC_OP_SEND_MESSAGE;
467 op->data.send_message.send_message = response_payload;
468 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800469 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700470 op++;
Craig Tillerbe98d242017-11-10 15:26:57 -0800471 error =
472 grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(103), nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700473 GPR_ASSERT(GRPC_CALL_OK == error);
474
475 memset(ops, 0, sizeof(ops));
476 op = ops;
477 op->op = GRPC_OP_RECV_MESSAGE;
478 op->data.recv_message.recv_message = &response_payload_recv;
479 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800480 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700481 op++;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800482 error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(3), nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700483 GPR_ASSERT(GRPC_CALL_OK == error);
484
485 CQ_EXPECT_COMPLETION(cqv, tag(103), 1);
486 CQ_EXPECT_COMPLETION(cqv, tag(3), 1);
487 cq_verify(cqv);
488
489 GPR_ASSERT(response_payload_recv->type == GRPC_BB_RAW);
490 GPR_ASSERT(byte_buffer_eq_string(response_payload_recv, response_str));
491
492 grpc_byte_buffer_destroy(request_payload);
493 grpc_byte_buffer_destroy(response_payload);
494 grpc_byte_buffer_destroy(request_payload_recv);
495 grpc_byte_buffer_destroy(response_payload_recv);
496 }
497
498 grpc_slice_unref(request_payload_slice);
499 grpc_slice_unref(response_payload_slice);
500
501 memset(ops, 0, sizeof(ops));
502 op = ops;
503 op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
504 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800505 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700506 op++;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800507 error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(4), nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700508 GPR_ASSERT(GRPC_CALL_OK == error);
509
510 memset(ops, 0, sizeof(ops));
511 op = ops;
512 op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
513 op->data.send_status_from_server.trailing_metadata_count = 0;
514 op->data.send_status_from_server.status = GRPC_STATUS_OK;
515 grpc_slice status_details = grpc_slice_from_static_string("xyz");
516 op->data.send_status_from_server.status_details = &status_details;
517 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800518 op->reserved = nullptr;
Muxi Yan121e7892017-07-12 12:30:41 -0700519 op++;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800520 error = grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(104), nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700521 GPR_ASSERT(GRPC_CALL_OK == error);
522
523 CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
524 CQ_EXPECT_COMPLETION(cqv, tag(4), 1);
525 CQ_EXPECT_COMPLETION(cqv, tag(101), 1);
526 CQ_EXPECT_COMPLETION(cqv, tag(104), 1);
527 cq_verify(cqv);
528
529 GPR_ASSERT(status == GRPC_STATUS_OK);
530 GPR_ASSERT(0 == grpc_slice_str_cmp(details, "xyz"));
531 GPR_ASSERT(0 == grpc_slice_str_cmp(call_details.method, "/foo"));
532 validate_host_override_string("foo.test.google.fr:1234", call_details.host,
533 config);
534 GPR_ASSERT(was_cancelled == 0);
535
536 grpc_slice_unref(details);
537 grpc_metadata_array_destroy(&initial_metadata_recv);
538 grpc_metadata_array_destroy(&trailing_metadata_recv);
539 grpc_metadata_array_destroy(&request_metadata_recv);
540 grpc_call_details_destroy(&call_details);
541
542 grpc_call_unref(c);
543 grpc_call_unref(s);
544
545 cq_verifier_destroy(cqv);
546
547 {
Yash Tibrewal8cf14702017-12-06 09:47:54 -0800548 grpc_core::ExecCtx exec_ctx;
549 grpc_channel_args_destroy(client_args);
550 grpc_channel_args_destroy(server_args);
Muxi Yan121e7892017-07-12 12:30:41 -0700551 }
552
553 end_test(&f);
554 config.tear_down_data(&f);
555}
556
557static void test_invoke_request_with_compressed_payload(
558 grpc_end2end_test_config config) {
559 request_with_payload_template(
560 config, "test_invoke_request_with_compressed_payload", 0,
Muxi Yan68a0fd52017-07-21 09:26:04 -0700561 GRPC_STREAM_COMPRESS_GZIP, GRPC_STREAM_COMPRESS_GZIP,
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800562 GRPC_STREAM_COMPRESS_GZIP, GRPC_STREAM_COMPRESS_GZIP, nullptr,
Muxi Yan121e7892017-07-12 12:30:41 -0700563 false, /* ignored */
Muxi Yandf174cc2017-07-26 16:01:48 -0700564 GRPC_STREAM_COMPRESS_LEVEL_NONE, false, false, GRPC_COMPRESS_NONE);
Muxi Yan121e7892017-07-12 12:30:41 -0700565}
566
567static void test_invoke_request_with_send_message_before_initial_metadata(
568 grpc_end2end_test_config config) {
569 request_with_payload_template(
570 config, "test_invoke_request_with_send_message_before_initial_metadata",
Muxi Yan68a0fd52017-07-21 09:26:04 -0700571 0, GRPC_STREAM_COMPRESS_GZIP, GRPC_STREAM_COMPRESS_GZIP,
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800572 GRPC_STREAM_COMPRESS_GZIP, GRPC_STREAM_COMPRESS_GZIP, nullptr,
Muxi Yan121e7892017-07-12 12:30:41 -0700573 false, /* ignored */
Muxi Yandf174cc2017-07-26 16:01:48 -0700574 GRPC_STREAM_COMPRESS_LEVEL_NONE, true, false, GRPC_COMPRESS_NONE);
Muxi Yan121e7892017-07-12 12:30:41 -0700575}
576
577static void test_invoke_request_with_server_level(
578 grpc_end2end_test_config config) {
Muxi Yan68a0fd52017-07-21 09:26:04 -0700579 request_with_payload_template(
580 config, "test_invoke_request_with_server_level", 0,
581 GRPC_STREAM_COMPRESS_NONE, GRPC_STREAM_COMPRESS_NONE,
582 GRPC_STREAM_COMPRESS_NONE, GRPC_STREAM_COMPRESS_GZIP,
Craig Tillerbe98d242017-11-10 15:26:57 -0800583 /* ignored */ nullptr, true, GRPC_STREAM_COMPRESS_LEVEL_HIGH, false,
584 false, GRPC_COMPRESS_NONE);
Muxi Yan121e7892017-07-12 12:30:41 -0700585}
586
587static void test_invoke_request_with_compressed_payload_md_override(
588 grpc_end2end_test_config config) {
589 grpc_metadata gzip_compression_override;
590 grpc_metadata identity_compression_override;
591
592 gzip_compression_override.key =
593 GRPC_MDSTR_GRPC_INTERNAL_STREAM_ENCODING_REQUEST;
594 gzip_compression_override.value = grpc_slice_from_static_string("gzip");
595 memset(&gzip_compression_override.internal_data, 0,
596 sizeof(gzip_compression_override.internal_data));
597
598 identity_compression_override.key =
599 GRPC_MDSTR_GRPC_INTERNAL_STREAM_ENCODING_REQUEST;
600 identity_compression_override.value =
601 grpc_slice_from_static_string("identity");
602 memset(&identity_compression_override.internal_data, 0,
603 sizeof(identity_compression_override.internal_data));
604
605 /* Channel default NONE (aka IDENTITY), call override to stream GZIP */
606 request_with_payload_template(
607 config, "test_invoke_request_with_compressed_payload_md_override_1", 0,
Muxi Yan68a0fd52017-07-21 09:26:04 -0700608 GRPC_STREAM_COMPRESS_NONE, GRPC_STREAM_COMPRESS_NONE,
609 GRPC_STREAM_COMPRESS_GZIP, GRPC_STREAM_COMPRESS_NONE,
610 &gzip_compression_override, false,
Muxi Yandf174cc2017-07-26 16:01:48 -0700611 /*ignored*/ GRPC_STREAM_COMPRESS_LEVEL_NONE, false, false,
612 GRPC_COMPRESS_NONE);
Muxi Yan121e7892017-07-12 12:30:41 -0700613
Muxi Yan68a0fd52017-07-21 09:26:04 -0700614 /* Channel default stream GZIP, call override to NONE (aka IDENTITY) */
Muxi Yan121e7892017-07-12 12:30:41 -0700615 request_with_payload_template(
616 config, "test_invoke_request_with_compressed_payload_md_override_3", 0,
Muxi Yan68a0fd52017-07-21 09:26:04 -0700617 GRPC_STREAM_COMPRESS_GZIP, GRPC_STREAM_COMPRESS_NONE,
618 GRPC_STREAM_COMPRESS_NONE, GRPC_STREAM_COMPRESS_NONE,
Muxi Yan121e7892017-07-12 12:30:41 -0700619 &identity_compression_override, false,
Muxi Yandf174cc2017-07-26 16:01:48 -0700620 /*ignored*/ GRPC_STREAM_COMPRESS_LEVEL_NONE, false, false,
621 GRPC_COMPRESS_NONE);
Muxi Yan121e7892017-07-12 12:30:41 -0700622}
623
624static void test_invoke_request_with_disabled_algorithm(
625 grpc_end2end_test_config config) {
626 request_for_disabled_algorithm(
627 config, "test_invoke_request_with_disabled_algorithm", 0,
628 GRPC_STREAM_COMPRESS_GZIP, GRPC_STREAM_COMPRESS_GZIP,
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800629 GRPC_STATUS_UNIMPLEMENTED, nullptr);
Muxi Yan121e7892017-07-12 12:30:41 -0700630}
631
Muxi Yan68a0fd52017-07-21 09:26:04 -0700632static void test_stream_compression_override_message_compression(
633 grpc_end2end_test_config config) {
634 grpc_stream_compression_level level = GRPC_STREAM_COMPRESS_LEVEL_MED;
635 request_with_payload_template(
636 config, "test_stream_compression_override_message_compression", 0,
637 GRPC_STREAM_COMPRESS_NONE, GRPC_STREAM_COMPRESS_NONE,
638 GRPC_STREAM_COMPRESS_NONE,
639 grpc_stream_compression_algorithm_for_level(
640 level, (1u << GRPC_STREAM_COMPRESS_ALGORITHMS_COUNT) - 1),
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800641 /* ignored */ nullptr, true, level, false, true, GRPC_COMPRESS_GZIP);
Muxi Yan68a0fd52017-07-21 09:26:04 -0700642}
643
Muxi Yan6f8217b2017-08-15 09:55:30 -0700644void stream_compression_compressed_payload(grpc_end2end_test_config config) {
Muxi Yan121e7892017-07-12 12:30:41 -0700645 test_invoke_request_with_compressed_payload(config);
646 test_invoke_request_with_send_message_before_initial_metadata(config);
647 test_invoke_request_with_server_level(config);
648 test_invoke_request_with_compressed_payload_md_override(config);
649 test_invoke_request_with_disabled_algorithm(config);
Muxi Yan68a0fd52017-07-21 09:26:04 -0700650 test_stream_compression_override_message_compression(config);
Muxi Yan121e7892017-07-12 12:30:41 -0700651}
652
Muxi Yan6f8217b2017-08-15 09:55:30 -0700653void stream_compression_compressed_payload_pre_init(void) {}