blob: 24595a820f62582681299fe768977623863ee668 [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:
Craig Tillerf9e6adf2015-05-06 11:45:59 -070094 AsyncEnd2endTest() {}
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_);
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700103 srv_cq_ = builder.AddCompletionQueue();
Craig Tiller0220cf12015-02-12 17:39:26 -0800104 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();
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700112 srv_cq_->Shutdown();
Craig Tiller492968f2015-02-18 13:14:03 -0800113 while (cli_cq_.Next(&ignored_tag, &ignored_ok))
114 ;
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700115 while (srv_cq_->Next(&ignored_tag, &ignored_ok))
Craig Tiller492968f2015-02-18 13:14:03 -0800116 ;
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 Tillerf9e6adf2015-05-06 11:45:59 -0700125 void server_ok(int i) { verify_ok(srv_cq_.get(), i, true); }
Craig Tiller47c83fd2015-02-21 22:45:35 -0800126 void client_ok(int i) { verify_ok(&cli_cq_, i, true); }
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700127 void server_fail(int i) { verify_ok(srv_cq_.get(), i, false); }
Craig Tiller47c83fd2015-02-21 22:45:35 -0800128 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(
Craig Tiller3676b382015-05-06 13:01:05 -0700144 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
Yang Gao406b32f2015-02-13 16:25:33 -0800145
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700146 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer,
147 srv_cq_.get(), srv_cq_.get(), tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800148
149 server_ok(2);
150 EXPECT_EQ(send_request.message(), recv_request.message());
151
152 send_response.set_message(recv_request.message());
153 response_writer.Finish(send_response, Status::OK, tag(3));
Yang Gao406b32f2015-02-13 16:25:33 -0800154 server_ok(3);
155
Yang Gao3a5e5492015-02-18 14:32:38 -0800156 response_reader->Finish(&recv_response, &recv_status, tag(4));
157 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800158
159 EXPECT_EQ(send_response.message(), recv_response.message());
160 EXPECT_TRUE(recv_status.IsOk());
161 }
162 }
163
Yang Gaobb84a302015-02-12 23:30:12 -0800164 CompletionQueue cli_cq_;
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700165 std::unique_ptr<ServerCompletionQueue> srv_cq_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800166 std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
167 std::unique_ptr<Server> server_;
168 grpc::cpp::test::util::TestService::AsyncService service_;
169 std::ostringstream server_address_;
170};
171
Yang Gao406b32f2015-02-13 16:25:33 -0800172TEST_F(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800173 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800174 SendRpc(1);
175}
Yang Gaobb84a302015-02-12 23:30:12 -0800176
Yang Gao406b32f2015-02-13 16:25:33 -0800177TEST_F(AsyncEnd2endTest, SequentialRpcs) {
178 ResetStub();
179 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800180}
181
vjpai7aadf462015-03-16 23:58:44 -0700182// Test a simple RPC using the async version of Next
183TEST_F(AsyncEnd2endTest, AsyncNextRpc) {
184 ResetStub();
185
186 EchoRequest send_request;
187 EchoRequest recv_request;
188 EchoResponse send_response;
189 EchoResponse recv_response;
190 Status recv_status;
191
192 ClientContext cli_ctx;
193 ServerContext srv_ctx;
194 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
195
196 send_request.set_message("Hello");
Yang Gao757afae2015-03-17 15:49:26 -0700197 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller3676b382015-05-06 13:01:05 -0700198 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
vjpai7aadf462015-03-16 23:58:44 -0700199
Yang Gao757afae2015-03-17 15:49:26 -0700200 std::chrono::system_clock::time_point time_now(
Craig Tillerf51199f2015-05-08 09:32:53 -0700201 std::chrono::system_clock::now());
202 std::chrono::system_clock::time_point time_limit(
203 std::chrono::system_clock::now() + std::chrono::seconds(10));
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700204 verify_timed_ok(srv_cq_.get(), -1, true, time_now, CompletionQueue::TIMEOUT);
vjpai7aadf462015-03-16 23:58:44 -0700205 verify_timed_ok(&cli_cq_, -1, true, time_now, CompletionQueue::TIMEOUT);
206
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700207 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, srv_cq_.get(),
208 srv_cq_.get(), tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700209
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700210 verify_timed_ok(srv_cq_.get(), 2, true, time_limit);
vjpai7aadf462015-03-16 23:58:44 -0700211 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700212
213 send_response.set_message(recv_request.message());
214 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700215 verify_timed_ok(srv_cq_.get(), 3, true);
vjpai7aadf462015-03-16 23:58:44 -0700216
217 response_reader->Finish(&recv_response, &recv_status, tag(4));
218 verify_timed_ok(&cli_cq_, 4, true);
219
220 EXPECT_EQ(send_response.message(), recv_response.message());
221 EXPECT_TRUE(recv_status.IsOk());
vjpai7aadf462015-03-16 23:58:44 -0700222}
Yang Gao757afae2015-03-17 15:49:26 -0700223
Yang Gao0e0d8e12015-02-13 14:40:41 -0800224// Two pings and a final pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800225TEST_F(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800226 ResetStub();
227
228 EchoRequest send_request;
229 EchoRequest recv_request;
230 EchoResponse send_response;
231 EchoResponse recv_response;
232 Status recv_status;
233 ClientContext cli_ctx;
234 ServerContext srv_ctx;
235 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
236
237 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800238 std::unique_ptr<ClientAsyncWriter<EchoRequest> > cli_stream(
vjpai56c51292015-02-26 17:01:35 -0800239 stub_->AsyncRequestStream(&cli_ctx, &recv_response, &cli_cq_, tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800240
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700241 service_.RequestRequestStream(&srv_ctx, &srv_stream, srv_cq_.get(),
242 srv_cq_.get(), 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 Tillerf9e6adf2015-05-06 11:45:59 -0700295 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
296 srv_cq_.get(), srv_cq_.get(), 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 Tillerf9e6adf2015-05-06 11:45:59 -0700346 service_.RequestBidiStream(&srv_ctx, &srv_stream, srv_cq_.get(),
347 srv_cq_.get(), tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800348
349 server_ok(2);
350 client_ok(1);
351
352 cli_stream->Write(send_request, tag(3));
353 client_ok(3);
354
355 srv_stream.Read(&recv_request, tag(4));
356 server_ok(4);
357 EXPECT_EQ(send_request.message(), recv_request.message());
358
359 send_response.set_message(recv_request.message());
360 srv_stream.Write(send_response, tag(5));
361 server_ok(5);
362
363 cli_stream->Read(&recv_response, tag(6));
364 client_ok(6);
365 EXPECT_EQ(send_response.message(), recv_response.message());
366
367 cli_stream->WritesDone(tag(7));
368 client_ok(7);
369
370 srv_stream.Read(&recv_request, tag(8));
371 server_fail(8);
372
373 srv_stream.Finish(Status::OK, tag(9));
374 server_ok(9);
375
376 cli_stream->Finish(&recv_status, tag(10));
377 client_ok(10);
378
379 EXPECT_TRUE(recv_status.IsOk());
380}
381
Yang Gao406b32f2015-02-13 16:25:33 -0800382// Metadata tests
383TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) {
384 ResetStub();
385
386 EchoRequest send_request;
387 EchoRequest recv_request;
388 EchoResponse send_response;
389 EchoResponse recv_response;
390 Status recv_status;
391
392 ClientContext cli_ctx;
393 ServerContext srv_ctx;
394 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
395
396 send_request.set_message("Hello");
397 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
398 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
399 cli_ctx.AddMetadata(meta1.first, meta1.second);
400 cli_ctx.AddMetadata(meta2.first, meta2.second);
401
Yang Gao3a5e5492015-02-18 14:32:38 -0800402 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller3676b382015-05-06 13:01:05 -0700403 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
Yang Gao406b32f2015-02-13 16:25:33 -0800404
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700405 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, srv_cq_.get(),
406 srv_cq_.get(), tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800407 server_ok(2);
408 EXPECT_EQ(send_request.message(), recv_request.message());
409 auto client_initial_metadata = srv_ctx.client_metadata();
410 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
411 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800412 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
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(
Craig Tiller3676b382015-05-06 13:01:05 -0700444 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
Yang Gao2b7f5372015-02-18 00:45:53 -0800445
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700446 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, srv_cq_.get(),
447 srv_cq_.get(), 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);
452 response_writer.SendInitialMetadata(tag(3));
453 server_ok(3);
454
Yang Gao3a5e5492015-02-18 14:32:38 -0800455 response_reader->ReadInitialMetadata(tag(4));
456 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800457 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
458 EXPECT_EQ(meta1.second, server_initial_metadata.find(meta1.first)->second);
459 EXPECT_EQ(meta2.second, server_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800460 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800461
462 send_response.set_message(recv_request.message());
463 response_writer.Finish(send_response, Status::OK, tag(5));
464 server_ok(5);
465
466 response_reader->Finish(&recv_response, &recv_status, tag(6));
467 client_ok(6);
468
469 EXPECT_EQ(send_response.message(), recv_response.message());
470 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800471}
472
473TEST_F(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
474 ResetStub();
475
476 EchoRequest send_request;
477 EchoRequest recv_request;
478 EchoResponse send_response;
479 EchoResponse recv_response;
480 Status recv_status;
481
482 ClientContext cli_ctx;
483 ServerContext srv_ctx;
484 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
485
486 send_request.set_message("Hello");
487 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
488 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
489
Yang Gao3a5e5492015-02-18 14:32:38 -0800490 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller3676b382015-05-06 13:01:05 -0700491 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
Yang Gao2b7f5372015-02-18 00:45:53 -0800492
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700493 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, srv_cq_.get(),
494 srv_cq_.get(), tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800495 server_ok(2);
496 EXPECT_EQ(send_request.message(), recv_request.message());
497 response_writer.SendInitialMetadata(tag(3));
498 server_ok(3);
499
500 send_response.set_message(recv_request.message());
501 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
502 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
503 response_writer.Finish(send_response, Status::OK, tag(4));
504
505 server_ok(4);
506
Yang Gao3a5e5492015-02-18 14:32:38 -0800507 response_reader->Finish(&recv_response, &recv_status, tag(5));
508 client_ok(5);
Yang Gao2b7f5372015-02-18 00:45:53 -0800509 EXPECT_EQ(send_response.message(), recv_response.message());
510 EXPECT_TRUE(recv_status.IsOk());
511 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
512 EXPECT_EQ(meta1.second, server_trailing_metadata.find(meta1.first)->second);
513 EXPECT_EQ(meta2.second, server_trailing_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800514 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800515}
516
517TEST_F(AsyncEnd2endTest, MetadataRpc) {
518 ResetStub();
519
520 EchoRequest send_request;
521 EchoRequest recv_request;
522 EchoResponse send_response;
523 EchoResponse recv_response;
524 Status recv_status;
525
526 ClientContext cli_ctx;
527 ServerContext srv_ctx;
528 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
529
530 send_request.set_message("Hello");
531 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800532 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400533 "key2-bin",
534 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc",
535 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800536 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800537 std::pair<grpc::string, grpc::string> meta6(
538 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400539 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
540 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800541 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800542 std::pair<grpc::string, grpc::string> meta4(
543 "key6-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400544 grpc::string("\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee",
545 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800546
547 cli_ctx.AddMetadata(meta1.first, meta1.second);
548 cli_ctx.AddMetadata(meta2.first, meta2.second);
549
Yang Gao3a5e5492015-02-18 14:32:38 -0800550 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller3676b382015-05-06 13:01:05 -0700551 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_));
Yang Gao2b7f5372015-02-18 00:45:53 -0800552
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700553 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, srv_cq_.get(),
554 srv_cq_.get(), tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800555 server_ok(2);
556 EXPECT_EQ(send_request.message(), recv_request.message());
557 auto client_initial_metadata = srv_ctx.client_metadata();
558 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
559 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800560 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800561
562 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
563 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
564 response_writer.SendInitialMetadata(tag(3));
565 server_ok(3);
Yang Gao3a5e5492015-02-18 14:32:38 -0800566 response_reader->ReadInitialMetadata(tag(4));
567 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800568 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
569 EXPECT_EQ(meta3.second, server_initial_metadata.find(meta3.first)->second);
570 EXPECT_EQ(meta4.second, server_initial_metadata.find(meta4.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800571 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800572
573 send_response.set_message(recv_request.message());
574 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
575 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
576 response_writer.Finish(send_response, Status::OK, tag(5));
577
578 server_ok(5);
579
Yang Gao3a5e5492015-02-18 14:32:38 -0800580 response_reader->Finish(&recv_response, &recv_status, tag(6));
581 client_ok(6);
582 EXPECT_EQ(send_response.message(), recv_response.message());
583 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800584 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
585 EXPECT_EQ(meta5.second, server_trailing_metadata.find(meta5.first)->second);
586 EXPECT_EQ(meta6.second, server_trailing_metadata.find(meta6.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800587 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800588}
Craig Tiller0220cf12015-02-12 17:39:26 -0800589} // namespace
590} // namespace testing
591} // namespace grpc
592
593int main(int argc, char** argv) {
594 grpc_test_init(argc, argv);
Craig Tiller0220cf12015-02-12 17:39:26 -0800595 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -0700596 return RUN_ALL_TESTS();
Craig Tiller0220cf12015-02-12 17:39:26 -0800597}