blob: 266c3622ea7727df6983ce20e864a81818c383cc [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
Craig Tiller69f90e62015-08-06 08:32:35 -070059#ifdef GPR_POSIX_SOCKET
60#include "src/core/iomgr/pollset_posix.h"
61#endif
62
Craig Tiller0220cf12015-02-12 17:39:26 -080063using grpc::cpp::test::util::EchoRequest;
64using grpc::cpp::test::util::EchoResponse;
65using std::chrono::system_clock;
66
67namespace grpc {
68namespace testing {
69
70namespace {
71
Yang Gao6baa9b62015-03-17 10:49:39 -070072void* tag(int i) { return (void*)(gpr_intptr) i; }
Yang Gaoc05b6cb2015-02-13 00:34:10 -080073
Craig Tiller69f90e62015-08-06 08:32:35 -070074#ifdef GPR_POSIX_SOCKET
75static int assert_non_blocking_poll(
76 struct pollfd *pfds, nfds_t nfds, int timeout) {
77 GPR_ASSERT(timeout == 0);
78 return poll(pfds, nfds, timeout);
79}
80
81class PollOverride {
Craig Tiller06cf3cc2015-05-13 13:11:01 -070082 public:
Craig Tiller69f90e62015-08-06 08:32:35 -070083 PollOverride(grpc_poll_function_type f) {
84 prev_ = grpc_poll_function;
85 grpc_poll_function = f;
86 }
87
88 ~PollOverride() {
89 grpc_poll_function = prev_;
90 }
91
92 private:
93 grpc_poll_function_type prev_;
94};
95
96class PollingCheckRegion : public PollOverride {
97 public:
98 explicit PollingCheckRegion(bool allow_blocking)
99 : PollOverride(allow_blocking ? poll : assert_non_blocking_poll) {}
100};
101#else
102class PollingCheckRegion {
103 public:
104 explicit PollingCheckRegion(bool allow_blocking) {}
105};
106#endif
107
108class Verifier : public PollingCheckRegion {
109 public:
110 explicit Verifier(bool spin) : PollingCheckRegion(!spin), spin_(spin) {}
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700111 Verifier& Expect(int i, bool expect_ok) {
112 expectations_[tag(i)] = expect_ok;
113 return *this;
vjpai7aadf462015-03-16 23:58:44 -0700114 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700115 void Verify(CompletionQueue *cq) {
Craig Tiller69f90e62015-08-06 08:32:35 -0700116 if (spin_) gpr_log(GPR_DEBUG, "spin");
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700117 GPR_ASSERT(!expectations_.empty());
118 while (!expectations_.empty()) {
119 bool ok;
120 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700121 if (spin_) {
122 for (;;) {
123 auto r = cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
124 if (r == CompletionQueue::TIMEOUT) continue;
125 if (r == CompletionQueue::GOT_EVENT) break;
126 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
127 abort();
128 }
129 } else {
130 EXPECT_TRUE(cq->Next(&got_tag, &ok));
131 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700132 auto it = expectations_.find(got_tag);
133 EXPECT_TRUE(it != expectations_.end());
134 EXPECT_EQ(it->second, ok);
135 expectations_.erase(it);
136 }
137 }
138 void Verify(CompletionQueue *cq, std::chrono::system_clock::time_point deadline) {
Craig Tiller69f90e62015-08-06 08:32:35 -0700139 if (spin_) gpr_log(GPR_DEBUG, "spin");
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700140 if (expectations_.empty()) {
141 bool ok;
142 void *got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700143 if (spin_) {
144 while (std::chrono::system_clock::now() < deadline) {
145 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)), CompletionQueue::TIMEOUT);
146 }
147 } else {
148 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), CompletionQueue::TIMEOUT);
149 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700150 } else {
151 while (!expectations_.empty()) {
152 bool ok;
153 void *got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700154 if (spin_) {
155 for (;;) {
156 GPR_ASSERT(std::chrono::system_clock::now() < deadline);
157 auto r = cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
158 if (r == CompletionQueue::TIMEOUT) continue;
159 if (r == CompletionQueue::GOT_EVENT) break;
160 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
161 abort();
162 }
163 } else {
164 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), CompletionQueue::GOT_EVENT);
165 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700166 auto it = expectations_.find(got_tag);
167 EXPECT_TRUE(it != expectations_.end());
168 EXPECT_EQ(it->second, ok);
169 expectations_.erase(it);
170 }
171 }
172 }
173
174 private:
175 std::map<void*, bool> expectations_;
Craig Tiller69f90e62015-08-06 08:32:35 -0700176 bool spin_;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700177};
vjpai7aadf462015-03-16 23:58:44 -0700178
Craig Tiller69f90e62015-08-06 08:32:35 -0700179class AsyncEnd2endTest : public ::testing::TestWithParam<bool> {
Craig Tiller0220cf12015-02-12 17:39:26 -0800180 protected:
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700181 AsyncEnd2endTest() {}
Craig Tiller0220cf12015-02-12 17:39:26 -0800182
Craig Tillercf133f42015-02-26 14:05:56 -0800183 void SetUp() GRPC_OVERRIDE {
Craig Tiller0220cf12015-02-12 17:39:26 -0800184 int port = grpc_pick_unused_port_or_die();
185 server_address_ << "localhost:" << port;
186 // Setup server
187 ServerBuilder builder;
Nicolas Noblecfd60732015-03-18 16:27:43 -0700188 builder.AddListeningPort(server_address_.str(), grpc::InsecureServerCredentials());
Craig Tiller0220cf12015-02-12 17:39:26 -0800189 builder.RegisterAsyncService(&service_);
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700190 cq_ = builder.AddCompletionQueue();
Craig Tiller0220cf12015-02-12 17:39:26 -0800191 server_ = builder.BuildAndStart();
192 }
193
Craig Tillercf133f42015-02-26 14:05:56 -0800194 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800195 server_->Shutdown();
196 void* ignored_tag;
197 bool ignored_ok;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700198 cq_->Shutdown();
199 while (cq_->Next(&ignored_tag, &ignored_ok))
Craig Tiller492968f2015-02-18 13:14:03 -0800200 ;
201 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800202
203 void ResetStub() {
Craig Tiller47c83fd2015-02-21 22:45:35 -0800204 std::shared_ptr<ChannelInterface> channel = CreateChannel(
205 server_address_.str(), InsecureCredentials(), ChannelArguments());
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800206 stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel));
Craig Tiller0220cf12015-02-12 17:39:26 -0800207 }
208
Yang Gao406b32f2015-02-13 16:25:33 -0800209 void SendRpc(int num_rpcs) {
210 for (int i = 0; i < num_rpcs; i++) {
211 EchoRequest send_request;
212 EchoRequest recv_request;
213 EchoResponse send_response;
214 EchoResponse recv_response;
215 Status recv_status;
216
217 ClientContext cli_ctx;
218 ServerContext srv_ctx;
219 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
220
221 send_request.set_message("Hello");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800222 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700223 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800224
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700225 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700226 cq_.get(), cq_.get(), tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800227
Craig Tiller69f90e62015-08-06 08:32:35 -0700228 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800229 EXPECT_EQ(send_request.message(), recv_request.message());
230
231 send_response.set_message(recv_request.message());
232 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700233 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800234
Yang Gao3a5e5492015-02-18 14:32:38 -0800235 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700236 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800237
238 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700239 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800240 }
241 }
242
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700243 std::unique_ptr<ServerCompletionQueue> cq_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800244 std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
245 std::unique_ptr<Server> server_;
246 grpc::cpp::test::util::TestService::AsyncService service_;
247 std::ostringstream server_address_;
248};
249
Craig Tiller69f90e62015-08-06 08:32:35 -0700250TEST_P(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800251 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800252 SendRpc(1);
253}
Yang Gaobb84a302015-02-12 23:30:12 -0800254
Craig Tiller69f90e62015-08-06 08:32:35 -0700255TEST_P(AsyncEnd2endTest, SequentialRpcs) {
Yang Gao406b32f2015-02-13 16:25:33 -0800256 ResetStub();
257 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800258}
259
vjpai7aadf462015-03-16 23:58:44 -0700260// Test a simple RPC using the async version of Next
Craig Tiller69f90e62015-08-06 08:32:35 -0700261TEST_P(AsyncEnd2endTest, AsyncNextRpc) {
vjpai7aadf462015-03-16 23:58:44 -0700262 ResetStub();
263
264 EchoRequest send_request;
265 EchoRequest recv_request;
266 EchoResponse send_response;
267 EchoResponse recv_response;
268 Status recv_status;
269
270 ClientContext cli_ctx;
271 ServerContext srv_ctx;
272 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
273
274 send_request.set_message("Hello");
Yang Gao757afae2015-03-17 15:49:26 -0700275 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700276 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
vjpai7aadf462015-03-16 23:58:44 -0700277
Yang Gao757afae2015-03-17 15:49:26 -0700278 std::chrono::system_clock::time_point time_now(
Craig Tillerf51199f2015-05-08 09:32:53 -0700279 std::chrono::system_clock::now());
280 std::chrono::system_clock::time_point time_limit(
281 std::chrono::system_clock::now() + std::chrono::seconds(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700282 Verifier(GetParam()).Verify(cq_.get(), time_now);
283 Verifier(GetParam()).Verify(cq_.get(), time_now);
vjpai7aadf462015-03-16 23:58:44 -0700284
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700285 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
286 cq_.get(), tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700287
Craig Tiller69f90e62015-08-06 08:32:35 -0700288 Verifier(GetParam()).Expect(2, true).Verify(cq_.get(), time_limit);
vjpai7aadf462015-03-16 23:58:44 -0700289 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700290
291 send_response.set_message(recv_request.message());
292 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700293 Verifier(GetParam()).Expect(3, true).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 Tiller69f90e62015-08-06 08:32:35 -0700296 Verifier(GetParam()).Expect(4, true).Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700297
298 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700299 EXPECT_TRUE(recv_status.ok());
vjpai7aadf462015-03-16 23:58:44 -0700300}
Yang Gao757afae2015-03-17 15:49:26 -0700301
Yang Gao0e0d8e12015-02-13 14:40:41 -0800302// Two pings and a final pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700303TEST_P(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800304 ResetStub();
305
306 EchoRequest send_request;
307 EchoRequest recv_request;
308 EchoResponse send_response;
309 EchoResponse recv_response;
310 Status recv_status;
311 ClientContext cli_ctx;
312 ServerContext srv_ctx;
313 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
314
315 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800316 std::unique_ptr<ClientAsyncWriter<EchoRequest> > cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700317 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800318
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700319 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(),
320 cq_.get(), tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800321
Craig Tiller69f90e62015-08-06 08:32:35 -0700322 Verifier(GetParam()).Expect(2, true).Expect(1, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800323
324 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700325 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800326
327 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700328 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800329 EXPECT_EQ(send_request.message(), recv_request.message());
330
331 cli_stream->Write(send_request, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700332 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800333
334 srv_stream.Read(&recv_request, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700335 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800336
337 EXPECT_EQ(send_request.message(), recv_request.message());
338 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700339 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800340
341 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700342 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800343
344 send_response.set_message(recv_request.message());
345 srv_stream.Finish(send_response, Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700346 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800347
348 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700349 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800350
351 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700352 EXPECT_TRUE(recv_status.ok());
Yang Gao005f18a2015-02-13 10:22:33 -0800353}
354
Yang Gao0e0d8e12015-02-13 14:40:41 -0800355// One ping, two pongs.
Craig Tiller69f90e62015-08-06 08:32:35 -0700356TEST_P(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800357 ResetStub();
358
359 EchoRequest send_request;
360 EchoRequest recv_request;
361 EchoResponse send_response;
362 EchoResponse recv_response;
363 Status recv_status;
364 ClientContext cli_ctx;
365 ServerContext srv_ctx;
366 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
367
368 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800369 std::unique_ptr<ClientAsyncReader<EchoResponse> > cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700370 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800371
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700372 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700373 cq_.get(), cq_.get(), tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800374
Craig Tiller69f90e62015-08-06 08:32:35 -0700375 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800376 EXPECT_EQ(send_request.message(), recv_request.message());
377
378 send_response.set_message(recv_request.message());
379 srv_stream.Write(send_response, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700380 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800381
382 cli_stream->Read(&recv_response, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700383 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800384 EXPECT_EQ(send_response.message(), recv_response.message());
385
386 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700387 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800388
389 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700390 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800391 EXPECT_EQ(send_response.message(), recv_response.message());
392
393 srv_stream.Finish(Status::OK, tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700394 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800395
396 cli_stream->Read(&recv_response, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700397 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800398
399 cli_stream->Finish(&recv_status, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700400 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800401
Yang Gaoc1a2c312015-06-16 10:59:46 -0700402 EXPECT_TRUE(recv_status.ok());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800403}
404
405// One ping, one pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700406TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800407 ResetStub();
408
409 EchoRequest send_request;
410 EchoRequest recv_request;
411 EchoResponse send_response;
412 EchoResponse recv_response;
413 Status recv_status;
414 ClientContext cli_ctx;
415 ServerContext srv_ctx;
416 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
417
418 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800419 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse> >
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700420 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800421
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700422 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(),
423 cq_.get(), tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800424
Craig Tiller69f90e62015-08-06 08:32:35 -0700425 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800426
427 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700428 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800429
430 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700431 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800432 EXPECT_EQ(send_request.message(), recv_request.message());
433
434 send_response.set_message(recv_request.message());
435 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700436 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800437
438 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700439 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800440 EXPECT_EQ(send_response.message(), recv_response.message());
441
442 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700443 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800444
445 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700446 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800447
448 srv_stream.Finish(Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700449 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800450
451 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700452 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800453
Yang Gaoc1a2c312015-06-16 10:59:46 -0700454 EXPECT_TRUE(recv_status.ok());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800455}
456
Yang Gao406b32f2015-02-13 16:25:33 -0800457// Metadata tests
Craig Tiller69f90e62015-08-06 08:32:35 -0700458TEST_P(AsyncEnd2endTest, ClientInitialMetadataRpc) {
Yang Gao406b32f2015-02-13 16:25:33 -0800459 ResetStub();
460
461 EchoRequest send_request;
462 EchoRequest recv_request;
463 EchoResponse send_response;
464 EchoResponse recv_response;
465 Status recv_status;
466
467 ClientContext cli_ctx;
468 ServerContext srv_ctx;
469 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
470
471 send_request.set_message("Hello");
472 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
473 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
474 cli_ctx.AddMetadata(meta1.first, meta1.second);
475 cli_ctx.AddMetadata(meta2.first, meta2.second);
476
Yang Gao3a5e5492015-02-18 14:32:38 -0800477 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700478 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800479
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700480 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
481 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700482 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800483 EXPECT_EQ(send_request.message(), recv_request.message());
484 auto client_initial_metadata = srv_ctx.client_metadata();
485 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
486 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700487 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800488
489 send_response.set_message(recv_request.message());
490 response_writer.Finish(send_response, Status::OK, tag(3));
491
Craig Tiller69f90e62015-08-06 08:32:35 -0700492 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800493
Yang Gao3a5e5492015-02-18 14:32:38 -0800494 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700495 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800496
497 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700498 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800499}
500
Craig Tiller69f90e62015-08-06 08:32:35 -0700501TEST_P(AsyncEnd2endTest, ServerInitialMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800502 ResetStub();
503
504 EchoRequest send_request;
505 EchoRequest recv_request;
506 EchoResponse send_response;
507 EchoResponse recv_response;
508 Status recv_status;
509
510 ClientContext cli_ctx;
511 ServerContext srv_ctx;
512 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
513
514 send_request.set_message("Hello");
515 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
516 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
517
Yang Gao3a5e5492015-02-18 14:32:38 -0800518 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700519 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800520
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700521 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
522 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700523 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800524 EXPECT_EQ(send_request.message(), recv_request.message());
525 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
526 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
527 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700528 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800529
Yang Gao3a5e5492015-02-18 14:32:38 -0800530 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700531 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800532 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
533 EXPECT_EQ(meta1.second, server_initial_metadata.find(meta1.first)->second);
534 EXPECT_EQ(meta2.second, server_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800535 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800536
537 send_response.set_message(recv_request.message());
538 response_writer.Finish(send_response, Status::OK, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700539 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800540
541 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700542 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800543
544 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700545 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800546}
547
Craig Tiller69f90e62015-08-06 08:32:35 -0700548TEST_P(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800549 ResetStub();
550
551 EchoRequest send_request;
552 EchoRequest recv_request;
553 EchoResponse send_response;
554 EchoResponse recv_response;
555 Status recv_status;
556
557 ClientContext cli_ctx;
558 ServerContext srv_ctx;
559 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
560
561 send_request.set_message("Hello");
562 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
563 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
564
Yang Gao3a5e5492015-02-18 14:32:38 -0800565 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700566 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800567
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700568 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
569 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700570 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800571 EXPECT_EQ(send_request.message(), recv_request.message());
572 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700573 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800574
575 send_response.set_message(recv_request.message());
576 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
577 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
578 response_writer.Finish(send_response, Status::OK, tag(4));
579
Craig Tiller69f90e62015-08-06 08:32:35 -0700580 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800581
Yang Gao3a5e5492015-02-18 14:32:38 -0800582 response_reader->Finish(&recv_response, &recv_status, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700583 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800584 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700585 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800586 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
587 EXPECT_EQ(meta1.second, server_trailing_metadata.find(meta1.first)->second);
588 EXPECT_EQ(meta2.second, server_trailing_metadata.find(meta2.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}
591
Craig Tiller69f90e62015-08-06 08:32:35 -0700592TEST_P(AsyncEnd2endTest, MetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800593 ResetStub();
594
595 EchoRequest send_request;
596 EchoRequest recv_request;
597 EchoResponse send_response;
598 EchoResponse recv_response;
599 Status recv_status;
600
601 ClientContext cli_ctx;
602 ServerContext srv_ctx;
603 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
604
605 send_request.set_message("Hello");
606 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800607 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400608 "key2-bin",
609 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc",
610 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800611 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800612 std::pair<grpc::string, grpc::string> meta6(
613 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400614 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
615 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800616 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800617 std::pair<grpc::string, grpc::string> meta4(
618 "key6-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400619 grpc::string("\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee",
620 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800621
622 cli_ctx.AddMetadata(meta1.first, meta1.second);
623 cli_ctx.AddMetadata(meta2.first, meta2.second);
624
Yang Gao3a5e5492015-02-18 14:32:38 -0800625 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700626 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800627
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700628 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
629 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700630 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800631 EXPECT_EQ(send_request.message(), recv_request.message());
632 auto client_initial_metadata = srv_ctx.client_metadata();
633 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
634 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700635 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800636
637 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
638 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
639 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700640 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800641 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700642 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800643 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
644 EXPECT_EQ(meta3.second, server_initial_metadata.find(meta3.first)->second);
645 EXPECT_EQ(meta4.second, server_initial_metadata.find(meta4.first)->second);
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700646 EXPECT_GE(server_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao3a5e5492015-02-18 14:32:38 -0800647
648 send_response.set_message(recv_request.message());
649 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
650 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
651 response_writer.Finish(send_response, Status::OK, tag(5));
652
Craig Tiller69f90e62015-08-06 08:32:35 -0700653 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800654
Yang Gao3a5e5492015-02-18 14:32:38 -0800655 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700656 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800657 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700658 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800659 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
660 EXPECT_EQ(meta5.second, server_trailing_metadata.find(meta5.first)->second);
661 EXPECT_EQ(meta6.second, server_trailing_metadata.find(meta6.first)->second);
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700662 EXPECT_GE(server_trailing_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800663}
yang-gb3352562015-08-04 14:42:06 -0700664
665// Server uses AsyncNotifyWhenDone API to check for cancellation
Craig Tiller69f90e62015-08-06 08:32:35 -0700666TEST_P(AsyncEnd2endTest, ServerCheckCancellation) {
yang-gb3352562015-08-04 14:42:06 -0700667 ResetStub();
668
669 EchoRequest send_request;
670 EchoRequest recv_request;
671 EchoResponse send_response;
672 EchoResponse recv_response;
673 Status recv_status;
674
675 ClientContext cli_ctx;
676 ServerContext srv_ctx;
677 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
678
679 send_request.set_message("Hello");
680 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
681 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
682
683 srv_ctx.AsyncNotifyWhenDone(tag(5));
684 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
685 cq_.get(), tag(2));
686
Craig Tiller69f90e62015-08-06 08:32:35 -0700687 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700688 EXPECT_EQ(send_request.message(), recv_request.message());
689
690 cli_ctx.TryCancel();
Craig Tiller69f90e62015-08-06 08:32:35 -0700691 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700692 EXPECT_TRUE(srv_ctx.IsCancelled());
693
694 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700695 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700696
697 EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
698}
699
700// Server uses AsyncNotifyWhenDone API to check for normal finish
Craig Tiller69f90e62015-08-06 08:32:35 -0700701TEST_P(AsyncEnd2endTest, ServerCheckDone) {
yang-gb3352562015-08-04 14:42:06 -0700702 ResetStub();
703
704 EchoRequest send_request;
705 EchoRequest recv_request;
706 EchoResponse send_response;
707 EchoResponse recv_response;
708 Status recv_status;
709
710 ClientContext cli_ctx;
711 ServerContext srv_ctx;
712 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
713
714 send_request.set_message("Hello");
715 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
716 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
717
718 srv_ctx.AsyncNotifyWhenDone(tag(5));
719 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
720 cq_.get(), tag(2));
721
Craig Tiller69f90e62015-08-06 08:32:35 -0700722 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700723 EXPECT_EQ(send_request.message(), recv_request.message());
724
725 send_response.set_message(recv_request.message());
726 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700727 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
728 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700729 EXPECT_FALSE(srv_ctx.IsCancelled());
730
731 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700732 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700733
734 EXPECT_EQ(send_response.message(), recv_response.message());
735 EXPECT_TRUE(recv_status.ok());
736}
737
Craig Tiller69f90e62015-08-06 08:32:35 -0700738INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest, ::testing::Values(false, true));
739
Craig Tiller0220cf12015-02-12 17:39:26 -0800740} // namespace
741} // namespace testing
742} // namespace grpc
743
744int main(int argc, char** argv) {
745 grpc_test_init(argc, argv);
Craig Tiller0220cf12015-02-12 17:39:26 -0800746 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -0700747 return RUN_ALL_TESTS();
Craig Tiller0220cf12015-02-12 17:39:26 -0800748}