blob: e3cbfd6f8df38ecb9d48d0561be6537c76873a25 [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"
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"
Craig Tiller0220cf12015-02-12 17:39:26 -080040#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
Yang Gao6baa9b62015-03-17 10:49:39 -070069void* 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 Gao757afae2015-03-17 15:49:26 -070079void verify_timed_ok(
80 CompletionQueue* cq, int i, bool expect_ok,
81 std::chrono::system_clock::time_point deadline =
82 std::chrono::system_clock::time_point::max(),
83 CompletionQueue::NextStatus expected_outcome = CompletionQueue::GOT_EVENT) {
vjpai7aadf462015-03-16 23:58:44 -070084 bool ok;
85 void* got_tag;
86 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), expected_outcome);
87 if (expected_outcome == CompletionQueue::GOT_EVENT) {
88 EXPECT_EQ(expect_ok, ok);
89 EXPECT_EQ(tag(i), got_tag);
90 }
91}
92
Yang Gao406b32f2015-02-13 16:25:33 -080093class AsyncEnd2endTest : public ::testing::Test {
Craig Tiller0220cf12015-02-12 17:39:26 -080094 protected:
Yang Gao406b32f2015-02-13 16:25:33 -080095 AsyncEnd2endTest() : service_(&srv_cq_) {}
Craig Tiller0220cf12015-02-12 17:39:26 -080096
Craig Tillercf133f42015-02-26 14:05:56 -080097 void SetUp() GRPC_OVERRIDE {
Craig Tiller0220cf12015-02-12 17:39:26 -080098 int port = grpc_pick_unused_port_or_die();
99 server_address_ << "localhost:" << port;
100 // Setup server
101 ServerBuilder builder;
Nicolas Noblecfd60732015-03-18 16:27:43 -0700102 builder.AddListeningPort(server_address_.str(), grpc::InsecureServerCredentials());
Craig Tiller0220cf12015-02-12 17:39:26 -0800103 builder.RegisterAsyncService(&service_);
104 server_ = builder.BuildAndStart();
105 }
106
Craig Tillercf133f42015-02-26 14:05:56 -0800107 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800108 server_->Shutdown();
109 void* ignored_tag;
110 bool ignored_ok;
111 cli_cq_.Shutdown();
112 srv_cq_.Shutdown();
113 while (cli_cq_.Next(&ignored_tag, &ignored_ok))
114 ;
115 while (srv_cq_.Next(&ignored_tag, &ignored_ok))
116 ;
117 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800118
119 void ResetStub() {
Craig Tiller47c83fd2015-02-21 22:45:35 -0800120 std::shared_ptr<ChannelInterface> channel = CreateChannel(
121 server_address_.str(), InsecureCredentials(), ChannelArguments());
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800122 stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel));
Craig Tiller0220cf12015-02-12 17:39:26 -0800123 }
124
Craig Tiller47c83fd2015-02-21 22:45:35 -0800125 void server_ok(int i) { verify_ok(&srv_cq_, i, true); }
126 void client_ok(int i) { verify_ok(&cli_cq_, i, true); }
127 void server_fail(int i) { verify_ok(&srv_cq_, i, false); }
128 void client_fail(int i) { verify_ok(&cli_cq_, i, false); }
Yang Gao005f18a2015-02-13 10:22:33 -0800129
Yang Gao406b32f2015-02-13 16:25:33 -0800130 void SendRpc(int num_rpcs) {
131 for (int i = 0; i < num_rpcs; i++) {
132 EchoRequest send_request;
133 EchoRequest recv_request;
134 EchoResponse send_response;
135 EchoResponse recv_response;
136 Status recv_status;
137
138 ClientContext cli_ctx;
139 ServerContext srv_ctx;
140 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
141
142 send_request.set_message("Hello");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800143 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Vijay Pai64ac47f2015-02-26 17:59:51 -0800144 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao406b32f2015-02-13 16:25:33 -0800145
Craig Tiller47c83fd2015-02-21 22:45:35 -0800146 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
147 tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800148
149 server_ok(2);
150 EXPECT_EQ(send_request.message(), recv_request.message());
Yang Gao3a5e5492015-02-18 14:32:38 -0800151 client_ok(1);
Yang Gao406b32f2015-02-13 16:25:33 -0800152
153 send_response.set_message(recv_request.message());
154 response_writer.Finish(send_response, Status::OK, tag(3));
Yang Gao406b32f2015-02-13 16:25:33 -0800155 server_ok(3);
156
Yang Gao3a5e5492015-02-18 14:32:38 -0800157 response_reader->Finish(&recv_response, &recv_status, tag(4));
158 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800159
160 EXPECT_EQ(send_response.message(), recv_response.message());
161 EXPECT_TRUE(recv_status.IsOk());
162 }
163 }
164
Yang Gaobb84a302015-02-12 23:30:12 -0800165 CompletionQueue cli_cq_;
166 CompletionQueue srv_cq_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800167 std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
168 std::unique_ptr<Server> server_;
169 grpc::cpp::test::util::TestService::AsyncService service_;
170 std::ostringstream server_address_;
171};
172
Yang Gao406b32f2015-02-13 16:25:33 -0800173TEST_F(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800174 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800175 SendRpc(1);
176}
Yang Gaobb84a302015-02-12 23:30:12 -0800177
Yang Gao406b32f2015-02-13 16:25:33 -0800178TEST_F(AsyncEnd2endTest, SequentialRpcs) {
179 ResetStub();
180 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800181}
182
vjpai7aadf462015-03-16 23:58:44 -0700183// Test a simple RPC using the async version of Next
184TEST_F(AsyncEnd2endTest, AsyncNextRpc) {
185 ResetStub();
186
187 EchoRequest send_request;
188 EchoRequest recv_request;
189 EchoResponse send_response;
190 EchoResponse recv_response;
191 Status recv_status;
192
193 ClientContext cli_ctx;
194 ServerContext srv_ctx;
195 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
196
197 send_request.set_message("Hello");
Yang Gao757afae2015-03-17 15:49:26 -0700198 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
199 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
vjpai7aadf462015-03-16 23:58:44 -0700200
Yang Gao757afae2015-03-17 15:49:26 -0700201 std::chrono::system_clock::time_point time_now(
202 std::chrono::system_clock::now()),
203 time_limit(std::chrono::system_clock::now() + std::chrono::seconds(5));
vjpai7aadf462015-03-16 23:58:44 -0700204 verify_timed_ok(&srv_cq_, -1, true, time_now, CompletionQueue::TIMEOUT);
205 verify_timed_ok(&cli_cq_, -1, true, time_now, CompletionQueue::TIMEOUT);
206
207 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
Yang Gao757afae2015-03-17 15:49:26 -0700208 tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700209
210 verify_timed_ok(&srv_cq_, 2, true, time_limit);
211 EXPECT_EQ(send_request.message(), recv_request.message());
212 verify_timed_ok(&cli_cq_, 1, true, time_limit);
213
214 send_response.set_message(recv_request.message());
215 response_writer.Finish(send_response, Status::OK, tag(3));
216 verify_timed_ok(&srv_cq_, 3, true);
217
218 response_reader->Finish(&recv_response, &recv_status, tag(4));
219 verify_timed_ok(&cli_cq_, 4, true);
220
221 EXPECT_EQ(send_response.message(), recv_response.message());
222 EXPECT_TRUE(recv_status.IsOk());
vjpai7aadf462015-03-16 23:58:44 -0700223}
Yang Gao757afae2015-03-17 15:49:26 -0700224
Yang Gao0e0d8e12015-02-13 14:40:41 -0800225// Two pings and a final pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800226TEST_F(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800227 ResetStub();
228
229 EchoRequest send_request;
230 EchoRequest recv_request;
231 EchoResponse send_response;
232 EchoResponse recv_response;
233 Status recv_status;
234 ClientContext cli_ctx;
235 ServerContext srv_ctx;
236 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
237
238 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800239 std::unique_ptr<ClientAsyncWriter<EchoRequest> > cli_stream(
vjpai56c51292015-02-26 17:01:35 -0800240 stub_->AsyncRequestStream(&cli_ctx, &recv_response, &cli_cq_, tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800241
Craig Tiller47c83fd2015-02-21 22:45:35 -0800242 service_.RequestRequestStream(&srv_ctx, &srv_stream, &srv_cq_, tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800243
244 server_ok(2);
245 client_ok(1);
246
247 cli_stream->Write(send_request, tag(3));
248 client_ok(3);
249
250 srv_stream.Read(&recv_request, tag(4));
251 server_ok(4);
252 EXPECT_EQ(send_request.message(), recv_request.message());
253
254 cli_stream->Write(send_request, tag(5));
255 client_ok(5);
256
257 srv_stream.Read(&recv_request, tag(6));
258 server_ok(6);
259
260 EXPECT_EQ(send_request.message(), recv_request.message());
261 cli_stream->WritesDone(tag(7));
262 client_ok(7);
263
264 srv_stream.Read(&recv_request, tag(8));
265 server_fail(8);
266
267 send_response.set_message(recv_request.message());
268 srv_stream.Finish(send_response, Status::OK, tag(9));
269 server_ok(9);
270
271 cli_stream->Finish(&recv_status, tag(10));
272 client_ok(10);
273
274 EXPECT_EQ(send_response.message(), recv_response.message());
275 EXPECT_TRUE(recv_status.IsOk());
276}
277
Yang Gao0e0d8e12015-02-13 14:40:41 -0800278// One ping, two pongs.
Yang Gao406b32f2015-02-13 16:25:33 -0800279TEST_F(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800280 ResetStub();
281
282 EchoRequest send_request;
283 EchoRequest recv_request;
284 EchoResponse send_response;
285 EchoResponse recv_response;
286 Status recv_status;
287 ClientContext cli_ctx;
288 ServerContext srv_ctx;
289 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
290
291 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800292 std::unique_ptr<ClientAsyncReader<EchoResponse> > cli_stream(
vjpai56c51292015-02-26 17:01:35 -0800293 stub_->AsyncResponseStream(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800294
Craig Tiller47c83fd2015-02-21 22:45:35 -0800295 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream, &srv_cq_,
296 tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800297
298 server_ok(2);
299 client_ok(1);
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(3));
304 server_ok(3);
305
306 cli_stream->Read(&recv_response, tag(4));
307 client_ok(4);
308 EXPECT_EQ(send_response.message(), recv_response.message());
309
310 srv_stream.Write(send_response, tag(5));
311 server_ok(5);
312
313 cli_stream->Read(&recv_response, tag(6));
314 client_ok(6);
315 EXPECT_EQ(send_response.message(), recv_response.message());
316
317 srv_stream.Finish(Status::OK, tag(7));
318 server_ok(7);
319
320 cli_stream->Read(&recv_response, tag(8));
321 client_fail(8);
322
323 cli_stream->Finish(&recv_status, tag(9));
324 client_ok(9);
325
326 EXPECT_TRUE(recv_status.IsOk());
327}
328
329// One ping, one pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800330TEST_F(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800331 ResetStub();
332
333 EchoRequest send_request;
334 EchoRequest recv_request;
335 EchoResponse send_response;
336 EchoResponse recv_response;
337 Status recv_status;
338 ClientContext cli_ctx;
339 ServerContext srv_ctx;
340 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
341
342 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800343 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse> >
vjpai56c51292015-02-26 17:01:35 -0800344 cli_stream(stub_->AsyncBidiStream(&cli_ctx, &cli_cq_, tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800345
Craig Tiller47c83fd2015-02-21 22:45:35 -0800346 service_.RequestBidiStream(&srv_ctx, &srv_stream, &srv_cq_, tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800347
348 server_ok(2);
349 client_ok(1);
350
351 cli_stream->Write(send_request, tag(3));
352 client_ok(3);
353
354 srv_stream.Read(&recv_request, tag(4));
355 server_ok(4);
356 EXPECT_EQ(send_request.message(), recv_request.message());
357
358 send_response.set_message(recv_request.message());
359 srv_stream.Write(send_response, tag(5));
360 server_ok(5);
361
362 cli_stream->Read(&recv_response, tag(6));
363 client_ok(6);
364 EXPECT_EQ(send_response.message(), recv_response.message());
365
366 cli_stream->WritesDone(tag(7));
367 client_ok(7);
368
369 srv_stream.Read(&recv_request, tag(8));
370 server_fail(8);
371
372 srv_stream.Finish(Status::OK, tag(9));
373 server_ok(9);
374
375 cli_stream->Finish(&recv_status, tag(10));
376 client_ok(10);
377
378 EXPECT_TRUE(recv_status.IsOk());
379}
380
Yang Gao406b32f2015-02-13 16:25:33 -0800381// Metadata tests
382TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) {
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 cli_ctx.AddMetadata(meta1.first, meta1.second);
399 cli_ctx.AddMetadata(meta2.first, meta2.second);
400
Yang Gao3a5e5492015-02-18 14:32:38 -0800401 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800402 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao406b32f2015-02-13 16:25:33 -0800403
Craig Tiller47c83fd2015-02-21 22:45:35 -0800404 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
405 tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800406 server_ok(2);
407 EXPECT_EQ(send_request.message(), recv_request.message());
408 auto client_initial_metadata = srv_ctx.client_metadata();
409 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
410 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800411 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800412 client_ok(1);
Yang Gao406b32f2015-02-13 16:25:33 -0800413
414 send_response.set_message(recv_request.message());
415 response_writer.Finish(send_response, Status::OK, tag(3));
416
417 server_ok(3);
418
Yang Gao3a5e5492015-02-18 14:32:38 -0800419 response_reader->Finish(&recv_response, &recv_status, tag(4));
420 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800421
422 EXPECT_EQ(send_response.message(), recv_response.message());
423 EXPECT_TRUE(recv_status.IsOk());
424}
425
Yang Gao2b7f5372015-02-18 00:45:53 -0800426TEST_F(AsyncEnd2endTest, ServerInitialMetadataRpc) {
427 ResetStub();
428
429 EchoRequest send_request;
430 EchoRequest recv_request;
431 EchoResponse send_response;
432 EchoResponse recv_response;
433 Status recv_status;
434
435 ClientContext cli_ctx;
436 ServerContext srv_ctx;
437 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
438
439 send_request.set_message("Hello");
440 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
441 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
442
Yang Gao3a5e5492015-02-18 14:32:38 -0800443 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800444 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800445
Craig Tiller47c83fd2015-02-21 22:45:35 -0800446 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
447 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800448 server_ok(2);
449 EXPECT_EQ(send_request.message(), recv_request.message());
450 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
451 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
Yang Gao3a5e5492015-02-18 14:32:38 -0800452 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800453 response_writer.SendInitialMetadata(tag(3));
454 server_ok(3);
455
Yang Gao3a5e5492015-02-18 14:32:38 -0800456 response_reader->ReadInitialMetadata(tag(4));
457 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800458 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
459 EXPECT_EQ(meta1.second, server_initial_metadata.find(meta1.first)->second);
460 EXPECT_EQ(meta2.second, server_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800461 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800462
463 send_response.set_message(recv_request.message());
464 response_writer.Finish(send_response, Status::OK, tag(5));
465 server_ok(5);
466
467 response_reader->Finish(&recv_response, &recv_status, tag(6));
468 client_ok(6);
469
470 EXPECT_EQ(send_response.message(), recv_response.message());
471 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800472}
473
474TEST_F(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
475 ResetStub();
476
477 EchoRequest send_request;
478 EchoRequest recv_request;
479 EchoResponse send_response;
480 EchoResponse recv_response;
481 Status recv_status;
482
483 ClientContext cli_ctx;
484 ServerContext srv_ctx;
485 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
486
487 send_request.set_message("Hello");
488 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
489 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
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
Craig Tiller47c83fd2015-02-21 22:45:35 -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 response_writer.SendInitialMetadata(tag(3));
499 server_ok(3);
Yang Gao3a5e5492015-02-18 14:32:38 -0800500 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800501
502 send_response.set_message(recv_request.message());
503 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
504 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
505 response_writer.Finish(send_response, Status::OK, tag(4));
506
507 server_ok(4);
508
Yang Gao3a5e5492015-02-18 14:32:38 -0800509 response_reader->Finish(&recv_response, &recv_status, tag(5));
510 client_ok(5);
Yang Gao2b7f5372015-02-18 00:45:53 -0800511 EXPECT_EQ(send_response.message(), recv_response.message());
512 EXPECT_TRUE(recv_status.IsOk());
513 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
514 EXPECT_EQ(meta1.second, server_trailing_metadata.find(meta1.first)->second);
515 EXPECT_EQ(meta2.second, server_trailing_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800516 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800517}
518
519TEST_F(AsyncEnd2endTest, MetadataRpc) {
520 ResetStub();
521
522 EchoRequest send_request;
523 EchoRequest recv_request;
524 EchoResponse send_response;
525 EchoResponse recv_response;
526 Status recv_status;
527
528 ClientContext cli_ctx;
529 ServerContext srv_ctx;
530 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
531
532 send_request.set_message("Hello");
533 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800534 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400535 "key2-bin",
536 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc",
537 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800538 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800539 std::pair<grpc::string, grpc::string> meta6(
540 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400541 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
542 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800543 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800544 std::pair<grpc::string, grpc::string> meta4(
545 "key6-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400546 grpc::string("\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee",
547 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800548
549 cli_ctx.AddMetadata(meta1.first, meta1.second);
550 cli_ctx.AddMetadata(meta2.first, meta2.second);
551
Yang Gao3a5e5492015-02-18 14:32:38 -0800552 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800553 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800554
Craig Tiller47c83fd2015-02-21 22:45:35 -0800555 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
556 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800557 server_ok(2);
558 EXPECT_EQ(send_request.message(), recv_request.message());
559 auto client_initial_metadata = srv_ctx.client_metadata();
560 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
561 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800562 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800563 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800564
565 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
566 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
567 response_writer.SendInitialMetadata(tag(3));
568 server_ok(3);
Yang Gao3a5e5492015-02-18 14:32:38 -0800569 response_reader->ReadInitialMetadata(tag(4));
570 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800571 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
572 EXPECT_EQ(meta3.second, server_initial_metadata.find(meta3.first)->second);
573 EXPECT_EQ(meta4.second, server_initial_metadata.find(meta4.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800574 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800575
576 send_response.set_message(recv_request.message());
577 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
578 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
579 response_writer.Finish(send_response, Status::OK, tag(5));
580
581 server_ok(5);
582
Yang Gao3a5e5492015-02-18 14:32:38 -0800583 response_reader->Finish(&recv_response, &recv_status, tag(6));
584 client_ok(6);
585 EXPECT_EQ(send_response.message(), recv_response.message());
586 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800587 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
588 EXPECT_EQ(meta5.second, server_trailing_metadata.find(meta5.first)->second);
589 EXPECT_EQ(meta6.second, server_trailing_metadata.find(meta6.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800590 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800591}
Craig Tiller0220cf12015-02-12 17:39:26 -0800592} // namespace
593} // namespace testing
594} // namespace grpc
595
596int main(int argc, char** argv) {
597 grpc_test_init(argc, argv);
Craig Tiller0220cf12015-02-12 17:39:26 -0800598 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -0700599 return RUN_ALL_TESTS();
Craig Tiller0220cf12015-02-12 17:39:26 -0800600}