blob: 01134a3dc336045d51042ef3875489dbe248a596 [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
Craig Tiller47c83fd2015-02-21 22:45:35 -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
Yang Gao406b32f2015-02-13 16:25:33 -080079class AsyncEnd2endTest : public ::testing::Test {
Craig Tiller0220cf12015-02-12 17:39:26 -080080 protected:
Yang Gao406b32f2015-02-13 16:25:33 -080081 AsyncEnd2endTest() : service_(&srv_cq_) {}
Craig Tiller0220cf12015-02-12 17:39:26 -080082
83 void SetUp() override {
84 int port = grpc_pick_unused_port_or_die();
85 server_address_ << "localhost:" << port;
86 // Setup server
87 ServerBuilder builder;
Craig Tiller42bc87c2015-02-23 08:50:19 -080088 builder.AddPort(server_address_.str(), grpc::InsecureServerCredentials());
Craig Tiller0220cf12015-02-12 17:39:26 -080089 builder.RegisterAsyncService(&service_);
90 server_ = builder.BuildAndStart();
91 }
92
Craig Tiller492968f2015-02-18 13:14:03 -080093 void TearDown() override {
94 server_->Shutdown();
95 void* ignored_tag;
96 bool ignored_ok;
97 cli_cq_.Shutdown();
98 srv_cq_.Shutdown();
99 while (cli_cq_.Next(&ignored_tag, &ignored_ok))
100 ;
101 while (srv_cq_.Next(&ignored_tag, &ignored_ok))
102 ;
103 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800104
105 void ResetStub() {
Craig Tiller47c83fd2015-02-21 22:45:35 -0800106 std::shared_ptr<ChannelInterface> channel = CreateChannel(
107 server_address_.str(), InsecureCredentials(), ChannelArguments());
Craig Tiller0220cf12015-02-12 17:39:26 -0800108 stub_.reset(grpc::cpp::test::util::TestService::NewStub(channel));
109 }
110
Craig Tiller47c83fd2015-02-21 22:45:35 -0800111 void server_ok(int i) { verify_ok(&srv_cq_, i, true); }
112 void client_ok(int i) { verify_ok(&cli_cq_, i, true); }
113 void server_fail(int i) { verify_ok(&srv_cq_, i, false); }
114 void client_fail(int i) { verify_ok(&cli_cq_, i, false); }
Yang Gao005f18a2015-02-13 10:22:33 -0800115
Yang Gao406b32f2015-02-13 16:25:33 -0800116 void SendRpc(int num_rpcs) {
117 for (int i = 0; i < num_rpcs; i++) {
118 EchoRequest send_request;
119 EchoRequest recv_request;
120 EchoResponse send_response;
121 EchoResponse recv_response;
122 Status recv_status;
123
124 ClientContext cli_ctx;
125 ServerContext srv_ctx;
126 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
127
128 send_request.set_message("Hello");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800129 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
130 stub_->Echo(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao406b32f2015-02-13 16:25:33 -0800131
Craig Tiller47c83fd2015-02-21 22:45:35 -0800132 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
133 tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800134
135 server_ok(2);
136 EXPECT_EQ(send_request.message(), recv_request.message());
Yang Gao3a5e5492015-02-18 14:32:38 -0800137 client_ok(1);
Yang Gao406b32f2015-02-13 16:25:33 -0800138
139 send_response.set_message(recv_request.message());
140 response_writer.Finish(send_response, Status::OK, tag(3));
Yang Gao406b32f2015-02-13 16:25:33 -0800141 server_ok(3);
142
Yang Gao3a5e5492015-02-18 14:32:38 -0800143 response_reader->Finish(&recv_response, &recv_status, tag(4));
144 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800145
146 EXPECT_EQ(send_response.message(), recv_response.message());
147 EXPECT_TRUE(recv_status.IsOk());
148 }
149 }
150
Yang Gaobb84a302015-02-12 23:30:12 -0800151 CompletionQueue cli_cq_;
152 CompletionQueue srv_cq_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800153 std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
154 std::unique_ptr<Server> server_;
155 grpc::cpp::test::util::TestService::AsyncService service_;
156 std::ostringstream server_address_;
157};
158
Yang Gao406b32f2015-02-13 16:25:33 -0800159TEST_F(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800160 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800161 SendRpc(1);
162}
Yang Gaobb84a302015-02-12 23:30:12 -0800163
Yang Gao406b32f2015-02-13 16:25:33 -0800164TEST_F(AsyncEnd2endTest, SequentialRpcs) {
165 ResetStub();
166 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800167}
168
Yang Gao0e0d8e12015-02-13 14:40:41 -0800169// Two pings and a final pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800170TEST_F(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800171 ResetStub();
172
173 EchoRequest send_request;
174 EchoRequest recv_request;
175 EchoResponse send_response;
176 EchoResponse recv_response;
177 Status recv_status;
178 ClientContext cli_ctx;
179 ServerContext srv_ctx;
180 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
181
182 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800183 std::unique_ptr<ClientAsyncWriter<EchoRequest> > cli_stream(
184 stub_->RequestStream(&cli_ctx, &recv_response, &cli_cq_, tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800185
Craig Tiller47c83fd2015-02-21 22:45:35 -0800186 service_.RequestRequestStream(&srv_ctx, &srv_stream, &srv_cq_, tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800187
188 server_ok(2);
189 client_ok(1);
190
191 cli_stream->Write(send_request, tag(3));
192 client_ok(3);
193
194 srv_stream.Read(&recv_request, tag(4));
195 server_ok(4);
196 EXPECT_EQ(send_request.message(), recv_request.message());
197
198 cli_stream->Write(send_request, tag(5));
199 client_ok(5);
200
201 srv_stream.Read(&recv_request, tag(6));
202 server_ok(6);
203
204 EXPECT_EQ(send_request.message(), recv_request.message());
205 cli_stream->WritesDone(tag(7));
206 client_ok(7);
207
208 srv_stream.Read(&recv_request, tag(8));
209 server_fail(8);
210
211 send_response.set_message(recv_request.message());
212 srv_stream.Finish(send_response, Status::OK, tag(9));
213 server_ok(9);
214
215 cli_stream->Finish(&recv_status, tag(10));
216 client_ok(10);
217
218 EXPECT_EQ(send_response.message(), recv_response.message());
219 EXPECT_TRUE(recv_status.IsOk());
220}
221
Yang Gao0e0d8e12015-02-13 14:40:41 -0800222// One ping, two pongs.
Yang Gao406b32f2015-02-13 16:25:33 -0800223TEST_F(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800224 ResetStub();
225
226 EchoRequest send_request;
227 EchoRequest recv_request;
228 EchoResponse send_response;
229 EchoResponse recv_response;
230 Status recv_status;
231 ClientContext cli_ctx;
232 ServerContext srv_ctx;
233 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
234
235 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800236 std::unique_ptr<ClientAsyncReader<EchoResponse> > cli_stream(
237 stub_->ResponseStream(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800238
Craig Tiller47c83fd2015-02-21 22:45:35 -0800239 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream, &srv_cq_,
240 tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800241
242 server_ok(2);
243 client_ok(1);
244 EXPECT_EQ(send_request.message(), recv_request.message());
245
246 send_response.set_message(recv_request.message());
247 srv_stream.Write(send_response, tag(3));
248 server_ok(3);
249
250 cli_stream->Read(&recv_response, tag(4));
251 client_ok(4);
252 EXPECT_EQ(send_response.message(), recv_response.message());
253
254 srv_stream.Write(send_response, tag(5));
255 server_ok(5);
256
257 cli_stream->Read(&recv_response, tag(6));
258 client_ok(6);
259 EXPECT_EQ(send_response.message(), recv_response.message());
260
261 srv_stream.Finish(Status::OK, tag(7));
262 server_ok(7);
263
264 cli_stream->Read(&recv_response, tag(8));
265 client_fail(8);
266
267 cli_stream->Finish(&recv_status, tag(9));
268 client_ok(9);
269
270 EXPECT_TRUE(recv_status.IsOk());
271}
272
273// One ping, one pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800274TEST_F(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800275 ResetStub();
276
277 EchoRequest send_request;
278 EchoRequest recv_request;
279 EchoResponse send_response;
280 EchoResponse recv_response;
281 Status recv_status;
282 ClientContext cli_ctx;
283 ServerContext srv_ctx;
284 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
285
286 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800287 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse> >
288 cli_stream(stub_->BidiStream(&cli_ctx, &cli_cq_, tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800289
Craig Tiller47c83fd2015-02-21 22:45:35 -0800290 service_.RequestBidiStream(&srv_ctx, &srv_stream, &srv_cq_, tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800291
292 server_ok(2);
293 client_ok(1);
294
295 cli_stream->Write(send_request, tag(3));
296 client_ok(3);
297
298 srv_stream.Read(&recv_request, tag(4));
299 server_ok(4);
300 EXPECT_EQ(send_request.message(), recv_request.message());
301
302 send_response.set_message(recv_request.message());
303 srv_stream.Write(send_response, tag(5));
304 server_ok(5);
305
306 cli_stream->Read(&recv_response, tag(6));
307 client_ok(6);
308 EXPECT_EQ(send_response.message(), recv_response.message());
309
310 cli_stream->WritesDone(tag(7));
311 client_ok(7);
312
313 srv_stream.Read(&recv_request, tag(8));
314 server_fail(8);
315
316 srv_stream.Finish(Status::OK, tag(9));
317 server_ok(9);
318
319 cli_stream->Finish(&recv_status, tag(10));
320 client_ok(10);
321
322 EXPECT_TRUE(recv_status.IsOk());
323}
324
Yang Gao406b32f2015-02-13 16:25:33 -0800325// Metadata tests
326TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) {
327 ResetStub();
328
329 EchoRequest send_request;
330 EchoRequest recv_request;
331 EchoResponse send_response;
332 EchoResponse recv_response;
333 Status recv_status;
334
335 ClientContext cli_ctx;
336 ServerContext srv_ctx;
337 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
338
339 send_request.set_message("Hello");
340 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
341 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
342 cli_ctx.AddMetadata(meta1.first, meta1.second);
343 cli_ctx.AddMetadata(meta2.first, meta2.second);
344
Yang Gao3a5e5492015-02-18 14:32:38 -0800345 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
346 stub_->Echo(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao406b32f2015-02-13 16:25:33 -0800347
Craig Tiller47c83fd2015-02-21 22:45:35 -0800348 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
349 tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800350 server_ok(2);
351 EXPECT_EQ(send_request.message(), recv_request.message());
352 auto client_initial_metadata = srv_ctx.client_metadata();
353 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
354 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800355 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800356 client_ok(1);
Yang Gao406b32f2015-02-13 16:25:33 -0800357
358 send_response.set_message(recv_request.message());
359 response_writer.Finish(send_response, Status::OK, tag(3));
360
361 server_ok(3);
362
Yang Gao3a5e5492015-02-18 14:32:38 -0800363 response_reader->Finish(&recv_response, &recv_status, tag(4));
364 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800365
366 EXPECT_EQ(send_response.message(), recv_response.message());
367 EXPECT_TRUE(recv_status.IsOk());
368}
369
Yang Gao2b7f5372015-02-18 00:45:53 -0800370TEST_F(AsyncEnd2endTest, ServerInitialMetadataRpc) {
371 ResetStub();
372
373 EchoRequest send_request;
374 EchoRequest recv_request;
375 EchoResponse send_response;
376 EchoResponse recv_response;
377 Status recv_status;
378
379 ClientContext cli_ctx;
380 ServerContext srv_ctx;
381 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
382
383 send_request.set_message("Hello");
384 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
385 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
386
Yang Gao3a5e5492015-02-18 14:32:38 -0800387 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
388 stub_->Echo(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800389
Craig Tiller47c83fd2015-02-21 22:45:35 -0800390 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
391 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800392 server_ok(2);
393 EXPECT_EQ(send_request.message(), recv_request.message());
394 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
395 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
Yang Gao3a5e5492015-02-18 14:32:38 -0800396 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800397 response_writer.SendInitialMetadata(tag(3));
398 server_ok(3);
399
Yang Gao3a5e5492015-02-18 14:32:38 -0800400 response_reader->ReadInitialMetadata(tag(4));
401 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800402 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
403 EXPECT_EQ(meta1.second, server_initial_metadata.find(meta1.first)->second);
404 EXPECT_EQ(meta2.second, server_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800405 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800406
407 send_response.set_message(recv_request.message());
408 response_writer.Finish(send_response, Status::OK, tag(5));
409 server_ok(5);
410
411 response_reader->Finish(&recv_response, &recv_status, tag(6));
412 client_ok(6);
413
414 EXPECT_EQ(send_response.message(), recv_response.message());
415 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800416}
417
418TEST_F(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
419 ResetStub();
420
421 EchoRequest send_request;
422 EchoRequest recv_request;
423 EchoResponse send_response;
424 EchoResponse recv_response;
425 Status recv_status;
426
427 ClientContext cli_ctx;
428 ServerContext srv_ctx;
429 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
430
431 send_request.set_message("Hello");
432 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
433 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
434
Yang Gao3a5e5492015-02-18 14:32:38 -0800435 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
436 stub_->Echo(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800437
Craig Tiller47c83fd2015-02-21 22:45:35 -0800438 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
439 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800440 server_ok(2);
441 EXPECT_EQ(send_request.message(), recv_request.message());
442 response_writer.SendInitialMetadata(tag(3));
443 server_ok(3);
Yang Gao3a5e5492015-02-18 14:32:38 -0800444 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800445
446 send_response.set_message(recv_request.message());
447 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
448 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
449 response_writer.Finish(send_response, Status::OK, tag(4));
450
451 server_ok(4);
452
Yang Gao3a5e5492015-02-18 14:32:38 -0800453 response_reader->Finish(&recv_response, &recv_status, tag(5));
454 client_ok(5);
Yang Gao2b7f5372015-02-18 00:45:53 -0800455 EXPECT_EQ(send_response.message(), recv_response.message());
456 EXPECT_TRUE(recv_status.IsOk());
457 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
458 EXPECT_EQ(meta1.second, server_trailing_metadata.find(meta1.first)->second);
459 EXPECT_EQ(meta2.second, server_trailing_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800460 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800461}
462
463TEST_F(AsyncEnd2endTest, MetadataRpc) {
464 ResetStub();
465
466 EchoRequest send_request;
467 EchoRequest recv_request;
468 EchoResponse send_response;
469 EchoResponse recv_response;
470 Status recv_status;
471
472 ClientContext cli_ctx;
473 ServerContext srv_ctx;
474 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
475
476 send_request.set_message("Hello");
477 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800478 std::pair<grpc::string, grpc::string> meta2(
479 "key2-bin", {"\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13});
Yang Gao2b7f5372015-02-18 00:45:53 -0800480 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800481 std::pair<grpc::string, grpc::string> meta6(
482 "key4-bin",
Yang Gao3a5e5492015-02-18 14:32:38 -0800483 {"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d", 14});
Yang Gao2b7f5372015-02-18 00:45:53 -0800484 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800485 std::pair<grpc::string, grpc::string> meta4(
486 "key6-bin",
Yang Gao3a5e5492015-02-18 14:32:38 -0800487 {"\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15});
Yang Gao2b7f5372015-02-18 00:45:53 -0800488
489 cli_ctx.AddMetadata(meta1.first, meta1.second);
490 cli_ctx.AddMetadata(meta2.first, meta2.second);
491
Yang Gao3a5e5492015-02-18 14:32:38 -0800492 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
493 stub_->Echo(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800494
Craig Tiller47c83fd2015-02-21 22:45:35 -0800495 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
496 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800497 server_ok(2);
498 EXPECT_EQ(send_request.message(), recv_request.message());
499 auto client_initial_metadata = srv_ctx.client_metadata();
500 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
501 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800502 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800503 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800504
505 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
506 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
507 response_writer.SendInitialMetadata(tag(3));
508 server_ok(3);
Yang Gao3a5e5492015-02-18 14:32:38 -0800509 response_reader->ReadInitialMetadata(tag(4));
510 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800511 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
512 EXPECT_EQ(meta3.second, server_initial_metadata.find(meta3.first)->second);
513 EXPECT_EQ(meta4.second, server_initial_metadata.find(meta4.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800514 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800515
516 send_response.set_message(recv_request.message());
517 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
518 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
519 response_writer.Finish(send_response, Status::OK, tag(5));
520
521 server_ok(5);
522
Yang Gao3a5e5492015-02-18 14:32:38 -0800523 response_reader->Finish(&recv_response, &recv_status, tag(6));
524 client_ok(6);
525 EXPECT_EQ(send_response.message(), recv_response.message());
526 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800527 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
528 EXPECT_EQ(meta5.second, server_trailing_metadata.find(meta5.first)->second);
529 EXPECT_EQ(meta6.second, server_trailing_metadata.find(meta6.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800530 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800531}
Craig Tiller0220cf12015-02-12 17:39:26 -0800532} // namespace
533} // namespace testing
534} // namespace grpc
535
536int main(int argc, char** argv) {
537 grpc_test_init(argc, argv);
538 grpc_init();
539 ::testing::InitGoogleTest(&argc, argv);
540 int result = RUN_ALL_TESTS();
541 grpc_shutdown();
542 google::protobuf::ShutdownProtobufLibrary();
543 return result;
544}