blob: e011b788ff00a7a230af54f4d4dfc9f036e971e7 [file] [log] [blame]
Craig Tiller0220cf12015-02-12 17:39:26 -08001/*
2 *
Craig Tiller06059952015-02-18 08:34:56 -08003 * Copyright 2015, Google Inc.
Craig Tiller0220cf12015-02-12 17:39:26 -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 */
33
34#include <chrono>
Yang Gaoda699b82015-02-18 01:10:22 -080035#include <memory>
Craig Tiller0220cf12015-02-12 17:39:26 -080036
37#include "test/core/util/test_config.h"
38#include "test/cpp/util/echo_duplicate.pb.h"
39#include "test/cpp/util/echo.pb.h"
40#include "src/cpp/util/time.h"
Yang Gao3a5e5492015-02-18 14:32:38 -080041#include <grpc++/async_unary_call.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080042#include <grpc++/channel_arguments.h>
43#include <grpc++/channel_interface.h>
44#include <grpc++/client_context.h>
45#include <grpc++/create_channel.h>
46#include <grpc++/credentials.h>
47#include <grpc++/server.h>
48#include <grpc++/server_builder.h>
49#include <grpc++/server_context.h>
Craig Tiller42bc87c2015-02-23 08:50:19 -080050#include <grpc++/server_credentials.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080051#include <grpc++/status.h>
52#include <grpc++/stream.h>
53#include "test/core/util/port.h"
54#include <gtest/gtest.h>
55
56#include <grpc/grpc.h>
57#include <grpc/support/thd.h>
58#include <grpc/support/time.h>
59
60using grpc::cpp::test::util::EchoRequest;
61using grpc::cpp::test::util::EchoResponse;
62using std::chrono::system_clock;
63
64namespace grpc {
65namespace testing {
66
67namespace {
68
Vijay Pai64ac47f2015-02-26 17:59:51 -080069void* tag(int i) { return (void*)(gpr_intptr)i; }
Yang Gaoc05b6cb2015-02-13 00:34:10 -080070
71void verify_ok(CompletionQueue* cq, int i, bool expect_ok) {
72 bool ok;
73 void* got_tag;
74 EXPECT_TRUE(cq->Next(&got_tag, &ok));
75 EXPECT_EQ(expect_ok, ok);
76 EXPECT_EQ(tag(i), got_tag);
77}
78
vjpai7aadf462015-03-16 23:58:44 -070079void verify_timed_ok(CompletionQueue* cq, int i, bool expect_ok,
80 std::chrono::system_clock::time_point deadline =
81 std::chrono::system_clock::time_point::max(),
82 CompletionQueue::NextStatus expected_outcome =
83 CompletionQueue::GOT_EVENT) {
84 bool ok;
85 void* got_tag;
86 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), expected_outcome);
87 if (expected_outcome == CompletionQueue::GOT_EVENT) {
88 EXPECT_EQ(expect_ok, ok);
89 EXPECT_EQ(tag(i), got_tag);
90 }
91}
92
Yang Gao406b32f2015-02-13 16:25:33 -080093class AsyncEnd2endTest : public ::testing::Test {
Craig Tiller0220cf12015-02-12 17:39:26 -080094 protected:
Yang Gao406b32f2015-02-13 16:25:33 -080095 AsyncEnd2endTest() : service_(&srv_cq_) {}
Craig Tiller0220cf12015-02-12 17:39:26 -080096
Craig Tillercf133f42015-02-26 14:05:56 -080097 void SetUp() GRPC_OVERRIDE {
Craig Tiller0220cf12015-02-12 17:39:26 -080098 int port = grpc_pick_unused_port_or_die();
99 server_address_ << "localhost:" << port;
100 // Setup server
101 ServerBuilder builder;
Craig Tiller42bc87c2015-02-23 08:50:19 -0800102 builder.AddPort(server_address_.str(), grpc::InsecureServerCredentials());
Craig Tiller0220cf12015-02-12 17:39:26 -0800103 builder.RegisterAsyncService(&service_);
104 server_ = builder.BuildAndStart();
105 }
106
Craig Tillercf133f42015-02-26 14:05:56 -0800107 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800108 server_->Shutdown();
109 void* ignored_tag;
110 bool ignored_ok;
111 cli_cq_.Shutdown();
112 srv_cq_.Shutdown();
113 while (cli_cq_.Next(&ignored_tag, &ignored_ok))
114 ;
115 while (srv_cq_.Next(&ignored_tag, &ignored_ok))
116 ;
117 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800118
119 void ResetStub() {
Craig Tiller47c83fd2015-02-21 22:45:35 -0800120 std::shared_ptr<ChannelInterface> channel = CreateChannel(
121 server_address_.str(), InsecureCredentials(), ChannelArguments());
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800122 stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel));
Craig Tiller0220cf12015-02-12 17:39:26 -0800123 }
124
Craig Tiller47c83fd2015-02-21 22:45:35 -0800125 void server_ok(int i) { verify_ok(&srv_cq_, i, true); }
126 void client_ok(int i) { verify_ok(&cli_cq_, i, true); }
127 void server_fail(int i) { verify_ok(&srv_cq_, i, false); }
128 void client_fail(int i) { verify_ok(&cli_cq_, i, false); }
Yang Gao005f18a2015-02-13 10:22:33 -0800129
Yang Gao406b32f2015-02-13 16:25:33 -0800130 void SendRpc(int num_rpcs) {
131 for (int i = 0; i < num_rpcs; i++) {
132 EchoRequest send_request;
133 EchoRequest recv_request;
134 EchoResponse send_response;
135 EchoResponse recv_response;
136 Status recv_status;
137
138 ClientContext cli_ctx;
139 ServerContext srv_ctx;
140 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
141
142 send_request.set_message("Hello");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800143 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Vijay Pai64ac47f2015-02-26 17:59:51 -0800144 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao406b32f2015-02-13 16:25:33 -0800145
Craig Tiller47c83fd2015-02-21 22:45:35 -0800146 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
147 tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800148
149 server_ok(2);
150 EXPECT_EQ(send_request.message(), recv_request.message());
Yang Gao3a5e5492015-02-18 14:32:38 -0800151 client_ok(1);
Yang Gao406b32f2015-02-13 16:25:33 -0800152
153 send_response.set_message(recv_request.message());
154 response_writer.Finish(send_response, Status::OK, tag(3));
Yang Gao406b32f2015-02-13 16:25:33 -0800155 server_ok(3);
156
Yang Gao3a5e5492015-02-18 14:32:38 -0800157 response_reader->Finish(&recv_response, &recv_status, tag(4));
158 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800159
160 EXPECT_EQ(send_response.message(), recv_response.message());
161 EXPECT_TRUE(recv_status.IsOk());
162 }
163 }
164
Yang Gaobb84a302015-02-12 23:30:12 -0800165 CompletionQueue cli_cq_;
166 CompletionQueue srv_cq_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800167 std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
168 std::unique_ptr<Server> server_;
169 grpc::cpp::test::util::TestService::AsyncService service_;
170 std::ostringstream server_address_;
171};
172
Yang Gao406b32f2015-02-13 16:25:33 -0800173TEST_F(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800174 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800175 SendRpc(1);
176}
Yang Gaobb84a302015-02-12 23:30:12 -0800177
Yang Gao406b32f2015-02-13 16:25:33 -0800178TEST_F(AsyncEnd2endTest, SequentialRpcs) {
179 ResetStub();
180 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800181}
182
vjpai7aadf462015-03-16 23:58:44 -0700183// Test a simple RPC using the async version of Next
184TEST_F(AsyncEnd2endTest, AsyncNextRpc) {
185 ResetStub();
186
187 EchoRequest send_request;
188 EchoRequest recv_request;
189 EchoResponse send_response;
190 EchoResponse recv_response;
191 Status recv_status;
192
193 ClientContext cli_ctx;
194 ServerContext srv_ctx;
195 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
196
197 send_request.set_message("Hello");
198 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> >
199 response_reader(stub_->AsyncEcho(&cli_ctx, send_request,
200 &cli_cq_, tag(1)));
201
202 std::chrono::system_clock::time_point
203 time_now(std::chrono::system_clock::now()),
204 time_limit(std::chrono::system_clock::now()+std::chrono::seconds(5));
205 verify_timed_ok(&srv_cq_, -1, true, time_now, CompletionQueue::TIMEOUT);
206 verify_timed_ok(&cli_cq_, -1, true, time_now, CompletionQueue::TIMEOUT);
207
208 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
209 tag(2));
210
211 verify_timed_ok(&srv_cq_, 2, true, time_limit);
212 EXPECT_EQ(send_request.message(), recv_request.message());
213 verify_timed_ok(&cli_cq_, 1, true, time_limit);
214
215 send_response.set_message(recv_request.message());
216 response_writer.Finish(send_response, Status::OK, tag(3));
217 verify_timed_ok(&srv_cq_, 3, true);
218
219 response_reader->Finish(&recv_response, &recv_status, tag(4));
220 verify_timed_ok(&cli_cq_, 4, true);
221
222 EXPECT_EQ(send_response.message(), recv_response.message());
223 EXPECT_TRUE(recv_status.IsOk());
224
225}
226
Yang Gao0e0d8e12015-02-13 14:40:41 -0800227// Two pings and a final pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800228TEST_F(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800229 ResetStub();
230
231 EchoRequest send_request;
232 EchoRequest recv_request;
233 EchoResponse send_response;
234 EchoResponse recv_response;
235 Status recv_status;
236 ClientContext cli_ctx;
237 ServerContext srv_ctx;
238 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
239
240 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800241 std::unique_ptr<ClientAsyncWriter<EchoRequest> > cli_stream(
vjpai56c51292015-02-26 17:01:35 -0800242 stub_->AsyncRequestStream(&cli_ctx, &recv_response, &cli_cq_, tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800243
Craig Tiller47c83fd2015-02-21 22:45:35 -0800244 service_.RequestRequestStream(&srv_ctx, &srv_stream, &srv_cq_, tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800245
246 server_ok(2);
247 client_ok(1);
248
249 cli_stream->Write(send_request, tag(3));
250 client_ok(3);
251
252 srv_stream.Read(&recv_request, tag(4));
253 server_ok(4);
254 EXPECT_EQ(send_request.message(), recv_request.message());
255
256 cli_stream->Write(send_request, tag(5));
257 client_ok(5);
258
259 srv_stream.Read(&recv_request, tag(6));
260 server_ok(6);
261
262 EXPECT_EQ(send_request.message(), recv_request.message());
263 cli_stream->WritesDone(tag(7));
264 client_ok(7);
265
266 srv_stream.Read(&recv_request, tag(8));
267 server_fail(8);
268
269 send_response.set_message(recv_request.message());
270 srv_stream.Finish(send_response, Status::OK, tag(9));
271 server_ok(9);
272
273 cli_stream->Finish(&recv_status, tag(10));
274 client_ok(10);
275
276 EXPECT_EQ(send_response.message(), recv_response.message());
277 EXPECT_TRUE(recv_status.IsOk());
278}
279
Yang Gao0e0d8e12015-02-13 14:40:41 -0800280// One ping, two pongs.
Yang Gao406b32f2015-02-13 16:25:33 -0800281TEST_F(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800282 ResetStub();
283
284 EchoRequest send_request;
285 EchoRequest recv_request;
286 EchoResponse send_response;
287 EchoResponse recv_response;
288 Status recv_status;
289 ClientContext cli_ctx;
290 ServerContext srv_ctx;
291 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
292
293 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800294 std::unique_ptr<ClientAsyncReader<EchoResponse> > cli_stream(
vjpai56c51292015-02-26 17:01:35 -0800295 stub_->AsyncResponseStream(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800296
Craig Tiller47c83fd2015-02-21 22:45:35 -0800297 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream, &srv_cq_,
298 tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800299
300 server_ok(2);
301 client_ok(1);
302 EXPECT_EQ(send_request.message(), recv_request.message());
303
304 send_response.set_message(recv_request.message());
305 srv_stream.Write(send_response, tag(3));
306 server_ok(3);
307
308 cli_stream->Read(&recv_response, tag(4));
309 client_ok(4);
310 EXPECT_EQ(send_response.message(), recv_response.message());
311
312 srv_stream.Write(send_response, tag(5));
313 server_ok(5);
314
315 cli_stream->Read(&recv_response, tag(6));
316 client_ok(6);
317 EXPECT_EQ(send_response.message(), recv_response.message());
318
319 srv_stream.Finish(Status::OK, tag(7));
320 server_ok(7);
321
322 cli_stream->Read(&recv_response, tag(8));
323 client_fail(8);
324
325 cli_stream->Finish(&recv_status, tag(9));
326 client_ok(9);
327
328 EXPECT_TRUE(recv_status.IsOk());
329}
330
331// One ping, one pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800332TEST_F(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800333 ResetStub();
334
335 EchoRequest send_request;
336 EchoRequest recv_request;
337 EchoResponse send_response;
338 EchoResponse recv_response;
339 Status recv_status;
340 ClientContext cli_ctx;
341 ServerContext srv_ctx;
342 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
343
344 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800345 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse> >
vjpai56c51292015-02-26 17:01:35 -0800346 cli_stream(stub_->AsyncBidiStream(&cli_ctx, &cli_cq_, tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800347
Craig Tiller47c83fd2015-02-21 22:45:35 -0800348 service_.RequestBidiStream(&srv_ctx, &srv_stream, &srv_cq_, tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800349
350 server_ok(2);
351 client_ok(1);
352
353 cli_stream->Write(send_request, tag(3));
354 client_ok(3);
355
356 srv_stream.Read(&recv_request, tag(4));
357 server_ok(4);
358 EXPECT_EQ(send_request.message(), recv_request.message());
359
360 send_response.set_message(recv_request.message());
361 srv_stream.Write(send_response, tag(5));
362 server_ok(5);
363
364 cli_stream->Read(&recv_response, tag(6));
365 client_ok(6);
366 EXPECT_EQ(send_response.message(), recv_response.message());
367
368 cli_stream->WritesDone(tag(7));
369 client_ok(7);
370
371 srv_stream.Read(&recv_request, tag(8));
372 server_fail(8);
373
374 srv_stream.Finish(Status::OK, tag(9));
375 server_ok(9);
376
377 cli_stream->Finish(&recv_status, tag(10));
378 client_ok(10);
379
380 EXPECT_TRUE(recv_status.IsOk());
381}
382
Yang Gao406b32f2015-02-13 16:25:33 -0800383// Metadata tests
384TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) {
385 ResetStub();
386
387 EchoRequest send_request;
388 EchoRequest recv_request;
389 EchoResponse send_response;
390 EchoResponse recv_response;
391 Status recv_status;
392
393 ClientContext cli_ctx;
394 ServerContext srv_ctx;
395 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
396
397 send_request.set_message("Hello");
398 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
399 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
400 cli_ctx.AddMetadata(meta1.first, meta1.second);
401 cli_ctx.AddMetadata(meta2.first, meta2.second);
402
Yang Gao3a5e5492015-02-18 14:32:38 -0800403 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800404 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao406b32f2015-02-13 16:25:33 -0800405
Craig Tiller47c83fd2015-02-21 22:45:35 -0800406 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
407 tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800408 server_ok(2);
409 EXPECT_EQ(send_request.message(), recv_request.message());
410 auto client_initial_metadata = srv_ctx.client_metadata();
411 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
412 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800413 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800414 client_ok(1);
Yang Gao406b32f2015-02-13 16:25:33 -0800415
416 send_response.set_message(recv_request.message());
417 response_writer.Finish(send_response, Status::OK, tag(3));
418
419 server_ok(3);
420
Yang Gao3a5e5492015-02-18 14:32:38 -0800421 response_reader->Finish(&recv_response, &recv_status, tag(4));
422 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800423
424 EXPECT_EQ(send_response.message(), recv_response.message());
425 EXPECT_TRUE(recv_status.IsOk());
426}
427
Yang Gao2b7f5372015-02-18 00:45:53 -0800428TEST_F(AsyncEnd2endTest, ServerInitialMetadataRpc) {
429 ResetStub();
430
431 EchoRequest send_request;
432 EchoRequest recv_request;
433 EchoResponse send_response;
434 EchoResponse recv_response;
435 Status recv_status;
436
437 ClientContext cli_ctx;
438 ServerContext srv_ctx;
439 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
440
441 send_request.set_message("Hello");
442 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
443 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
444
Yang Gao3a5e5492015-02-18 14:32:38 -0800445 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800446 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800447
Craig Tiller47c83fd2015-02-21 22:45:35 -0800448 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
449 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800450 server_ok(2);
451 EXPECT_EQ(send_request.message(), recv_request.message());
452 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
453 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
Yang Gao3a5e5492015-02-18 14:32:38 -0800454 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800455 response_writer.SendInitialMetadata(tag(3));
456 server_ok(3);
457
Yang Gao3a5e5492015-02-18 14:32:38 -0800458 response_reader->ReadInitialMetadata(tag(4));
459 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800460 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
461 EXPECT_EQ(meta1.second, server_initial_metadata.find(meta1.first)->second);
462 EXPECT_EQ(meta2.second, server_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800463 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800464
465 send_response.set_message(recv_request.message());
466 response_writer.Finish(send_response, Status::OK, tag(5));
467 server_ok(5);
468
469 response_reader->Finish(&recv_response, &recv_status, tag(6));
470 client_ok(6);
471
472 EXPECT_EQ(send_response.message(), recv_response.message());
473 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800474}
475
476TEST_F(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
477 ResetStub();
478
479 EchoRequest send_request;
480 EchoRequest recv_request;
481 EchoResponse send_response;
482 EchoResponse recv_response;
483 Status recv_status;
484
485 ClientContext cli_ctx;
486 ServerContext srv_ctx;
487 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
488
489 send_request.set_message("Hello");
490 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
491 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
492
Yang Gao3a5e5492015-02-18 14:32:38 -0800493 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800494 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800495
Craig Tiller47c83fd2015-02-21 22:45:35 -0800496 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
497 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800498 server_ok(2);
499 EXPECT_EQ(send_request.message(), recv_request.message());
500 response_writer.SendInitialMetadata(tag(3));
501 server_ok(3);
Yang Gao3a5e5492015-02-18 14:32:38 -0800502 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800503
504 send_response.set_message(recv_request.message());
505 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
506 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
507 response_writer.Finish(send_response, Status::OK, tag(4));
508
509 server_ok(4);
510
Yang Gao3a5e5492015-02-18 14:32:38 -0800511 response_reader->Finish(&recv_response, &recv_status, tag(5));
512 client_ok(5);
Yang Gao2b7f5372015-02-18 00:45:53 -0800513 EXPECT_EQ(send_response.message(), recv_response.message());
514 EXPECT_TRUE(recv_status.IsOk());
515 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
516 EXPECT_EQ(meta1.second, server_trailing_metadata.find(meta1.first)->second);
517 EXPECT_EQ(meta2.second, server_trailing_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800518 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800519}
520
521TEST_F(AsyncEnd2endTest, MetadataRpc) {
522 ResetStub();
523
524 EchoRequest send_request;
525 EchoRequest recv_request;
526 EchoResponse send_response;
527 EchoResponse recv_response;
528 Status recv_status;
529
530 ClientContext cli_ctx;
531 ServerContext srv_ctx;
532 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
533
534 send_request.set_message("Hello");
535 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800536 std::pair<grpc::string, grpc::string> meta2(
537 "key2-bin", {"\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13});
Yang Gao2b7f5372015-02-18 00:45:53 -0800538 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800539 std::pair<grpc::string, grpc::string> meta6(
540 "key4-bin",
Yang Gao3a5e5492015-02-18 14:32:38 -0800541 {"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d", 14});
Yang Gao2b7f5372015-02-18 00:45:53 -0800542 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800543 std::pair<grpc::string, grpc::string> meta4(
544 "key6-bin",
Yang Gao3a5e5492015-02-18 14:32:38 -0800545 {"\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15});
Yang Gao2b7f5372015-02-18 00:45:53 -0800546
547 cli_ctx.AddMetadata(meta1.first, meta1.second);
548 cli_ctx.AddMetadata(meta2.first, meta2.second);
549
Yang Gao3a5e5492015-02-18 14:32:38 -0800550 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800551 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800552
Craig Tiller47c83fd2015-02-21 22:45:35 -0800553 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
554 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800555 server_ok(2);
556 EXPECT_EQ(send_request.message(), recv_request.message());
557 auto client_initial_metadata = srv_ctx.client_metadata();
558 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
559 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800560 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800561 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800562
563 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
564 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
565 response_writer.SendInitialMetadata(tag(3));
566 server_ok(3);
Yang Gao3a5e5492015-02-18 14:32:38 -0800567 response_reader->ReadInitialMetadata(tag(4));
568 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800569 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
570 EXPECT_EQ(meta3.second, server_initial_metadata.find(meta3.first)->second);
571 EXPECT_EQ(meta4.second, server_initial_metadata.find(meta4.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800572 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800573
574 send_response.set_message(recv_request.message());
575 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
576 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
577 response_writer.Finish(send_response, Status::OK, tag(5));
578
579 server_ok(5);
580
Yang Gao3a5e5492015-02-18 14:32:38 -0800581 response_reader->Finish(&recv_response, &recv_status, tag(6));
582 client_ok(6);
583 EXPECT_EQ(send_response.message(), recv_response.message());
584 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800585 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
586 EXPECT_EQ(meta5.second, server_trailing_metadata.find(meta5.first)->second);
587 EXPECT_EQ(meta6.second, server_trailing_metadata.find(meta6.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800588 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800589}
Craig Tiller0220cf12015-02-12 17:39:26 -0800590} // namespace
591} // namespace testing
592} // namespace grpc
593
594int main(int argc, char** argv) {
595 grpc_test_init(argc, argv);
596 grpc_init();
597 ::testing::InitGoogleTest(&argc, argv);
598 int result = RUN_ALL_TESTS();
599 grpc_shutdown();
600 google::protobuf::ShutdownProtobufLibrary();
601 return result;
602}