blob: b10b93978d164928227a43b7b0740b2bfa30d2d8 [file] [log] [blame]
Muxi Yand19c1122017-06-23 17:00:20 -07001/*
2 *
Muxi Yand46239a2017-06-27 16:30:46 -07003 * Copyright 2017 gRPC authors.
Muxi Yand19c1122017-06-23 17:00:20 -07004 *
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/support/alloc.h>
26#include <grpc/support/log.h>
27#include <grpc/support/time.h>
28#include <grpc/support/useful.h>
29
30#include "src/core/lib/channel/channel_args.h"
31#include "src/core/lib/slice/slice_internal.h"
32#include "src/core/lib/transport/metadata.h"
33#include "src/core/lib/transport/service_config.h"
34
35#include "test/core/end2end/cq_verifier.h"
36#include "test/core/end2end/tests/cancel_test_helpers.h"
37
Craig Tillerbaa14a92017-11-03 09:09:36 -070038static void* tag(intptr_t t) { return (void*)t; }
Muxi Yand19c1122017-06-23 17:00:20 -070039
40static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
Craig Tillerbaa14a92017-11-03 09:09:36 -070041 const char* test_name,
Mark D. Rothd4ac3a12017-09-05 13:47:15 -070042 cancellation_mode mode,
43 bool use_service_config,
Craig Tillerbaa14a92017-11-03 09:09:36 -070044 grpc_channel_args* client_args,
45 grpc_channel_args* server_args) {
Muxi Yand19c1122017-06-23 17:00:20 -070046 grpc_end2end_test_fixture f;
Mark D. Rothd4ac3a12017-09-05 13:47:15 -070047 gpr_log(GPR_INFO, "Running test: %s/%s/%s/%s", test_name, config.name,
48 mode.name, use_service_config ? "service_config" : "client_api");
Muxi Yand19c1122017-06-23 17:00:20 -070049 f = config.create_fixture(client_args, server_args);
50 config.init_server(&f, server_args);
51 config.init_client(&f, client_args);
52 return f;
53}
54
55static gpr_timespec n_seconds_from_now(int n) {
56 return grpc_timeout_seconds_to_deadline(n);
57}
58
59static gpr_timespec five_seconds_from_now(void) {
60 return n_seconds_from_now(5);
61}
62
Craig Tillerbaa14a92017-11-03 09:09:36 -070063static void drain_cq(grpc_completion_queue* cq) {
Muxi Yand19c1122017-06-23 17:00:20 -070064 grpc_event ev;
65 do {
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080066 ev = grpc_completion_queue_next(cq, five_seconds_from_now(), nullptr);
Muxi Yand19c1122017-06-23 17:00:20 -070067 } while (ev.type != GRPC_QUEUE_SHUTDOWN);
68}
69
Craig Tillerbaa14a92017-11-03 09:09:36 -070070static void shutdown_server(grpc_end2end_test_fixture* f) {
Muxi Yand19c1122017-06-23 17:00:20 -070071 if (!f->server) return;
72 grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
73 GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
74 grpc_timeout_seconds_to_deadline(5),
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080075 nullptr)
Muxi Yand19c1122017-06-23 17:00:20 -070076 .type == GRPC_OP_COMPLETE);
77 grpc_server_destroy(f->server);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080078 f->server = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -070079}
80
Craig Tillerbaa14a92017-11-03 09:09:36 -070081static void shutdown_client(grpc_end2end_test_fixture* f) {
Muxi Yand19c1122017-06-23 17:00:20 -070082 if (!f->client) return;
83 grpc_channel_destroy(f->client);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -080084 f->client = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -070085}
86
Craig Tillerbaa14a92017-11-03 09:09:36 -070087static void end_test(grpc_end2end_test_fixture* f) {
Muxi Yand19c1122017-06-23 17:00:20 -070088 shutdown_server(f);
89 shutdown_client(f);
90
91 grpc_completion_queue_shutdown(f->cq);
92 drain_cq(f->cq);
93 grpc_completion_queue_destroy(f->cq);
94 grpc_completion_queue_destroy(f->shutdown_cq);
95}
96
97/* Cancel after accept, no payload */
98static void test_cancel_after_round_trip(grpc_end2end_test_config config,
99 cancellation_mode mode,
100 bool use_service_config) {
101 grpc_op ops[6];
Craig Tillerbaa14a92017-11-03 09:09:36 -0700102 grpc_op* op;
103 grpc_call* c;
104 grpc_call* s;
Muxi Yand19c1122017-06-23 17:00:20 -0700105 grpc_metadata_array initial_metadata_recv;
106 grpc_metadata_array trailing_metadata_recv;
107 grpc_metadata_array request_metadata_recv;
108 grpc_call_details call_details;
109 grpc_status_code status;
110 grpc_call_error error;
111 grpc_slice details;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800112 grpc_byte_buffer* request_payload_recv = nullptr;
113 grpc_byte_buffer* response_payload_recv = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -0700114 grpc_slice request_payload_slice =
115 grpc_slice_from_copied_string("hello world");
116 grpc_slice response_payload_slice =
117 grpc_slice_from_copied_string("hello you");
Craig Tillerbaa14a92017-11-03 09:09:36 -0700118 grpc_byte_buffer* request_payload =
Muxi Yand19c1122017-06-23 17:00:20 -0700119 grpc_raw_byte_buffer_create(&request_payload_slice, 1);
Craig Tillerbaa14a92017-11-03 09:09:36 -0700120 grpc_byte_buffer* response_payload1 =
Ken Payson95197182017-08-29 11:31:00 -0700121 grpc_raw_byte_buffer_create(&response_payload_slice, 1);
Craig Tillerbaa14a92017-11-03 09:09:36 -0700122 grpc_byte_buffer* response_payload2 =
Muxi Yand19c1122017-06-23 17:00:20 -0700123 grpc_raw_byte_buffer_create(&response_payload_slice, 1);
124 int was_cancelled = 2;
125
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800126 grpc_channel_args* args = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -0700127 if (use_service_config) {
128 grpc_arg arg;
129 arg.type = GRPC_ARG_STRING;
Yash Tibrewal40422d52017-11-06 14:39:17 -0800130 arg.key = const_cast<char*>(GRPC_ARG_SERVICE_CONFIG);
131 arg.value.string = const_cast<char*>(
Muxi Yand19c1122017-06-23 17:00:20 -0700132 "{\n"
133 " \"methodConfig\": [ {\n"
134 " \"name\": [\n"
135 " { \"service\": \"service\", \"method\": \"method\" }\n"
136 " ],\n"
137 " \"timeout\": \"5s\"\n"
138 " } ]\n"
Yash Tibrewal34a57d02017-10-23 15:33:21 -0700139 "}");
Muxi Yand19c1122017-06-23 17:00:20 -0700140 args = grpc_channel_args_copy_and_add(args, &arg, 1);
141 }
142
Craig Tillerbe98d242017-11-10 15:26:57 -0800143 grpc_end2end_test_fixture f =
144 begin_test(config, "cancel_after_round_trip", mode, use_service_config,
145 args, nullptr);
Craig Tillerbaa14a92017-11-03 09:09:36 -0700146 cq_verifier* cqv = cq_verifier_create(f.cq);
Muxi Yand19c1122017-06-23 17:00:20 -0700147
148 gpr_timespec deadline = use_service_config
149 ? gpr_inf_future(GPR_CLOCK_MONOTONIC)
150 : five_seconds_from_now();
151 c = grpc_channel_create_call(
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800152 f.client, nullptr, GRPC_PROPAGATE_DEFAULTS, f.cq,
Muxi Yand19c1122017-06-23 17:00:20 -0700153 grpc_slice_from_static_string("/service/method"),
154 get_host_override_slice("foo.test.google.fr:1234", config), deadline,
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800155 nullptr);
Muxi Yand19c1122017-06-23 17:00:20 -0700156 GPR_ASSERT(c);
157
158 grpc_metadata_array_init(&initial_metadata_recv);
159 grpc_metadata_array_init(&trailing_metadata_recv);
160 grpc_metadata_array_init(&request_metadata_recv);
161 grpc_call_details_init(&call_details);
162
163 memset(ops, 0, sizeof(ops));
164 op = ops;
165 op->op = GRPC_OP_SEND_INITIAL_METADATA;
166 op->data.send_initial_metadata.count = 0;
167 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800168 op->reserved = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -0700169 op++;
170 op->op = GRPC_OP_SEND_MESSAGE;
171 op->data.send_message.send_message = request_payload;
172 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800173 op->reserved = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -0700174 op++;
175 op->op = GRPC_OP_RECV_INITIAL_METADATA;
176 op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv;
177 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800178 op->reserved = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -0700179 op++;
180 op->op = GRPC_OP_RECV_MESSAGE;
181 op->data.recv_message.recv_message = &response_payload_recv;
182 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800183 op->reserved = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -0700184 op++;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800185 error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(1), nullptr);
Muxi Yand19c1122017-06-23 17:00:20 -0700186 GPR_ASSERT(GRPC_CALL_OK == error);
187
188 error =
189 grpc_server_request_call(f.server, &s, &call_details,
190 &request_metadata_recv, f.cq, f.cq, tag(101));
191 GPR_ASSERT(GRPC_CALL_OK == error);
192 CQ_EXPECT_COMPLETION(cqv, tag(101), 1);
193 cq_verify(cqv);
194
195 memset(ops, 0, sizeof(ops));
196 op = ops;
197 op->op = GRPC_OP_RECV_MESSAGE;
198 op->data.recv_message.recv_message = &request_payload_recv;
199 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800200 op->reserved = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -0700201 op++;
202 op->op = GRPC_OP_SEND_INITIAL_METADATA;
203 op->data.send_initial_metadata.count = 0;
204 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800205 op->reserved = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -0700206 op++;
207 op->op = GRPC_OP_SEND_MESSAGE;
Ken Payson95197182017-08-29 11:31:00 -0700208 op->data.send_message.send_message = response_payload1;
Muxi Yand19c1122017-06-23 17:00:20 -0700209 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800210 op->reserved = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -0700211 op++;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800212 error = grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(102), nullptr);
Muxi Yand19c1122017-06-23 17:00:20 -0700213 GPR_ASSERT(GRPC_CALL_OK == error);
214
215 CQ_EXPECT_COMPLETION(cqv, tag(102), 1);
216 CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
217 cq_verify(cqv);
218
Muxi Yan0c8cb1d2017-06-27 14:00:53 -0700219 grpc_byte_buffer_destroy(request_payload_recv);
220 grpc_byte_buffer_destroy(response_payload_recv);
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800221 request_payload_recv = nullptr;
222 response_payload_recv = nullptr;
Muxi Yan0c8cb1d2017-06-27 14:00:53 -0700223
Muxi Yand19c1122017-06-23 17:00:20 -0700224 memset(ops, 0, sizeof(ops));
225 op = ops;
226 op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
227 op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
228 op->data.recv_status_on_client.status = &status;
229 op->data.recv_status_on_client.status_details = &details;
230 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800231 op->reserved = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -0700232 op++;
233 op->op = GRPC_OP_RECV_MESSAGE;
234 op->data.recv_message.recv_message = &response_payload_recv;
235 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800236 op->reserved = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -0700237 op++;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800238 error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(2), nullptr);
Muxi Yand19c1122017-06-23 17:00:20 -0700239 GPR_ASSERT(GRPC_CALL_OK == error);
240
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800241 GPR_ASSERT(GRPC_CALL_OK == mode.initiate_cancel(c, nullptr));
Muxi Yand19c1122017-06-23 17:00:20 -0700242
243 memset(ops, 0, sizeof(ops));
244 op = ops;
245 op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
246 op->data.recv_close_on_server.cancelled = &was_cancelled;
247 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800248 op->reserved = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -0700249 op++;
250 op->op = GRPC_OP_SEND_MESSAGE;
Ken Payson95197182017-08-29 11:31:00 -0700251 op->data.send_message.send_message = response_payload2;
Muxi Yand19c1122017-06-23 17:00:20 -0700252 op->flags = 0;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800253 op->reserved = nullptr;
Muxi Yand19c1122017-06-23 17:00:20 -0700254 op++;
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800255 error = grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(103), nullptr);
Muxi Yand19c1122017-06-23 17:00:20 -0700256 GPR_ASSERT(GRPC_CALL_OK == error);
257
258 CQ_EXPECT_COMPLETION(cqv, tag(2), 1);
259 CQ_EXPECT_COMPLETION(cqv, tag(103), 1);
260 cq_verify(cqv);
261
262 GPR_ASSERT(status == mode.expect_status || status == GRPC_STATUS_INTERNAL);
263 GPR_ASSERT(was_cancelled == 1);
264
265 grpc_metadata_array_destroy(&initial_metadata_recv);
266 grpc_metadata_array_destroy(&trailing_metadata_recv);
267 grpc_metadata_array_destroy(&request_metadata_recv);
268 grpc_call_details_destroy(&call_details);
269
270 grpc_byte_buffer_destroy(request_payload);
Ken Payson95197182017-08-29 11:31:00 -0700271 grpc_byte_buffer_destroy(response_payload1);
272 grpc_byte_buffer_destroy(response_payload2);
Muxi Yand19c1122017-06-23 17:00:20 -0700273 grpc_byte_buffer_destroy(request_payload_recv);
274 grpc_byte_buffer_destroy(response_payload_recv);
275 grpc_slice_unref(details);
276
277 grpc_call_unref(c);
278 grpc_call_unref(s);
279
Craig Tiller4ac2b8e2017-11-10 14:14:17 -0800280 if (args != nullptr) {
Yash Tibrewal8cf14702017-12-06 09:47:54 -0800281 grpc_core::ExecCtx exec_ctx;
282 grpc_channel_args_destroy(args);
Muxi Yand19c1122017-06-23 17:00:20 -0700283 }
284
285 cq_verifier_destroy(cqv);
286 end_test(&f);
287 config.tear_down_data(&f);
288}
289
290void cancel_after_round_trip(grpc_end2end_test_config config) {
291 unsigned i;
292
293 for (i = 0; i < GPR_ARRAY_SIZE(cancellation_modes); i++) {
294 test_cancel_after_round_trip(config, cancellation_modes[i],
295 false /* use_service_config */);
296 if (config.feature_mask & FEATURE_MASK_SUPPORTS_CLIENT_CHANNEL &&
297 cancellation_modes[i].expect_status == GRPC_STATUS_DEADLINE_EXCEEDED) {
298 test_cancel_after_round_trip(config, cancellation_modes[i],
299 true /* use_service_config */);
300 }
301 }
302}
303
304void cancel_after_round_trip_pre_init(void) {}