blob: 364aa417cd2ab43cbdbb50fd2737792375a7583b [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
yang-g9e2f90c2015-08-21 15:35:03 -070036#include <grpc/grpc.h>
37#include <grpc/support/thd.h>
38#include <grpc/support/time.h>
yang-g8c2be9f2015-08-19 16:28:09 -070039#include <grpc++/channel.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080040#include <grpc++/client_context.h>
41#include <grpc++/create_channel.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080042#include <grpc++/server.h>
43#include <grpc++/server_builder.h>
44#include <grpc++/server_context.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080045#include <gtest/gtest.h>
46
yang-g9e2f90c2015-08-21 15:35:03 -070047#include "test/core/util/port.h"
48#include "test/core/util/test_config.h"
49#include "test/cpp/util/echo_duplicate.grpc.pb.h"
50#include "test/cpp/util/echo.grpc.pb.h"
yang-ge21908f2015-08-25 13:47:51 -070051#include "test/cpp/util/string_ref_helper.h"
Craig Tiller0220cf12015-02-12 17:39:26 -080052
Craig Tiller69f90e62015-08-06 08:32:35 -070053#ifdef GPR_POSIX_SOCKET
54#include "src/core/iomgr/pollset_posix.h"
55#endif
56
Craig Tiller0220cf12015-02-12 17:39:26 -080057using grpc::cpp::test::util::EchoRequest;
58using grpc::cpp::test::util::EchoResponse;
59using std::chrono::system_clock;
60
61namespace grpc {
62namespace testing {
63
64namespace {
65
Craig Tillerd6c98df2015-08-18 09:33:44 -070066void* tag(int i) { return (void*)(gpr_intptr)i; }
Yang Gaoc05b6cb2015-02-13 00:34:10 -080067
Craig Tiller69f90e62015-08-06 08:32:35 -070068#ifdef GPR_POSIX_SOCKET
Craig Tiller4c06b822015-08-06 08:41:31 -070069static int assert_non_blocking_poll(struct pollfd* pfds, nfds_t nfds,
70 int timeout) {
Craig Tiller69f90e62015-08-06 08:32:35 -070071 GPR_ASSERT(timeout == 0);
72 return poll(pfds, nfds, timeout);
73}
74
75class PollOverride {
Craig Tiller06cf3cc2015-05-13 13:11:01 -070076 public:
Craig Tiller69f90e62015-08-06 08:32:35 -070077 PollOverride(grpc_poll_function_type f) {
78 prev_ = grpc_poll_function;
79 grpc_poll_function = f;
80 }
81
Craig Tiller4c06b822015-08-06 08:41:31 -070082 ~PollOverride() { grpc_poll_function = prev_; }
Craig Tiller69f90e62015-08-06 08:32:35 -070083
84 private:
85 grpc_poll_function_type prev_;
86};
87
88class PollingCheckRegion : public PollOverride {
89 public:
Craig Tiller4c06b822015-08-06 08:41:31 -070090 explicit PollingCheckRegion(bool allow_blocking)
Craig Tiller69f90e62015-08-06 08:32:35 -070091 : PollOverride(allow_blocking ? poll : assert_non_blocking_poll) {}
92};
93#else
94class PollingCheckRegion {
95 public:
96 explicit PollingCheckRegion(bool allow_blocking) {}
97};
98#endif
99
100class Verifier : public PollingCheckRegion {
101 public:
102 explicit Verifier(bool spin) : PollingCheckRegion(!spin), spin_(spin) {}
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700103 Verifier& Expect(int i, bool expect_ok) {
104 expectations_[tag(i)] = expect_ok;
105 return *this;
vjpai7aadf462015-03-16 23:58:44 -0700106 }
Craig Tillerd6c98df2015-08-18 09:33:44 -0700107 void Verify(CompletionQueue* cq) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700108 GPR_ASSERT(!expectations_.empty());
109 while (!expectations_.empty()) {
110 bool ok;
111 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700112 if (spin_) {
113 for (;;) {
114 auto r = cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
115 if (r == CompletionQueue::TIMEOUT) continue;
116 if (r == CompletionQueue::GOT_EVENT) break;
117 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
118 abort();
119 }
120 } else {
121 EXPECT_TRUE(cq->Next(&got_tag, &ok));
122 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700123 auto it = expectations_.find(got_tag);
124 EXPECT_TRUE(it != expectations_.end());
125 EXPECT_EQ(it->second, ok);
126 expectations_.erase(it);
127 }
128 }
Craig Tillerd6c98df2015-08-18 09:33:44 -0700129 void Verify(CompletionQueue* cq,
130 std::chrono::system_clock::time_point deadline) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700131 if (expectations_.empty()) {
132 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700133 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700134 if (spin_) {
135 while (std::chrono::system_clock::now() < deadline) {
Craig Tiller4c06b822015-08-06 08:41:31 -0700136 EXPECT_EQ(
137 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)),
138 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700139 }
140 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700141 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
142 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700143 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700144 } else {
145 while (!expectations_.empty()) {
146 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700147 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700148 if (spin_) {
149 for (;;) {
150 GPR_ASSERT(std::chrono::system_clock::now() < deadline);
Craig Tiller4c06b822015-08-06 08:41:31 -0700151 auto r =
152 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
Craig Tiller69f90e62015-08-06 08:32:35 -0700153 if (r == CompletionQueue::TIMEOUT) continue;
154 if (r == CompletionQueue::GOT_EVENT) break;
155 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
156 abort();
Craig Tiller4c06b822015-08-06 08:41:31 -0700157 }
Craig Tiller69f90e62015-08-06 08:32:35 -0700158 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700159 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
160 CompletionQueue::GOT_EVENT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700161 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700162 auto it = expectations_.find(got_tag);
163 EXPECT_TRUE(it != expectations_.end());
164 EXPECT_EQ(it->second, ok);
165 expectations_.erase(it);
166 }
167 }
168 }
169
170 private:
171 std::map<void*, bool> expectations_;
Craig Tiller69f90e62015-08-06 08:32:35 -0700172 bool spin_;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700173};
vjpai7aadf462015-03-16 23:58:44 -0700174
Craig Tiller69f90e62015-08-06 08:32:35 -0700175class AsyncEnd2endTest : public ::testing::TestWithParam<bool> {
Craig Tiller0220cf12015-02-12 17:39:26 -0800176 protected:
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700177 AsyncEnd2endTest() {}
Craig Tiller0220cf12015-02-12 17:39:26 -0800178
Craig Tillercf133f42015-02-26 14:05:56 -0800179 void SetUp() GRPC_OVERRIDE {
Craig Tiller0220cf12015-02-12 17:39:26 -0800180 int port = grpc_pick_unused_port_or_die();
181 server_address_ << "localhost:" << port;
vjpai017ed622015-12-09 10:42:54 -0800182
183 // It is currently unsupported to mix sync and async services
184 // in the same server, so first test that (for coverage)
185 ServerBuilder build_bad;
186 build_bad.AddListeningPort(server_address_.str(),
187 grpc::InsecureServerCredentials());
188 build_bad.RegisterAsyncService(&service_);
189 grpc::cpp::test::util::TestService::Service sync_service;
190 build_bad.RegisterService(&sync_service);
191 GPR_ASSERT(build_bad.BuildAndStart() == nullptr);
192
Craig Tiller0220cf12015-02-12 17:39:26 -0800193 // Setup server
194 ServerBuilder builder;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700195 builder.AddListeningPort(server_address_.str(),
196 grpc::InsecureServerCredentials());
Craig Tiller0220cf12015-02-12 17:39:26 -0800197 builder.RegisterAsyncService(&service_);
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700198 cq_ = builder.AddCompletionQueue();
Craig Tiller0220cf12015-02-12 17:39:26 -0800199 server_ = builder.BuildAndStart();
200 }
201
Craig Tillercf133f42015-02-26 14:05:56 -0800202 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800203 server_->Shutdown();
204 void* ignored_tag;
205 bool ignored_ok;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700206 cq_->Shutdown();
207 while (cq_->Next(&ignored_tag, &ignored_ok))
Craig Tiller492968f2015-02-18 13:14:03 -0800208 ;
209 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800210
211 void ResetStub() {
yang-g730055d2015-08-27 12:29:45 -0700212 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -0700213 CreateChannel(server_address_.str(), InsecureChannelCredentials());
Nicolas "Pixel" Noble7fa51672015-09-02 02:29:09 +0200214 stub_ = grpc::cpp::test::util::TestService::NewStub(channel);
Craig Tiller0220cf12015-02-12 17:39:26 -0800215 }
216
Yang Gao406b32f2015-02-13 16:25:33 -0800217 void SendRpc(int num_rpcs) {
218 for (int i = 0; i < num_rpcs; i++) {
219 EchoRequest send_request;
220 EchoRequest recv_request;
221 EchoResponse send_response;
222 EchoResponse recv_response;
223 Status recv_status;
224
225 ClientContext cli_ctx;
226 ServerContext srv_ctx;
227 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
228
229 send_request.set_message("Hello");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800230 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700231 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800232
Craig Tillerd6c98df2015-08-18 09:33:44 -0700233 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
234 cq_.get(), tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800235
Craig Tiller69f90e62015-08-06 08:32:35 -0700236 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800237 EXPECT_EQ(send_request.message(), recv_request.message());
238
239 send_response.set_message(recv_request.message());
240 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700241 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800242
Yang Gao3a5e5492015-02-18 14:32:38 -0800243 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700244 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800245
246 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700247 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800248 }
249 }
250
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700251 std::unique_ptr<ServerCompletionQueue> cq_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800252 std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
253 std::unique_ptr<Server> server_;
254 grpc::cpp::test::util::TestService::AsyncService service_;
255 std::ostringstream server_address_;
256};
257
Craig Tiller69f90e62015-08-06 08:32:35 -0700258TEST_P(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800259 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800260 SendRpc(1);
261}
Yang Gaobb84a302015-02-12 23:30:12 -0800262
Craig Tiller69f90e62015-08-06 08:32:35 -0700263TEST_P(AsyncEnd2endTest, SequentialRpcs) {
Yang Gao406b32f2015-02-13 16:25:33 -0800264 ResetStub();
265 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800266}
267
vjpai7aadf462015-03-16 23:58:44 -0700268// Test a simple RPC using the async version of Next
Craig Tiller69f90e62015-08-06 08:32:35 -0700269TEST_P(AsyncEnd2endTest, AsyncNextRpc) {
vjpai7aadf462015-03-16 23:58:44 -0700270 ResetStub();
271
272 EchoRequest send_request;
273 EchoRequest recv_request;
274 EchoResponse send_response;
275 EchoResponse recv_response;
276 Status recv_status;
277
278 ClientContext cli_ctx;
279 ServerContext srv_ctx;
280 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
281
282 send_request.set_message("Hello");
Yang Gao757afae2015-03-17 15:49:26 -0700283 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700284 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
vjpai7aadf462015-03-16 23:58:44 -0700285
Yang Gao757afae2015-03-17 15:49:26 -0700286 std::chrono::system_clock::time_point time_now(
Craig Tillerf51199f2015-05-08 09:32:53 -0700287 std::chrono::system_clock::now());
288 std::chrono::system_clock::time_point time_limit(
289 std::chrono::system_clock::now() + std::chrono::seconds(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700290 Verifier(GetParam()).Verify(cq_.get(), time_now);
291 Verifier(GetParam()).Verify(cq_.get(), time_now);
vjpai7aadf462015-03-16 23:58:44 -0700292
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700293 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
294 cq_.get(), tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700295
Craig Tiller69f90e62015-08-06 08:32:35 -0700296 Verifier(GetParam()).Expect(2, true).Verify(cq_.get(), time_limit);
vjpai7aadf462015-03-16 23:58:44 -0700297 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700298
299 send_response.set_message(recv_request.message());
300 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller4c06b822015-08-06 08:41:31 -0700301 Verifier(GetParam())
302 .Expect(3, true)
303 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700304
305 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller4c06b822015-08-06 08:41:31 -0700306 Verifier(GetParam())
307 .Expect(4, true)
308 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700309
310 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700311 EXPECT_TRUE(recv_status.ok());
vjpai7aadf462015-03-16 23:58:44 -0700312}
Yang Gao757afae2015-03-17 15:49:26 -0700313
Yang Gao0e0d8e12015-02-13 14:40:41 -0800314// Two pings and a final pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700315TEST_P(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800316 ResetStub();
317
318 EchoRequest send_request;
319 EchoRequest recv_request;
320 EchoResponse send_response;
321 EchoResponse recv_response;
322 Status recv_status;
323 ClientContext cli_ctx;
324 ServerContext srv_ctx;
325 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
326
327 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800328 std::unique_ptr<ClientAsyncWriter<EchoRequest> > cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700329 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800330
Craig Tillerd6c98df2015-08-18 09:33:44 -0700331 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
332 tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800333
Craig Tiller69f90e62015-08-06 08:32:35 -0700334 Verifier(GetParam()).Expect(2, true).Expect(1, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800335
336 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700337 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800338
339 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700340 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800341 EXPECT_EQ(send_request.message(), recv_request.message());
342
343 cli_stream->Write(send_request, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700344 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800345
346 srv_stream.Read(&recv_request, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700347 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800348
349 EXPECT_EQ(send_request.message(), recv_request.message());
350 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700351 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800352
353 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700354 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800355
356 send_response.set_message(recv_request.message());
357 srv_stream.Finish(send_response, Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700358 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800359
360 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700361 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800362
363 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700364 EXPECT_TRUE(recv_status.ok());
Yang Gao005f18a2015-02-13 10:22:33 -0800365}
366
Yang Gao0e0d8e12015-02-13 14:40:41 -0800367// One ping, two pongs.
Craig Tiller69f90e62015-08-06 08:32:35 -0700368TEST_P(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800369 ResetStub();
370
371 EchoRequest send_request;
372 EchoRequest recv_request;
373 EchoResponse send_response;
374 EchoResponse recv_response;
375 Status recv_status;
376 ClientContext cli_ctx;
377 ServerContext srv_ctx;
378 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
379
380 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800381 std::unique_ptr<ClientAsyncReader<EchoResponse> > cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700382 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800383
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700384 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700385 cq_.get(), cq_.get(), tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800386
Craig Tiller69f90e62015-08-06 08:32:35 -0700387 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800388 EXPECT_EQ(send_request.message(), recv_request.message());
389
390 send_response.set_message(recv_request.message());
391 srv_stream.Write(send_response, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700392 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800393
394 cli_stream->Read(&recv_response, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700395 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800396 EXPECT_EQ(send_response.message(), recv_response.message());
397
398 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700399 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800400
401 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700402 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800403 EXPECT_EQ(send_response.message(), recv_response.message());
404
405 srv_stream.Finish(Status::OK, tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700406 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800407
408 cli_stream->Read(&recv_response, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700409 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800410
411 cli_stream->Finish(&recv_status, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700412 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800413
Yang Gaoc1a2c312015-06-16 10:59:46 -0700414 EXPECT_TRUE(recv_status.ok());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800415}
416
417// One ping, one pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700418TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800419 ResetStub();
420
421 EchoRequest send_request;
422 EchoRequest recv_request;
423 EchoResponse send_response;
424 EchoResponse recv_response;
425 Status recv_status;
426 ClientContext cli_ctx;
427 ServerContext srv_ctx;
428 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
429
430 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800431 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse> >
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700432 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800433
Craig Tillerd6c98df2015-08-18 09:33:44 -0700434 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
435 tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800436
Craig Tiller69f90e62015-08-06 08:32:35 -0700437 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800438
439 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700440 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800441
442 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700443 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800444 EXPECT_EQ(send_request.message(), recv_request.message());
445
446 send_response.set_message(recv_request.message());
447 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700448 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800449
450 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700451 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800452 EXPECT_EQ(send_response.message(), recv_response.message());
453
454 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700455 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800456
457 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700458 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800459
460 srv_stream.Finish(Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700461 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800462
463 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700464 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800465
Yang Gaoc1a2c312015-06-16 10:59:46 -0700466 EXPECT_TRUE(recv_status.ok());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800467}
468
Yang Gao406b32f2015-02-13 16:25:33 -0800469// Metadata tests
Craig Tiller69f90e62015-08-06 08:32:35 -0700470TEST_P(AsyncEnd2endTest, ClientInitialMetadataRpc) {
Yang Gao406b32f2015-02-13 16:25:33 -0800471 ResetStub();
472
473 EchoRequest send_request;
474 EchoRequest recv_request;
475 EchoResponse send_response;
476 EchoResponse recv_response;
477 Status recv_status;
478
479 ClientContext cli_ctx;
480 ServerContext srv_ctx;
481 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
482
483 send_request.set_message("Hello");
484 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
485 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
486 cli_ctx.AddMetadata(meta1.first, meta1.second);
487 cli_ctx.AddMetadata(meta2.first, meta2.second);
488
Yang Gao3a5e5492015-02-18 14:32:38 -0800489 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700490 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800491
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700492 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
493 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700494 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800495 EXPECT_EQ(send_request.message(), recv_request.message());
496 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700497 EXPECT_EQ(meta1.second,
498 ToString(client_initial_metadata.find(meta1.first)->second));
499 EXPECT_EQ(meta2.second,
500 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700501 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800502
503 send_response.set_message(recv_request.message());
504 response_writer.Finish(send_response, Status::OK, tag(3));
505
Craig Tiller69f90e62015-08-06 08:32:35 -0700506 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800507
Yang Gao3a5e5492015-02-18 14:32:38 -0800508 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700509 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800510
511 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700512 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800513}
514
Craig Tiller69f90e62015-08-06 08:32:35 -0700515TEST_P(AsyncEnd2endTest, ServerInitialMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800516 ResetStub();
517
518 EchoRequest send_request;
519 EchoRequest recv_request;
520 EchoResponse send_response;
521 EchoResponse recv_response;
522 Status recv_status;
523
524 ClientContext cli_ctx;
525 ServerContext srv_ctx;
526 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
527
528 send_request.set_message("Hello");
529 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
530 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
531
Yang Gao3a5e5492015-02-18 14:32:38 -0800532 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700533 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800534
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700535 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
536 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700537 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800538 EXPECT_EQ(send_request.message(), recv_request.message());
539 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
540 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
541 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700542 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800543
Yang Gao3a5e5492015-02-18 14:32:38 -0800544 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700545 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800546 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700547 EXPECT_EQ(meta1.second,
548 ToString(server_initial_metadata.find(meta1.first)->second));
549 EXPECT_EQ(meta2.second,
550 ToString(server_initial_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800551 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800552
553 send_response.set_message(recv_request.message());
554 response_writer.Finish(send_response, Status::OK, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700555 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800556
557 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700558 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800559
560 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700561 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800562}
563
Craig Tiller69f90e62015-08-06 08:32:35 -0700564TEST_P(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800565 ResetStub();
566
567 EchoRequest send_request;
568 EchoRequest recv_request;
569 EchoResponse send_response;
570 EchoResponse recv_response;
571 Status recv_status;
572
573 ClientContext cli_ctx;
574 ServerContext srv_ctx;
575 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
576
577 send_request.set_message("Hello");
578 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
579 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
580
Yang Gao3a5e5492015-02-18 14:32:38 -0800581 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700582 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800583
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700584 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
585 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700586 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800587 EXPECT_EQ(send_request.message(), recv_request.message());
588 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700589 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800590
591 send_response.set_message(recv_request.message());
592 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
593 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
594 response_writer.Finish(send_response, Status::OK, tag(4));
595
Craig Tiller69f90e62015-08-06 08:32:35 -0700596 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800597
Yang Gao3a5e5492015-02-18 14:32:38 -0800598 response_reader->Finish(&recv_response, &recv_status, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700599 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800600 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700601 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800602 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700603 EXPECT_EQ(meta1.second,
604 ToString(server_trailing_metadata.find(meta1.first)->second));
605 EXPECT_EQ(meta2.second,
606 ToString(server_trailing_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800607 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800608}
609
Craig Tiller69f90e62015-08-06 08:32:35 -0700610TEST_P(AsyncEnd2endTest, MetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800611 ResetStub();
612
613 EchoRequest send_request;
614 EchoRequest recv_request;
615 EchoResponse send_response;
616 EchoResponse recv_response;
617 Status recv_status;
618
619 ClientContext cli_ctx;
620 ServerContext srv_ctx;
621 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
622
623 send_request.set_message("Hello");
624 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800625 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400626 "key2-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700627 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800628 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800629 std::pair<grpc::string, grpc::string> meta6(
630 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400631 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700632 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800633 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800634 std::pair<grpc::string, grpc::string> meta4(
635 "key6-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700636 grpc::string(
637 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800638
639 cli_ctx.AddMetadata(meta1.first, meta1.second);
640 cli_ctx.AddMetadata(meta2.first, meta2.second);
641
Yang Gao3a5e5492015-02-18 14:32:38 -0800642 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700643 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800644
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700645 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
646 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700647 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800648 EXPECT_EQ(send_request.message(), recv_request.message());
649 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700650 EXPECT_EQ(meta1.second,
651 ToString(client_initial_metadata.find(meta1.first)->second));
652 EXPECT_EQ(meta2.second,
653 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700654 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800655
656 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
657 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
658 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700659 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800660 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700661 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800662 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700663 EXPECT_EQ(meta3.second,
664 ToString(server_initial_metadata.find(meta3.first)->second));
665 EXPECT_EQ(meta4.second,
666 ToString(server_initial_metadata.find(meta4.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700667 EXPECT_GE(server_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao3a5e5492015-02-18 14:32:38 -0800668
669 send_response.set_message(recv_request.message());
670 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
671 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
672 response_writer.Finish(send_response, Status::OK, tag(5));
673
Craig Tiller69f90e62015-08-06 08:32:35 -0700674 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800675
Yang Gao3a5e5492015-02-18 14:32:38 -0800676 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700677 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800678 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700679 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800680 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700681 EXPECT_EQ(meta5.second,
682 ToString(server_trailing_metadata.find(meta5.first)->second));
683 EXPECT_EQ(meta6.second,
684 ToString(server_trailing_metadata.find(meta6.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700685 EXPECT_GE(server_trailing_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800686}
yang-gb3352562015-08-04 14:42:06 -0700687
688// Server uses AsyncNotifyWhenDone API to check for cancellation
Craig Tiller69f90e62015-08-06 08:32:35 -0700689TEST_P(AsyncEnd2endTest, ServerCheckCancellation) {
yang-gb3352562015-08-04 14:42:06 -0700690 ResetStub();
691
692 EchoRequest send_request;
693 EchoRequest recv_request;
694 EchoResponse send_response;
695 EchoResponse recv_response;
696 Status recv_status;
697
698 ClientContext cli_ctx;
699 ServerContext srv_ctx;
700 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
701
702 send_request.set_message("Hello");
703 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
704 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
705
706 srv_ctx.AsyncNotifyWhenDone(tag(5));
707 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
708 cq_.get(), tag(2));
709
Craig Tiller69f90e62015-08-06 08:32:35 -0700710 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700711 EXPECT_EQ(send_request.message(), recv_request.message());
712
713 cli_ctx.TryCancel();
Craig Tiller69f90e62015-08-06 08:32:35 -0700714 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700715 EXPECT_TRUE(srv_ctx.IsCancelled());
716
717 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700718 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700719
720 EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
721}
722
723// Server uses AsyncNotifyWhenDone API to check for normal finish
Craig Tiller69f90e62015-08-06 08:32:35 -0700724TEST_P(AsyncEnd2endTest, ServerCheckDone) {
yang-gb3352562015-08-04 14:42:06 -0700725 ResetStub();
726
727 EchoRequest send_request;
728 EchoRequest recv_request;
729 EchoResponse send_response;
730 EchoResponse recv_response;
731 Status recv_status;
732
733 ClientContext cli_ctx;
734 ServerContext srv_ctx;
735 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
736
737 send_request.set_message("Hello");
738 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
739 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
740
741 srv_ctx.AsyncNotifyWhenDone(tag(5));
742 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
743 cq_.get(), tag(2));
744
Craig Tiller69f90e62015-08-06 08:32:35 -0700745 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700746 EXPECT_EQ(send_request.message(), recv_request.message());
747
748 send_response.set_message(recv_request.message());
749 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700750 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
751 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700752 EXPECT_FALSE(srv_ctx.IsCancelled());
753
754 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700755 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700756
757 EXPECT_EQ(send_response.message(), recv_response.message());
758 EXPECT_TRUE(recv_status.ok());
759}
760
Craig Tiller8f7bff72015-08-17 13:23:14 -0700761TEST_P(AsyncEnd2endTest, UnimplementedRpc) {
yang-g730055d2015-08-27 12:29:45 -0700762 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -0700763 CreateChannel(server_address_.str(), InsecureChannelCredentials());
yang-g9b7757d2015-08-13 11:15:53 -0700764 std::unique_ptr<grpc::cpp::test::util::UnimplementedService::Stub> stub;
Nicolas "Pixel" Noble7fa51672015-09-02 02:29:09 +0200765 stub = grpc::cpp::test::util::UnimplementedService::NewStub(channel);
yang-g9b7757d2015-08-13 11:15:53 -0700766 EchoRequest send_request;
767 EchoResponse recv_response;
768 Status recv_status;
769
770 ClientContext cli_ctx;
771 send_request.set_message("Hello");
772 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
773 stub->AsyncUnimplemented(&cli_ctx, send_request, cq_.get()));
774
775 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller8f7bff72015-08-17 13:23:14 -0700776 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-g9b7757d2015-08-13 11:15:53 -0700777
778 EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
779 EXPECT_EQ("", recv_status.error_message());
780}
781
Craig Tiller4c06b822015-08-06 08:41:31 -0700782INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest,
783 ::testing::Values(false, true));
Craig Tiller69f90e62015-08-06 08:32:35 -0700784
Craig Tiller0220cf12015-02-12 17:39:26 -0800785} // namespace
786} // namespace testing
787} // namespace grpc
788
789int main(int argc, char** argv) {
790 grpc_test_init(argc, argv);
Craig Tiller0220cf12015-02-12 17:39:26 -0800791 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -0700792 return RUN_ALL_TESTS();
Craig Tiller0220cf12015-02-12 17:39:26 -0800793}