blob: 3acbfd55c292e8efb32fb3ec2825b39a58ce4440 [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 Tiller7536af02015-12-22 13:49:30 -080066void* tag(int i) { return (void*)(intptr_t)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
Craig Tiller0220cf12015-02-12 17:39:26 -0800183 // Setup server
184 ServerBuilder builder;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700185 builder.AddListeningPort(server_address_.str(),
186 grpc::InsecureServerCredentials());
Craig Tiller15f383c2016-01-07 12:45:32 -0800187 builder.RegisterService(&service_);
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700188 cq_ = builder.AddCompletionQueue();
Craig Tiller0220cf12015-02-12 17:39:26 -0800189 server_ = builder.BuildAndStart();
190 }
191
Craig Tillercf133f42015-02-26 14:05:56 -0800192 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800193 server_->Shutdown();
194 void* ignored_tag;
195 bool ignored_ok;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700196 cq_->Shutdown();
197 while (cq_->Next(&ignored_tag, &ignored_ok))
Craig Tiller492968f2015-02-18 13:14:03 -0800198 ;
199 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800200
201 void ResetStub() {
yang-g730055d2015-08-27 12:29:45 -0700202 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -0700203 CreateChannel(server_address_.str(), InsecureChannelCredentials());
Nicolas "Pixel" Noble7fa51672015-09-02 02:29:09 +0200204 stub_ = grpc::cpp::test::util::TestService::NewStub(channel);
Craig Tiller0220cf12015-02-12 17:39:26 -0800205 }
206
Yang Gao406b32f2015-02-13 16:25:33 -0800207 void SendRpc(int num_rpcs) {
208 for (int i = 0; i < num_rpcs; i++) {
209 EchoRequest send_request;
210 EchoRequest recv_request;
211 EchoResponse send_response;
212 EchoResponse recv_response;
213 Status recv_status;
214
215 ClientContext cli_ctx;
216 ServerContext srv_ctx;
217 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
218
219 send_request.set_message("Hello");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800220 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700221 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800222
Craig Tillerd6c98df2015-08-18 09:33:44 -0700223 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
224 cq_.get(), tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800225
Craig Tiller69f90e62015-08-06 08:32:35 -0700226 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800227 EXPECT_EQ(send_request.message(), recv_request.message());
228
229 send_response.set_message(recv_request.message());
230 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700231 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800232
Yang Gao3a5e5492015-02-18 14:32:38 -0800233 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700234 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800235
236 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700237 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800238 }
239 }
240
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700241 std::unique_ptr<ServerCompletionQueue> cq_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800242 std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
243 std::unique_ptr<Server> server_;
244 grpc::cpp::test::util::TestService::AsyncService service_;
245 std::ostringstream server_address_;
246};
247
Craig Tiller69f90e62015-08-06 08:32:35 -0700248TEST_P(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800249 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800250 SendRpc(1);
251}
Yang Gaobb84a302015-02-12 23:30:12 -0800252
Craig Tiller69f90e62015-08-06 08:32:35 -0700253TEST_P(AsyncEnd2endTest, SequentialRpcs) {
Yang Gao406b32f2015-02-13 16:25:33 -0800254 ResetStub();
255 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800256}
257
vjpai7aadf462015-03-16 23:58:44 -0700258// Test a simple RPC using the async version of Next
Craig Tiller69f90e62015-08-06 08:32:35 -0700259TEST_P(AsyncEnd2endTest, AsyncNextRpc) {
vjpai7aadf462015-03-16 23:58:44 -0700260 ResetStub();
261
262 EchoRequest send_request;
263 EchoRequest recv_request;
264 EchoResponse send_response;
265 EchoResponse recv_response;
266 Status recv_status;
267
268 ClientContext cli_ctx;
269 ServerContext srv_ctx;
270 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
271
272 send_request.set_message("Hello");
Yang Gao757afae2015-03-17 15:49:26 -0700273 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700274 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
vjpai7aadf462015-03-16 23:58:44 -0700275
Yang Gao757afae2015-03-17 15:49:26 -0700276 std::chrono::system_clock::time_point time_now(
Craig Tillerf51199f2015-05-08 09:32:53 -0700277 std::chrono::system_clock::now());
278 std::chrono::system_clock::time_point time_limit(
279 std::chrono::system_clock::now() + std::chrono::seconds(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700280 Verifier(GetParam()).Verify(cq_.get(), time_now);
281 Verifier(GetParam()).Verify(cq_.get(), time_now);
vjpai7aadf462015-03-16 23:58:44 -0700282
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700283 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
284 cq_.get(), tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700285
Craig Tiller69f90e62015-08-06 08:32:35 -0700286 Verifier(GetParam()).Expect(2, true).Verify(cq_.get(), time_limit);
vjpai7aadf462015-03-16 23:58:44 -0700287 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700288
289 send_response.set_message(recv_request.message());
290 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller4c06b822015-08-06 08:41:31 -0700291 Verifier(GetParam())
292 .Expect(3, true)
293 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700294
295 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller4c06b822015-08-06 08:41:31 -0700296 Verifier(GetParam())
297 .Expect(4, true)
298 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700299
300 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700301 EXPECT_TRUE(recv_status.ok());
vjpai7aadf462015-03-16 23:58:44 -0700302}
Yang Gao757afae2015-03-17 15:49:26 -0700303
Yang Gao0e0d8e12015-02-13 14:40:41 -0800304// Two pings and a final pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700305TEST_P(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800306 ResetStub();
307
308 EchoRequest send_request;
309 EchoRequest recv_request;
310 EchoResponse send_response;
311 EchoResponse recv_response;
312 Status recv_status;
313 ClientContext cli_ctx;
314 ServerContext srv_ctx;
315 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
316
317 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800318 std::unique_ptr<ClientAsyncWriter<EchoRequest> > cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700319 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800320
Craig Tillerd6c98df2015-08-18 09:33:44 -0700321 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
322 tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800323
Craig Tiller69f90e62015-08-06 08:32:35 -0700324 Verifier(GetParam()).Expect(2, true).Expect(1, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800325
326 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700327 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800328
329 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700330 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800331 EXPECT_EQ(send_request.message(), recv_request.message());
332
333 cli_stream->Write(send_request, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700334 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800335
336 srv_stream.Read(&recv_request, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700337 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800338
339 EXPECT_EQ(send_request.message(), recv_request.message());
340 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700341 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800342
343 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700344 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800345
346 send_response.set_message(recv_request.message());
347 srv_stream.Finish(send_response, Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700348 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800349
350 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700351 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800352
353 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700354 EXPECT_TRUE(recv_status.ok());
Yang Gao005f18a2015-02-13 10:22:33 -0800355}
356
Yang Gao0e0d8e12015-02-13 14:40:41 -0800357// One ping, two pongs.
Craig Tiller69f90e62015-08-06 08:32:35 -0700358TEST_P(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800359 ResetStub();
360
361 EchoRequest send_request;
362 EchoRequest recv_request;
363 EchoResponse send_response;
364 EchoResponse recv_response;
365 Status recv_status;
366 ClientContext cli_ctx;
367 ServerContext srv_ctx;
368 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
369
370 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800371 std::unique_ptr<ClientAsyncReader<EchoResponse> > cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700372 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800373
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700374 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700375 cq_.get(), cq_.get(), tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800376
Craig Tiller69f90e62015-08-06 08:32:35 -0700377 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800378 EXPECT_EQ(send_request.message(), recv_request.message());
379
380 send_response.set_message(recv_request.message());
381 srv_stream.Write(send_response, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700382 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800383
384 cli_stream->Read(&recv_response, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700385 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800386 EXPECT_EQ(send_response.message(), recv_response.message());
387
388 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700389 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800390
391 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700392 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800393 EXPECT_EQ(send_response.message(), recv_response.message());
394
395 srv_stream.Finish(Status::OK, tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700396 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800397
398 cli_stream->Read(&recv_response, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700399 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800400
401 cli_stream->Finish(&recv_status, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700402 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800403
Yang Gaoc1a2c312015-06-16 10:59:46 -0700404 EXPECT_TRUE(recv_status.ok());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800405}
406
407// One ping, one pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700408TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800409 ResetStub();
410
411 EchoRequest send_request;
412 EchoRequest recv_request;
413 EchoResponse send_response;
414 EchoResponse recv_response;
415 Status recv_status;
416 ClientContext cli_ctx;
417 ServerContext srv_ctx;
418 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
419
420 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800421 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse> >
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700422 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800423
Craig Tillerd6c98df2015-08-18 09:33:44 -0700424 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
425 tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800426
Craig Tiller69f90e62015-08-06 08:32:35 -0700427 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800428
429 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700430 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800431
432 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700433 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800434 EXPECT_EQ(send_request.message(), recv_request.message());
435
436 send_response.set_message(recv_request.message());
437 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700438 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800439
440 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700441 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800442 EXPECT_EQ(send_response.message(), recv_response.message());
443
444 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700445 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800446
447 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700448 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800449
450 srv_stream.Finish(Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700451 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800452
453 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700454 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800455
Yang Gaoc1a2c312015-06-16 10:59:46 -0700456 EXPECT_TRUE(recv_status.ok());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800457}
458
Yang Gao406b32f2015-02-13 16:25:33 -0800459// Metadata tests
Craig Tiller69f90e62015-08-06 08:32:35 -0700460TEST_P(AsyncEnd2endTest, ClientInitialMetadataRpc) {
Yang Gao406b32f2015-02-13 16:25:33 -0800461 ResetStub();
462
463 EchoRequest send_request;
464 EchoRequest recv_request;
465 EchoResponse send_response;
466 EchoResponse recv_response;
467 Status recv_status;
468
469 ClientContext cli_ctx;
470 ServerContext srv_ctx;
471 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
472
473 send_request.set_message("Hello");
474 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
475 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
476 cli_ctx.AddMetadata(meta1.first, meta1.second);
477 cli_ctx.AddMetadata(meta2.first, meta2.second);
478
Yang Gao3a5e5492015-02-18 14:32:38 -0800479 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700480 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800481
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700482 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
483 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700484 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800485 EXPECT_EQ(send_request.message(), recv_request.message());
486 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700487 EXPECT_EQ(meta1.second,
488 ToString(client_initial_metadata.find(meta1.first)->second));
489 EXPECT_EQ(meta2.second,
490 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700491 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800492
493 send_response.set_message(recv_request.message());
494 response_writer.Finish(send_response, Status::OK, tag(3));
495
Craig Tiller69f90e62015-08-06 08:32:35 -0700496 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800497
Yang Gao3a5e5492015-02-18 14:32:38 -0800498 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700499 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800500
501 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700502 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800503}
504
Craig Tiller69f90e62015-08-06 08:32:35 -0700505TEST_P(AsyncEnd2endTest, ServerInitialMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800506 ResetStub();
507
508 EchoRequest send_request;
509 EchoRequest recv_request;
510 EchoResponse send_response;
511 EchoResponse recv_response;
512 Status recv_status;
513
514 ClientContext cli_ctx;
515 ServerContext srv_ctx;
516 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
517
518 send_request.set_message("Hello");
519 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
520 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
521
Yang Gao3a5e5492015-02-18 14:32:38 -0800522 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700523 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800524
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700525 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
526 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700527 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800528 EXPECT_EQ(send_request.message(), recv_request.message());
529 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
530 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
531 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700532 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800533
Yang Gao3a5e5492015-02-18 14:32:38 -0800534 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700535 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800536 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700537 EXPECT_EQ(meta1.second,
538 ToString(server_initial_metadata.find(meta1.first)->second));
539 EXPECT_EQ(meta2.second,
540 ToString(server_initial_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800541 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800542
543 send_response.set_message(recv_request.message());
544 response_writer.Finish(send_response, Status::OK, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700545 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800546
547 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700548 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800549
550 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700551 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800552}
553
Craig Tiller69f90e62015-08-06 08:32:35 -0700554TEST_P(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800555 ResetStub();
556
557 EchoRequest send_request;
558 EchoRequest recv_request;
559 EchoResponse send_response;
560 EchoResponse recv_response;
561 Status recv_status;
562
563 ClientContext cli_ctx;
564 ServerContext srv_ctx;
565 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
566
567 send_request.set_message("Hello");
568 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
569 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
570
Yang Gao3a5e5492015-02-18 14:32:38 -0800571 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700572 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800573
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700574 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
575 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700576 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800577 EXPECT_EQ(send_request.message(), recv_request.message());
578 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700579 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800580
581 send_response.set_message(recv_request.message());
582 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
583 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
584 response_writer.Finish(send_response, Status::OK, tag(4));
585
Craig Tiller69f90e62015-08-06 08:32:35 -0700586 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800587
Yang Gao3a5e5492015-02-18 14:32:38 -0800588 response_reader->Finish(&recv_response, &recv_status, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700589 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800590 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700591 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800592 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700593 EXPECT_EQ(meta1.second,
594 ToString(server_trailing_metadata.find(meta1.first)->second));
595 EXPECT_EQ(meta2.second,
596 ToString(server_trailing_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800597 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800598}
599
Craig Tiller69f90e62015-08-06 08:32:35 -0700600TEST_P(AsyncEnd2endTest, MetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800601 ResetStub();
602
603 EchoRequest send_request;
604 EchoRequest recv_request;
605 EchoResponse send_response;
606 EchoResponse recv_response;
607 Status recv_status;
608
609 ClientContext cli_ctx;
610 ServerContext srv_ctx;
611 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
612
613 send_request.set_message("Hello");
614 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800615 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400616 "key2-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700617 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800618 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800619 std::pair<grpc::string, grpc::string> meta6(
620 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400621 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700622 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800623 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800624 std::pair<grpc::string, grpc::string> meta4(
625 "key6-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700626 grpc::string(
627 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800628
629 cli_ctx.AddMetadata(meta1.first, meta1.second);
630 cli_ctx.AddMetadata(meta2.first, meta2.second);
631
Yang Gao3a5e5492015-02-18 14:32:38 -0800632 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700633 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800634
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700635 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
636 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700637 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800638 EXPECT_EQ(send_request.message(), recv_request.message());
639 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700640 EXPECT_EQ(meta1.second,
641 ToString(client_initial_metadata.find(meta1.first)->second));
642 EXPECT_EQ(meta2.second,
643 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700644 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800645
646 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
647 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
648 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700649 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800650 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700651 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800652 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700653 EXPECT_EQ(meta3.second,
654 ToString(server_initial_metadata.find(meta3.first)->second));
655 EXPECT_EQ(meta4.second,
656 ToString(server_initial_metadata.find(meta4.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700657 EXPECT_GE(server_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao3a5e5492015-02-18 14:32:38 -0800658
659 send_response.set_message(recv_request.message());
660 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
661 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
662 response_writer.Finish(send_response, Status::OK, tag(5));
663
Craig Tiller69f90e62015-08-06 08:32:35 -0700664 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800665
Yang Gao3a5e5492015-02-18 14:32:38 -0800666 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700667 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800668 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700669 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800670 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700671 EXPECT_EQ(meta5.second,
672 ToString(server_trailing_metadata.find(meta5.first)->second));
673 EXPECT_EQ(meta6.second,
674 ToString(server_trailing_metadata.find(meta6.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700675 EXPECT_GE(server_trailing_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800676}
yang-gb3352562015-08-04 14:42:06 -0700677
678// Server uses AsyncNotifyWhenDone API to check for cancellation
Craig Tiller69f90e62015-08-06 08:32:35 -0700679TEST_P(AsyncEnd2endTest, ServerCheckCancellation) {
yang-gb3352562015-08-04 14:42:06 -0700680 ResetStub();
681
682 EchoRequest send_request;
683 EchoRequest recv_request;
684 EchoResponse send_response;
685 EchoResponse recv_response;
686 Status recv_status;
687
688 ClientContext cli_ctx;
689 ServerContext srv_ctx;
690 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
691
692 send_request.set_message("Hello");
693 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
694 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
695
696 srv_ctx.AsyncNotifyWhenDone(tag(5));
697 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
698 cq_.get(), tag(2));
699
Craig Tiller69f90e62015-08-06 08:32:35 -0700700 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700701 EXPECT_EQ(send_request.message(), recv_request.message());
702
703 cli_ctx.TryCancel();
Craig Tiller69f90e62015-08-06 08:32:35 -0700704 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700705 EXPECT_TRUE(srv_ctx.IsCancelled());
706
707 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700708 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700709
710 EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
711}
712
713// Server uses AsyncNotifyWhenDone API to check for normal finish
Craig Tiller69f90e62015-08-06 08:32:35 -0700714TEST_P(AsyncEnd2endTest, ServerCheckDone) {
yang-gb3352562015-08-04 14:42:06 -0700715 ResetStub();
716
717 EchoRequest send_request;
718 EchoRequest recv_request;
719 EchoResponse send_response;
720 EchoResponse recv_response;
721 Status recv_status;
722
723 ClientContext cli_ctx;
724 ServerContext srv_ctx;
725 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
726
727 send_request.set_message("Hello");
728 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
729 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
730
731 srv_ctx.AsyncNotifyWhenDone(tag(5));
732 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
733 cq_.get(), tag(2));
734
Craig Tiller69f90e62015-08-06 08:32:35 -0700735 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700736 EXPECT_EQ(send_request.message(), recv_request.message());
737
738 send_response.set_message(recv_request.message());
739 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700740 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
741 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700742 EXPECT_FALSE(srv_ctx.IsCancelled());
743
744 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700745 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700746
747 EXPECT_EQ(send_response.message(), recv_response.message());
748 EXPECT_TRUE(recv_status.ok());
749}
750
Craig Tiller8f7bff72015-08-17 13:23:14 -0700751TEST_P(AsyncEnd2endTest, UnimplementedRpc) {
yang-g730055d2015-08-27 12:29:45 -0700752 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -0700753 CreateChannel(server_address_.str(), InsecureChannelCredentials());
yang-g9b7757d2015-08-13 11:15:53 -0700754 std::unique_ptr<grpc::cpp::test::util::UnimplementedService::Stub> stub;
Nicolas "Pixel" Noble7fa51672015-09-02 02:29:09 +0200755 stub = grpc::cpp::test::util::UnimplementedService::NewStub(channel);
yang-g9b7757d2015-08-13 11:15:53 -0700756 EchoRequest send_request;
757 EchoResponse recv_response;
758 Status recv_status;
759
760 ClientContext cli_ctx;
761 send_request.set_message("Hello");
762 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
763 stub->AsyncUnimplemented(&cli_ctx, send_request, cq_.get()));
764
765 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller8f7bff72015-08-17 13:23:14 -0700766 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-g9b7757d2015-08-13 11:15:53 -0700767
768 EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
769 EXPECT_EQ("", recv_status.error_message());
770}
771
Craig Tiller4c06b822015-08-06 08:41:31 -0700772INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest,
773 ::testing::Values(false, true));
Craig Tiller69f90e62015-08-06 08:32:35 -0700774
Craig Tiller0220cf12015-02-12 17:39:26 -0800775} // namespace
776} // namespace testing
777} // namespace grpc
778
779int main(int argc, char** argv) {
780 grpc_test_init(argc, argv);
Craig Tiller0220cf12015-02-12 17:39:26 -0800781 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -0700782 return RUN_ALL_TESTS();
Craig Tiller0220cf12015-02-12 17:39:26 -0800783}