blob: 2a9072570d39468eb7fedaa8cb471a63809e2466 [file] [log] [blame]
yang-g077f6f82015-12-07 11:22:51 -08001/*
2 *
Craig Tiller6169d5f2016-03-31 07:46:18 -07003 * Copyright 2015, Google Inc.
yang-g077f6f82015-12-07 11:22:51 -08004 * 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 */
David Garcia Quintasa301eaa2016-05-06 16:59:03 -070033
34#include <limits.h>
35#include <string.h>
36
yang-g077f6f82015-12-07 11:22:51 -080037#include <grpc/grpc.h>
38#include <grpc/support/alloc.h>
yang-g4852b592015-12-07 14:20:37 -080039#include <grpc/support/host_port.h>
yang-g077f6f82015-12-07 11:22:51 -080040#include <grpc/support/log.h>
David Garcia Quintasa301eaa2016-05-06 16:59:03 -070041
yang-g077f6f82015-12-07 11:22:51 -080042#include "test/core/end2end/cq_verifier.h"
yang-g4852b592015-12-07 14:20:37 -080043#include "test/core/util/port.h"
yang-g077f6f82015-12-07 11:22:51 -080044#include "test/core/util/test_config.h"
45
Craig Tiller7536af02015-12-22 13:49:30 -080046static void *tag(intptr_t i) { return (void *)i; }
yang-g077f6f82015-12-07 11:22:51 -080047
48struct test_state {
yang-g4852b592015-12-07 14:20:37 -080049 int is_client;
yang-g077f6f82015-12-07 11:22:51 -080050 grpc_channel *chan;
51 grpc_call *call;
52 gpr_timespec deadline;
53 grpc_completion_queue *cq;
54 cq_verifier *cqv;
55 grpc_op ops[6];
56 grpc_metadata_array initial_metadata_recv;
57 grpc_metadata_array trailing_metadata_recv;
58 grpc_status_code status;
Craig Tiller7c70b6c2017-01-23 07:48:42 -080059 grpc_slice details;
yang-g4852b592015-12-07 14:20:37 -080060 grpc_call *server_call;
61 grpc_server *server;
62 grpc_metadata_array server_initial_metadata_recv;
63 grpc_call_details call_details;
yang-g077f6f82015-12-07 11:22:51 -080064};
65
66static struct test_state g_state;
67
yang-g4852b592015-12-07 14:20:37 -080068static void prepare_test(int is_client) {
Nicolas "Pixel" Nobled9a23682016-03-26 00:16:57 +010069 int port = grpc_pick_unused_port_or_die();
yang-g4852b592015-12-07 14:20:37 -080070 char *server_hostport;
71 grpc_op *op;
72 g_state.is_client = is_client;
yang-g077f6f82015-12-07 11:22:51 -080073 grpc_metadata_array_init(&g_state.initial_metadata_recv);
74 grpc_metadata_array_init(&g_state.trailing_metadata_recv);
Robbie Shadeca7effc2017-01-17 09:14:29 -050075 g_state.deadline = grpc_timeout_seconds_to_deadline(2);
yang-g077f6f82015-12-07 11:22:51 -080076 g_state.cq = grpc_completion_queue_create(NULL);
77 g_state.cqv = cq_verifier_create(g_state.cq);
Craig Tiller7c70b6c2017-01-23 07:48:42 -080078 g_state.details = grpc_empty_slice();
David Garcia Quintasa301eaa2016-05-06 16:59:03 -070079 memset(g_state.ops, 0, sizeof(g_state.ops));
yang-g077f6f82015-12-07 11:22:51 -080080
yang-g4852b592015-12-07 14:20:37 -080081 if (is_client) {
82 /* create a call, channel to a non existant server */
83 g_state.chan =
84 grpc_insecure_channel_create("nonexistant:54321", NULL, NULL);
Craig Tiller7c70b6c2017-01-23 07:48:42 -080085 grpc_slice host = grpc_slice_from_static_string("nonexistant");
yang-g4852b592015-12-07 14:20:37 -080086 g_state.call = grpc_channel_create_call(
Craig Tiller7c70b6c2017-01-23 07:48:42 -080087 g_state.chan, NULL, GRPC_PROPAGATE_DEFAULTS, g_state.cq,
88 grpc_slice_from_static_string("/Foo"), &host, g_state.deadline, NULL);
yang-g4852b592015-12-07 14:20:37 -080089 } else {
90 g_state.server = grpc_server_create(NULL, NULL);
91 grpc_server_register_completion_queue(g_state.server, g_state.cq, NULL);
yang-g4852b592015-12-07 14:20:37 -080092 gpr_join_host_port(&server_hostport, "0.0.0.0", port);
93 grpc_server_add_insecure_http2_port(g_state.server, server_hostport);
94 grpc_server_start(g_state.server);
95 gpr_free(server_hostport);
96 gpr_join_host_port(&server_hostport, "localhost", port);
97 g_state.chan = grpc_insecure_channel_create(server_hostport, NULL, NULL);
98 gpr_free(server_hostport);
Craig Tiller7c70b6c2017-01-23 07:48:42 -080099 grpc_slice host = grpc_slice_from_static_string("bar");
yang-g4852b592015-12-07 14:20:37 -0800100 g_state.call = grpc_channel_create_call(
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800101 g_state.chan, NULL, GRPC_PROPAGATE_DEFAULTS, g_state.cq,
102 grpc_slice_from_static_string("/Foo"), &host, g_state.deadline, NULL);
yang-g4852b592015-12-07 14:20:37 -0800103 grpc_metadata_array_init(&g_state.server_initial_metadata_recv);
104 grpc_call_details_init(&g_state.call_details);
105 op = g_state.ops;
106 op->op = GRPC_OP_SEND_INITIAL_METADATA;
107 op->data.send_initial_metadata.count = 0;
108 op->flags = 0;
109 op->reserved = NULL;
110 op++;
111 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(g_state.call, g_state.ops,
112 (size_t)(op - g_state.ops),
113 tag(1), NULL));
114 GPR_ASSERT(GRPC_CALL_OK ==
115 grpc_server_request_call(g_state.server, &g_state.server_call,
116 &g_state.call_details,
117 &g_state.server_initial_metadata_recv,
118 g_state.cq, g_state.cq, tag(101)));
Mark D. Roth7187ab92016-08-24 13:49:22 -0700119 CQ_EXPECT_COMPLETION(g_state.cqv, tag(101), 1);
120 CQ_EXPECT_COMPLETION(g_state.cqv, tag(1), 1);
yang-g4852b592015-12-07 14:20:37 -0800121 cq_verify(g_state.cqv);
122 }
yang-g077f6f82015-12-07 11:22:51 -0800123}
124
125static void cleanup_test() {
yang-g4852b592015-12-07 14:20:37 -0800126 grpc_call_destroy(g_state.call);
127 cq_verifier_destroy(g_state.cqv);
128 grpc_channel_destroy(g_state.chan);
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800129 grpc_slice_unref(g_state.details);
yang-g4852b592015-12-07 14:20:37 -0800130 grpc_metadata_array_destroy(&g_state.initial_metadata_recv);
131 grpc_metadata_array_destroy(&g_state.trailing_metadata_recv);
132
133 if (!g_state.is_client) {
134 grpc_call_destroy(g_state.server_call);
135 grpc_server_shutdown_and_notify(g_state.server, g_state.cq, tag(1000));
136 GPR_ASSERT(grpc_completion_queue_pluck(g_state.cq, tag(1000),
Robbie Shadeca7effc2017-01-17 09:14:29 -0500137 grpc_timeout_seconds_to_deadline(5),
Craig Tillerf40df232016-03-25 13:38:14 -0700138 NULL)
139 .type == GRPC_OP_COMPLETE);
yang-g4852b592015-12-07 14:20:37 -0800140 grpc_server_destroy(g_state.server);
141 grpc_call_details_destroy(&g_state.call_details);
142 grpc_metadata_array_destroy(&g_state.server_initial_metadata_recv);
143 }
yang-g077f6f82015-12-07 11:22:51 -0800144 grpc_completion_queue_shutdown(g_state.cq);
145 while (grpc_completion_queue_next(g_state.cq,
Craig Tillerf40df232016-03-25 13:38:14 -0700146 gpr_inf_future(GPR_CLOCK_REALTIME), NULL)
147 .type != GRPC_QUEUE_SHUTDOWN)
yang-g077f6f82015-12-07 11:22:51 -0800148 ;
149 grpc_completion_queue_destroy(g_state.cq);
yang-g077f6f82015-12-07 11:22:51 -0800150}
151
152static void test_non_null_reserved_on_start_batch() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700153 gpr_log(GPR_INFO, "test_non_null_reserved_on_start_batch");
154
yang-g4852b592015-12-07 14:20:37 -0800155 prepare_test(1);
yang-g077f6f82015-12-07 11:22:51 -0800156 GPR_ASSERT(GRPC_CALL_ERROR ==
157 grpc_call_start_batch(g_state.call, NULL, 0, NULL, tag(1)));
158 cleanup_test();
159}
160
161static void test_non_null_reserved_on_op() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700162 gpr_log(GPR_INFO, "test_non_null_reserved_on_op");
163
yang-g077f6f82015-12-07 11:22:51 -0800164 grpc_op *op;
yang-g4852b592015-12-07 14:20:37 -0800165 prepare_test(1);
yang-g077f6f82015-12-07 11:22:51 -0800166
167 op = g_state.ops;
168 op->op = GRPC_OP_SEND_INITIAL_METADATA;
169 op->data.send_initial_metadata.count = 0;
170 op->flags = 0;
171 op->reserved = tag(2);
172 op++;
173 GPR_ASSERT(GRPC_CALL_ERROR ==
174 grpc_call_start_batch(g_state.call, g_state.ops,
175 (size_t)(op - g_state.ops), tag(1), NULL));
yang-g077f6f82015-12-07 11:22:51 -0800176 cleanup_test();
177}
178
179static void test_send_initial_metadata_more_than_once() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700180 gpr_log(GPR_INFO, "test_send_initial_metadata_more_than_once");
181
yang-g077f6f82015-12-07 11:22:51 -0800182 grpc_op *op;
yang-g4852b592015-12-07 14:20:37 -0800183 prepare_test(1);
yang-g077f6f82015-12-07 11:22:51 -0800184
185 op = g_state.ops;
186 op->op = GRPC_OP_SEND_INITIAL_METADATA;
187 op->data.send_initial_metadata.count = 0;
188 op->flags = 0;
189 op->reserved = NULL;
190 op++;
191 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(g_state.call, g_state.ops,
192 (size_t)(op - g_state.ops),
193 tag(1), NULL));
Mark D. Roth7187ab92016-08-24 13:49:22 -0700194 CQ_EXPECT_COMPLETION(g_state.cqv, tag(1), 0);
yang-g077f6f82015-12-07 11:22:51 -0800195 cq_verify(g_state.cqv);
196
197 op = g_state.ops;
198 op->op = GRPC_OP_SEND_INITIAL_METADATA;
199 op->data.send_initial_metadata.count = 0;
200 op->flags = 0;
201 op->reserved = NULL;
202 op++;
203 GPR_ASSERT(GRPC_CALL_ERROR_TOO_MANY_OPERATIONS ==
204 grpc_call_start_batch(g_state.call, g_state.ops,
205 (size_t)(op - g_state.ops), tag(1), NULL));
yang-g077f6f82015-12-07 11:22:51 -0800206 cleanup_test();
207}
208
209static void test_too_many_metadata() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700210 gpr_log(GPR_INFO, "test_too_many_metadata");
211
yang-g077f6f82015-12-07 11:22:51 -0800212 grpc_op *op;
yang-g4852b592015-12-07 14:20:37 -0800213 prepare_test(1);
yang-g077f6f82015-12-07 11:22:51 -0800214
215 op = g_state.ops;
216 op->op = GRPC_OP_SEND_INITIAL_METADATA;
217 op->data.send_initial_metadata.count = (size_t)INT_MAX + 1;
218 op->flags = 0;
219 op->reserved = NULL;
220 op++;
221 GPR_ASSERT(GRPC_CALL_ERROR_INVALID_METADATA ==
222 grpc_call_start_batch(g_state.call, g_state.ops,
223 (size_t)(op - g_state.ops), tag(1), NULL));
yang-g077f6f82015-12-07 11:22:51 -0800224 cleanup_test();
225}
226
227static void test_send_null_message() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700228 gpr_log(GPR_INFO, "test_send_null_message");
229
yang-g077f6f82015-12-07 11:22:51 -0800230 grpc_op *op;
yang-g4852b592015-12-07 14:20:37 -0800231 prepare_test(1);
yang-g077f6f82015-12-07 11:22:51 -0800232
233 op = g_state.ops;
234 op->op = GRPC_OP_SEND_INITIAL_METADATA;
235 op->data.send_initial_metadata.count = 0;
236 op->flags = 0;
237 op->reserved = NULL;
238 op++;
239 op->op = GRPC_OP_SEND_MESSAGE;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800240 op->data.send_message.send_message = NULL;
yang-g077f6f82015-12-07 11:22:51 -0800241 op->flags = 0;
242 op->reserved = NULL;
243 op++;
244 GPR_ASSERT(GRPC_CALL_ERROR_INVALID_MESSAGE ==
245 grpc_call_start_batch(g_state.call, g_state.ops,
246 (size_t)(op - g_state.ops), tag(1), NULL));
247 cleanup_test();
248}
249
250static void test_send_messages_at_the_same_time() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700251 gpr_log(GPR_INFO, "test_send_messages_at_the_same_time");
252
yang-g077f6f82015-12-07 11:22:51 -0800253 grpc_op *op;
Craig Tiller28b72422016-10-26 21:15:29 -0700254 grpc_slice request_payload_slice =
255 grpc_slice_from_copied_string("hello world");
yang-g077f6f82015-12-07 11:22:51 -0800256 grpc_byte_buffer *request_payload =
257 grpc_raw_byte_buffer_create(&request_payload_slice, 1);
yang-g4852b592015-12-07 14:20:37 -0800258 prepare_test(1);
yang-g077f6f82015-12-07 11:22:51 -0800259 op = g_state.ops;
260 op->op = GRPC_OP_SEND_INITIAL_METADATA;
261 op->data.send_initial_metadata.count = 0;
262 op->flags = 0;
263 op->reserved = NULL;
264 op++;
265 op->op = GRPC_OP_SEND_MESSAGE;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800266 op->data.send_message.send_message = request_payload;
yang-g077f6f82015-12-07 11:22:51 -0800267 op->flags = 0;
268 op->reserved = NULL;
269 op++;
270 op->op = GRPC_OP_SEND_MESSAGE;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800271 op->data.send_message.send_message = tag(2);
yang-g077f6f82015-12-07 11:22:51 -0800272 op->flags = 0;
273 op->reserved = NULL;
274 op++;
275 GPR_ASSERT(GRPC_CALL_ERROR_TOO_MANY_OPERATIONS ==
276 grpc_call_start_batch(g_state.call, g_state.ops,
277 (size_t)(op - g_state.ops), tag(1), NULL));
278 grpc_byte_buffer_destroy(request_payload);
279 cleanup_test();
280}
281
282static void test_send_server_status_from_client() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700283 gpr_log(GPR_INFO, "test_send_server_status_from_client");
284
yang-g077f6f82015-12-07 11:22:51 -0800285 grpc_op *op;
yang-g4852b592015-12-07 14:20:37 -0800286 prepare_test(1);
yang-g077f6f82015-12-07 11:22:51 -0800287
288 op = g_state.ops;
289 op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
290 op->data.send_status_from_server.trailing_metadata_count = 0;
291 op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED;
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800292 grpc_slice status_details = grpc_slice_from_static_string("xyz");
293 op->data.send_status_from_server.status_details = &status_details;
yang-g077f6f82015-12-07 11:22:51 -0800294 op->flags = 0;
295 op->reserved = NULL;
296 op++;
297 GPR_ASSERT(GRPC_CALL_ERROR_NOT_ON_CLIENT ==
298 grpc_call_start_batch(g_state.call, g_state.ops,
299 (size_t)(op - g_state.ops), tag(1), NULL));
300 cleanup_test();
301}
302
303static void test_receive_initial_metadata_twice_at_client() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700304 gpr_log(GPR_INFO, "test_receive_initial_metadata_twice_at_client");
305
yang-g077f6f82015-12-07 11:22:51 -0800306 grpc_op *op;
yang-g4852b592015-12-07 14:20:37 -0800307 prepare_test(1);
yang-g077f6f82015-12-07 11:22:51 -0800308 op = g_state.ops;
309 op->op = GRPC_OP_RECV_INITIAL_METADATA;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800310 op->data.recv_initial_metadata.recv_initial_metadata =
311 &g_state.initial_metadata_recv;
yang-g077f6f82015-12-07 11:22:51 -0800312 op->flags = 0;
313 op->reserved = NULL;
314 op++;
315 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(g_state.call, g_state.ops,
316 (size_t)(op - g_state.ops),
317 tag(1), NULL));
Mark D. Roth7187ab92016-08-24 13:49:22 -0700318 CQ_EXPECT_COMPLETION(g_state.cqv, tag(1), 0);
yang-g077f6f82015-12-07 11:22:51 -0800319 cq_verify(g_state.cqv);
320 op = g_state.ops;
321 op->op = GRPC_OP_RECV_INITIAL_METADATA;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800322 op->data.recv_initial_metadata.recv_initial_metadata =
323 &g_state.initial_metadata_recv;
yang-g077f6f82015-12-07 11:22:51 -0800324 op->flags = 0;
325 op->reserved = NULL;
326 op++;
Craig Tiller620e9652015-12-14 12:02:50 -0800327 GPR_ASSERT(GRPC_CALL_ERROR_TOO_MANY_OPERATIONS ==
328 grpc_call_start_batch(g_state.call, g_state.ops,
329 (size_t)(op - g_state.ops), tag(1), NULL));
yang-g077f6f82015-12-07 11:22:51 -0800330 cleanup_test();
331}
332
333static void test_receive_message_with_invalid_flags() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700334 gpr_log(GPR_INFO, "test_receive_message_with_invalid_flags");
335
yang-g077f6f82015-12-07 11:22:51 -0800336 grpc_op *op;
337 grpc_byte_buffer *payload = NULL;
yang-g4852b592015-12-07 14:20:37 -0800338 prepare_test(1);
yang-g077f6f82015-12-07 11:22:51 -0800339 op = g_state.ops;
340 op->op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800341 op->data.recv_message.recv_message = &payload;
yang-g077f6f82015-12-07 11:22:51 -0800342 op->flags = 1;
343 op->reserved = NULL;
344 op++;
Craig Tiller620e9652015-12-14 12:02:50 -0800345 GPR_ASSERT(GRPC_CALL_ERROR_INVALID_FLAGS ==
346 grpc_call_start_batch(g_state.call, g_state.ops,
347 (size_t)(op - g_state.ops), tag(1), NULL));
yang-g077f6f82015-12-07 11:22:51 -0800348 cleanup_test();
349}
350
351static void test_receive_two_messages_at_the_same_time() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700352 gpr_log(GPR_INFO, "test_receive_two_messages_at_the_same_time");
353
yang-g077f6f82015-12-07 11:22:51 -0800354 grpc_op *op;
355 grpc_byte_buffer *payload = NULL;
yang-g4852b592015-12-07 14:20:37 -0800356 prepare_test(1);
yang-g077f6f82015-12-07 11:22:51 -0800357 op = g_state.ops;
358 op->op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800359 op->data.recv_message.recv_message = &payload;
yang-g077f6f82015-12-07 11:22:51 -0800360 op->flags = 0;
361 op->reserved = NULL;
362 op++;
363 op->op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800364 op->data.recv_message.recv_message = &payload;
yang-g077f6f82015-12-07 11:22:51 -0800365 op->flags = 0;
366 op->reserved = NULL;
367 op++;
Craig Tiller620e9652015-12-14 12:02:50 -0800368 GPR_ASSERT(GRPC_CALL_ERROR_TOO_MANY_OPERATIONS ==
369 grpc_call_start_batch(g_state.call, g_state.ops,
370 (size_t)(op - g_state.ops), tag(1), NULL));
yang-g077f6f82015-12-07 11:22:51 -0800371 cleanup_test();
372}
373
yang-g4852b592015-12-07 14:20:37 -0800374static void test_recv_close_on_server_from_client() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700375 gpr_log(GPR_INFO, "test_recv_close_on_server_from_client");
376
yang-g4852b592015-12-07 14:20:37 -0800377 grpc_op *op;
378 prepare_test(1);
379
380 op = g_state.ops;
381 op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
382 op->data.recv_close_on_server.cancelled = NULL;
383 op->flags = 0;
384 op->reserved = NULL;
385 op++;
386 GPR_ASSERT(GRPC_CALL_ERROR_NOT_ON_CLIENT ==
387 grpc_call_start_batch(g_state.call, g_state.ops,
388 (size_t)(op - g_state.ops), tag(1), NULL));
389 cleanup_test();
390}
391
392static void test_recv_status_on_client_twice() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700393 gpr_log(GPR_INFO, "test_recv_status_on_client_twice");
394
yang-g4852b592015-12-07 14:20:37 -0800395 grpc_op *op;
396 prepare_test(1);
397
398 op = g_state.ops;
399 op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
400 op->data.recv_status_on_client.trailing_metadata =
401 &g_state.trailing_metadata_recv;
402 op->data.recv_status_on_client.status = &g_state.status;
403 op->data.recv_status_on_client.status_details = &g_state.details;
yang-g4852b592015-12-07 14:20:37 -0800404 op->flags = 0;
405 op->reserved = NULL;
406 op++;
407 GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(g_state.call, g_state.ops,
408 (size_t)(op - g_state.ops),
409 tag(1), NULL));
Mark D. Roth7187ab92016-08-24 13:49:22 -0700410 CQ_EXPECT_COMPLETION(g_state.cqv, tag(1), 1);
yang-g4852b592015-12-07 14:20:37 -0800411 cq_verify(g_state.cqv);
412
413 op = g_state.ops;
414 op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
415 op->data.recv_status_on_client.trailing_metadata = NULL;
416 op->data.recv_status_on_client.status = NULL;
417 op->data.recv_status_on_client.status_details = NULL;
yang-g4852b592015-12-07 14:20:37 -0800418 op->flags = 0;
419 op->reserved = NULL;
420 op++;
421 GPR_ASSERT(GRPC_CALL_ERROR_TOO_MANY_OPERATIONS ==
422 grpc_call_start_batch(g_state.call, g_state.ops,
423 (size_t)(op - g_state.ops), tag(1), NULL));
424 cleanup_test();
425}
426
427static void test_send_close_from_client_on_server() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700428 gpr_log(GPR_INFO, "test_send_close_from_client_on_server");
429
yang-g4852b592015-12-07 14:20:37 -0800430 grpc_op *op;
431 prepare_test(0);
432
433 op = g_state.ops;
434 op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
435 op->flags = 0;
436 op->reserved = NULL;
437 op++;
438 GPR_ASSERT(GRPC_CALL_ERROR_NOT_ON_SERVER ==
439 grpc_call_start_batch(g_state.server_call, g_state.ops,
440 (size_t)(op - g_state.ops), tag(2), NULL));
441 cleanup_test();
442}
443
444static void test_recv_status_on_client_from_server() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700445 gpr_log(GPR_INFO, "test_recv_status_on_client_from_server");
446
yang-g4852b592015-12-07 14:20:37 -0800447 grpc_op *op;
448 prepare_test(0);
449
450 op = g_state.ops;
451 op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
452 op->data.recv_status_on_client.trailing_metadata =
453 &g_state.trailing_metadata_recv;
454 op->data.recv_status_on_client.status = &g_state.status;
455 op->data.recv_status_on_client.status_details = &g_state.details;
yang-g4852b592015-12-07 14:20:37 -0800456 op->flags = 0;
457 op->reserved = NULL;
458 op++;
459 GPR_ASSERT(GRPC_CALL_ERROR_NOT_ON_SERVER ==
460 grpc_call_start_batch(g_state.server_call, g_state.ops,
461 (size_t)(op - g_state.ops), tag(2), NULL));
462 cleanup_test();
463}
464
465static void test_send_status_from_server_with_invalid_flags() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700466 gpr_log(GPR_INFO, "test_send_status_from_server_with_invalid_flags");
467
yang-g4852b592015-12-07 14:20:37 -0800468 grpc_op *op;
469 prepare_test(0);
470
471 op = g_state.ops;
472 op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
473 op->data.send_status_from_server.trailing_metadata_count = 0;
474 op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED;
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800475 grpc_slice status_details = grpc_slice_from_static_string("xyz");
476 op->data.send_status_from_server.status_details = &status_details;
yang-g4852b592015-12-07 14:20:37 -0800477 op->flags = 1;
478 op->reserved = NULL;
479 op++;
480 GPR_ASSERT(GRPC_CALL_ERROR_INVALID_FLAGS ==
481 grpc_call_start_batch(g_state.server_call, g_state.ops,
482 (size_t)(op - g_state.ops), tag(2), NULL));
483 cleanup_test();
484}
485
486static void test_too_many_trailing_metadata() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700487 gpr_log(GPR_INFO, "test_too_many_trailing_metadata");
488
yang-g4852b592015-12-07 14:20:37 -0800489 grpc_op *op;
490 prepare_test(0);
491
492 op = g_state.ops;
493 op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
494 op->data.send_status_from_server.trailing_metadata_count =
495 (size_t)INT_MAX + 1;
496 op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED;
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800497 grpc_slice status_details = grpc_slice_from_static_string("xyz");
498 op->data.send_status_from_server.status_details = &status_details;
yang-g4852b592015-12-07 14:20:37 -0800499 op->flags = 0;
500 op->reserved = NULL;
501 op++;
502 GPR_ASSERT(GRPC_CALL_ERROR_INVALID_METADATA ==
503 grpc_call_start_batch(g_state.server_call, g_state.ops,
504 (size_t)(op - g_state.ops), tag(2), NULL));
505 cleanup_test();
506}
507
508static void test_send_server_status_twice() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700509 gpr_log(GPR_INFO, "test_send_server_status_twice");
510
yang-g4852b592015-12-07 14:20:37 -0800511 grpc_op *op;
512 prepare_test(0);
513
514 op = g_state.ops;
515 op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
516 op->data.send_status_from_server.trailing_metadata_count = 0;
517 op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED;
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800518 grpc_slice status_details = grpc_slice_from_static_string("xyz");
519 op->data.send_status_from_server.status_details = &status_details;
yang-g4852b592015-12-07 14:20:37 -0800520 op->flags = 0;
521 op->reserved = NULL;
522 op++;
523 op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
524 op->data.send_status_from_server.trailing_metadata_count = 0;
525 op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED;
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800526 op->data.send_status_from_server.status_details = &status_details;
yang-g4852b592015-12-07 14:20:37 -0800527 op->flags = 0;
528 op->reserved = NULL;
529 op++;
530 GPR_ASSERT(GRPC_CALL_ERROR_TOO_MANY_OPERATIONS ==
531 grpc_call_start_batch(g_state.server_call, g_state.ops,
532 (size_t)(op - g_state.ops), tag(2), NULL));
533 cleanup_test();
534}
535
536static void test_recv_close_on_server_with_invalid_flags() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700537 gpr_log(GPR_INFO, "test_recv_close_on_server_with_invalid_flags");
538
yang-g4852b592015-12-07 14:20:37 -0800539 grpc_op *op;
540 prepare_test(0);
541
542 op = g_state.ops;
543 op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
544 op->data.recv_close_on_server.cancelled = NULL;
545 op->flags = 1;
546 op->reserved = NULL;
547 op++;
548 GPR_ASSERT(GRPC_CALL_ERROR_INVALID_FLAGS ==
549 grpc_call_start_batch(g_state.server_call, g_state.ops,
550 (size_t)(op - g_state.ops), tag(2), NULL));
551 cleanup_test();
552}
553
554static void test_recv_close_on_server_twice() {
Craig Tillerebdb0072016-03-16 16:59:34 -0700555 gpr_log(GPR_INFO, "test_recv_close_on_server_twice");
556
yang-g4852b592015-12-07 14:20:37 -0800557 grpc_op *op;
558 prepare_test(0);
559
560 op = g_state.ops;
561 op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
562 op->data.recv_close_on_server.cancelled = NULL;
563 op->flags = 0;
564 op->reserved = NULL;
565 op++;
566 op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
567 op->data.recv_close_on_server.cancelled = NULL;
568 op->flags = 0;
569 op->reserved = NULL;
570 op++;
571 GPR_ASSERT(GRPC_CALL_ERROR_TOO_MANY_OPERATIONS ==
572 grpc_call_start_batch(g_state.server_call, g_state.ops,
573 (size_t)(op - g_state.ops), tag(2), NULL));
574 cleanup_test();
575}
576
yang-g92fa9602016-12-21 14:18:07 -0800577static void test_invalid_initial_metadata_reserved_key() {
578 gpr_log(GPR_INFO, "test_invalid_initial_metadata_reserved_key");
579
580 grpc_metadata metadata;
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800581 metadata.key = grpc_slice_from_static_string(":start_with_colon");
582 metadata.value = grpc_slice_from_static_string("value");
yang-g92fa9602016-12-21 14:18:07 -0800583
584 grpc_op *op;
585 prepare_test(1);
586 op = g_state.ops;
587 op->op = GRPC_OP_SEND_INITIAL_METADATA;
588 op->data.send_initial_metadata.count = 1;
589 op->data.send_initial_metadata.metadata = &metadata;
590 op->flags = 0;
591 op->reserved = NULL;
592 op++;
593 GPR_ASSERT(GRPC_CALL_ERROR_INVALID_METADATA ==
594 grpc_call_start_batch(g_state.call, g_state.ops,
595 (size_t)(op - g_state.ops), tag(1), NULL));
596 cleanup_test();
597}
598
yang-g077f6f82015-12-07 11:22:51 -0800599int main(int argc, char **argv) {
600 grpc_test_init(argc, argv);
601 grpc_init();
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800602 test_invalid_initial_metadata_reserved_key();
yang-g077f6f82015-12-07 11:22:51 -0800603 test_non_null_reserved_on_start_batch();
604 test_non_null_reserved_on_op();
605 test_send_initial_metadata_more_than_once();
606 test_too_many_metadata();
607 test_send_null_message();
608 test_send_messages_at_the_same_time();
609 test_send_server_status_from_client();
610 test_receive_initial_metadata_twice_at_client();
611 test_receive_message_with_invalid_flags();
612 test_receive_two_messages_at_the_same_time();
yang-g4852b592015-12-07 14:20:37 -0800613 test_recv_close_on_server_from_client();
614 test_recv_status_on_client_twice();
615 test_send_close_from_client_on_server();
616 test_recv_status_on_client_from_server();
617 test_send_status_from_server_with_invalid_flags();
618 test_too_many_trailing_metadata();
619 test_send_server_status_twice();
620 test_recv_close_on_server_with_invalid_flags();
621 test_recv_close_on_server_twice();
yang-g077f6f82015-12-07 11:22:51 -0800622 grpc_shutdown();
623
624 return 0;
625}