blob: 9ec9701f9cc6f0ba2eff799641eda4932ec02ad1 [file] [log] [blame]
Julien Boeuf9f218dd2015-04-23 10:24:02 -07001/*
2 *
Craig Tiller6169d5f2016-03-31 07:46:18 -07003 * Copyright 2015, Google Inc.
Julien Boeuf9f218dd2015-04-23 10:24:02 -07004 * 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>
Julien Boeuf9f218dd2015-04-23 10:24:02 -070038
Julien Boeuf9f218dd2015-04-23 10:24:02 -070039#include <grpc/byte_buffer.h>
Craig Tillerf40df232016-03-25 13:38:14 -070040#include <grpc/grpc_security.h>
Julien Boeuf9f218dd2015-04-23 10:24:02 -070041#include <grpc/support/alloc.h>
42#include <grpc/support/log.h>
43#include <grpc/support/time.h>
44#include <grpc/support/useful.h>
Julien Boeuf8ca294e2016-05-02 14:56:30 -070045#include "src/core/lib/security/credentials/credentials.h"
Craig Tiller9533d042016-03-25 17:11:06 -070046#include "src/core/lib/support/string.h"
Craig Tillerf40df232016-03-25 13:38:14 -070047#include "test/core/end2end/cq_verifier.h"
Julien Boeuf9f218dd2015-04-23 10:24:02 -070048
49static const char iam_token[] = "token";
50static const char iam_selector[] = "selector";
51static const char overridden_iam_token[] = "overridden_token";
52static const char overridden_iam_selector[] = "overridden_selector";
53
Craig Tiller9a576332015-06-17 10:21:49 -070054typedef enum { NONE, OVERRIDE, DESTROY } override_mode;
Julien Boeuf9f218dd2015-04-23 10:24:02 -070055
Craig Tiller7536af02015-12-22 13:49:30 -080056static void *tag(intptr_t t) { return (void *)t; }
Julien Boeuf9f218dd2015-04-23 10:24:02 -070057
58static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
59 const char *test_name,
Julien Boeuf77a7b872015-08-05 20:11:02 -070060 int fail_server_auth_check) {
Julien Boeuf9f218dd2015-04-23 10:24:02 -070061 grpc_end2end_test_fixture f;
Robbie Shade55a046a2017-01-25 15:14:28 -050062 gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
Julien Boeufea456fc2015-07-07 15:23:30 -070063 f = config.create_fixture(NULL, NULL);
Mark D. Rothe127a392016-10-27 08:27:15 -070064 config.init_client(&f, NULL);
Julien Boeuf77a7b872015-08-05 20:11:02 -070065 if (fail_server_auth_check) {
66 grpc_arg fail_auth_arg = {
67 GRPC_ARG_STRING, FAIL_AUTH_CHECK_SERVER_ARG_NAME, {NULL}};
68 grpc_channel_args args;
Craig Tillerd6c98df2015-08-18 09:33:44 -070069 args.num_args = 1;
Julien Boeuf77a7b872015-08-05 20:11:02 -070070 args.args = &fail_auth_arg;
71 config.init_server(&f, &args);
72 } else {
73 config.init_server(&f, NULL);
74 }
Julien Boeuf9f218dd2015-04-23 10:24:02 -070075 return f;
76}
77
Chris Evansed2a5472017-03-27 17:34:51 -050078static gpr_timespec n_seconds_from_now(int n) {
Robbie Shadeca7effc2017-01-17 09:14:29 -050079 return grpc_timeout_seconds_to_deadline(n);
Julien Boeuf9f218dd2015-04-23 10:24:02 -070080}
81
Chris Evansed2a5472017-03-27 17:34:51 -050082static gpr_timespec five_seconds_from_now(void) {
83 return n_seconds_from_now(5);
84}
Julien Boeuf9f218dd2015-04-23 10:24:02 -070085
86static void drain_cq(grpc_completion_queue *cq) {
Craig Tillerc7313232015-05-08 17:05:14 -070087 grpc_event ev;
Julien Boeuf9f218dd2015-04-23 10:24:02 -070088 do {
Chris Evansed2a5472017-03-27 17:34:51 -050089 ev = grpc_completion_queue_next(cq, five_seconds_from_now(), NULL);
Craig Tillerc7313232015-05-08 17:05:14 -070090 } while (ev.type != GRPC_QUEUE_SHUTDOWN);
Julien Boeuf9f218dd2015-04-23 10:24:02 -070091}
92
93static void shutdown_server(grpc_end2end_test_fixture *f) {
94 if (!f->server) return;
Sree Kuchibhotla321881d2017-02-27 11:25:28 -080095 grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
Sree Kuchibhotla752be9c2017-03-03 14:36:02 -080096 GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
97 grpc_timeout_seconds_to_deadline(5),
98 NULL)
Craig Tillerf40df232016-03-25 13:38:14 -070099 .type == GRPC_OP_COMPLETE);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700100 grpc_server_destroy(f->server);
101 f->server = NULL;
102}
103
104static void shutdown_client(grpc_end2end_test_fixture *f) {
105 if (!f->client) return;
106 grpc_channel_destroy(f->client);
107 f->client = NULL;
108}
109
110static void end_test(grpc_end2end_test_fixture *f) {
111 shutdown_server(f);
112 shutdown_client(f);
113
Craig Tillerbc0ec332015-05-11 12:11:32 -0700114 grpc_completion_queue_shutdown(f->cq);
115 drain_cq(f->cq);
116 grpc_completion_queue_destroy(f->cq);
Sree Kuchibhotla321881d2017-02-27 11:25:28 -0800117 grpc_completion_queue_destroy(f->shutdown_cq);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700118}
119
Julien Boeuf84d964a2015-04-29 11:31:06 -0700120static void print_auth_context(int is_client, const grpc_auth_context *ctx) {
121 const grpc_auth_property *p;
Julien Boeuf83b02972015-05-20 22:50:34 -0700122 grpc_auth_property_iterator it;
Julien Boeuf84d964a2015-04-29 11:31:06 -0700123 gpr_log(GPR_INFO, "%s peer:", is_client ? "client" : "server");
Julien Boeuf83b02972015-05-20 22:50:34 -0700124 gpr_log(GPR_INFO, "\tauthenticated: %s",
125 grpc_auth_context_peer_is_authenticated(ctx) ? "YES" : "NO");
Julien Boeuf84d964a2015-04-29 11:31:06 -0700126 it = grpc_auth_context_peer_identity(ctx);
Julien Boeuf83b02972015-05-20 22:50:34 -0700127 while ((p = grpc_auth_property_iterator_next(&it)) != NULL) {
128 gpr_log(GPR_INFO, "\t\t%s: %s", p->name, p->value);
Julien Boeuf84d964a2015-04-29 11:31:06 -0700129 }
130 gpr_log(GPR_INFO, "\tall properties:");
131 it = grpc_auth_context_property_iterator(ctx);
Julien Boeuf83b02972015-05-20 22:50:34 -0700132 while ((p = grpc_auth_property_iterator_next(&it)) != NULL) {
Julien Boeuf84d964a2015-04-29 11:31:06 -0700133 gpr_log(GPR_INFO, "\t\t%s: %s", p->name, p->value);
134 }
Julien Boeuf84d964a2015-04-29 11:31:06 -0700135}
136
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700137static void request_response_with_payload_and_call_creds(
138 const char *test_name, grpc_end2end_test_config config,
139 override_mode mode) {
140 grpc_call *c;
141 grpc_call *s;
Craig Tiller28b72422016-10-26 21:15:29 -0700142 grpc_slice request_payload_slice =
143 grpc_slice_from_copied_string("hello world");
144 grpc_slice response_payload_slice =
145 grpc_slice_from_copied_string("hello you");
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700146 grpc_byte_buffer *request_payload =
David Garcia Quintas59f905d2015-06-08 16:31:19 -0700147 grpc_raw_byte_buffer_create(&request_payload_slice, 1);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700148 grpc_byte_buffer *response_payload =
David Garcia Quintas59f905d2015-06-08 16:31:19 -0700149 grpc_raw_byte_buffer_create(&response_payload_slice, 1);
Julien Boeufa87d6c22015-07-17 15:51:46 -0700150 grpc_end2end_test_fixture f;
151 cq_verifier *cqv;
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700152 grpc_op ops[6];
153 grpc_op *op;
154 grpc_metadata_array initial_metadata_recv;
155 grpc_metadata_array trailing_metadata_recv;
156 grpc_metadata_array request_metadata_recv;
157 grpc_byte_buffer *request_payload_recv = NULL;
158 grpc_byte_buffer *response_payload_recv = NULL;
159 grpc_call_details call_details;
160 grpc_status_code status;
Nicolas "Pixel" Noble9a123df2015-07-29 23:45:08 +0200161 grpc_call_error error;
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800162 grpc_slice details;
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700163 int was_cancelled = 2;
Julien Boeuf4e02e842015-10-09 22:49:42 -0700164 grpc_call_credentials *creds = NULL;
yang-gd53bc892015-07-09 12:56:29 -0700165 grpc_auth_context *s_auth_context = NULL;
Julien Boeufea456fc2015-07-07 15:23:30 -0700166 grpc_auth_context *c_auth_context = NULL;
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700167
Julien Boeuf77a7b872015-08-05 20:11:02 -0700168 f = begin_test(config, test_name, 0);
Julien Boeufa87d6c22015-07-17 15:51:46 -0700169 cqv = cq_verifier_create(f.cq);
170
Chris Evansed2a5472017-03-27 17:34:51 -0500171 gpr_timespec deadline = five_seconds_from_now();
Muxi Yan5ebd3272016-10-31 07:27:07 -0700172 c = grpc_channel_create_call(
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800173 f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
174 grpc_slice_from_static_string("/foo"),
175 get_host_override_slice("foo.test.google.fr:1234", config), deadline,
Muxi Yan5ebd3272016-10-31 07:27:07 -0700176 NULL);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700177 GPR_ASSERT(c);
Julien Boeuf510a9202015-08-25 21:51:07 -0700178 creds = grpc_google_iam_credentials_create(iam_token, iam_selector, NULL);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700179 GPR_ASSERT(creds != NULL);
180 GPR_ASSERT(grpc_call_set_credentials(c, creds) == GRPC_CALL_OK);
181 switch (mode) {
182 case NONE:
183 break;
184 case OVERRIDE:
Julien Boeuf4e02e842015-10-09 22:49:42 -0700185 grpc_call_credentials_release(creds);
Julien Boeuf510a9202015-08-25 21:51:07 -0700186 creds = grpc_google_iam_credentials_create(overridden_iam_token,
187 overridden_iam_selector, NULL);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700188 GPR_ASSERT(creds != NULL);
189 GPR_ASSERT(grpc_call_set_credentials(c, creds) == GRPC_CALL_OK);
190 break;
Nicolas "Pixel" Nobleb5cb8d12015-05-09 09:16:19 +0200191 case DESTROY:
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700192 GPR_ASSERT(grpc_call_set_credentials(c, NULL) == GRPC_CALL_OK);
193 break;
194 }
Julien Boeuf4e02e842015-10-09 22:49:42 -0700195 grpc_call_credentials_release(creds);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700196
197 grpc_metadata_array_init(&initial_metadata_recv);
198 grpc_metadata_array_init(&trailing_metadata_recv);
199 grpc_metadata_array_init(&request_metadata_recv);
200 grpc_call_details_init(&call_details);
201
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700202 memset(ops, 0, sizeof(ops));
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700203 op = ops;
204 op->op = GRPC_OP_SEND_INITIAL_METADATA;
205 op->data.send_initial_metadata.count = 0;
David Garcia Quintas1d5aca52015-06-14 14:42:04 -0700206 op->flags = 0;
Nicolas "Pixel" Noble49605162015-08-01 00:12:01 +0200207 op->reserved = NULL;
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700208 op++;
209 op->op = GRPC_OP_SEND_MESSAGE;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800210 op->data.send_message.send_message = request_payload;
David Garcia Quintas1d5aca52015-06-14 14:42:04 -0700211 op->flags = 0;
Nicolas "Pixel" Noble49605162015-08-01 00:12:01 +0200212 op->reserved = NULL;
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700213 op++;
214 op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
David Garcia Quintas1d5aca52015-06-14 14:42:04 -0700215 op->flags = 0;
Nicolas "Pixel" Noble49605162015-08-01 00:12:01 +0200216 op->reserved = NULL;
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700217 op++;
218 op->op = GRPC_OP_RECV_INITIAL_METADATA;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800219 op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv;
David Garcia Quintas1d5aca52015-06-14 14:42:04 -0700220 op->flags = 0;
Nicolas "Pixel" Noble49605162015-08-01 00:12:01 +0200221 op->reserved = NULL;
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700222 op++;
223 op->op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800224 op->data.recv_message.recv_message = &response_payload_recv;
David Garcia Quintas1d5aca52015-06-14 14:42:04 -0700225 op->flags = 0;
Nicolas "Pixel" Noble49605162015-08-01 00:12:01 +0200226 op->reserved = NULL;
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700227 op++;
228 op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
229 op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
230 op->data.recv_status_on_client.status = &status;
231 op->data.recv_status_on_client.status_details = &details;
David Garcia Quintas1d5aca52015-06-14 14:42:04 -0700232 op->flags = 0;
Nicolas "Pixel" Noble49605162015-08-01 00:12:01 +0200233 op->reserved = NULL;
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700234 op++;
Craig Tiller3121fd42015-09-10 09:56:20 -0700235 error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(1), NULL);
Nicolas "Pixel" Noble9a123df2015-07-29 23:45:08 +0200236 GPR_ASSERT(GRPC_CALL_OK == error);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700237
Craig Tillerd6c98df2015-08-18 09:33:44 -0700238 error =
239 grpc_server_request_call(f.server, &s, &call_details,
240 &request_metadata_recv, f.cq, f.cq, tag(101));
Nicolas "Pixel" Noble9a123df2015-07-29 23:45:08 +0200241 GPR_ASSERT(GRPC_CALL_OK == error);
Mark D. Roth7187ab92016-08-24 13:49:22 -0700242 CQ_EXPECT_COMPLETION(cqv, tag(101), 1);
Craig Tillerbc0ec332015-05-11 12:11:32 -0700243 cq_verify(cqv);
Julien Boeuf84d964a2015-04-29 11:31:06 -0700244 s_auth_context = grpc_call_auth_context(s);
245 GPR_ASSERT(s_auth_context != NULL);
246 print_auth_context(0, s_auth_context);
yang-gd53bc892015-07-09 12:56:29 -0700247 grpc_auth_context_release(s_auth_context);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700248
Julien Boeufea456fc2015-07-07 15:23:30 -0700249 c_auth_context = grpc_call_auth_context(c);
250 GPR_ASSERT(c_auth_context != NULL);
251 print_auth_context(1, c_auth_context);
252 grpc_auth_context_release(c_auth_context);
253
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700254 /* Cannot set creds on the server call object. */
Craig Tillere7da1d42015-05-12 14:59:24 -0700255 GPR_ASSERT(grpc_call_set_credentials(s, NULL) != GRPC_CALL_OK);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700256
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700257 memset(ops, 0, sizeof(ops));
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700258 op = ops;
259 op->op = GRPC_OP_SEND_INITIAL_METADATA;
260 op->data.send_initial_metadata.count = 0;
David Garcia Quintas1d5aca52015-06-14 14:42:04 -0700261 op->flags = 0;
Nicolas "Pixel" Noble49605162015-08-01 00:12:01 +0200262 op->reserved = NULL;
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700263 op++;
Craig Tiller4541f332015-05-19 16:26:33 -0700264 op->op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800265 op->data.recv_message.recv_message = &request_payload_recv;
David Garcia Quintas1d5aca52015-06-14 14:42:04 -0700266 op->flags = 0;
Nicolas "Pixel" Noble49605162015-08-01 00:12:01 +0200267 op->reserved = NULL;
Craig Tiller4541f332015-05-19 16:26:33 -0700268 op++;
Craig Tiller3121fd42015-09-10 09:56:20 -0700269 error = grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(102), NULL);
Nicolas "Pixel" Noble9a123df2015-07-29 23:45:08 +0200270 GPR_ASSERT(GRPC_CALL_OK == error);
Craig Tiller4541f332015-05-19 16:26:33 -0700271
Mark D. Roth7187ab92016-08-24 13:49:22 -0700272 CQ_EXPECT_COMPLETION(cqv, tag(102), 1);
Craig Tillerdad88a72015-05-26 17:01:09 -0700273 cq_verify(cqv);
274
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700275 memset(ops, 0, sizeof(ops));
Craig Tiller4541f332015-05-19 16:26:33 -0700276 op = ops;
277 op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
278 op->data.recv_close_on_server.cancelled = &was_cancelled;
David Garcia Quintas1d5aca52015-06-14 14:42:04 -0700279 op->flags = 0;
Nicolas "Pixel" Noble49605162015-08-01 00:12:01 +0200280 op->reserved = NULL;
Craig Tiller4541f332015-05-19 16:26:33 -0700281 op++;
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700282 op->op = GRPC_OP_SEND_MESSAGE;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800283 op->data.send_message.send_message = response_payload;
David Garcia Quintas1d5aca52015-06-14 14:42:04 -0700284 op->flags = 0;
Nicolas "Pixel" Noble49605162015-08-01 00:12:01 +0200285 op->reserved = NULL;
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700286 op++;
287 op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
288 op->data.send_status_from_server.trailing_metadata_count = 0;
Julien Boeuf554c79c2015-05-08 14:51:25 -0700289 op->data.send_status_from_server.status = GRPC_STATUS_OK;
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800290 grpc_slice status_details = grpc_slice_from_static_string("xyz");
291 op->data.send_status_from_server.status_details = &status_details;
David Garcia Quintas1d5aca52015-06-14 14:42:04 -0700292 op->flags = 0;
Nicolas "Pixel" Noble49605162015-08-01 00:12:01 +0200293 op->reserved = NULL;
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700294 op++;
Craig Tiller3121fd42015-09-10 09:56:20 -0700295 error = grpc_call_start_batch(s, ops, (size_t)(op - ops), tag(103), NULL);
Nicolas "Pixel" Noble9a123df2015-07-29 23:45:08 +0200296 GPR_ASSERT(GRPC_CALL_OK == error);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700297
Mark D. Roth7187ab92016-08-24 13:49:22 -0700298 CQ_EXPECT_COMPLETION(cqv, tag(103), 1);
299 CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
Craig Tillerbc0ec332015-05-11 12:11:32 -0700300 cq_verify(cqv);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700301
Julien Boeuf554c79c2015-05-08 14:51:25 -0700302 GPR_ASSERT(status == GRPC_STATUS_OK);
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800303 GPR_ASSERT(0 == grpc_slice_str_cmp(details, "xyz"));
304 GPR_ASSERT(0 == grpc_slice_str_cmp(call_details.method, "/foo"));
Muxi Yan5ebd3272016-10-31 07:27:07 -0700305 validate_host_override_string("foo.test.google.fr:1234", call_details.host,
306 config);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700307 GPR_ASSERT(was_cancelled == 0);
308 GPR_ASSERT(byte_buffer_eq_string(request_payload_recv, "hello world"));
309 GPR_ASSERT(byte_buffer_eq_string(response_payload_recv, "hello you"));
310
311 switch (mode) {
312 case NONE:
313 GPR_ASSERT(contains_metadata(&request_metadata_recv,
314 GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
315 iam_token));
316 GPR_ASSERT(contains_metadata(&request_metadata_recv,
317 GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
318 iam_selector));
319 break;
320 case OVERRIDE:
321 GPR_ASSERT(contains_metadata(&request_metadata_recv,
322 GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
323 overridden_iam_token));
324 GPR_ASSERT(contains_metadata(&request_metadata_recv,
325 GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
326 overridden_iam_selector));
327 break;
Nicolas "Pixel" Nobleb5cb8d12015-05-09 09:16:19 +0200328 case DESTROY:
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700329 GPR_ASSERT(!contains_metadata(&request_metadata_recv,
330 GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
331 iam_token));
332 GPR_ASSERT(!contains_metadata(&request_metadata_recv,
333 GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
334 iam_selector));
335 GPR_ASSERT(!contains_metadata(&request_metadata_recv,
336 GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
337 overridden_iam_token));
338 GPR_ASSERT(!contains_metadata(&request_metadata_recv,
339 GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
340 overridden_iam_selector));
341 break;
342 }
343
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800344 grpc_slice_unref(details);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700345 grpc_metadata_array_destroy(&initial_metadata_recv);
346 grpc_metadata_array_destroy(&trailing_metadata_recv);
347 grpc_metadata_array_destroy(&request_metadata_recv);
348 grpc_call_details_destroy(&call_details);
349
350 grpc_call_destroy(c);
351 grpc_call_destroy(s);
352
Craig Tillerbc0ec332015-05-11 12:11:32 -0700353 cq_verifier_destroy(cqv);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700354
355 grpc_byte_buffer_destroy(request_payload);
356 grpc_byte_buffer_destroy(response_payload);
357 grpc_byte_buffer_destroy(request_payload_recv);
358 grpc_byte_buffer_destroy(response_payload_recv);
359
360 end_test(&f);
361 config.tear_down_data(&f);
362}
363
Julien Boeufea456fc2015-07-07 15:23:30 -0700364static void test_request_response_with_payload_and_call_creds(
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700365 grpc_end2end_test_config config) {
Craig Tiller9a576332015-06-17 10:21:49 -0700366 request_response_with_payload_and_call_creds(
367 "test_request_response_with_payload_and_call_creds", config, NONE);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700368}
369
Julien Boeufea456fc2015-07-07 15:23:30 -0700370static void test_request_response_with_payload_and_overridden_call_creds(
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700371 grpc_end2end_test_config config) {
Craig Tiller9a576332015-06-17 10:21:49 -0700372 request_response_with_payload_and_call_creds(
373 "test_request_response_with_payload_and_overridden_call_creds", config,
374 OVERRIDE);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700375}
376
Julien Boeufea456fc2015-07-07 15:23:30 -0700377static void test_request_response_with_payload_and_deleted_call_creds(
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700378 grpc_end2end_test_config config) {
Craig Tiller9a576332015-06-17 10:21:49 -0700379 request_response_with_payload_and_call_creds(
380 "test_request_response_with_payload_and_deleted_call_creds", config,
381 DESTROY);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700382}
383
Julien Boeuf77a7b872015-08-05 20:11:02 -0700384static void test_request_with_server_rejecting_client_creds(
385 grpc_end2end_test_config config) {
386 grpc_op ops[6];
387 grpc_op *op;
388 grpc_call *c;
389 grpc_end2end_test_fixture f;
Chris Evansed2a5472017-03-27 17:34:51 -0500390 gpr_timespec deadline = five_seconds_from_now();
Julien Boeuf77a7b872015-08-05 20:11:02 -0700391 cq_verifier *cqv;
392 grpc_metadata_array initial_metadata_recv;
393 grpc_metadata_array trailing_metadata_recv;
394 grpc_metadata_array request_metadata_recv;
395 grpc_call_details call_details;
396 grpc_status_code status;
Nicolas "Pixel" Noble9d72b142015-08-08 01:45:38 +0200397 grpc_call_error error;
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800398 grpc_slice details;
Julien Boeuf77a7b872015-08-05 20:11:02 -0700399 grpc_byte_buffer *response_payload_recv = NULL;
Craig Tiller28b72422016-10-26 21:15:29 -0700400 grpc_slice request_payload_slice =
401 grpc_slice_from_copied_string("hello world");
Julien Boeuf77a7b872015-08-05 20:11:02 -0700402 grpc_byte_buffer *request_payload =
403 grpc_raw_byte_buffer_create(&request_payload_slice, 1);
Julien Boeuf4e02e842015-10-09 22:49:42 -0700404 grpc_call_credentials *creds;
Julien Boeuf77a7b872015-08-05 20:11:02 -0700405
406 f = begin_test(config, "test_request_with_server_rejecting_client_creds", 1);
407 cqv = cq_verifier_create(f.cq);
408
Muxi Yan5ebd3272016-10-31 07:27:07 -0700409 c = grpc_channel_create_call(
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800410 f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq,
411 grpc_slice_from_static_string("/foo"),
412 get_host_override_slice("foo.test.google.fr:1234", config), deadline,
Muxi Yan5ebd3272016-10-31 07:27:07 -0700413 NULL);
Julien Boeuf77a7b872015-08-05 20:11:02 -0700414 GPR_ASSERT(c);
415
Julien Boeuf510a9202015-08-25 21:51:07 -0700416 creds = grpc_google_iam_credentials_create(iam_token, iam_selector, NULL);
Julien Boeuf77a7b872015-08-05 20:11:02 -0700417 GPR_ASSERT(creds != NULL);
418 GPR_ASSERT(grpc_call_set_credentials(c, creds) == GRPC_CALL_OK);
Julien Boeuf4e02e842015-10-09 22:49:42 -0700419 grpc_call_credentials_release(creds);
Julien Boeuf77a7b872015-08-05 20:11:02 -0700420
421 grpc_metadata_array_init(&initial_metadata_recv);
422 grpc_metadata_array_init(&trailing_metadata_recv);
423 grpc_metadata_array_init(&request_metadata_recv);
424 grpc_call_details_init(&call_details);
425
David Garcia Quintasa301eaa2016-05-06 16:59:03 -0700426 memset(ops, 0, sizeof(ops));
Julien Boeuf77a7b872015-08-05 20:11:02 -0700427 op = ops;
428 op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
429 op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
430 op->data.recv_status_on_client.status = &status;
431 op->data.recv_status_on_client.status_details = &details;
Julien Boeuf77a7b872015-08-05 20:11:02 -0700432 op->flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700433 op->reserved = NULL;
Julien Boeuf77a7b872015-08-05 20:11:02 -0700434 op++;
435 op->op = GRPC_OP_SEND_INITIAL_METADATA;
436 op->data.send_initial_metadata.count = 0;
437 op->flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700438 op->reserved = NULL;
Julien Boeuf77a7b872015-08-05 20:11:02 -0700439 op++;
440 op->op = GRPC_OP_SEND_MESSAGE;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800441 op->data.send_message.send_message = request_payload;
Julien Boeuf77a7b872015-08-05 20:11:02 -0700442 op->flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700443 op->reserved = NULL;
Julien Boeuf77a7b872015-08-05 20:11:02 -0700444 op++;
445 op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
446 op->flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700447 op->reserved = NULL;
Julien Boeuf77a7b872015-08-05 20:11:02 -0700448 op++;
449 op->op = GRPC_OP_RECV_INITIAL_METADATA;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800450 op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv;
Julien Boeuf77a7b872015-08-05 20:11:02 -0700451 op->flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700452 op->reserved = NULL;
Julien Boeuf77a7b872015-08-05 20:11:02 -0700453 op++;
454 op->op = GRPC_OP_RECV_MESSAGE;
Mark D. Roth435f9f22017-01-25 12:53:54 -0800455 op->data.recv_message.recv_message = &response_payload_recv;
Julien Boeuf77a7b872015-08-05 20:11:02 -0700456 op->flags = 0;
Craig Tiller42758992015-08-18 10:34:32 -0700457 op->reserved = NULL;
Julien Boeuf77a7b872015-08-05 20:11:02 -0700458 op++;
Craig Tiller3121fd42015-09-10 09:56:20 -0700459 error = grpc_call_start_batch(c, ops, (size_t)(op - ops), tag(1), NULL);
Nicolas "Pixel" Noble9d72b142015-08-08 01:45:38 +0200460 GPR_ASSERT(error == GRPC_CALL_OK);
Julien Boeuf77a7b872015-08-05 20:11:02 -0700461
Mark D. Roth7187ab92016-08-24 13:49:22 -0700462 CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
Julien Boeuf77a7b872015-08-05 20:11:02 -0700463 cq_verify(cqv);
464
465 GPR_ASSERT(status == GRPC_STATUS_UNAUTHENTICATED);
466
467 grpc_metadata_array_destroy(&initial_metadata_recv);
468 grpc_metadata_array_destroy(&trailing_metadata_recv);
469 grpc_metadata_array_destroy(&request_metadata_recv);
470 grpc_call_details_destroy(&call_details);
471
472 grpc_byte_buffer_destroy(request_payload);
473 grpc_byte_buffer_destroy(response_payload_recv);
Craig Tiller7c70b6c2017-01-23 07:48:42 -0800474 grpc_slice_unref(details);
Julien Boeuf77a7b872015-08-05 20:11:02 -0700475
476 grpc_call_destroy(c);
477
478 cq_verifier_destroy(cqv);
479 end_test(&f);
480 config.tear_down_data(&f);
481}
482
Craig Tiller0fe5ee72015-12-22 12:50:36 -0800483void call_creds(grpc_end2end_test_config config) {
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700484 if (config.feature_mask & FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS) {
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700485 test_request_response_with_payload_and_call_creds(config);
486 test_request_response_with_payload_and_overridden_call_creds(config);
487 test_request_response_with_payload_and_deleted_call_creds(config);
Julien Boeuf77a7b872015-08-05 20:11:02 -0700488 test_request_with_server_rejecting_client_creds(config);
Julien Boeuf9f218dd2015-04-23 10:24:02 -0700489 }
490}
Craig Tiller9e9edbc2016-04-04 10:38:49 -0700491
492void call_creds_pre_init(void) {}