blob: 4c2f0fa13b8c0f25681c8a1789076ee17d34e703 [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
Yang Gaoda699b82015-02-18 01:10:22 -080034#include <memory>
Craig Tiller0220cf12015-02-12 17:39:26 -080035
Nicolas Noble89219162015-04-07 18:01:18 -070036#include "test/core/util/port.h"
Craig Tiller0220cf12015-02-12 17:39:26 -080037#include "test/core/util/test_config.h"
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +020038#include "test/cpp/util/echo_duplicate.grpc.pb.h"
39#include "test/cpp/util/echo.grpc.pb.h"
Yang Gao3a5e5492015-02-18 14:32:38 -080040#include <grpc++/async_unary_call.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080041#include <grpc++/channel_arguments.h>
42#include <grpc++/channel_interface.h>
43#include <grpc++/client_context.h>
44#include <grpc++/create_channel.h>
45#include <grpc++/credentials.h>
46#include <grpc++/server.h>
47#include <grpc++/server_builder.h>
48#include <grpc++/server_context.h>
Craig Tiller42bc87c2015-02-23 08:50:19 -080049#include <grpc++/server_credentials.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080050#include <grpc++/status.h>
51#include <grpc++/stream.h>
Nicolas Noble89219162015-04-07 18:01:18 -070052#include <grpc++/time.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080053#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 Gao6baa9b62015-03-17 10:49:39 -070068void* 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 Gao757afae2015-03-17 15:49:26 -070078void verify_timed_ok(
79 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 = CompletionQueue::GOT_EVENT) {
vjpai7aadf462015-03-16 23:58:44 -070083 bool ok;
84 void* got_tag;
85 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), expected_outcome);
86 if (expected_outcome == CompletionQueue::GOT_EVENT) {
87 EXPECT_EQ(expect_ok, ok);
88 EXPECT_EQ(tag(i), got_tag);
89 }
90}
91
Yang Gao406b32f2015-02-13 16:25:33 -080092class AsyncEnd2endTest : public ::testing::Test {
Craig Tiller0220cf12015-02-12 17:39:26 -080093 protected:
Yang Gao406b32f2015-02-13 16:25:33 -080094 AsyncEnd2endTest() : service_(&srv_cq_) {}
Craig Tiller0220cf12015-02-12 17:39:26 -080095
Craig Tillercf133f42015-02-26 14:05:56 -080096 void SetUp() GRPC_OVERRIDE {
Craig Tiller0220cf12015-02-12 17:39:26 -080097 int port = grpc_pick_unused_port_or_die();
98 server_address_ << "localhost:" << port;
99 // Setup server
100 ServerBuilder builder;
Nicolas Noblecfd60732015-03-18 16:27:43 -0700101 builder.AddListeningPort(server_address_.str(), grpc::InsecureServerCredentials());
Craig Tiller0220cf12015-02-12 17:39:26 -0800102 builder.RegisterAsyncService(&service_);
103 server_ = builder.BuildAndStart();
104 }
105
Craig Tillercf133f42015-02-26 14:05:56 -0800106 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800107 server_->Shutdown();
108 void* ignored_tag;
109 bool ignored_ok;
110 cli_cq_.Shutdown();
111 srv_cq_.Shutdown();
112 while (cli_cq_.Next(&ignored_tag, &ignored_ok))
113 ;
114 while (srv_cq_.Next(&ignored_tag, &ignored_ok))
115 ;
116 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800117
118 void ResetStub() {
Craig Tiller47c83fd2015-02-21 22:45:35 -0800119 std::shared_ptr<ChannelInterface> channel = CreateChannel(
120 server_address_.str(), InsecureCredentials(), ChannelArguments());
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800121 stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel));
Craig Tiller0220cf12015-02-12 17:39:26 -0800122 }
123
Craig Tiller47c83fd2015-02-21 22:45:35 -0800124 void server_ok(int i) { verify_ok(&srv_cq_, i, true); }
125 void client_ok(int i) { verify_ok(&cli_cq_, i, true); }
126 void server_fail(int i) { verify_ok(&srv_cq_, i, false); }
127 void client_fail(int i) { verify_ok(&cli_cq_, i, false); }
Yang Gao005f18a2015-02-13 10:22:33 -0800128
Yang Gao406b32f2015-02-13 16:25:33 -0800129 void SendRpc(int num_rpcs) {
130 for (int i = 0; i < num_rpcs; i++) {
131 EchoRequest send_request;
132 EchoRequest recv_request;
133 EchoResponse send_response;
134 EchoResponse recv_response;
135 Status recv_status;
136
137 ClientContext cli_ctx;
138 ServerContext srv_ctx;
139 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
140
141 send_request.set_message("Hello");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800142 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller3676b382015-05-06 13:01:05 -0700143 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
Yang Gao406b32f2015-02-13 16:25:33 -0800144
Craig Tiller47c83fd2015-02-21 22:45:35 -0800145 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
146 tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800147
148 server_ok(2);
149 EXPECT_EQ(send_request.message(), recv_request.message());
150
151 send_response.set_message(recv_request.message());
152 response_writer.Finish(send_response, Status::OK, tag(3));
Yang Gao406b32f2015-02-13 16:25:33 -0800153 server_ok(3);
154
Yang Gao3a5e5492015-02-18 14:32:38 -0800155 response_reader->Finish(&recv_response, &recv_status, tag(4));
156 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800157
158 EXPECT_EQ(send_response.message(), recv_response.message());
159 EXPECT_TRUE(recv_status.IsOk());
160 }
161 }
162
Yang Gaobb84a302015-02-12 23:30:12 -0800163 CompletionQueue cli_cq_;
164 CompletionQueue srv_cq_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800165 std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
166 std::unique_ptr<Server> server_;
167 grpc::cpp::test::util::TestService::AsyncService service_;
168 std::ostringstream server_address_;
169};
170
Yang Gao406b32f2015-02-13 16:25:33 -0800171TEST_F(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800172 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800173 SendRpc(1);
174}
Yang Gaobb84a302015-02-12 23:30:12 -0800175
Yang Gao406b32f2015-02-13 16:25:33 -0800176TEST_F(AsyncEnd2endTest, SequentialRpcs) {
177 ResetStub();
178 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800179}
180
vjpai7aadf462015-03-16 23:58:44 -0700181// Test a simple RPC using the async version of Next
182TEST_F(AsyncEnd2endTest, AsyncNextRpc) {
183 ResetStub();
184
185 EchoRequest send_request;
186 EchoRequest recv_request;
187 EchoResponse send_response;
188 EchoResponse recv_response;
189 Status recv_status;
190
191 ClientContext cli_ctx;
192 ServerContext srv_ctx;
193 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
194
195 send_request.set_message("Hello");
Yang Gao757afae2015-03-17 15:49:26 -0700196 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller3676b382015-05-06 13:01:05 -0700197 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
vjpai7aadf462015-03-16 23:58:44 -0700198
Yang Gao757afae2015-03-17 15:49:26 -0700199 std::chrono::system_clock::time_point time_now(
200 std::chrono::system_clock::now()),
201 time_limit(std::chrono::system_clock::now() + std::chrono::seconds(5));
vjpai7aadf462015-03-16 23:58:44 -0700202 verify_timed_ok(&srv_cq_, -1, true, time_now, CompletionQueue::TIMEOUT);
203 verify_timed_ok(&cli_cq_, -1, true, time_now, CompletionQueue::TIMEOUT);
204
205 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
Yang Gao757afae2015-03-17 15:49:26 -0700206 tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700207
208 verify_timed_ok(&srv_cq_, 2, true, time_limit);
209 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700210
211 send_response.set_message(recv_request.message());
212 response_writer.Finish(send_response, Status::OK, tag(3));
213 verify_timed_ok(&srv_cq_, 3, true);
214
215 response_reader->Finish(&recv_response, &recv_status, tag(4));
216 verify_timed_ok(&cli_cq_, 4, true);
217
218 EXPECT_EQ(send_response.message(), recv_response.message());
219 EXPECT_TRUE(recv_status.IsOk());
vjpai7aadf462015-03-16 23:58:44 -0700220}
Yang Gao757afae2015-03-17 15:49:26 -0700221
Yang Gao0e0d8e12015-02-13 14:40:41 -0800222// Two pings and a final pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800223TEST_F(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -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 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
234
235 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800236 std::unique_ptr<ClientAsyncWriter<EchoRequest> > cli_stream(
vjpai56c51292015-02-26 17:01:35 -0800237 stub_->AsyncRequestStream(&cli_ctx, &recv_response, &cli_cq_, tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800238
Craig Tiller47c83fd2015-02-21 22:45:35 -0800239 service_.RequestRequestStream(&srv_ctx, &srv_stream, &srv_cq_, tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800240
241 server_ok(2);
242 client_ok(1);
243
244 cli_stream->Write(send_request, tag(3));
245 client_ok(3);
246
247 srv_stream.Read(&recv_request, tag(4));
248 server_ok(4);
249 EXPECT_EQ(send_request.message(), recv_request.message());
250
251 cli_stream->Write(send_request, tag(5));
252 client_ok(5);
253
254 srv_stream.Read(&recv_request, tag(6));
255 server_ok(6);
256
257 EXPECT_EQ(send_request.message(), recv_request.message());
258 cli_stream->WritesDone(tag(7));
259 client_ok(7);
260
261 srv_stream.Read(&recv_request, tag(8));
262 server_fail(8);
263
264 send_response.set_message(recv_request.message());
265 srv_stream.Finish(send_response, Status::OK, tag(9));
266 server_ok(9);
267
268 cli_stream->Finish(&recv_status, tag(10));
269 client_ok(10);
270
271 EXPECT_EQ(send_response.message(), recv_response.message());
272 EXPECT_TRUE(recv_status.IsOk());
273}
274
Yang Gao0e0d8e12015-02-13 14:40:41 -0800275// One ping, two pongs.
Yang Gao406b32f2015-02-13 16:25:33 -0800276TEST_F(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800277 ResetStub();
278
279 EchoRequest send_request;
280 EchoRequest recv_request;
281 EchoResponse send_response;
282 EchoResponse recv_response;
283 Status recv_status;
284 ClientContext cli_ctx;
285 ServerContext srv_ctx;
286 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
287
288 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800289 std::unique_ptr<ClientAsyncReader<EchoResponse> > cli_stream(
vjpai56c51292015-02-26 17:01:35 -0800290 stub_->AsyncResponseStream(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800291
Craig Tiller47c83fd2015-02-21 22:45:35 -0800292 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream, &srv_cq_,
293 tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800294
295 server_ok(2);
296 client_ok(1);
297 EXPECT_EQ(send_request.message(), recv_request.message());
298
299 send_response.set_message(recv_request.message());
300 srv_stream.Write(send_response, tag(3));
301 server_ok(3);
302
303 cli_stream->Read(&recv_response, tag(4));
304 client_ok(4);
305 EXPECT_EQ(send_response.message(), recv_response.message());
306
307 srv_stream.Write(send_response, tag(5));
308 server_ok(5);
309
310 cli_stream->Read(&recv_response, tag(6));
311 client_ok(6);
312 EXPECT_EQ(send_response.message(), recv_response.message());
313
314 srv_stream.Finish(Status::OK, tag(7));
315 server_ok(7);
316
317 cli_stream->Read(&recv_response, tag(8));
318 client_fail(8);
319
320 cli_stream->Finish(&recv_status, tag(9));
321 client_ok(9);
322
323 EXPECT_TRUE(recv_status.IsOk());
324}
325
326// One ping, one pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800327TEST_F(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800328 ResetStub();
329
330 EchoRequest send_request;
331 EchoRequest recv_request;
332 EchoResponse send_response;
333 EchoResponse recv_response;
334 Status recv_status;
335 ClientContext cli_ctx;
336 ServerContext srv_ctx;
337 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
338
339 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800340 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse> >
vjpai56c51292015-02-26 17:01:35 -0800341 cli_stream(stub_->AsyncBidiStream(&cli_ctx, &cli_cq_, tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800342
Craig Tiller47c83fd2015-02-21 22:45:35 -0800343 service_.RequestBidiStream(&srv_ctx, &srv_stream, &srv_cq_, tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800344
345 server_ok(2);
346 client_ok(1);
347
348 cli_stream->Write(send_request, tag(3));
349 client_ok(3);
350
351 srv_stream.Read(&recv_request, tag(4));
352 server_ok(4);
353 EXPECT_EQ(send_request.message(), recv_request.message());
354
355 send_response.set_message(recv_request.message());
356 srv_stream.Write(send_response, tag(5));
357 server_ok(5);
358
359 cli_stream->Read(&recv_response, tag(6));
360 client_ok(6);
361 EXPECT_EQ(send_response.message(), recv_response.message());
362
363 cli_stream->WritesDone(tag(7));
364 client_ok(7);
365
366 srv_stream.Read(&recv_request, tag(8));
367 server_fail(8);
368
369 srv_stream.Finish(Status::OK, tag(9));
370 server_ok(9);
371
372 cli_stream->Finish(&recv_status, tag(10));
373 client_ok(10);
374
375 EXPECT_TRUE(recv_status.IsOk());
376}
377
Yang Gao406b32f2015-02-13 16:25:33 -0800378// Metadata tests
379TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) {
380 ResetStub();
381
382 EchoRequest send_request;
383 EchoRequest recv_request;
384 EchoResponse send_response;
385 EchoResponse recv_response;
386 Status recv_status;
387
388 ClientContext cli_ctx;
389 ServerContext srv_ctx;
390 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
391
392 send_request.set_message("Hello");
393 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
394 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
395 cli_ctx.AddMetadata(meta1.first, meta1.second);
396 cli_ctx.AddMetadata(meta2.first, meta2.second);
397
Yang Gao3a5e5492015-02-18 14:32:38 -0800398 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller3676b382015-05-06 13:01:05 -0700399 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
Yang Gao406b32f2015-02-13 16:25:33 -0800400
Craig Tiller47c83fd2015-02-21 22:45:35 -0800401 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
402 tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800403 server_ok(2);
404 EXPECT_EQ(send_request.message(), recv_request.message());
405 auto client_initial_metadata = srv_ctx.client_metadata();
406 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
407 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800408 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao406b32f2015-02-13 16:25:33 -0800409
410 send_response.set_message(recv_request.message());
411 response_writer.Finish(send_response, Status::OK, tag(3));
412
413 server_ok(3);
414
Yang Gao3a5e5492015-02-18 14:32:38 -0800415 response_reader->Finish(&recv_response, &recv_status, tag(4));
416 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800417
418 EXPECT_EQ(send_response.message(), recv_response.message());
419 EXPECT_TRUE(recv_status.IsOk());
420}
421
Yang Gao2b7f5372015-02-18 00:45:53 -0800422TEST_F(AsyncEnd2endTest, ServerInitialMetadataRpc) {
423 ResetStub();
424
425 EchoRequest send_request;
426 EchoRequest recv_request;
427 EchoResponse send_response;
428 EchoResponse recv_response;
429 Status recv_status;
430
431 ClientContext cli_ctx;
432 ServerContext srv_ctx;
433 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
434
435 send_request.set_message("Hello");
436 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
437 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
438
Yang Gao3a5e5492015-02-18 14:32:38 -0800439 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller3676b382015-05-06 13:01:05 -0700440 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
Yang Gao2b7f5372015-02-18 00:45:53 -0800441
Craig Tiller47c83fd2015-02-21 22:45:35 -0800442 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
443 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800444 server_ok(2);
445 EXPECT_EQ(send_request.message(), recv_request.message());
446 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
447 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
448 response_writer.SendInitialMetadata(tag(3));
449 server_ok(3);
450
Yang Gao3a5e5492015-02-18 14:32:38 -0800451 response_reader->ReadInitialMetadata(tag(4));
452 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800453 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
454 EXPECT_EQ(meta1.second, server_initial_metadata.find(meta1.first)->second);
455 EXPECT_EQ(meta2.second, server_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800456 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800457
458 send_response.set_message(recv_request.message());
459 response_writer.Finish(send_response, Status::OK, tag(5));
460 server_ok(5);
461
462 response_reader->Finish(&recv_response, &recv_status, tag(6));
463 client_ok(6);
464
465 EXPECT_EQ(send_response.message(), recv_response.message());
466 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800467}
468
469TEST_F(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
470 ResetStub();
471
472 EchoRequest send_request;
473 EchoRequest recv_request;
474 EchoResponse send_response;
475 EchoResponse recv_response;
476 Status recv_status;
477
478 ClientContext cli_ctx;
479 ServerContext srv_ctx;
480 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
481
482 send_request.set_message("Hello");
483 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
484 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
485
Yang Gao3a5e5492015-02-18 14:32:38 -0800486 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller3676b382015-05-06 13:01:05 -0700487 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
Yang Gao2b7f5372015-02-18 00:45:53 -0800488
Craig Tiller47c83fd2015-02-21 22:45:35 -0800489 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
490 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800491 server_ok(2);
492 EXPECT_EQ(send_request.message(), recv_request.message());
493 response_writer.SendInitialMetadata(tag(3));
494 server_ok(3);
495
496 send_response.set_message(recv_request.message());
497 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
498 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
499 response_writer.Finish(send_response, Status::OK, tag(4));
500
501 server_ok(4);
502
Yang Gao3a5e5492015-02-18 14:32:38 -0800503 response_reader->Finish(&recv_response, &recv_status, tag(5));
504 client_ok(5);
Yang Gao2b7f5372015-02-18 00:45:53 -0800505 EXPECT_EQ(send_response.message(), recv_response.message());
506 EXPECT_TRUE(recv_status.IsOk());
507 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
508 EXPECT_EQ(meta1.second, server_trailing_metadata.find(meta1.first)->second);
509 EXPECT_EQ(meta2.second, server_trailing_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800510 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800511}
512
513TEST_F(AsyncEnd2endTest, MetadataRpc) {
514 ResetStub();
515
516 EchoRequest send_request;
517 EchoRequest recv_request;
518 EchoResponse send_response;
519 EchoResponse recv_response;
520 Status recv_status;
521
522 ClientContext cli_ctx;
523 ServerContext srv_ctx;
524 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
525
526 send_request.set_message("Hello");
527 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800528 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400529 "key2-bin",
530 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc",
531 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800532 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800533 std::pair<grpc::string, grpc::string> meta6(
534 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400535 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
536 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800537 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800538 std::pair<grpc::string, grpc::string> meta4(
539 "key6-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400540 grpc::string("\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee",
541 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800542
543 cli_ctx.AddMetadata(meta1.first, meta1.second);
544 cli_ctx.AddMetadata(meta2.first, meta2.second);
545
Yang Gao3a5e5492015-02-18 14:32:38 -0800546 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller3676b382015-05-06 13:01:05 -0700547 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
Yang Gao2b7f5372015-02-18 00:45:53 -0800548
Craig Tiller47c83fd2015-02-21 22:45:35 -0800549 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
550 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800551 server_ok(2);
552 EXPECT_EQ(send_request.message(), recv_request.message());
553 auto client_initial_metadata = srv_ctx.client_metadata();
554 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
555 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800556 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800557 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800558
559 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
560 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
561 response_writer.SendInitialMetadata(tag(3));
562 server_ok(3);
Yang Gao3a5e5492015-02-18 14:32:38 -0800563 response_reader->ReadInitialMetadata(tag(4));
564 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800565 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
566 EXPECT_EQ(meta3.second, server_initial_metadata.find(meta3.first)->second);
567 EXPECT_EQ(meta4.second, server_initial_metadata.find(meta4.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800568 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800569
570 send_response.set_message(recv_request.message());
571 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
572 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
573 response_writer.Finish(send_response, Status::OK, tag(5));
574
575 server_ok(5);
576
Yang Gao3a5e5492015-02-18 14:32:38 -0800577 response_reader->Finish(&recv_response, &recv_status, tag(6));
578 client_ok(6);
579 EXPECT_EQ(send_response.message(), recv_response.message());
580 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800581 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
582 EXPECT_EQ(meta5.second, server_trailing_metadata.find(meta5.first)->second);
583 EXPECT_EQ(meta6.second, server_trailing_metadata.find(meta6.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800584 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800585}
Craig Tiller0220cf12015-02-12 17:39:26 -0800586} // namespace
587} // namespace testing
588} // namespace grpc
589
590int main(int argc, char** argv) {
591 grpc_test_init(argc, argv);
Craig Tiller0220cf12015-02-12 17:39:26 -0800592 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -0700593 return RUN_ALL_TESTS();
Craig Tiller0220cf12015-02-12 17:39:26 -0800594}