blob: f03aa9fbd00a93115483705e7d2b2c3f8bd3a494 [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
Vijay Pai64ac47f2015-02-26 17:59:51 -080068void* tag(int i) { return (void*)(gpr_intptr)i; }
Yang Gaoc05b6cb2015-02-13 00:34:10 -080069
70void verify_ok(CompletionQueue* cq, int i, bool expect_ok) {
71 bool ok;
72 void* got_tag;
73 EXPECT_TRUE(cq->Next(&got_tag, &ok));
74 EXPECT_EQ(expect_ok, ok);
75 EXPECT_EQ(tag(i), got_tag);
76}
77
Yang Gao406b32f2015-02-13 16:25:33 -080078class AsyncEnd2endTest : public ::testing::Test {
Craig Tiller0220cf12015-02-12 17:39:26 -080079 protected:
Yang Gao406b32f2015-02-13 16:25:33 -080080 AsyncEnd2endTest() : service_(&srv_cq_) {}
Craig Tiller0220cf12015-02-12 17:39:26 -080081
82 void SetUp() override {
83 int port = grpc_pick_unused_port_or_die();
84 server_address_ << "localhost:" << port;
85 // Setup server
86 ServerBuilder builder;
87 builder.AddPort(server_address_.str());
88 builder.RegisterAsyncService(&service_);
89 server_ = builder.BuildAndStart();
90 }
91
Craig Tiller492968f2015-02-18 13:14:03 -080092 void TearDown() override {
93 server_->Shutdown();
94 void* ignored_tag;
95 bool ignored_ok;
96 cli_cq_.Shutdown();
97 srv_cq_.Shutdown();
98 while (cli_cq_.Next(&ignored_tag, &ignored_ok))
99 ;
100 while (srv_cq_.Next(&ignored_tag, &ignored_ok))
101 ;
102 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800103
104 void ResetStub() {
105 std::shared_ptr<ChannelInterface> channel =
Craig Tillere4fe8442015-02-23 13:55:15 -0800106 CreateChannelDeprecated(server_address_.str(), ChannelArguments());
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800107 stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel));
Craig Tiller0220cf12015-02-12 17:39:26 -0800108 }
109
Vijay Pai64ac47f2015-02-26 17:59:51 -0800110 void server_ok(int i) { verify_ok(&srv_cq_, i, true); }
111 void client_ok(int i) { verify_ok(&cli_cq_, i, true); }
112 void server_fail(int i) { verify_ok(&srv_cq_, i, false); }
113 void client_fail(int i) { verify_ok(&cli_cq_, i, false); }
Yang Gao005f18a2015-02-13 10:22:33 -0800114
Yang Gao406b32f2015-02-13 16:25:33 -0800115 void SendRpc(int num_rpcs) {
116 for (int i = 0; i < num_rpcs; i++) {
117 EchoRequest send_request;
118 EchoRequest recv_request;
119 EchoResponse send_response;
120 EchoResponse recv_response;
121 Status recv_status;
122
123 ClientContext cli_ctx;
124 ServerContext srv_ctx;
125 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
126
127 send_request.set_message("Hello");
Vijay Pai64ac47f2015-02-26 17:59:51 -0800128 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
129 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao406b32f2015-02-13 16:25:33 -0800130
Vijay Pai64ac47f2015-02-26 17:59:51 -0800131 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
132 tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800133
134 server_ok(2);
135 EXPECT_EQ(send_request.message(), recv_request.message());
Yang Gao3a5e5492015-02-18 14:32:38 -0800136 client_ok(1);
Yang Gao406b32f2015-02-13 16:25:33 -0800137
138 send_response.set_message(recv_request.message());
139 response_writer.Finish(send_response, Status::OK, tag(3));
Yang Gao406b32f2015-02-13 16:25:33 -0800140 server_ok(3);
141
Yang Gao3a5e5492015-02-18 14:32:38 -0800142 response_reader->Finish(&recv_response, &recv_status, tag(4));
143 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800144
145 EXPECT_EQ(send_response.message(), recv_response.message());
146 EXPECT_TRUE(recv_status.IsOk());
147 }
148 }
149
Yang Gaobb84a302015-02-12 23:30:12 -0800150 CompletionQueue cli_cq_;
151 CompletionQueue srv_cq_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800152 std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
153 std::unique_ptr<Server> server_;
154 grpc::cpp::test::util::TestService::AsyncService service_;
155 std::ostringstream server_address_;
156};
157
Yang Gao406b32f2015-02-13 16:25:33 -0800158TEST_F(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800159 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800160 SendRpc(1);
161}
Yang Gaobb84a302015-02-12 23:30:12 -0800162
Yang Gao406b32f2015-02-13 16:25:33 -0800163TEST_F(AsyncEnd2endTest, SequentialRpcs) {
164 ResetStub();
165 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800166}
167
Yang Gao0e0d8e12015-02-13 14:40:41 -0800168// Two pings and a final pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800169TEST_F(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800170 ResetStub();
171
172 EchoRequest send_request;
173 EchoRequest recv_request;
174 EchoResponse send_response;
175 EchoResponse recv_response;
176 Status recv_status;
177 ClientContext cli_ctx;
178 ServerContext srv_ctx;
179 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
180
181 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800182 std::unique_ptr<ClientAsyncWriter<EchoRequest> > cli_stream(
vjpai56c51292015-02-26 17:01:35 -0800183 stub_->AsyncRequestStream(&cli_ctx, &recv_response, &cli_cq_, tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800184
Vijay Pai64ac47f2015-02-26 17:59:51 -0800185 service_.RequestRequestStream(&srv_ctx, &srv_stream, &srv_cq_, tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800186
187 server_ok(2);
188 client_ok(1);
189
190 cli_stream->Write(send_request, tag(3));
191 client_ok(3);
192
193 srv_stream.Read(&recv_request, tag(4));
194 server_ok(4);
195 EXPECT_EQ(send_request.message(), recv_request.message());
196
197 cli_stream->Write(send_request, tag(5));
198 client_ok(5);
199
200 srv_stream.Read(&recv_request, tag(6));
201 server_ok(6);
202
203 EXPECT_EQ(send_request.message(), recv_request.message());
204 cli_stream->WritesDone(tag(7));
205 client_ok(7);
206
207 srv_stream.Read(&recv_request, tag(8));
208 server_fail(8);
209
210 send_response.set_message(recv_request.message());
211 srv_stream.Finish(send_response, Status::OK, tag(9));
212 server_ok(9);
213
214 cli_stream->Finish(&recv_status, tag(10));
215 client_ok(10);
216
217 EXPECT_EQ(send_response.message(), recv_response.message());
218 EXPECT_TRUE(recv_status.IsOk());
219}
220
Yang Gao0e0d8e12015-02-13 14:40:41 -0800221// One ping, two pongs.
Yang Gao406b32f2015-02-13 16:25:33 -0800222TEST_F(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800223 ResetStub();
224
225 EchoRequest send_request;
226 EchoRequest recv_request;
227 EchoResponse send_response;
228 EchoResponse recv_response;
229 Status recv_status;
230 ClientContext cli_ctx;
231 ServerContext srv_ctx;
232 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
233
234 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800235 std::unique_ptr<ClientAsyncReader<EchoResponse> > cli_stream(
vjpai56c51292015-02-26 17:01:35 -0800236 stub_->AsyncResponseStream(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800237
Vijay Pai64ac47f2015-02-26 17:59:51 -0800238 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream, &srv_cq_,
239 tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800240
241 server_ok(2);
242 client_ok(1);
243 EXPECT_EQ(send_request.message(), recv_request.message());
244
245 send_response.set_message(recv_request.message());
246 srv_stream.Write(send_response, tag(3));
247 server_ok(3);
248
249 cli_stream->Read(&recv_response, tag(4));
250 client_ok(4);
251 EXPECT_EQ(send_response.message(), recv_response.message());
252
253 srv_stream.Write(send_response, tag(5));
254 server_ok(5);
255
256 cli_stream->Read(&recv_response, tag(6));
257 client_ok(6);
258 EXPECT_EQ(send_response.message(), recv_response.message());
259
260 srv_stream.Finish(Status::OK, tag(7));
261 server_ok(7);
262
263 cli_stream->Read(&recv_response, tag(8));
264 client_fail(8);
265
266 cli_stream->Finish(&recv_status, tag(9));
267 client_ok(9);
268
269 EXPECT_TRUE(recv_status.IsOk());
270}
271
272// One ping, one pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800273TEST_F(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800274 ResetStub();
275
276 EchoRequest send_request;
277 EchoRequest recv_request;
278 EchoResponse send_response;
279 EchoResponse recv_response;
280 Status recv_status;
281 ClientContext cli_ctx;
282 ServerContext srv_ctx;
283 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
284
285 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800286 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse> >
vjpai56c51292015-02-26 17:01:35 -0800287 cli_stream(stub_->AsyncBidiStream(&cli_ctx, &cli_cq_, tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800288
Vijay Pai64ac47f2015-02-26 17:59:51 -0800289 service_.RequestBidiStream(&srv_ctx, &srv_stream, &srv_cq_, tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800290
291 server_ok(2);
292 client_ok(1);
293
294 cli_stream->Write(send_request, tag(3));
295 client_ok(3);
296
297 srv_stream.Read(&recv_request, tag(4));
298 server_ok(4);
299 EXPECT_EQ(send_request.message(), recv_request.message());
300
301 send_response.set_message(recv_request.message());
302 srv_stream.Write(send_response, tag(5));
303 server_ok(5);
304
305 cli_stream->Read(&recv_response, tag(6));
306 client_ok(6);
307 EXPECT_EQ(send_response.message(), recv_response.message());
308
309 cli_stream->WritesDone(tag(7));
310 client_ok(7);
311
312 srv_stream.Read(&recv_request, tag(8));
313 server_fail(8);
314
315 srv_stream.Finish(Status::OK, tag(9));
316 server_ok(9);
317
318 cli_stream->Finish(&recv_status, tag(10));
319 client_ok(10);
320
321 EXPECT_TRUE(recv_status.IsOk());
322}
323
Yang Gao406b32f2015-02-13 16:25:33 -0800324// Metadata tests
325TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) {
326 ResetStub();
327
328 EchoRequest send_request;
329 EchoRequest recv_request;
330 EchoResponse send_response;
331 EchoResponse recv_response;
332 Status recv_status;
333
334 ClientContext cli_ctx;
335 ServerContext srv_ctx;
336 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
337
338 send_request.set_message("Hello");
339 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
340 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
341 cli_ctx.AddMetadata(meta1.first, meta1.second);
342 cli_ctx.AddMetadata(meta2.first, meta2.second);
343
Yang Gao3a5e5492015-02-18 14:32:38 -0800344 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800345 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao406b32f2015-02-13 16:25:33 -0800346
Vijay Pai64ac47f2015-02-26 17:59:51 -0800347 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
348 tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800349 server_ok(2);
350 EXPECT_EQ(send_request.message(), recv_request.message());
351 auto client_initial_metadata = srv_ctx.client_metadata();
352 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
353 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800354 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800355 client_ok(1);
Yang Gao406b32f2015-02-13 16:25:33 -0800356
357 send_response.set_message(recv_request.message());
358 response_writer.Finish(send_response, Status::OK, tag(3));
359
360 server_ok(3);
361
Yang Gao3a5e5492015-02-18 14:32:38 -0800362 response_reader->Finish(&recv_response, &recv_status, tag(4));
363 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800364
365 EXPECT_EQ(send_response.message(), recv_response.message());
366 EXPECT_TRUE(recv_status.IsOk());
367}
368
Yang Gao2b7f5372015-02-18 00:45:53 -0800369TEST_F(AsyncEnd2endTest, ServerInitialMetadataRpc) {
370 ResetStub();
371
372 EchoRequest send_request;
373 EchoRequest recv_request;
374 EchoResponse send_response;
375 EchoResponse recv_response;
376 Status recv_status;
377
378 ClientContext cli_ctx;
379 ServerContext srv_ctx;
380 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
381
382 send_request.set_message("Hello");
383 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
384 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
385
Yang Gao3a5e5492015-02-18 14:32:38 -0800386 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800387 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800388
Vijay Pai64ac47f2015-02-26 17:59:51 -0800389 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
390 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800391 server_ok(2);
392 EXPECT_EQ(send_request.message(), recv_request.message());
393 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
394 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
Yang Gao3a5e5492015-02-18 14:32:38 -0800395 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800396 response_writer.SendInitialMetadata(tag(3));
397 server_ok(3);
398
Yang Gao3a5e5492015-02-18 14:32:38 -0800399 response_reader->ReadInitialMetadata(tag(4));
400 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800401 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
402 EXPECT_EQ(meta1.second, server_initial_metadata.find(meta1.first)->second);
403 EXPECT_EQ(meta2.second, server_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800404 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800405
406 send_response.set_message(recv_request.message());
407 response_writer.Finish(send_response, Status::OK, tag(5));
408 server_ok(5);
409
410 response_reader->Finish(&recv_response, &recv_status, tag(6));
411 client_ok(6);
412
413 EXPECT_EQ(send_response.message(), recv_response.message());
414 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800415}
416
417TEST_F(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
418 ResetStub();
419
420 EchoRequest send_request;
421 EchoRequest recv_request;
422 EchoResponse send_response;
423 EchoResponse recv_response;
424 Status recv_status;
425
426 ClientContext cli_ctx;
427 ServerContext srv_ctx;
428 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
429
430 send_request.set_message("Hello");
431 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
432 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
433
Yang Gao3a5e5492015-02-18 14:32:38 -0800434 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800435 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800436
Vijay Pai64ac47f2015-02-26 17:59:51 -0800437 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
438 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800439 server_ok(2);
440 EXPECT_EQ(send_request.message(), recv_request.message());
441 response_writer.SendInitialMetadata(tag(3));
442 server_ok(3);
Yang Gao3a5e5492015-02-18 14:32:38 -0800443 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800444
445 send_response.set_message(recv_request.message());
446 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
447 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
448 response_writer.Finish(send_response, Status::OK, tag(4));
449
450 server_ok(4);
451
Yang Gao3a5e5492015-02-18 14:32:38 -0800452 response_reader->Finish(&recv_response, &recv_status, tag(5));
453 client_ok(5);
Yang Gao2b7f5372015-02-18 00:45:53 -0800454 EXPECT_EQ(send_response.message(), recv_response.message());
455 EXPECT_TRUE(recv_status.IsOk());
456 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
457 EXPECT_EQ(meta1.second, server_trailing_metadata.find(meta1.first)->second);
458 EXPECT_EQ(meta2.second, server_trailing_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800459 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800460}
461
462TEST_F(AsyncEnd2endTest, MetadataRpc) {
463 ResetStub();
464
465 EchoRequest send_request;
466 EchoRequest recv_request;
467 EchoResponse send_response;
468 EchoResponse recv_response;
469 Status recv_status;
470
471 ClientContext cli_ctx;
472 ServerContext srv_ctx;
473 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
474
475 send_request.set_message("Hello");
476 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800477 std::pair<grpc::string, grpc::string> meta2(
478 "key2-bin", {"\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13});
Yang Gao2b7f5372015-02-18 00:45:53 -0800479 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Vijay Pai64ac47f2015-02-26 17:59:51 -0800480 std::pair<grpc::string, grpc::string> meta6(
481 "key4-bin",
Yang Gao3a5e5492015-02-18 14:32:38 -0800482 {"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d", 14});
Yang Gao2b7f5372015-02-18 00:45:53 -0800483 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Vijay Pai64ac47f2015-02-26 17:59:51 -0800484 std::pair<grpc::string, grpc::string> meta4(
485 "key6-bin",
Yang Gao3a5e5492015-02-18 14:32:38 -0800486 {"\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15});
Yang Gao2b7f5372015-02-18 00:45:53 -0800487
488 cli_ctx.AddMetadata(meta1.first, meta1.second);
489 cli_ctx.AddMetadata(meta2.first, meta2.second);
490
Yang Gao3a5e5492015-02-18 14:32:38 -0800491 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800492 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800493
Vijay Pai64ac47f2015-02-26 17:59:51 -0800494 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
495 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800496 server_ok(2);
497 EXPECT_EQ(send_request.message(), recv_request.message());
498 auto client_initial_metadata = srv_ctx.client_metadata();
499 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
500 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800501 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800502 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800503
504 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
505 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
506 response_writer.SendInitialMetadata(tag(3));
507 server_ok(3);
Yang Gao3a5e5492015-02-18 14:32:38 -0800508 response_reader->ReadInitialMetadata(tag(4));
509 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800510 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
511 EXPECT_EQ(meta3.second, server_initial_metadata.find(meta3.first)->second);
512 EXPECT_EQ(meta4.second, server_initial_metadata.find(meta4.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800513 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800514
515 send_response.set_message(recv_request.message());
516 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
517 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
518 response_writer.Finish(send_response, Status::OK, tag(5));
519
520 server_ok(5);
521
Yang Gao3a5e5492015-02-18 14:32:38 -0800522 response_reader->Finish(&recv_response, &recv_status, tag(6));
523 client_ok(6);
524 EXPECT_EQ(send_response.message(), recv_response.message());
525 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800526 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
527 EXPECT_EQ(meta5.second, server_trailing_metadata.find(meta5.first)->second);
528 EXPECT_EQ(meta6.second, server_trailing_metadata.find(meta6.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800529 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800530}
Craig Tiller0220cf12015-02-12 17:39:26 -0800531} // namespace
532} // namespace testing
533} // namespace grpc
534
535int main(int argc, char** argv) {
536 grpc_test_init(argc, argv);
537 grpc_init();
538 ::testing::InitGoogleTest(&argc, argv);
539 int result = RUN_ALL_TESTS();
540 grpc_shutdown();
541 google::protobuf::ShutdownProtobufLibrary();
542 return result;
543}