blob: 6c0dfadbb912b644487e98e7bc459227eff8b9db [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(
Vijay Pai64ac47f2015-02-26 17:59:51 -0800143 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
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());
Yang Gao3a5e5492015-02-18 14:32:38 -0800150 client_ok(1);
Yang Gao406b32f2015-02-13 16:25:33 -0800151
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_;
165 CompletionQueue 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(
198 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
vjpai7aadf462015-03-16 23:58:44 -0700199
Yang Gao757afae2015-03-17 15:49:26 -0700200 std::chrono::system_clock::time_point time_now(
201 std::chrono::system_clock::now()),
202 time_limit(std::chrono::system_clock::now() + std::chrono::seconds(5));
vjpai7aadf462015-03-16 23:58:44 -0700203 verify_timed_ok(&srv_cq_, -1, true, time_now, CompletionQueue::TIMEOUT);
204 verify_timed_ok(&cli_cq_, -1, true, time_now, CompletionQueue::TIMEOUT);
205
206 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
Yang Gao757afae2015-03-17 15:49:26 -0700207 tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700208
209 verify_timed_ok(&srv_cq_, 2, true, time_limit);
210 EXPECT_EQ(send_request.message(), recv_request.message());
211 verify_timed_ok(&cli_cq_, 1, true, time_limit);
212
213 send_response.set_message(recv_request.message());
214 response_writer.Finish(send_response, Status::OK, tag(3));
215 verify_timed_ok(&srv_cq_, 3, true);
216
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 Tiller47c83fd2015-02-21 22:45:35 -0800241 service_.RequestRequestStream(&srv_ctx, &srv_stream, &srv_cq_, tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800242
243 server_ok(2);
244 client_ok(1);
245
246 cli_stream->Write(send_request, tag(3));
247 client_ok(3);
248
249 srv_stream.Read(&recv_request, tag(4));
250 server_ok(4);
251 EXPECT_EQ(send_request.message(), recv_request.message());
252
253 cli_stream->Write(send_request, tag(5));
254 client_ok(5);
255
256 srv_stream.Read(&recv_request, tag(6));
257 server_ok(6);
258
259 EXPECT_EQ(send_request.message(), recv_request.message());
260 cli_stream->WritesDone(tag(7));
261 client_ok(7);
262
263 srv_stream.Read(&recv_request, tag(8));
264 server_fail(8);
265
266 send_response.set_message(recv_request.message());
267 srv_stream.Finish(send_response, Status::OK, tag(9));
268 server_ok(9);
269
270 cli_stream->Finish(&recv_status, tag(10));
271 client_ok(10);
272
273 EXPECT_EQ(send_response.message(), recv_response.message());
274 EXPECT_TRUE(recv_status.IsOk());
275}
276
Yang Gao0e0d8e12015-02-13 14:40:41 -0800277// One ping, two pongs.
Yang Gao406b32f2015-02-13 16:25:33 -0800278TEST_F(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800279 ResetStub();
280
281 EchoRequest send_request;
282 EchoRequest recv_request;
283 EchoResponse send_response;
284 EchoResponse recv_response;
285 Status recv_status;
286 ClientContext cli_ctx;
287 ServerContext srv_ctx;
288 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
289
290 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800291 std::unique_ptr<ClientAsyncReader<EchoResponse> > cli_stream(
vjpai56c51292015-02-26 17:01:35 -0800292 stub_->AsyncResponseStream(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800293
Craig Tiller47c83fd2015-02-21 22:45:35 -0800294 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream, &srv_cq_,
295 tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800296
297 server_ok(2);
298 client_ok(1);
299 EXPECT_EQ(send_request.message(), recv_request.message());
300
301 send_response.set_message(recv_request.message());
302 srv_stream.Write(send_response, tag(3));
303 server_ok(3);
304
305 cli_stream->Read(&recv_response, tag(4));
306 client_ok(4);
307 EXPECT_EQ(send_response.message(), recv_response.message());
308
309 srv_stream.Write(send_response, tag(5));
310 server_ok(5);
311
312 cli_stream->Read(&recv_response, tag(6));
313 client_ok(6);
314 EXPECT_EQ(send_response.message(), recv_response.message());
315
316 srv_stream.Finish(Status::OK, tag(7));
317 server_ok(7);
318
319 cli_stream->Read(&recv_response, tag(8));
320 client_fail(8);
321
322 cli_stream->Finish(&recv_status, tag(9));
323 client_ok(9);
324
325 EXPECT_TRUE(recv_status.IsOk());
326}
327
328// One ping, one pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800329TEST_F(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800330 ResetStub();
331
332 EchoRequest send_request;
333 EchoRequest recv_request;
334 EchoResponse send_response;
335 EchoResponse recv_response;
336 Status recv_status;
337 ClientContext cli_ctx;
338 ServerContext srv_ctx;
339 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
340
341 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800342 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse> >
vjpai56c51292015-02-26 17:01:35 -0800343 cli_stream(stub_->AsyncBidiStream(&cli_ctx, &cli_cq_, tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800344
Craig Tiller47c83fd2015-02-21 22:45:35 -0800345 service_.RequestBidiStream(&srv_ctx, &srv_stream, &srv_cq_, tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800346
347 server_ok(2);
348 client_ok(1);
349
350 cli_stream->Write(send_request, tag(3));
351 client_ok(3);
352
353 srv_stream.Read(&recv_request, tag(4));
354 server_ok(4);
355 EXPECT_EQ(send_request.message(), recv_request.message());
356
357 send_response.set_message(recv_request.message());
358 srv_stream.Write(send_response, tag(5));
359 server_ok(5);
360
361 cli_stream->Read(&recv_response, tag(6));
362 client_ok(6);
363 EXPECT_EQ(send_response.message(), recv_response.message());
364
365 cli_stream->WritesDone(tag(7));
366 client_ok(7);
367
368 srv_stream.Read(&recv_request, tag(8));
369 server_fail(8);
370
371 srv_stream.Finish(Status::OK, tag(9));
372 server_ok(9);
373
374 cli_stream->Finish(&recv_status, tag(10));
375 client_ok(10);
376
377 EXPECT_TRUE(recv_status.IsOk());
378}
379
Yang Gao406b32f2015-02-13 16:25:33 -0800380// Metadata tests
381TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) {
382 ResetStub();
383
384 EchoRequest send_request;
385 EchoRequest recv_request;
386 EchoResponse send_response;
387 EchoResponse recv_response;
388 Status recv_status;
389
390 ClientContext cli_ctx;
391 ServerContext srv_ctx;
392 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
393
394 send_request.set_message("Hello");
395 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
396 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
397 cli_ctx.AddMetadata(meta1.first, meta1.second);
398 cli_ctx.AddMetadata(meta2.first, meta2.second);
399
Yang Gao3a5e5492015-02-18 14:32:38 -0800400 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800401 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao406b32f2015-02-13 16:25:33 -0800402
Craig Tiller47c83fd2015-02-21 22:45:35 -0800403 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
404 tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800405 server_ok(2);
406 EXPECT_EQ(send_request.message(), recv_request.message());
407 auto client_initial_metadata = srv_ctx.client_metadata();
408 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
409 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800410 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800411 client_ok(1);
Yang Gao406b32f2015-02-13 16:25:33 -0800412
413 send_response.set_message(recv_request.message());
414 response_writer.Finish(send_response, Status::OK, tag(3));
415
416 server_ok(3);
417
Yang Gao3a5e5492015-02-18 14:32:38 -0800418 response_reader->Finish(&recv_response, &recv_status, tag(4));
419 client_ok(4);
Yang Gao406b32f2015-02-13 16:25:33 -0800420
421 EXPECT_EQ(send_response.message(), recv_response.message());
422 EXPECT_TRUE(recv_status.IsOk());
423}
424
Yang Gao2b7f5372015-02-18 00:45:53 -0800425TEST_F(AsyncEnd2endTest, ServerInitialMetadataRpc) {
426 ResetStub();
427
428 EchoRequest send_request;
429 EchoRequest recv_request;
430 EchoResponse send_response;
431 EchoResponse recv_response;
432 Status recv_status;
433
434 ClientContext cli_ctx;
435 ServerContext srv_ctx;
436 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
437
438 send_request.set_message("Hello");
439 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
440 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
441
Yang Gao3a5e5492015-02-18 14:32:38 -0800442 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800443 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800444
Craig Tiller47c83fd2015-02-21 22:45:35 -0800445 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
446 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800447 server_ok(2);
448 EXPECT_EQ(send_request.message(), recv_request.message());
449 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
450 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
Yang Gao3a5e5492015-02-18 14:32:38 -0800451 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800452 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(
vjpai56c51292015-02-26 17:01:35 -0800491 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800492
Craig Tiller47c83fd2015-02-21 22:45:35 -0800493 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
494 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);
Yang Gao3a5e5492015-02-18 14:32:38 -0800499 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800500
501 send_response.set_message(recv_request.message());
502 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
503 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
504 response_writer.Finish(send_response, Status::OK, tag(4));
505
506 server_ok(4);
507
Yang Gao3a5e5492015-02-18 14:32:38 -0800508 response_reader->Finish(&recv_response, &recv_status, tag(5));
509 client_ok(5);
Yang Gao2b7f5372015-02-18 00:45:53 -0800510 EXPECT_EQ(send_response.message(), recv_response.message());
511 EXPECT_TRUE(recv_status.IsOk());
512 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
513 EXPECT_EQ(meta1.second, server_trailing_metadata.find(meta1.first)->second);
514 EXPECT_EQ(meta2.second, server_trailing_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800515 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800516}
517
518TEST_F(AsyncEnd2endTest, MetadataRpc) {
519 ResetStub();
520
521 EchoRequest send_request;
522 EchoRequest recv_request;
523 EchoResponse send_response;
524 EchoResponse recv_response;
525 Status recv_status;
526
527 ClientContext cli_ctx;
528 ServerContext srv_ctx;
529 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
530
531 send_request.set_message("Hello");
532 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800533 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400534 "key2-bin",
535 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc",
536 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800537 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800538 std::pair<grpc::string, grpc::string> meta6(
539 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400540 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
541 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800542 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800543 std::pair<grpc::string, grpc::string> meta4(
544 "key6-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400545 grpc::string("\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee",
546 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800547
548 cli_ctx.AddMetadata(meta1.first, meta1.second);
549 cli_ctx.AddMetadata(meta2.first, meta2.second);
550
Yang Gao3a5e5492015-02-18 14:32:38 -0800551 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
vjpai56c51292015-02-26 17:01:35 -0800552 stub_->AsyncEcho(&cli_ctx, send_request, &cli_cq_, tag(1)));
Yang Gao2b7f5372015-02-18 00:45:53 -0800553
Craig Tiller47c83fd2015-02-21 22:45:35 -0800554 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, &srv_cq_,
555 tag(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800556 server_ok(2);
557 EXPECT_EQ(send_request.message(), recv_request.message());
558 auto client_initial_metadata = srv_ctx.client_metadata();
559 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
560 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800561 EXPECT_EQ(static_cast<size_t>(2), client_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800562 client_ok(1);
Yang Gao2b7f5372015-02-18 00:45:53 -0800563
564 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
565 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
566 response_writer.SendInitialMetadata(tag(3));
567 server_ok(3);
Yang Gao3a5e5492015-02-18 14:32:38 -0800568 response_reader->ReadInitialMetadata(tag(4));
569 client_ok(4);
Yang Gao2b7f5372015-02-18 00:45:53 -0800570 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
571 EXPECT_EQ(meta3.second, server_initial_metadata.find(meta3.first)->second);
572 EXPECT_EQ(meta4.second, server_initial_metadata.find(meta4.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800573 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800574
575 send_response.set_message(recv_request.message());
576 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
577 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
578 response_writer.Finish(send_response, Status::OK, tag(5));
579
580 server_ok(5);
581
Yang Gao3a5e5492015-02-18 14:32:38 -0800582 response_reader->Finish(&recv_response, &recv_status, tag(6));
583 client_ok(6);
584 EXPECT_EQ(send_response.message(), recv_response.message());
585 EXPECT_TRUE(recv_status.IsOk());
Yang Gao2b7f5372015-02-18 00:45:53 -0800586 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
587 EXPECT_EQ(meta5.second, server_trailing_metadata.find(meta5.first)->second);
588 EXPECT_EQ(meta6.second, server_trailing_metadata.find(meta6.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800589 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800590}
Craig Tiller0220cf12015-02-12 17:39:26 -0800591} // namespace
592} // namespace testing
593} // namespace grpc
594
595int main(int argc, char** argv) {
596 grpc_test_init(argc, argv);
Craig Tiller0220cf12015-02-12 17:39:26 -0800597 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -0700598 return RUN_ALL_TESTS();
Craig Tiller0220cf12015-02-12 17:39:26 -0800599}