blob: 45d55e94bccaf07911de6159d31660e391b5b903 [file] [log] [blame]
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001/*
2 *
3 * Copyright 2014, Google Inc.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
34#include "test/core/end2end/end2end_tests.h"
35
36#include <stdio.h>
37#include <string.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080038
39#include <grpc/byte_buffer.h>
40#include <grpc/support/alloc.h>
41#include <grpc/support/log.h>
42#include <grpc/support/time.h>
jtattermusch97fb3f62014-12-08 15:13:41 -080043#include <grpc/support/string.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080044#include <grpc/support/useful.h>
45#include "test/core/end2end/cq_verifier.h"
46
47enum { TIMEOUT = 200000 };
48
49static void *tag(gpr_intptr t) { return (void *)t; }
50
51static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
52 const char *test_name,
53 grpc_channel_args *client_args,
54 grpc_channel_args *server_args) {
55 grpc_end2end_test_fixture f;
56 gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
57 f = config.create_fixture(client_args, server_args);
58 config.init_client(&f, client_args);
59 config.init_server(&f, server_args);
60 return f;
61}
62
63static gpr_timespec n_seconds_time(int n) {
64 return gpr_time_add(gpr_now(), gpr_time_from_micros(GPR_US_PER_SEC * n));
65}
66
67static gpr_timespec five_seconds_time() { return n_seconds_time(5); }
68
69static void drain_cq(grpc_completion_queue *cq) {
70 grpc_event *ev;
71 grpc_completion_type type;
72 do {
73 ev = grpc_completion_queue_next(cq, five_seconds_time());
74 GPR_ASSERT(ev);
75 type = ev->type;
76 grpc_event_finish(ev);
77 } while (type != GRPC_QUEUE_SHUTDOWN);
78}
79
80static void shutdown_server(grpc_end2end_test_fixture *f) {
81 if (!f->server) return;
82 grpc_server_shutdown(f->server);
83 grpc_server_destroy(f->server);
84 f->server = NULL;
85}
86
87static void shutdown_client(grpc_end2end_test_fixture *f) {
88 if (!f->client) return;
89 grpc_channel_destroy(f->client);
90 f->client = NULL;
91}
92
93static void end_test(grpc_end2end_test_fixture *f) {
94 shutdown_server(f);
95 shutdown_client(f);
96
97 grpc_completion_queue_shutdown(f->server_cq);
98 drain_cq(f->server_cq);
99 grpc_completion_queue_destroy(f->server_cq);
100 grpc_completion_queue_shutdown(f->client_cq);
101 drain_cq(f->client_cq);
102 grpc_completion_queue_destroy(f->client_cq);
103}
104
105static void test_no_op(grpc_end2end_test_config config) {
106 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
107 end_test(&f);
108 config.tear_down_data(&f);
109}
110
111static void simple_request_body(grpc_end2end_test_fixture f) {
112 grpc_call *c;
113 grpc_call *s;
114 grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
115 gpr_timespec deadline = five_seconds_time();
116 cq_verifier *v_client = cq_verifier_create(f.client_cq);
117 cq_verifier *v_server = cq_verifier_create(f.server_cq);
118
119 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
120 GPR_ASSERT(c);
121
122 GPR_ASSERT(GRPC_CALL_OK ==
123 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
124 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
125 cq_verify(v_client);
126
127 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(4)));
128 cq_expect_finish_accepted(v_client, tag(4), GRPC_OP_OK);
129 cq_verify(v_client);
130
131 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
132 cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
133 deadline, NULL);
134 cq_verify(v_server);
135
136 GPR_ASSERT(GRPC_CALL_OK == grpc_call_accept(s, f.server_cq, tag(102), 0));
137 cq_expect_client_metadata_read(v_client, tag(2), NULL);
138 cq_verify(v_client);
139
140 GPR_ASSERT(GRPC_CALL_OK ==
141 grpc_call_start_write_status(s, send_status, tag(5)));
142 cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
143 cq_verify(v_client);
144
145 cq_expect_finish_accepted(v_server, tag(5), GRPC_OP_OK);
146 cq_verify(v_server);
147 cq_expect_finished(v_server, tag(102), NULL);
148 cq_verify(v_server);
149
150 grpc_call_destroy(c);
151 grpc_call_destroy(s);
152
153 cq_verifier_destroy(v_client);
154 cq_verifier_destroy(v_server);
155}
156
157/* an alternative ordering of the simple request body */
158static void simple_request_body2(grpc_end2end_test_fixture f) {
159 grpc_call *c;
160 grpc_call *s;
161 grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
162 gpr_timespec deadline = five_seconds_time();
163 cq_verifier *v_client = cq_verifier_create(f.client_cq);
164 cq_verifier *v_server = cq_verifier_create(f.server_cq);
165
166 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
167 GPR_ASSERT(c);
168
169 GPR_ASSERT(GRPC_CALL_OK ==
170 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
171 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
172 cq_verify(v_client);
173
174 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(4)));
175 cq_expect_finish_accepted(v_client, tag(4), GRPC_OP_OK);
176 cq_verify(v_client);
177
178 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
179 cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
180 deadline, NULL);
181 cq_verify(v_server);
182
183 GPR_ASSERT(GRPC_CALL_OK == grpc_call_accept(s, f.server_cq, tag(102), 0));
184
185 GPR_ASSERT(GRPC_CALL_OK ==
186 grpc_call_start_write_status(s, send_status, tag(5)));
187 cq_expect_finish_accepted(v_server, tag(5), GRPC_OP_OK);
188 cq_verify(v_server);
189
190 cq_expect_client_metadata_read(v_client, tag(2), NULL);
191 cq_verify(v_client);
192
193 cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
194 cq_verify(v_client);
195
196 cq_expect_finished(v_server, tag(102), NULL);
197 cq_verify(v_server);
198
199 grpc_call_destroy(c);
200 grpc_call_destroy(s);
201
202 cq_verifier_destroy(v_client);
203 cq_verifier_destroy(v_server);
204}
205
206static void test_invoke_simple_request(
207 grpc_end2end_test_config config, const char *name,
208 void (*body)(grpc_end2end_test_fixture f)) {
jtattermusch97fb3f62014-12-08 15:13:41 -0800209 char *fullname;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800210 grpc_end2end_test_fixture f;
211
jtattermusch97fb3f62014-12-08 15:13:41 -0800212 gpr_asprintf(&fullname, "%s/%s", __FUNCTION__, name);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800213 f = begin_test(config, fullname, NULL, NULL);
214 body(f);
215 end_test(&f);
216 config.tear_down_data(&f);
jtattermusch97fb3f62014-12-08 15:13:41 -0800217 gpr_free(fullname);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800218}
219
220static void test_invoke_10_simple_requests(grpc_end2end_test_config config) {
221 int i;
222 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
223 for (i = 0; i < 10; i++) {
224 simple_request_body(f);
225 gpr_log(GPR_INFO, "Passed simple request %d", i);
226 }
227 end_test(&f);
228 config.tear_down_data(&f);
229}
230
231static void simple_delayed_request_body(grpc_end2end_test_config config,
232 grpc_end2end_test_fixture *f,
233 grpc_channel_args *client_args,
234 grpc_channel_args *server_args,
235 long delay_us) {
236 grpc_call *c;
237 grpc_call *s;
238 grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
239 gpr_timespec deadline = five_seconds_time();
240 cq_verifier *v_client = cq_verifier_create(f->client_cq);
241 cq_verifier *v_server = cq_verifier_create(f->server_cq);
242
243 config.init_client(f, client_args);
244
245 c = grpc_channel_create_call(f->client, "/foo", "test.google.com", deadline);
246 GPR_ASSERT(c);
247
248 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_invoke(c, f->client_cq, tag(1),
249 tag(2), tag(3), 0));
250 gpr_sleep_until(gpr_time_add(gpr_now(), gpr_time_from_micros(delay_us)));
251 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
252
253 config.init_server(f, server_args);
254
255 cq_verify(v_client);
256
257 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(4)));
258 cq_expect_finish_accepted(v_client, tag(4), GRPC_OP_OK);
259 cq_verify(v_client);
260
261 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f->server, tag(100)));
262 cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
263 deadline, NULL);
264 cq_verify(v_server);
265
266 GPR_ASSERT(GRPC_CALL_OK == grpc_call_accept(s, f->server_cq, tag(102), 0));
267 cq_expect_client_metadata_read(v_client, tag(2), NULL);
268 cq_verify(v_client);
269
270 GPR_ASSERT(GRPC_CALL_OK ==
271 grpc_call_start_write_status(s, send_status, tag(5)));
272 cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
273 cq_verify(v_client);
274
275 cq_expect_finish_accepted(v_server, tag(5), GRPC_OP_OK);
276 cq_expect_finished(v_server, tag(102), NULL);
277 cq_verify(v_server);
278
279 grpc_call_destroy(c);
280 grpc_call_destroy(s);
281
282 cq_verifier_destroy(v_client);
283 cq_verifier_destroy(v_server);
284}
285
286static void test_simple_delayed_request_short(grpc_end2end_test_config config) {
287 grpc_end2end_test_fixture f;
288
289 gpr_log(GPR_INFO, "%s/%s", __FUNCTION__, config.name);
290 f = config.create_fixture(NULL, NULL);
291 simple_delayed_request_body(config, &f, NULL, NULL, 100000);
292 end_test(&f);
293 config.tear_down_data(&f);
294}
295
296static void test_simple_delayed_request_long(grpc_end2end_test_config config) {
297 grpc_end2end_test_fixture f;
298
299 gpr_log(GPR_INFO, "%s/%s", __FUNCTION__, config.name);
300 f = config.create_fixture(NULL, NULL);
301 /* This timeout should be longer than a single retry */
302 simple_delayed_request_body(config, &f, NULL, NULL, 1500000);
303 end_test(&f);
304 config.tear_down_data(&f);
305}
306
307/* Client sends a request with payload, server reads then returns status. */
308static void test_invoke_request_with_payload(grpc_end2end_test_config config) {
309 grpc_call *c;
310 grpc_call *s;
311 grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
312 gpr_slice payload_slice = gpr_slice_from_copied_string("hello world");
313 grpc_byte_buffer *payload = grpc_byte_buffer_create(&payload_slice, 1);
314 gpr_timespec deadline = five_seconds_time();
315 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
316 cq_verifier *v_client = cq_verifier_create(f.client_cq);
317 cq_verifier *v_server = cq_verifier_create(f.server_cq);
318
319 /* byte buffer holds the slice, we can unref it already */
320 gpr_slice_unref(payload_slice);
321
322 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
323 GPR_ASSERT(c);
324
325 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
326
327 GPR_ASSERT(GRPC_CALL_OK ==
328 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
329 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
330 cq_verify(v_client);
331
332 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write(c, payload, tag(4), 0));
333 /* destroy byte buffer early to ensure async code keeps track of its contents
334 correctly */
335 grpc_byte_buffer_destroy(payload);
336 cq_expect_write_accepted(v_client, tag(4), GRPC_OP_OK);
337 cq_verify(v_client);
338
339 cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
340 deadline, NULL);
341 cq_verify(v_server);
342
343 grpc_call_accept(s, f.server_cq, tag(102), 0);
344 cq_expect_client_metadata_read(v_client, tag(2), NULL);
345 cq_verify(v_client);
346
347 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_read(s, tag(4)));
348 cq_expect_read(v_server, tag(4), gpr_slice_from_copied_string("hello world"));
349
350 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(5)));
351 GPR_ASSERT(GRPC_CALL_OK ==
352 grpc_call_start_write_status(s, send_status, tag(6)));
353 cq_expect_finish_accepted(v_client, tag(5), GRPC_OP_OK);
354 cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
355 cq_verify(v_client);
356
357 cq_expect_finish_accepted(v_server, tag(6), GRPC_OP_OK);
358 cq_expect_finished(v_server, tag(102), NULL);
359 cq_verify(v_server);
360
361 grpc_call_destroy(c);
362 grpc_call_destroy(s);
363
364 end_test(&f);
365 config.tear_down_data(&f);
366
367 cq_verifier_destroy(v_client);
368 cq_verifier_destroy(v_server);
369}
370
371/* test the case when there is a pending message at the client side,
372 writes_done should not return a status without a start_read.
373 Note: this test will last for 3s. Do not run in a loop. */
374static void test_writes_done_hangs_with_pending_read(
375 grpc_end2end_test_config config) {
376 grpc_call *c;
377 grpc_call *s;
378 grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
379 gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
380 gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
381 grpc_byte_buffer *request_payload =
382 grpc_byte_buffer_create(&request_payload_slice, 1);
383 grpc_byte_buffer *response_payload =
384 grpc_byte_buffer_create(&response_payload_slice, 1);
385 gpr_timespec deadline = five_seconds_time();
386 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
387 cq_verifier *v_client = cq_verifier_create(f.client_cq);
388 cq_verifier *v_server = cq_verifier_create(f.server_cq);
389
390 /* byte buffer holds the slice, we can unref it already */
391 gpr_slice_unref(request_payload_slice);
392 gpr_slice_unref(response_payload_slice);
393
394 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
395 GPR_ASSERT(c);
396
397 GPR_ASSERT(GRPC_CALL_OK ==
398 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
399 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
400 cq_verify(v_client);
401
402 GPR_ASSERT(GRPC_CALL_OK ==
403 grpc_call_start_write(c, request_payload, tag(4), 0));
404 /* destroy byte buffer early to ensure async code keeps track of its contents
405 correctly */
406 grpc_byte_buffer_destroy(request_payload);
407 cq_expect_write_accepted(v_client, tag(4), GRPC_OP_OK);
408 cq_verify(v_client);
409
410 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
411 cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
412 deadline, NULL);
413 cq_verify(v_server);
414
415 grpc_call_accept(s, f.server_cq, tag(102), 0);
416 cq_expect_client_metadata_read(v_client, tag(2), NULL);
417 cq_verify(v_client);
418
419 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_read(s, tag(5)));
420 cq_expect_read(v_server, tag(5), gpr_slice_from_copied_string("hello world"));
421 cq_verify(v_server);
422
423 GPR_ASSERT(GRPC_CALL_OK ==
424 grpc_call_start_write(s, response_payload, tag(6), 0));
425 /* destroy byte buffer early to ensure async code keeps track of its contents
426 correctly */
427 grpc_byte_buffer_destroy(response_payload);
428 cq_expect_write_accepted(v_server, tag(6), GRPC_OP_OK);
429 cq_verify(v_server);
430
431 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(6)));
432 GPR_ASSERT(GRPC_CALL_OK ==
433 grpc_call_start_write_status(s, send_status, tag(7)));
434
435 cq_expect_finish_accepted(v_client, tag(6), GRPC_OP_OK);
436 cq_verify(v_client);
437
438 /* does not return status because there is a pending message to be read */
439 cq_verify_empty(v_client);
440
441 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_read(c, tag(8)));
442 cq_expect_read(v_client, tag(8), gpr_slice_from_copied_string("hello you"));
443 cq_verify(v_client);
444
445 cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
446 cq_verify(v_client);
447
448 cq_expect_finish_accepted(v_server, tag(7), GRPC_OP_OK);
449 cq_expect_finished(v_server, tag(102), NULL);
450 cq_verify(v_server);
451
452 grpc_call_destroy(c);
453 grpc_call_destroy(s);
454
455 end_test(&f);
456 config.tear_down_data(&f);
457
458 cq_verifier_destroy(v_client);
459 cq_verifier_destroy(v_server);
460}
461
462static void request_response_with_payload(grpc_end2end_test_fixture f) {
463 grpc_call *c;
464 grpc_call *s;
465 grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
466 gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
467 gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
468 grpc_byte_buffer *request_payload =
469 grpc_byte_buffer_create(&request_payload_slice, 1);
470 grpc_byte_buffer *response_payload =
471 grpc_byte_buffer_create(&response_payload_slice, 1);
472 gpr_timespec deadline = five_seconds_time();
473 cq_verifier *v_client = cq_verifier_create(f.client_cq);
474 cq_verifier *v_server = cq_verifier_create(f.server_cq);
475
476 /* byte buffer holds the slice, we can unref it already */
477 gpr_slice_unref(request_payload_slice);
478 gpr_slice_unref(response_payload_slice);
479
480 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
481
482 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
483 GPR_ASSERT(c);
484
485 GPR_ASSERT(GRPC_CALL_OK ==
486 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
487 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
488 cq_verify(v_client);
489
490 GPR_ASSERT(GRPC_CALL_OK ==
491 grpc_call_start_write(c, request_payload, tag(4), 0));
492 /* destroy byte buffer early to ensure async code keeps track of its contents
493 correctly */
494 grpc_byte_buffer_destroy(request_payload);
495 cq_expect_write_accepted(v_client, tag(4), GRPC_OP_OK);
496 cq_verify(v_client);
497
498 cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
499 deadline, NULL);
500 cq_verify(v_server);
501
502 grpc_call_accept(s, f.server_cq, tag(102), 0);
503 cq_expect_client_metadata_read(v_client, tag(2), NULL);
504 cq_verify(v_client);
505
506 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_read(s, tag(5)));
507 cq_expect_read(v_server, tag(5), gpr_slice_from_copied_string("hello world"));
508 cq_verify(v_server);
509
510 GPR_ASSERT(GRPC_CALL_OK ==
511 grpc_call_start_write(s, response_payload, tag(6), 0));
512 /* destroy byte buffer early to ensure async code keeps track of its contents
513 correctly */
514 grpc_byte_buffer_destroy(response_payload);
515 cq_expect_write_accepted(v_server, tag(6), GRPC_OP_OK);
516 cq_verify(v_server);
517
518 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_read(c, tag(7)));
519 cq_expect_read(v_client, tag(7), gpr_slice_from_copied_string("hello you"));
520
521 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(8)));
522 GPR_ASSERT(GRPC_CALL_OK ==
523 grpc_call_start_write_status(s, send_status, tag(9)));
524
525 cq_expect_finish_accepted(v_client, tag(8), GRPC_OP_OK);
526 cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
527 cq_verify(v_client);
528
529 cq_expect_finish_accepted(v_server, tag(9), GRPC_OP_OK);
530 cq_expect_finished(v_server, tag(102), NULL);
531 cq_verify(v_server);
532
533 grpc_call_destroy(c);
534 grpc_call_destroy(s);
535
536 cq_verifier_destroy(v_client);
537 cq_verifier_destroy(v_server);
538}
539
540/* Client sends a request with payload, server reads then returns a response
541 payload and status. */
542static void test_invoke_request_response_with_payload(
543 grpc_end2end_test_config config) {
544 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
545 request_response_with_payload(f);
546 end_test(&f);
547 config.tear_down_data(&f);
548}
549
550static void test_invoke_10_request_response_with_payload(
551 grpc_end2end_test_config config) {
552 int i;
553 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
554 for (i = 0; i < 10; i++) {
555 request_response_with_payload(f);
556 }
557 end_test(&f);
558 config.tear_down_data(&f);
559}
560
561/* allow cancellation by either grpc_call_cancel, or by wait_for_deadline (which
562 * does nothing) */
563typedef grpc_call_error (*canceller)(grpc_call *call);
564
565static grpc_call_error wait_for_deadline(grpc_call *call) {
566 return GRPC_CALL_OK;
567}
568
569/* Cancel and do nothing */
570static void test_cancel_in_a_vacuum(grpc_end2end_test_config config,
571 canceller call_cancel) {
572 grpc_call *c;
573 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
574 gpr_timespec deadline = five_seconds_time();
575 cq_verifier *v_client = cq_verifier_create(f.client_cq);
576
577 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
578 GPR_ASSERT(c);
579
580 GPR_ASSERT(GRPC_CALL_OK == call_cancel(c));
581
582 grpc_call_destroy(c);
583
584 cq_verifier_destroy(v_client);
585 end_test(&f);
586 config.tear_down_data(&f);
587}
588
589/* Cancel before invoke */
590static void test_cancel_before_invoke(grpc_end2end_test_config config) {
591 grpc_call *c;
592 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
593 gpr_timespec deadline = five_seconds_time();
594 cq_verifier *v_client = cq_verifier_create(f.client_cq);
595 grpc_status chk_status = {GRPC_STATUS_CANCELLED, NULL};
596
597 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
598 GPR_ASSERT(c);
599
600 GPR_ASSERT(GRPC_CALL_OK == grpc_call_cancel(c));
601
602 GPR_ASSERT(GRPC_CALL_OK ==
603 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
604 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_ERROR);
605 cq_expect_client_metadata_read(v_client, tag(2), NULL);
606 cq_expect_finished_with_status(v_client, tag(3), chk_status, NULL);
607 cq_verify(v_client);
608
609 grpc_call_destroy(c);
610
611 cq_verifier_destroy(v_client);
612 end_test(&f);
613 config.tear_down_data(&f);
614}
615
616/* Cancel after invoke, no payload */
617static void test_cancel_after_invoke(grpc_end2end_test_config config,
618 canceller call_cancel) {
619 grpc_call *c;
620 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
621 gpr_timespec deadline = five_seconds_time();
622 cq_verifier *v_client = cq_verifier_create(f.client_cq);
623 grpc_status chk_status = {GRPC_STATUS_CANCELLED, NULL};
624
625 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
626 GPR_ASSERT(c);
627
628 GPR_ASSERT(GRPC_CALL_OK ==
629 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
630 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
631 cq_verify(v_client);
632
633 GPR_ASSERT(GRPC_CALL_OK == call_cancel(c));
634
635 cq_expect_client_metadata_read(v_client, tag(2), NULL);
636 cq_expect_finished_with_status(v_client, tag(3), chk_status, NULL);
637 cq_verify(v_client);
638
639 grpc_call_destroy(c);
640
641 cq_verifier_destroy(v_client);
642 end_test(&f);
643 config.tear_down_data(&f);
644}
645
646/* Cancel after accept, no payload */
647static void test_cancel_after_accept(grpc_end2end_test_config config,
648 canceller call_cancel) {
649 grpc_call *c;
650 grpc_call *s;
651 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
652 gpr_timespec deadline = five_seconds_time();
653 cq_verifier *v_client = cq_verifier_create(f.client_cq);
654 cq_verifier *v_server = cq_verifier_create(f.server_cq);
655 grpc_status chk_status = {GRPC_STATUS_CANCELLED, NULL};
656
657 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
658 GPR_ASSERT(c);
659
660 GPR_ASSERT(GRPC_CALL_OK ==
661 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
662 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
663 cq_verify(v_client);
664
665 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
666 cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
667 deadline, NULL);
668 cq_verify(v_server);
669
670 GPR_ASSERT(GRPC_CALL_OK == grpc_call_accept(s, f.server_cq, tag(102), 0));
671 cq_expect_client_metadata_read(v_client, tag(2), NULL);
672 cq_verify(v_client);
673
674 GPR_ASSERT(GRPC_CALL_OK == call_cancel(c));
675
676 cq_expect_finished_with_status(v_client, tag(3), chk_status, NULL);
677 cq_verify(v_client);
678
679 cq_expect_finished_with_status(v_server, tag(102), chk_status, NULL);
680 cq_verify(v_server);
681
682 grpc_call_destroy(c);
683 grpc_call_destroy(s);
684
685 cq_verifier_destroy(v_client);
686 cq_verifier_destroy(v_server);
687 end_test(&f);
688 config.tear_down_data(&f);
689}
690
691/* Cancel after accept with a writes closed, no payload */
692static void test_cancel_after_accept_and_writes_closed(
693 grpc_end2end_test_config config, canceller call_cancel) {
694 grpc_call *c;
695 grpc_call *s;
696 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
697 gpr_timespec deadline = five_seconds_time();
698 cq_verifier *v_client = cq_verifier_create(f.client_cq);
699 cq_verifier *v_server = cq_verifier_create(f.server_cq);
700 grpc_status chk_status = {GRPC_STATUS_CANCELLED, NULL};
701
702 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
703 GPR_ASSERT(c);
704
705 GPR_ASSERT(GRPC_CALL_OK ==
706 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
707 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
708 cq_verify(v_client);
709
710 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
711 cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
712 deadline, NULL);
713 cq_verify(v_server);
714
715 GPR_ASSERT(GRPC_CALL_OK == grpc_call_accept(s, f.server_cq, tag(102), 0));
716 cq_expect_client_metadata_read(v_client, tag(2), NULL);
717 cq_verify(v_client);
718
719 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(4)));
720 cq_expect_finish_accepted(v_client, tag(4), GRPC_OP_OK);
721 cq_verify(v_client);
722
723 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_read(s, tag(101)));
724 cq_expect_empty_read(v_server, tag(101));
725 cq_verify(v_server);
726
727 GPR_ASSERT(GRPC_CALL_OK == call_cancel(c));
728
729 cq_expect_finished_with_status(v_client, tag(3), chk_status, NULL);
730 cq_verify(v_client);
731
732 cq_expect_finished_with_status(v_server, tag(102), chk_status, NULL);
733 cq_verify(v_server);
734
735 grpc_call_destroy(c);
736 grpc_call_destroy(s);
737
738 cq_verifier_destroy(v_client);
739 cq_verifier_destroy(v_server);
740 end_test(&f);
741 config.tear_down_data(&f);
742}
743
744/* Request/response with metadata and payload.*/
745static void test_request_response_with_metadata_and_payload(
746 grpc_end2end_test_config config) {
747 grpc_call *c;
748 grpc_call *s;
749 grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
750 gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
751 gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
752 grpc_byte_buffer *request_payload =
753 grpc_byte_buffer_create(&request_payload_slice, 1);
754 grpc_byte_buffer *response_payload =
755 grpc_byte_buffer_create(&response_payload_slice, 1);
756 gpr_timespec deadline = five_seconds_time();
757 grpc_metadata meta1 = {"key1", "val1", 4};
758 grpc_metadata meta2 = {"key2", "val2", 4};
759 grpc_metadata meta3 = {"key3", "val3", 4};
760 grpc_metadata meta4 = {"key4", "val4", 4};
761 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
762 cq_verifier *v_client = cq_verifier_create(f.client_cq);
763 cq_verifier *v_server = cq_verifier_create(f.server_cq);
764
765 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
766
767 /* byte buffer holds the slice, we can unref it already */
768 gpr_slice_unref(request_payload_slice);
769 gpr_slice_unref(response_payload_slice);
770
771 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
772 GPR_ASSERT(c);
773
774 /* add multiple metadata */
775 GPR_ASSERT(GRPC_CALL_OK == grpc_call_add_metadata(c, &meta1, 0));
776 GPR_ASSERT(GRPC_CALL_OK == grpc_call_add_metadata(c, &meta2, 0));
777
778 GPR_ASSERT(GRPC_CALL_OK ==
779 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
780 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
781 cq_verify(v_client);
782
783 GPR_ASSERT(GRPC_CALL_OK ==
784 grpc_call_start_write(c, request_payload, tag(4), 0));
785 /* destroy byte buffer early to ensure async code keeps track of its contents
786 correctly */
787 grpc_byte_buffer_destroy(request_payload);
788 cq_expect_write_accepted(v_client, tag(4), GRPC_OP_OK);
789 cq_verify(v_client);
790
791 cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
792 deadline, "key1", "val1", "key2", "val2", NULL);
793 cq_verify(v_server);
794
795 /* add multiple metadata */
796 GPR_ASSERT(GRPC_CALL_OK == grpc_call_add_metadata(s, &meta3, 0));
797 GPR_ASSERT(GRPC_CALL_OK == grpc_call_add_metadata(s, &meta4, 0));
798
799 grpc_call_accept(s, f.server_cq, tag(102), 0);
800
801 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_read(s, tag(5)));
802 cq_expect_read(v_server, tag(5), gpr_slice_from_copied_string("hello world"));
803 cq_verify(v_server);
804
805 GPR_ASSERT(GRPC_CALL_OK ==
806 grpc_call_start_write(s, response_payload, tag(6), 0));
807 /* destroy byte buffer early to ensure async code keeps track of its contents
808 correctly */
809 grpc_byte_buffer_destroy(response_payload);
810 cq_expect_write_accepted(v_server, tag(6), GRPC_OP_OK);
811 cq_verify(v_server);
812
813 /* fetch metadata.. */
814 cq_expect_client_metadata_read(v_client, tag(2), "key3", "val3", "key4",
815 "val4", NULL);
816 cq_verify(v_client);
817
818 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_read(c, tag(7)));
819 cq_expect_read(v_client, tag(7), gpr_slice_from_copied_string("hello you"));
820 cq_verify(v_client);
821
822 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(8)));
823 GPR_ASSERT(GRPC_CALL_OK ==
824 grpc_call_start_write_status(s, send_status, tag(9)));
825
826 cq_expect_finish_accepted(v_client, tag(8), GRPC_OP_OK);
827 cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
828 cq_verify(v_client);
829
830 cq_expect_finish_accepted(v_server, tag(9), GRPC_OP_OK);
831 cq_expect_finished(v_server, tag(102), NULL);
832 cq_verify(v_server);
833
834 grpc_call_destroy(c);
835 grpc_call_destroy(s);
836
837 end_test(&f);
838 config.tear_down_data(&f);
839
840 cq_verifier_destroy(v_client);
841 cq_verifier_destroy(v_server);
842}
843
844/* Request with a large amount of metadata.*/
845static void test_request_with_large_metadata(grpc_end2end_test_config config) {
846 grpc_call *c;
847 grpc_call *s;
848 grpc_status send_status = {GRPC_STATUS_OK, NULL};
849 gpr_timespec deadline = five_seconds_time();
850 grpc_metadata meta;
851 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
852 cq_verifier *v_client = cq_verifier_create(f.client_cq);
853 cq_verifier *v_server = cq_verifier_create(f.server_cq);
854 const int large_size = 64 * 1024;
855
856 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
857
858 meta.key = "key";
859 meta.value = gpr_malloc(large_size + 1);
860 memset(meta.value, 'a', large_size);
861 meta.value[large_size] = 0;
862 meta.value_length = large_size;
863
864 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
865 GPR_ASSERT(c);
866
867 /* add the metadata */
868 GPR_ASSERT(GRPC_CALL_OK == grpc_call_add_metadata(c, &meta, 0));
869
870 GPR_ASSERT(GRPC_CALL_OK ==
871 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
872 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
873 cq_verify(v_client);
874
875 cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
876 deadline, "key", meta.value, NULL);
877 cq_verify(v_server);
878
879 grpc_call_accept(s, f.server_cq, tag(102), 0);
880
881 /* fetch metadata.. */
882 cq_expect_client_metadata_read(v_client, tag(2), NULL);
883 cq_verify(v_client);
884
885 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(8)));
886 GPR_ASSERT(GRPC_CALL_OK ==
887 grpc_call_start_write_status(s, send_status, tag(9)));
888
889 cq_expect_finish_accepted(v_client, tag(8), GRPC_OP_OK);
890 cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
891 cq_verify(v_client);
892
893 cq_expect_finish_accepted(v_server, tag(9), GRPC_OP_OK);
894 cq_expect_finished(v_server, tag(102), NULL);
895 cq_verify(v_server);
896
897 grpc_call_destroy(c);
898 grpc_call_destroy(s);
899
900 end_test(&f);
901 config.tear_down_data(&f);
902
903 cq_verifier_destroy(v_client);
904 cq_verifier_destroy(v_server);
905
906 gpr_free(meta.value);
907}
908
909/* Client pings and server pongs. Repeat messages rounds before finishing. */
910static void test_pingpong_streaming(grpc_end2end_test_config config,
911 int messages) {
912 int i;
913 grpc_call *c;
914 grpc_call *s = NULL;
915 grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
916 gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
917 gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
918 grpc_byte_buffer *request_payload = NULL;
919 grpc_byte_buffer *response_payload = NULL;
920 gpr_timespec deadline = n_seconds_time(messages * 5);
921 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
922 cq_verifier *v_client = cq_verifier_create(f.client_cq);
923 cq_verifier *v_server = cq_verifier_create(f.server_cq);
924
925 gpr_log(GPR_INFO, "testing with %d message pairs.", messages);
926 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
927 GPR_ASSERT(c);
928
929 GPR_ASSERT(GRPC_CALL_OK ==
930 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
931 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
932
933 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
934
935 cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
936 deadline, NULL);
937 cq_verify(v_server);
938 grpc_call_accept(s, f.server_cq, tag(102), 0);
939
940 cq_expect_client_metadata_read(v_client, tag(2), NULL);
941 cq_verify(v_client);
942
943 for (i = 0; i < messages; i++) {
944 request_payload = grpc_byte_buffer_create(&request_payload_slice, 1);
945 GPR_ASSERT(GRPC_CALL_OK ==
946 grpc_call_start_write(c, request_payload, tag(2), 0));
947 /* destroy byte buffer early to ensure async code keeps track of its
948 contents
949 correctly */
950 grpc_byte_buffer_destroy(request_payload);
951 cq_expect_write_accepted(v_client, tag(2), GRPC_OP_OK);
952 cq_verify(v_client);
953
954 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_read(s, tag(3)));
955 cq_expect_read(v_server, tag(3),
956 gpr_slice_from_copied_string("hello world"));
957 cq_verify(v_server);
958
959 response_payload = grpc_byte_buffer_create(&response_payload_slice, 1);
960 GPR_ASSERT(GRPC_CALL_OK ==
961 grpc_call_start_write(s, response_payload, tag(4), 0));
962 /* destroy byte buffer early to ensure async code keeps track of its
963 contents
964 correctly */
965 grpc_byte_buffer_destroy(response_payload);
966 cq_expect_write_accepted(v_server, tag(4), GRPC_OP_OK);
967 cq_verify(v_server);
968
969 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_read(c, tag(5)));
970 cq_expect_read(v_client, tag(5), gpr_slice_from_copied_string("hello you"));
971 cq_verify(v_client);
972 }
973
974 gpr_slice_unref(request_payload_slice);
975 gpr_slice_unref(response_payload_slice);
976
977 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(6)));
978 GPR_ASSERT(GRPC_CALL_OK ==
979 grpc_call_start_write_status(s, send_status, tag(7)));
980
981 cq_expect_finish_accepted(v_client, tag(6), GRPC_OP_OK);
982 cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
983 cq_verify(v_client);
984
985 cq_expect_finish_accepted(v_server, tag(7), GRPC_OP_OK);
986 cq_expect_finished(v_server, tag(102), NULL);
987 cq_verify(v_server);
988
989 grpc_call_destroy(c);
990 grpc_call_destroy(s);
991
992 end_test(&f);
993 config.tear_down_data(&f);
994
995 cq_verifier_destroy(v_client);
996 cq_verifier_destroy(v_server);
997}
998
999static void test_early_server_shutdown_finishes_tags(
1000 grpc_end2end_test_config config) {
1001 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
1002 cq_verifier *v_server = cq_verifier_create(f.server_cq);
1003 grpc_call *s = (void *)1;
1004
1005 /* upon shutdown, the server should finish all requested calls indicating
1006 no new call */
1007 grpc_server_request_call(f.server, tag(1000));
1008 grpc_server_shutdown(f.server);
1009 cq_expect_server_rpc_new(v_server, &s, tag(1000), NULL, NULL, gpr_inf_past,
1010 NULL);
1011 cq_verify(v_server);
1012 GPR_ASSERT(s == NULL);
1013
1014 end_test(&f);
1015 config.tear_down_data(&f);
1016 cq_verifier_destroy(v_server);
1017}
1018
1019static void test_early_server_shutdown_finishes_inflight_calls(
1020 grpc_end2end_test_config config) {
1021 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
1022 grpc_call *c;
1023 grpc_call *s;
1024 grpc_status expect_status = {GRPC_STATUS_UNAVAILABLE, NULL};
1025 gpr_timespec deadline = five_seconds_time();
1026 cq_verifier *v_client = cq_verifier_create(f.client_cq);
1027 cq_verifier *v_server = cq_verifier_create(f.server_cq);
1028
1029 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
1030 GPR_ASSERT(c);
1031
1032 GPR_ASSERT(GRPC_CALL_OK ==
1033 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
1034 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
1035 cq_verify(v_client);
1036
1037 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(4)));
1038 cq_expect_finish_accepted(v_client, tag(4), GRPC_OP_OK);
1039 cq_verify(v_client);
1040
1041 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
1042 cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
1043 deadline, NULL);
1044 cq_verify(v_server);
1045
1046 GPR_ASSERT(GRPC_CALL_OK == grpc_call_accept(s, f.server_cq, tag(102), 0));
1047 cq_expect_client_metadata_read(v_client, tag(2), NULL);
1048 cq_verify(v_client);
1049
1050 /* shutdown and destroy the server */
1051 shutdown_server(&f);
1052
1053 cq_expect_finished(v_server, tag(102), NULL);
1054 cq_verify(v_server);
1055
1056 grpc_call_destroy(s);
1057
1058 cq_expect_finished_with_status(v_client, tag(3), expect_status, NULL);
1059 cq_verify(v_client);
1060
1061 grpc_call_destroy(c);
1062
1063 cq_verifier_destroy(v_client);
1064 cq_verifier_destroy(v_server);
1065
1066 end_test(&f);
1067 config.tear_down_data(&f);
1068}
1069
1070static void test_max_concurrent_streams(grpc_end2end_test_config config) {
1071 grpc_end2end_test_fixture f;
1072 grpc_arg server_arg;
1073 grpc_channel_args server_args;
1074 grpc_call *c1;
1075 grpc_call *c2;
1076 grpc_call *s1;
1077 grpc_call *s2;
1078 gpr_timespec deadline;
1079 grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
1080 cq_verifier *v_client;
1081 cq_verifier *v_server;
1082
1083 server_arg.key = GRPC_ARG_MAX_CONCURRENT_STREAMS;
1084 server_arg.type = GRPC_ARG_INTEGER;
1085 server_arg.value.integer = 1;
1086
1087 server_args.num_args = 1;
1088 server_args.args = &server_arg;
1089
1090 f = begin_test(config, __FUNCTION__, NULL, &server_args);
1091 v_client = cq_verifier_create(f.client_cq);
1092 v_server = cq_verifier_create(f.server_cq);
1093
1094 /* perform a ping-pong to ensure that settings have had a chance to round
1095 trip */
1096 simple_request_body(f);
1097 /* perform another one to make sure that the one stream case still works */
1098 simple_request_body(f);
1099
1100 /* start two requests - ensuring that the second is not accepted until
1101 the first completes */
1102 deadline = five_seconds_time();
1103 c1 = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
1104 GPR_ASSERT(c1);
1105 c2 = grpc_channel_create_call(f.client, "/bar", "test.google.com", deadline);
1106 GPR_ASSERT(c1);
1107
1108 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
1109
1110 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_invoke(c1, f.client_cq, tag(300),
1111 tag(301), tag(302), 0));
1112 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_invoke(c2, f.client_cq, tag(400),
1113 tag(401), tag(402), 0));
1114 cq_expect_invoke_accepted(v_client, tag(300), GRPC_OP_OK);
1115 cq_verify(v_client);
1116
1117 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c1, tag(303)));
1118 cq_expect_finish_accepted(v_client, tag(303), GRPC_OP_OK);
1119 cq_verify(v_client);
1120
1121 cq_expect_server_rpc_new(v_server, &s1, tag(100), "/foo", "test.google.com",
1122 deadline, NULL);
1123 cq_verify(v_server);
1124
1125 GPR_ASSERT(GRPC_CALL_OK == grpc_call_accept(s1, f.server_cq, tag(102), 0));
1126 cq_expect_client_metadata_read(v_client, tag(301), NULL);
1127 cq_verify(v_client);
1128
1129 GPR_ASSERT(GRPC_CALL_OK ==
1130 grpc_call_start_write_status(s1, send_status, tag(103)));
1131 cq_expect_finish_accepted(v_server, tag(103), GRPC_OP_OK);
1132 cq_expect_finished(v_server, tag(102), NULL);
1133 cq_verify(v_server);
1134
1135 /* first request is finished, we should be able to start the second */
1136 cq_expect_finished_with_status(v_client, tag(302), send_status, NULL);
1137 cq_expect_invoke_accepted(v_client, tag(400), GRPC_OP_OK);
1138 cq_verify(v_client);
1139
1140 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c2, tag(403)));
1141 cq_expect_finish_accepted(v_client, tag(403), GRPC_OP_OK);
1142 cq_verify(v_client);
1143
1144 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(200)));
1145 cq_expect_server_rpc_new(v_server, &s2, tag(200), "/bar", "test.google.com",
1146 deadline, NULL);
1147 cq_verify(v_server);
1148
1149 GPR_ASSERT(GRPC_CALL_OK == grpc_call_accept(s2, f.server_cq, tag(202), 0));
1150 cq_expect_client_metadata_read(v_client, tag(401), NULL);
1151 cq_verify(v_client);
1152
1153 GPR_ASSERT(GRPC_CALL_OK ==
1154 grpc_call_start_write_status(s2, send_status, tag(203)));
1155 cq_expect_finish_accepted(v_server, tag(203), GRPC_OP_OK);
1156 cq_expect_finished(v_server, tag(202), NULL);
1157 cq_verify(v_server);
1158
1159 cq_expect_finished_with_status(v_client, tag(402), send_status, NULL);
1160 cq_verify(v_client);
1161
1162 cq_verifier_destroy(v_client);
1163 cq_verifier_destroy(v_server);
1164
1165 grpc_call_destroy(c1);
1166 grpc_call_destroy(s1);
1167 grpc_call_destroy(c2);
1168 grpc_call_destroy(s2);
1169
1170 end_test(&f);
1171 config.tear_down_data(&f);
1172}
1173
1174static gpr_slice large_slice() {
1175 gpr_slice slice = gpr_slice_malloc(1000000);
1176 memset(GPR_SLICE_START_PTR(slice), 0xab, GPR_SLICE_LENGTH(slice));
1177 return slice;
1178}
1179
1180static void test_invoke_large_request(grpc_end2end_test_config config) {
1181 grpc_call *c;
1182 grpc_call *s;
1183 grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
1184 gpr_slice request_payload_slice = large_slice();
1185 grpc_byte_buffer *request_payload =
1186 grpc_byte_buffer_create(&request_payload_slice, 1);
1187 gpr_timespec deadline = five_seconds_time();
1188 grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
1189 cq_verifier *v_client = cq_verifier_create(f.client_cq);
1190 cq_verifier *v_server = cq_verifier_create(f.server_cq);
1191
1192 /* byte buffer holds the slice, we can unref it already */
1193 gpr_slice_unref(request_payload_slice);
1194
1195 GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
1196
1197 c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
1198 GPR_ASSERT(c);
1199
1200 GPR_ASSERT(GRPC_CALL_OK ==
1201 grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
1202 cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
1203 cq_verify(v_client);
1204
1205 GPR_ASSERT(GRPC_CALL_OK ==
1206 grpc_call_start_write(c, request_payload, tag(4), 0));
1207 /* destroy byte buffer early to ensure async code keeps track of its contents
1208 correctly */
1209 grpc_byte_buffer_destroy(request_payload);
1210 /* write should not be accepted until the server is willing to read the
1211 request (as this request is very large) */
1212 cq_verify_empty(v_client);
1213
1214 cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
1215 deadline, NULL);
1216 cq_verify(v_server);
1217
1218 grpc_call_accept(s, f.server_cq, tag(102), 0);
1219 cq_expect_client_metadata_read(v_client, tag(2), NULL);
1220 cq_verify(v_client);
1221
1222 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_read(s, tag(5)));
1223 /* now the write can be accepted */
1224 cq_expect_write_accepted(v_client, tag(4), GRPC_OP_OK);
1225 cq_verify(v_client);
1226 cq_expect_read(v_server, tag(5), large_slice());
1227 cq_verify(v_server);
1228
1229 GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(8)));
1230 GPR_ASSERT(GRPC_CALL_OK ==
1231 grpc_call_start_write_status(s, send_status, tag(9)));
1232
1233 cq_expect_finish_accepted(v_client, tag(8), GRPC_OP_OK);
1234 cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
1235 cq_verify(v_client);
1236
1237 cq_expect_finish_accepted(v_server, tag(9), GRPC_OP_OK);
1238 cq_expect_finished(v_server, tag(102), NULL);
1239 cq_verify(v_server);
1240
1241 grpc_call_destroy(c);
1242 grpc_call_destroy(s);
1243
1244 cq_verifier_destroy(v_client);
1245 cq_verifier_destroy(v_server);
1246
1247 end_test(&f);
1248 config.tear_down_data(&f);
1249}
1250
1251void grpc_end2end_tests(grpc_end2end_test_config config) {
1252 int i;
1253 canceller cancellers[2] = {grpc_call_cancel, wait_for_deadline};
1254
1255 test_no_op(config);
1256 test_invoke_simple_request(config, "simple_request_body",
1257 simple_request_body);
1258 test_invoke_simple_request(config, "simple_request_body2",
1259 simple_request_body2);
1260 test_invoke_10_simple_requests(config);
1261 if (config.feature_mask & FEATURE_MASK_SUPPORTS_DELAYED_CONNECTION) {
1262 test_simple_delayed_request_short(config);
1263 test_simple_delayed_request_long(config);
1264 }
1265 test_invoke_request_with_payload(config);
1266 test_request_response_with_metadata_and_payload(config);
1267 test_request_with_large_metadata(config);
1268 test_writes_done_hangs_with_pending_read(config);
1269 test_invoke_request_response_with_payload(config);
1270 test_invoke_10_request_response_with_payload(config);
1271 test_early_server_shutdown_finishes_tags(config);
1272 test_early_server_shutdown_finishes_inflight_calls(config);
1273 test_max_concurrent_streams(config);
1274 test_invoke_large_request(config);
1275 for (i = 0; i < GPR_ARRAY_SIZE(cancellers); i++) {
1276 test_cancel_in_a_vacuum(config, cancellers[i]);
1277 test_cancel_after_invoke(config, cancellers[i]);
1278 test_cancel_after_accept(config, cancellers[i]);
1279 test_cancel_after_accept_and_writes_closed(config, cancellers[i]);
1280 }
1281 test_cancel_before_invoke(config);
1282 for (i = 1; i < 10; i++) {
1283 test_pingpong_streaming(config, i);
1284 }
1285}