blob: 7698e86cf410c2ce954f29a20755c5927894ceda [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>
50#include <grpc++/status.h>
51#include <grpc++/stream.h>
52#include "test/core/util/port.h"
53#include <gtest/gtest.h>
54
55#include <grpc/grpc.h>
56#include <grpc/support/thd.h>
57#include <grpc/support/time.h>
58
59using grpc::cpp::test::util::EchoRequest;
60using grpc::cpp::test::util::EchoResponse;
61using std::chrono::system_clock;
62
63namespace grpc {
64namespace testing {
65
66namespace {
67
Yang Gaoc05b6cb2015-02-13 00:34:10 -080068void* tag(int i) {
69 return (void*)(gpr_intptr)i;
70}
71
72void verify_ok(CompletionQueue* cq, int i, bool expect_ok) {
73 bool ok;
74 void* got_tag;
75 EXPECT_TRUE(cq->Next(&got_tag, &ok));
76 EXPECT_EQ(expect_ok, ok);
77 EXPECT_EQ(tag(i), got_tag);
78}
79
Yang Gao406b32f2015-02-13 16:25:33 -080080class AsyncEnd2endTest : public ::testing::Test {
Craig Tiller0220cf12015-02-12 17:39:26 -080081 protected:
Yang Gao406b32f2015-02-13 16:25:33 -080082 AsyncEnd2endTest() : service_(&srv_cq_) {}
Craig Tiller0220cf12015-02-12 17:39:26 -080083
84 void SetUp() override {
85 int port = grpc_pick_unused_port_or_die();
86 server_address_ << "localhost:" << port;
87 // Setup server
88 ServerBuilder builder;
89 builder.AddPort(server_address_.str());
90 builder.RegisterAsyncService(&service_);
91 server_ = builder.BuildAndStart();
92 }
93
Craig Tiller492968f2015-02-18 13:14:03 -080094 void TearDown() override {
95 server_->Shutdown();
96 void* ignored_tag;
97 bool ignored_ok;
98 cli_cq_.Shutdown();
99 srv_cq_.Shutdown();
100 while (cli_cq_.Next(&ignored_tag, &ignored_ok))
101 ;
102 while (srv_cq_.Next(&ignored_tag, &ignored_ok))
103 ;
104 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800105
106 void ResetStub() {
107 std::shared_ptr<ChannelInterface> channel =
Craig Tillere4fe8442015-02-23 13:55:15 -0800108 CreateChannelDeprecated(server_address_.str(), ChannelArguments());
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800109 stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel));
Craig Tiller0220cf12015-02-12 17:39:26 -0800110 }
111
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800112 void server_ok(int i) {
113 verify_ok(&srv_cq_, i, true);
114 }
115 void client_ok(int i) {
116 verify_ok(&cli_cq_, i , true);
117 }
118 void server_fail(int i) {
119 verify_ok(&srv_cq_, i, false);
120 }
121 void client_fail(int i) {
122 verify_ok(&cli_cq_, i, false);
123 }
Yang Gao005f18a2015-02-13 10:22:33 -0800124
Yang Gao406b32f2015-02-13 16:25:33 -0800125 void SendRpc(int num_rpcs) {
126 for (int i = 0; i < num_rpcs; i++) {
127 EchoRequest send_request;
128 EchoRequest recv_request;
129 EchoResponse send_response;
130 EchoResponse recv_response;
131 Status recv_status;
132
133 ClientContext cli_ctx;
134 ServerContext srv_ctx;
135 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
136
137 send_request.set_message("Hello");
Yang Gao3a5e5492015-02-18 14:32:38 -0800138 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> >
vjpai56c51292015-02-26 17:01:35 -0800139 response_reader(stub_->AsyncEcho(
Yang Gao3a5e5492015-02-18 14:32:38 -0800140 &cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao406b32f2015-02-13 16:25:33 -0800141
142 service_.RequestEcho(
143 &srv_ctx, &recv_request, &response_writer, &srv_cq_, tag(2));
144
145 server_ok(2);
146 EXPECT_EQ(send_request.message(), recv_request.message());
Yang Gao3a5e5492015-02-18 14:32:38 -0800147 client_ok(1);
Yang Gao406b32f2015-02-13 16:25:33 -0800148
149 send_response.set_message(recv_request.message());
150 response_writer.Finish(send_response, Status::OK, tag(3));
Yang Gao406b32f2015-02-13 16:25:33 -0800151 server_ok(3);
152
Yang Gao3a5e5492015-02-18 14:32:38 -0800153 response_reader->Finish(&recv_response, &recv_status, tag(4));
154 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800155
156 EXPECT_EQ(send_response.message(), recv_response.message());
157 EXPECT_TRUE(recv_status.IsOk());
158 }
159 }
160
Yang Gaobb84a302015-02-12 23:30:12 -0800161 CompletionQueue cli_cq_;
162 CompletionQueue srv_cq_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800163 std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
164 std::unique_ptr<Server> server_;
165 grpc::cpp::test::util::TestService::AsyncService service_;
166 std::ostringstream server_address_;
167};
168
Yang Gao406b32f2015-02-13 16:25:33 -0800169TEST_F(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800170 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800171 SendRpc(1);
172}
Yang Gaobb84a302015-02-12 23:30:12 -0800173
Yang Gao406b32f2015-02-13 16:25:33 -0800174TEST_F(AsyncEnd2endTest, SequentialRpcs) {
175 ResetStub();
176 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800177}
178
Yang Gao0e0d8e12015-02-13 14:40:41 -0800179// Two pings and a final pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800180TEST_F(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800181 ResetStub();
182
183 EchoRequest send_request;
184 EchoRequest recv_request;
185 EchoResponse send_response;
186 EchoResponse recv_response;
187 Status recv_status;
188 ClientContext cli_ctx;
189 ServerContext srv_ctx;
190 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
191
192 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800193 std::unique_ptr<ClientAsyncWriter<EchoRequest> > cli_stream(
vjpai56c51292015-02-26 17:01:35 -0800194 stub_->AsyncRequestStream(&cli_ctx, &recv_response, &cli_cq_, tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800195
196 service_.RequestRequestStream(
197 &srv_ctx, &srv_stream, &srv_cq_, tag(2));
198
199 server_ok(2);
200 client_ok(1);
201
202 cli_stream->Write(send_request, tag(3));
203 client_ok(3);
204
205 srv_stream.Read(&recv_request, tag(4));
206 server_ok(4);
207 EXPECT_EQ(send_request.message(), recv_request.message());
208
209 cli_stream->Write(send_request, tag(5));
210 client_ok(5);
211
212 srv_stream.Read(&recv_request, tag(6));
213 server_ok(6);
214
215 EXPECT_EQ(send_request.message(), recv_request.message());
216 cli_stream->WritesDone(tag(7));
217 client_ok(7);
218
219 srv_stream.Read(&recv_request, tag(8));
220 server_fail(8);
221
222 send_response.set_message(recv_request.message());
223 srv_stream.Finish(send_response, Status::OK, tag(9));
224 server_ok(9);
225
226 cli_stream->Finish(&recv_status, tag(10));
227 client_ok(10);
228
229 EXPECT_EQ(send_response.message(), recv_response.message());
230 EXPECT_TRUE(recv_status.IsOk());
231}
232
Yang Gao0e0d8e12015-02-13 14:40:41 -0800233// One ping, two pongs.
Yang Gao406b32f2015-02-13 16:25:33 -0800234TEST_F(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800235 ResetStub();
236
237 EchoRequest send_request;
238 EchoRequest recv_request;
239 EchoResponse send_response;
240 EchoResponse recv_response;
241 Status recv_status;
242 ClientContext cli_ctx;
243 ServerContext srv_ctx;
244 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
245
246 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800247 std::unique_ptr<ClientAsyncReader<EchoResponse> > cli_stream(
vjpai56c51292015-02-26 17:01:35 -0800248 stub_->AsyncResponseStream(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800249
250 service_.RequestResponseStream(
251 &srv_ctx, &recv_request, &srv_stream, &srv_cq_, tag(2));
252
253 server_ok(2);
254 client_ok(1);
255 EXPECT_EQ(send_request.message(), recv_request.message());
256
257 send_response.set_message(recv_request.message());
258 srv_stream.Write(send_response, tag(3));
259 server_ok(3);
260
261 cli_stream->Read(&recv_response, tag(4));
262 client_ok(4);
263 EXPECT_EQ(send_response.message(), recv_response.message());
264
265 srv_stream.Write(send_response, tag(5));
266 server_ok(5);
267
268 cli_stream->Read(&recv_response, tag(6));
269 client_ok(6);
270 EXPECT_EQ(send_response.message(), recv_response.message());
271
272 srv_stream.Finish(Status::OK, tag(7));
273 server_ok(7);
274
275 cli_stream->Read(&recv_response, tag(8));
276 client_fail(8);
277
278 cli_stream->Finish(&recv_status, tag(9));
279 client_ok(9);
280
281 EXPECT_TRUE(recv_status.IsOk());
282}
283
284// One ping, one pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800285TEST_F(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800286 ResetStub();
287
288 EchoRequest send_request;
289 EchoRequest recv_request;
290 EchoResponse send_response;
291 EchoResponse recv_response;
292 Status recv_status;
293 ClientContext cli_ctx;
294 ServerContext srv_ctx;
295 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
296
297 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800298 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse> >
vjpai56c51292015-02-26 17:01:35 -0800299 cli_stream(stub_->AsyncBidiStream(&cli_ctx, &cli_cq_, tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800300
301 service_.RequestBidiStream(
302 &srv_ctx, &srv_stream, &srv_cq_, tag(2));
303
304 server_ok(2);
305 client_ok(1);
306
307 cli_stream->Write(send_request, tag(3));
308 client_ok(3);
309
310 srv_stream.Read(&recv_request, tag(4));
311 server_ok(4);
312 EXPECT_EQ(send_request.message(), recv_request.message());
313
314 send_response.set_message(recv_request.message());
315 srv_stream.Write(send_response, tag(5));
316 server_ok(5);
317
318 cli_stream->Read(&recv_response, tag(6));
319 client_ok(6);
320 EXPECT_EQ(send_response.message(), recv_response.message());
321
322 cli_stream->WritesDone(tag(7));
323 client_ok(7);
324
325 srv_stream.Read(&recv_request, tag(8));
326 server_fail(8);
327
328 srv_stream.Finish(Status::OK, tag(9));
329 server_ok(9);
330
331 cli_stream->Finish(&recv_status, tag(10));
332 client_ok(10);
333
334 EXPECT_TRUE(recv_status.IsOk());
335}
336
Yang Gao406b32f2015-02-13 16:25:33 -0800337// Metadata tests
338TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) {
339 ResetStub();
340
341 EchoRequest send_request;
342 EchoRequest recv_request;
343 EchoResponse send_response;
344 EchoResponse recv_response;
345 Status recv_status;
346
347 ClientContext cli_ctx;
348 ServerContext srv_ctx;
349 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
350
351 send_request.set_message("Hello");
352 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
353 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
354 cli_ctx.AddMetadata(meta1.first, meta1.second);
355 cli_ctx.AddMetadata(meta2.first, meta2.second);
356
Yang Gao3a5e5492015-02-18 14:32:38 -0800357 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800358 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao406b32f2015-02-13 16:25:33 -0800359
360 service_.RequestEcho(
361 &srv_ctx, &recv_request, &response_writer, &srv_cq_, tag(2));
362 server_ok(2);
363 EXPECT_EQ(send_request.message(), recv_request.message());
364 auto client_initial_metadata = srv_ctx.client_metadata();
365 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
366 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800367 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800368 client_ok(1);
Yang Gao406b32f2015-02-13 16:25:33 -0800369
370 send_response.set_message(recv_request.message());
371 response_writer.Finish(send_response, Status::OK, tag(3));
372
373 server_ok(3);
374
Yang Gao3a5e5492015-02-18 14:32:38 -0800375 response_reader->Finish(&recv_response, &recv_status, tag(4));
376 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800377
378 EXPECT_EQ(send_response.message(), recv_response.message());
379 EXPECT_TRUE(recv_status.IsOk());
380}
381
Yang Gao2b7f5372015-02-18 00:45:53 -0800382TEST_F(AsyncEnd2endTest, ServerInitialMetadataRpc) {
383 ResetStub();
384
385 EchoRequest send_request;
386 EchoRequest recv_request;
387 EchoResponse send_response;
388 EchoResponse recv_response;
389 Status recv_status;
390
391 ClientContext cli_ctx;
392 ServerContext srv_ctx;
393 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
394
395 send_request.set_message("Hello");
396 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
397 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
398
Yang Gao3a5e5492015-02-18 14:32:38 -0800399 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800400 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800401
402 service_.RequestEcho(
403 &srv_ctx, &recv_request, &response_writer, &srv_cq_, tag(2));
404 server_ok(2);
405 EXPECT_EQ(send_request.message(), recv_request.message());
406 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
407 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
Yang Gao3a5e5492015-02-18 14:32:38 -0800408 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800409 response_writer.SendInitialMetadata(tag(3));
410 server_ok(3);
411
Yang Gao3a5e5492015-02-18 14:32:38 -0800412 response_reader->ReadInitialMetadata(tag(4));
413 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800414 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
415 EXPECT_EQ(meta1.second, server_initial_metadata.find(meta1.first)->second);
416 EXPECT_EQ(meta2.second, server_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800417 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800418
419 send_response.set_message(recv_request.message());
420 response_writer.Finish(send_response, Status::OK, tag(5));
421 server_ok(5);
422
423 response_reader->Finish(&recv_response, &recv_status, tag(6));
424 client_ok(6);
425
426 EXPECT_EQ(send_response.message(), recv_response.message());
427 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800428}
429
430TEST_F(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
431 ResetStub();
432
433 EchoRequest send_request;
434 EchoRequest recv_request;
435 EchoResponse send_response;
436 EchoResponse recv_response;
437 Status recv_status;
438
439 ClientContext cli_ctx;
440 ServerContext srv_ctx;
441 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
442
443 send_request.set_message("Hello");
444 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
445 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
446
Yang Gao3a5e5492015-02-18 14:32:38 -0800447 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800448 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800449
450 service_.RequestEcho(
451 &srv_ctx, &recv_request, &response_writer, &srv_cq_, tag(2));
452 server_ok(2);
453 EXPECT_EQ(send_request.message(), recv_request.message());
454 response_writer.SendInitialMetadata(tag(3));
455 server_ok(3);
Yang Gao3a5e5492015-02-18 14:32:38 -0800456 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800457
458 send_response.set_message(recv_request.message());
459 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
460 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
461 response_writer.Finish(send_response, Status::OK, tag(4));
462
463 server_ok(4);
464
Yang Gao2b7f5372015-02-18 00:45:53 -0800465
Yang Gao3a5e5492015-02-18 14:32:38 -0800466 response_reader->Finish(&recv_response, &recv_status, tag(5));
467 client_ok(5);
Yang Gao2b7f5372015-02-18 00:45:53 -0800468 EXPECT_EQ(send_response.message(), recv_response.message());
469 EXPECT_TRUE(recv_status.IsOk());
470 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
471 EXPECT_EQ(meta1.second, server_trailing_metadata.find(meta1.first)->second);
472 EXPECT_EQ(meta2.second, server_trailing_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800473 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800474}
475
476TEST_F(AsyncEnd2endTest, MetadataRpc) {
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");
Yang Gao3a5e5492015-02-18 14:32:38 -0800491 std::pair<grpc::string, grpc::string> meta2(
492 "key2-bin", {"\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13});
Yang Gao2b7f5372015-02-18 00:45:53 -0800493 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Yang Gao3a5e5492015-02-18 14:32:38 -0800494 std::pair<grpc::string, grpc::string> meta6("key4-bin",
495 {"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d", 14});
Yang Gao2b7f5372015-02-18 00:45:53 -0800496 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Yang Gao3a5e5492015-02-18 14:32:38 -0800497 std::pair<grpc::string, grpc::string> meta4("key6-bin",
498 {"\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15});
Yang Gao2b7f5372015-02-18 00:45:53 -0800499
500 cli_ctx.AddMetadata(meta1.first, meta1.second);
501 cli_ctx.AddMetadata(meta2.first, meta2.second);
502
Yang Gao3a5e5492015-02-18 14:32:38 -0800503 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800504 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800505
506 service_.RequestEcho(
507 &srv_ctx, &recv_request, &response_writer, &srv_cq_, tag(2));
508 server_ok(2);
509 EXPECT_EQ(send_request.message(), recv_request.message());
510 auto client_initial_metadata = srv_ctx.client_metadata();
511 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
512 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800513 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800514 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800515
516 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
517 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
518 response_writer.SendInitialMetadata(tag(3));
519 server_ok(3);
Yang Gao3a5e5492015-02-18 14:32:38 -0800520 response_reader->ReadInitialMetadata(tag(4));
521 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800522 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
523 EXPECT_EQ(meta3.second, server_initial_metadata.find(meta3.first)->second);
524 EXPECT_EQ(meta4.second, server_initial_metadata.find(meta4.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800525 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800526
527 send_response.set_message(recv_request.message());
528 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
529 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
530 response_writer.Finish(send_response, Status::OK, tag(5));
531
532 server_ok(5);
533
534
535 response_reader->Finish(&recv_response, &recv_status, tag(6));
536 client_ok(6);
537 EXPECT_EQ(send_response.message(), recv_response.message());
538 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800539 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
540 EXPECT_EQ(meta5.second, server_trailing_metadata.find(meta5.first)->second);
541 EXPECT_EQ(meta6.second, server_trailing_metadata.find(meta6.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800542 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800543}
Craig Tiller0220cf12015-02-12 17:39:26 -0800544} // namespace
545} // namespace testing
546} // namespace grpc
547
548int main(int argc, char** argv) {
549 grpc_test_init(argc, argv);
550 grpc_init();
551 ::testing::InitGoogleTest(&argc, argv);
552 int result = RUN_ALL_TESTS();
553 grpc_shutdown();
554 google::protobuf::ShutdownProtobufLibrary();
555 return result;
556}