blob: 78417fc6d0be48d2efb7c1c48f399e909f32e965 [file] [log] [blame]
Craig Tiller0220cf12015-02-12 17:39:26 -08001/*
2 *
murgatroid993466c4b2016-01-12 10:26:04 -08003 * Copyright 2015-2016, 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>
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -080035#include <thread>
Craig Tiller0220cf12015-02-12 17:39:26 -080036
yang-g8c2be9f2015-08-19 16:28:09 -070037#include <grpc++/channel.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080038#include <grpc++/client_context.h>
39#include <grpc++/create_channel.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080040#include <grpc++/server.h>
41#include <grpc++/server_builder.h>
42#include <grpc++/server_context.h>
Sree Kuchibhotlab0d0c8e2016-01-13 22:52:17 -080043#include <grpc/grpc.h>
44#include <grpc/support/thd.h>
45#include <grpc/support/time.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080046#include <gtest/gtest.h>
47
Craig Tiller1b4e3302015-12-17 16:35:00 -080048#include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h"
49#include "src/proto/grpc/testing/echo.grpc.pb.h"
Sree Kuchibhotlab0d0c8e2016-01-13 22:52:17 -080050#include "test/core/util/port.h"
51#include "test/core/util/test_config.h"
yang-ge21908f2015-08-25 13:47:51 -070052#include "test/cpp/util/string_ref_helper.h"
Craig Tiller0220cf12015-02-12 17:39:26 -080053
Craig Tiller69f90e62015-08-06 08:32:35 -070054#ifdef GPR_POSIX_SOCKET
55#include "src/core/iomgr/pollset_posix.h"
56#endif
57
Craig Tiller1b4e3302015-12-17 16:35:00 -080058using grpc::testing::EchoRequest;
59using grpc::testing::EchoResponse;
Craig Tiller0220cf12015-02-12 17:39:26 -080060using std::chrono::system_clock;
61
62namespace grpc {
63namespace testing {
64
65namespace {
66
Craig Tiller7536af02015-12-22 13:49:30 -080067void* tag(int i) { return (void*)(intptr_t)i; }
Yang Gaoc05b6cb2015-02-13 00:34:10 -080068
Craig Tiller69f90e62015-08-06 08:32:35 -070069#ifdef GPR_POSIX_SOCKET
Craig Tiller4c06b822015-08-06 08:41:31 -070070static int assert_non_blocking_poll(struct pollfd* pfds, nfds_t nfds,
71 int timeout) {
Craig Tiller69f90e62015-08-06 08:32:35 -070072 GPR_ASSERT(timeout == 0);
73 return poll(pfds, nfds, timeout);
74}
75
76class PollOverride {
Craig Tiller06cf3cc2015-05-13 13:11:01 -070077 public:
Craig Tiller69f90e62015-08-06 08:32:35 -070078 PollOverride(grpc_poll_function_type f) {
79 prev_ = grpc_poll_function;
80 grpc_poll_function = f;
81 }
82
Craig Tiller4c06b822015-08-06 08:41:31 -070083 ~PollOverride() { grpc_poll_function = prev_; }
Craig Tiller69f90e62015-08-06 08:32:35 -070084
85 private:
86 grpc_poll_function_type prev_;
87};
88
vjpaicf4daeb2016-02-15 02:33:54 -080089class PollingOverrider : public PollOverride {
Craig Tiller69f90e62015-08-06 08:32:35 -070090 public:
vjpaicf4daeb2016-02-15 02:33:54 -080091 explicit PollingOverrider(bool allow_blocking)
Craig Tiller69f90e62015-08-06 08:32:35 -070092 : PollOverride(allow_blocking ? poll : assert_non_blocking_poll) {}
93};
94#else
vjpaicf4daeb2016-02-15 02:33:54 -080095class PollingOverrider {
Craig Tiller69f90e62015-08-06 08:32:35 -070096 public:
vjpaicf4daeb2016-02-15 02:33:54 -080097 explicit PollingOverrider(bool allow_blocking) {}
Craig Tiller69f90e62015-08-06 08:32:35 -070098};
99#endif
100
vjpaicf4daeb2016-02-15 02:33:54 -0800101class Verifier {
Craig Tiller69f90e62015-08-06 08:32:35 -0700102 public:
vjpaicf4daeb2016-02-15 02:33:54 -0800103 explicit Verifier(bool spin) : spin_(spin) {}
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700104 Verifier& Expect(int i, bool expect_ok) {
105 expectations_[tag(i)] = expect_ok;
106 return *this;
vjpai7aadf462015-03-16 23:58:44 -0700107 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800108
109 void Verify(CompletionQueue* cq) { Verify(cq, false); }
110
111 void Verify(CompletionQueue* cq, bool ignore_ok) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700112 GPR_ASSERT(!expectations_.empty());
113 while (!expectations_.empty()) {
114 bool ok;
115 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700116 if (spin_) {
117 for (;;) {
118 auto r = cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
119 if (r == CompletionQueue::TIMEOUT) continue;
120 if (r == CompletionQueue::GOT_EVENT) break;
121 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
122 abort();
123 }
124 } else {
125 EXPECT_TRUE(cq->Next(&got_tag, &ok));
126 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700127 auto it = expectations_.find(got_tag);
128 EXPECT_TRUE(it != expectations_.end());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800129 if (!ignore_ok) {
130 EXPECT_EQ(it->second, ok);
131 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700132 expectations_.erase(it);
133 }
134 }
Craig Tillerd6c98df2015-08-18 09:33:44 -0700135 void Verify(CompletionQueue* cq,
136 std::chrono::system_clock::time_point deadline) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700137 if (expectations_.empty()) {
138 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700139 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700140 if (spin_) {
141 while (std::chrono::system_clock::now() < deadline) {
Craig Tiller4c06b822015-08-06 08:41:31 -0700142 EXPECT_EQ(
143 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)),
144 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700145 }
146 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700147 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
148 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700149 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700150 } else {
151 while (!expectations_.empty()) {
152 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700153 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700154 if (spin_) {
155 for (;;) {
156 GPR_ASSERT(std::chrono::system_clock::now() < deadline);
Craig Tiller4c06b822015-08-06 08:41:31 -0700157 auto r =
158 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
Craig Tiller69f90e62015-08-06 08:32:35 -0700159 if (r == CompletionQueue::TIMEOUT) continue;
160 if (r == CompletionQueue::GOT_EVENT) break;
161 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
162 abort();
Craig Tiller4c06b822015-08-06 08:41:31 -0700163 }
Craig Tiller69f90e62015-08-06 08:32:35 -0700164 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700165 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
166 CompletionQueue::GOT_EVENT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700167 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700168 auto it = expectations_.find(got_tag);
169 EXPECT_TRUE(it != expectations_.end());
170 EXPECT_EQ(it->second, ok);
171 expectations_.erase(it);
172 }
173 }
174 }
175
176 private:
177 std::map<void*, bool> expectations_;
Craig Tiller69f90e62015-08-06 08:32:35 -0700178 bool spin_;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700179};
vjpai7aadf462015-03-16 23:58:44 -0700180
Craig Tiller69f90e62015-08-06 08:32:35 -0700181class AsyncEnd2endTest : public ::testing::TestWithParam<bool> {
Craig Tiller0220cf12015-02-12 17:39:26 -0800182 protected:
vjpaicf4daeb2016-02-15 02:33:54 -0800183 AsyncEnd2endTest(): poll_override_(GetParam()) {}
Craig Tiller0220cf12015-02-12 17:39:26 -0800184
Craig Tillercf133f42015-02-26 14:05:56 -0800185 void SetUp() GRPC_OVERRIDE {
Craig Tiller0220cf12015-02-12 17:39:26 -0800186 int port = grpc_pick_unused_port_or_die();
187 server_address_ << "localhost:" << port;
vjpai017ed622015-12-09 10:42:54 -0800188
Craig Tiller0220cf12015-02-12 17:39:26 -0800189 // Setup server
190 ServerBuilder builder;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700191 builder.AddListeningPort(server_address_.str(),
192 grpc::InsecureServerCredentials());
Craig Tiller15f383c2016-01-07 12:45:32 -0800193 builder.RegisterService(&service_);
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700194 cq_ = builder.AddCompletionQueue();
Craig Tiller0220cf12015-02-12 17:39:26 -0800195 server_ = builder.BuildAndStart();
196 }
197
Craig Tillercf133f42015-02-26 14:05:56 -0800198 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800199 server_->Shutdown();
200 void* ignored_tag;
201 bool ignored_ok;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700202 cq_->Shutdown();
203 while (cq_->Next(&ignored_tag, &ignored_ok))
Craig Tiller492968f2015-02-18 13:14:03 -0800204 ;
205 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800206
207 void ResetStub() {
yang-g730055d2015-08-27 12:29:45 -0700208 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -0700209 CreateChannel(server_address_.str(), InsecureChannelCredentials());
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800210 stub_ = grpc::testing::EchoTestService::NewStub(channel);
Craig Tiller0220cf12015-02-12 17:39:26 -0800211 }
212
Yang Gao406b32f2015-02-13 16:25:33 -0800213 void SendRpc(int num_rpcs) {
214 for (int i = 0; i < num_rpcs; i++) {
215 EchoRequest send_request;
216 EchoRequest recv_request;
217 EchoResponse send_response;
218 EchoResponse recv_response;
219 Status recv_status;
220
221 ClientContext cli_ctx;
222 ServerContext srv_ctx;
223 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
224
225 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800226 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700227 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800228
Craig Tillerd6c98df2015-08-18 09:33:44 -0700229 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
230 cq_.get(), tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800231
Craig Tiller69f90e62015-08-06 08:32:35 -0700232 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800233 EXPECT_EQ(send_request.message(), recv_request.message());
234
235 send_response.set_message(recv_request.message());
236 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700237 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800238
Yang Gao3a5e5492015-02-18 14:32:38 -0800239 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700240 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800241
242 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700243 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800244 }
245 }
246
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700247 std::unique_ptr<ServerCompletionQueue> cq_;
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800248 std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800249 std::unique_ptr<Server> server_;
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800250 grpc::testing::EchoTestService::AsyncService service_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800251 std::ostringstream server_address_;
vjpaicf4daeb2016-02-15 02:33:54 -0800252
253 PollingOverrider poll_override_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800254};
255
Craig Tiller69f90e62015-08-06 08:32:35 -0700256TEST_P(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800257 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800258 SendRpc(1);
259}
Yang Gaobb84a302015-02-12 23:30:12 -0800260
Craig Tiller69f90e62015-08-06 08:32:35 -0700261TEST_P(AsyncEnd2endTest, SequentialRpcs) {
Yang Gao406b32f2015-02-13 16:25:33 -0800262 ResetStub();
263 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800264}
265
vjpai7aadf462015-03-16 23:58:44 -0700266// Test a simple RPC using the async version of Next
Craig Tiller69f90e62015-08-06 08:32:35 -0700267TEST_P(AsyncEnd2endTest, AsyncNextRpc) {
vjpai7aadf462015-03-16 23:58:44 -0700268 ResetStub();
269
270 EchoRequest send_request;
271 EchoRequest recv_request;
272 EchoResponse send_response;
273 EchoResponse recv_response;
274 Status recv_status;
275
276 ClientContext cli_ctx;
277 ServerContext srv_ctx;
278 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
279
280 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800281 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700282 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
vjpai7aadf462015-03-16 23:58:44 -0700283
Yang Gao757afae2015-03-17 15:49:26 -0700284 std::chrono::system_clock::time_point time_now(
Craig Tillerf51199f2015-05-08 09:32:53 -0700285 std::chrono::system_clock::now());
286 std::chrono::system_clock::time_point time_limit(
287 std::chrono::system_clock::now() + std::chrono::seconds(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700288 Verifier(GetParam()).Verify(cq_.get(), time_now);
289 Verifier(GetParam()).Verify(cq_.get(), time_now);
vjpai7aadf462015-03-16 23:58:44 -0700290
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700291 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
292 cq_.get(), tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700293
Craig Tiller69f90e62015-08-06 08:32:35 -0700294 Verifier(GetParam()).Expect(2, true).Verify(cq_.get(), time_limit);
vjpai7aadf462015-03-16 23:58:44 -0700295 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700296
297 send_response.set_message(recv_request.message());
298 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller4c06b822015-08-06 08:41:31 -0700299 Verifier(GetParam())
300 .Expect(3, true)
301 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700302
303 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller4c06b822015-08-06 08:41:31 -0700304 Verifier(GetParam())
305 .Expect(4, true)
306 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700307
308 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700309 EXPECT_TRUE(recv_status.ok());
vjpai7aadf462015-03-16 23:58:44 -0700310}
Yang Gao757afae2015-03-17 15:49:26 -0700311
Yang Gao0e0d8e12015-02-13 14:40:41 -0800312// Two pings and a final pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700313TEST_P(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800314 ResetStub();
315
316 EchoRequest send_request;
317 EchoRequest recv_request;
318 EchoResponse send_response;
319 EchoResponse recv_response;
320 Status recv_status;
321 ClientContext cli_ctx;
322 ServerContext srv_ctx;
323 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
324
325 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800326 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700327 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800328
Craig Tillerd6c98df2015-08-18 09:33:44 -0700329 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
330 tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800331
Craig Tiller69f90e62015-08-06 08:32:35 -0700332 Verifier(GetParam()).Expect(2, true).Expect(1, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800333
334 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700335 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800336
337 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700338 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800339 EXPECT_EQ(send_request.message(), recv_request.message());
340
341 cli_stream->Write(send_request, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700342 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800343
344 srv_stream.Read(&recv_request, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700345 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800346
347 EXPECT_EQ(send_request.message(), recv_request.message());
348 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700349 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800350
351 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700352 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800353
354 send_response.set_message(recv_request.message());
355 srv_stream.Finish(send_response, Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700356 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800357
358 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700359 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800360
361 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700362 EXPECT_TRUE(recv_status.ok());
Yang Gao005f18a2015-02-13 10:22:33 -0800363}
364
Yang Gao0e0d8e12015-02-13 14:40:41 -0800365// One ping, two pongs.
Craig Tiller69f90e62015-08-06 08:32:35 -0700366TEST_P(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800367 ResetStub();
368
369 EchoRequest send_request;
370 EchoRequest recv_request;
371 EchoResponse send_response;
372 EchoResponse recv_response;
373 Status recv_status;
374 ClientContext cli_ctx;
375 ServerContext srv_ctx;
376 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
377
378 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800379 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700380 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800381
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700382 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700383 cq_.get(), cq_.get(), tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800384
Craig Tiller69f90e62015-08-06 08:32:35 -0700385 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800386 EXPECT_EQ(send_request.message(), recv_request.message());
387
388 send_response.set_message(recv_request.message());
389 srv_stream.Write(send_response, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700390 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800391
392 cli_stream->Read(&recv_response, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700393 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800394 EXPECT_EQ(send_response.message(), recv_response.message());
395
396 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700397 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800398
399 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700400 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800401 EXPECT_EQ(send_response.message(), recv_response.message());
402
403 srv_stream.Finish(Status::OK, tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700404 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800405
406 cli_stream->Read(&recv_response, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700407 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800408
409 cli_stream->Finish(&recv_status, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700410 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800411
Yang Gaoc1a2c312015-06-16 10:59:46 -0700412 EXPECT_TRUE(recv_status.ok());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800413}
414
415// One ping, one pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700416TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800417 ResetStub();
418
419 EchoRequest send_request;
420 EchoRequest recv_request;
421 EchoResponse send_response;
422 EchoResponse recv_response;
423 Status recv_status;
424 ClientContext cli_ctx;
425 ServerContext srv_ctx;
426 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
427
428 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800429 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700430 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800431
Craig Tillerd6c98df2015-08-18 09:33:44 -0700432 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
433 tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800434
Craig Tiller69f90e62015-08-06 08:32:35 -0700435 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800436
437 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700438 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800439
440 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700441 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800442 EXPECT_EQ(send_request.message(), recv_request.message());
443
444 send_response.set_message(recv_request.message());
445 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700446 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800447
448 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700449 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800450 EXPECT_EQ(send_response.message(), recv_response.message());
451
452 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700453 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800454
455 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700456 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800457
458 srv_stream.Finish(Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700459 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800460
461 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700462 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800463
Yang Gaoc1a2c312015-06-16 10:59:46 -0700464 EXPECT_TRUE(recv_status.ok());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800465}
466
Yang Gao406b32f2015-02-13 16:25:33 -0800467// Metadata tests
Craig Tiller69f90e62015-08-06 08:32:35 -0700468TEST_P(AsyncEnd2endTest, ClientInitialMetadataRpc) {
Yang Gao406b32f2015-02-13 16:25:33 -0800469 ResetStub();
470
471 EchoRequest send_request;
472 EchoRequest recv_request;
473 EchoResponse send_response;
474 EchoResponse recv_response;
475 Status recv_status;
476
477 ClientContext cli_ctx;
478 ServerContext srv_ctx;
479 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
480
481 send_request.set_message("Hello");
482 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
483 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
Craig Tiller6f871642016-02-03 16:15:31 -0800484 std::pair<grpc::string, grpc::string> meta3("g.r.d-bin", "xyz");
Yang Gao406b32f2015-02-13 16:25:33 -0800485 cli_ctx.AddMetadata(meta1.first, meta1.second);
486 cli_ctx.AddMetadata(meta2.first, meta2.second);
Craig Tiller6f871642016-02-03 16:15:31 -0800487 cli_ctx.AddMetadata(meta3.first, meta3.second);
Yang Gao406b32f2015-02-13 16:25:33 -0800488
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -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 Tiller6f871642016-02-03 16:15:31 -0800501 EXPECT_EQ(meta3.second,
502 ToString(client_initial_metadata.find(meta3.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700503 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800504
505 send_response.set_message(recv_request.message());
506 response_writer.Finish(send_response, Status::OK, tag(3));
507
Craig Tiller69f90e62015-08-06 08:32:35 -0700508 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800509
Yang Gao3a5e5492015-02-18 14:32:38 -0800510 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700511 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800512
513 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700514 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800515}
516
Craig Tiller69f90e62015-08-06 08:32:35 -0700517TEST_P(AsyncEnd2endTest, ServerInitialMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800518 ResetStub();
519
520 EchoRequest send_request;
521 EchoRequest recv_request;
522 EchoResponse send_response;
523 EchoResponse recv_response;
524 Status recv_status;
525
526 ClientContext cli_ctx;
527 ServerContext srv_ctx;
528 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
529
530 send_request.set_message("Hello");
531 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
532 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
533
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800534 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700535 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800536
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700537 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
538 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700539 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800540 EXPECT_EQ(send_request.message(), recv_request.message());
541 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
542 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
543 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700544 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800545
Yang Gao3a5e5492015-02-18 14:32:38 -0800546 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700547 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800548 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700549 EXPECT_EQ(meta1.second,
550 ToString(server_initial_metadata.find(meta1.first)->second));
551 EXPECT_EQ(meta2.second,
552 ToString(server_initial_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800553 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800554
555 send_response.set_message(recv_request.message());
556 response_writer.Finish(send_response, Status::OK, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700557 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800558
559 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700560 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800561
562 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700563 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800564}
565
Craig Tiller69f90e62015-08-06 08:32:35 -0700566TEST_P(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800567 ResetStub();
568
569 EchoRequest send_request;
570 EchoRequest recv_request;
571 EchoResponse send_response;
572 EchoResponse recv_response;
573 Status recv_status;
574
575 ClientContext cli_ctx;
576 ServerContext srv_ctx;
577 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
578
579 send_request.set_message("Hello");
580 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
581 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
582
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800583 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700584 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800585
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700586 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
587 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700588 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800589 EXPECT_EQ(send_request.message(), recv_request.message());
590 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700591 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800592
593 send_response.set_message(recv_request.message());
594 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
595 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
596 response_writer.Finish(send_response, Status::OK, tag(4));
597
Craig Tiller69f90e62015-08-06 08:32:35 -0700598 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800599
Yang Gao3a5e5492015-02-18 14:32:38 -0800600 response_reader->Finish(&recv_response, &recv_status, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700601 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800602 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700603 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800604 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700605 EXPECT_EQ(meta1.second,
606 ToString(server_trailing_metadata.find(meta1.first)->second));
607 EXPECT_EQ(meta2.second,
608 ToString(server_trailing_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800609 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800610}
611
Craig Tiller69f90e62015-08-06 08:32:35 -0700612TEST_P(AsyncEnd2endTest, MetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800613 ResetStub();
614
615 EchoRequest send_request;
616 EchoRequest recv_request;
617 EchoResponse send_response;
618 EchoResponse recv_response;
619 Status recv_status;
620
621 ClientContext cli_ctx;
622 ServerContext srv_ctx;
623 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
624
625 send_request.set_message("Hello");
626 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800627 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400628 "key2-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700629 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800630 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800631 std::pair<grpc::string, grpc::string> meta6(
632 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400633 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700634 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800635 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800636 std::pair<grpc::string, grpc::string> meta4(
637 "key6-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700638 grpc::string(
639 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800640
641 cli_ctx.AddMetadata(meta1.first, meta1.second);
642 cli_ctx.AddMetadata(meta2.first, meta2.second);
643
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800644 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700645 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800646
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700647 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
648 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700649 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800650 EXPECT_EQ(send_request.message(), recv_request.message());
651 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700652 EXPECT_EQ(meta1.second,
653 ToString(client_initial_metadata.find(meta1.first)->second));
654 EXPECT_EQ(meta2.second,
655 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700656 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800657
658 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
659 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
660 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700661 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800662 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700663 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800664 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700665 EXPECT_EQ(meta3.second,
666 ToString(server_initial_metadata.find(meta3.first)->second));
667 EXPECT_EQ(meta4.second,
668 ToString(server_initial_metadata.find(meta4.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700669 EXPECT_GE(server_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao3a5e5492015-02-18 14:32:38 -0800670
671 send_response.set_message(recv_request.message());
672 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
673 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
674 response_writer.Finish(send_response, Status::OK, tag(5));
675
Craig Tiller69f90e62015-08-06 08:32:35 -0700676 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800677
Yang Gao3a5e5492015-02-18 14:32:38 -0800678 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700679 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800680 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700681 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800682 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700683 EXPECT_EQ(meta5.second,
684 ToString(server_trailing_metadata.find(meta5.first)->second));
685 EXPECT_EQ(meta6.second,
686 ToString(server_trailing_metadata.find(meta6.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700687 EXPECT_GE(server_trailing_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800688}
yang-gb3352562015-08-04 14:42:06 -0700689
690// Server uses AsyncNotifyWhenDone API to check for cancellation
Craig Tiller69f90e62015-08-06 08:32:35 -0700691TEST_P(AsyncEnd2endTest, ServerCheckCancellation) {
yang-gb3352562015-08-04 14:42:06 -0700692 ResetStub();
693
694 EchoRequest send_request;
695 EchoRequest recv_request;
696 EchoResponse send_response;
697 EchoResponse recv_response;
698 Status recv_status;
699
700 ClientContext cli_ctx;
701 ServerContext srv_ctx;
702 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
703
704 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800705 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700706 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
707
708 srv_ctx.AsyncNotifyWhenDone(tag(5));
709 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
710 cq_.get(), tag(2));
711
Craig Tiller69f90e62015-08-06 08:32:35 -0700712 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700713 EXPECT_EQ(send_request.message(), recv_request.message());
714
715 cli_ctx.TryCancel();
Craig Tiller69f90e62015-08-06 08:32:35 -0700716 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700717 EXPECT_TRUE(srv_ctx.IsCancelled());
718
719 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700720 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700721
722 EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
723}
724
725// Server uses AsyncNotifyWhenDone API to check for normal finish
Craig Tiller69f90e62015-08-06 08:32:35 -0700726TEST_P(AsyncEnd2endTest, ServerCheckDone) {
yang-gb3352562015-08-04 14:42:06 -0700727 ResetStub();
728
729 EchoRequest send_request;
730 EchoRequest recv_request;
731 EchoResponse send_response;
732 EchoResponse recv_response;
733 Status recv_status;
734
735 ClientContext cli_ctx;
736 ServerContext srv_ctx;
737 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
738
739 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800740 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700741 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
742
743 srv_ctx.AsyncNotifyWhenDone(tag(5));
744 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
745 cq_.get(), tag(2));
746
Craig Tiller69f90e62015-08-06 08:32:35 -0700747 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700748 EXPECT_EQ(send_request.message(), recv_request.message());
749
750 send_response.set_message(recv_request.message());
751 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700752 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
753 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700754 EXPECT_FALSE(srv_ctx.IsCancelled());
755
756 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700757 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700758
759 EXPECT_EQ(send_response.message(), recv_response.message());
760 EXPECT_TRUE(recv_status.ok());
761}
762
Craig Tiller8f7bff72015-08-17 13:23:14 -0700763TEST_P(AsyncEnd2endTest, UnimplementedRpc) {
yang-g730055d2015-08-27 12:29:45 -0700764 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -0700765 CreateChannel(server_address_.str(), InsecureChannelCredentials());
Craig Tiller1b4e3302015-12-17 16:35:00 -0800766 std::unique_ptr<grpc::testing::UnimplementedService::Stub> stub;
767 stub = grpc::testing::UnimplementedService::NewStub(channel);
yang-g9b7757d2015-08-13 11:15:53 -0700768 EchoRequest send_request;
769 EchoResponse recv_response;
770 Status recv_status;
771
772 ClientContext cli_ctx;
773 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800774 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-g9b7757d2015-08-13 11:15:53 -0700775 stub->AsyncUnimplemented(&cli_ctx, send_request, cq_.get()));
776
777 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller8f7bff72015-08-17 13:23:14 -0700778 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-g9b7757d2015-08-13 11:15:53 -0700779
780 EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
781 EXPECT_EQ("", recv_status.error_message());
782}
783
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800784// This class is for testing scenarios where RPCs are cancelled on the server
785// by calling ServerContext::TryCancel()
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800786class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
787 protected:
788 typedef enum {
789 DO_NOT_CANCEL = 0,
790 CANCEL_BEFORE_PROCESSING,
791 CANCEL_DURING_PROCESSING,
792 CANCEL_AFTER_PROCESSING
793 } ServerTryCancelRequestPhase;
794
795 void ServerTryCancel(ServerContext* context) {
796 EXPECT_FALSE(context->IsCancelled());
797 context->TryCancel();
798 gpr_log(GPR_INFO, "Server called TryCancel()");
799 EXPECT_TRUE(context->IsCancelled());
800 }
801
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800802 // Helper for testing client-streaming RPCs which are cancelled on the server.
803 // Depending on the value of server_try_cancel parameter, this will test one
804 // of the following three scenarios:
805 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading
806 // any messages from the client
807 //
808 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
809 // messages from the client
810 //
811 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
812 // messages from the client (but before sending any status back to the
813 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800814 void TestClientStreamingServerCancel(
815 ServerTryCancelRequestPhase server_try_cancel) {
816 ResetStub();
817
818 EchoRequest send_request;
819 EchoRequest recv_request;
820 EchoResponse send_response;
821 EchoResponse recv_response;
822 Status recv_status;
823
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800824 ClientContext cli_ctx;
825 ServerContext srv_ctx;
826 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
827
828 // Initiate the 'RequestStream' call on client
829 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800830 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
831 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800832
833 // On the server, request to be notified of 'RequestStream' calls
834 // and receive the 'RequestStream' call just made by the client
835 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
836 tag(2));
837 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
838
839 // Client sends 3 messages (tags 3, 4 and 5)
840 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
841 send_request.set_message("Ping " + std::to_string(tag_idx));
842 cli_stream->Write(send_request, tag(tag_idx));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800843 Verifier(GetParam()).Expect(tag_idx, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800844 }
845 cli_stream->WritesDone(tag(6));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800846 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800847
848 bool expected_server_cq_result = true;
849 bool ignore_cq_result = false;
850
851 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
852 ServerTryCancel(&srv_ctx);
853
854 // Since cancellation is done before server reads any results, we know
855 // for sure that all cq results will return false from this point forward
856 expected_server_cq_result = false;
857 }
858
859 std::thread* server_try_cancel_thd = NULL;
860 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
861 server_try_cancel_thd = new std::thread(
862 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
863 // Server will cancel the RPC in a parallel thread while reading the
864 // requests from the client. Since the cancellation can happen at anytime,
865 // some of the cq results (i.e those until cancellation) might be true but
866 // its non deterministic. So better to ignore the cq results
867 ignore_cq_result = true;
868 }
869
870 // Server reads 3 messages (tags 6, 7 and 8)
871 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
872 srv_stream.Read(&recv_request, tag(tag_idx));
873 Verifier(GetParam())
874 .Expect(tag_idx, expected_server_cq_result)
875 .Verify(cq_.get(), ignore_cq_result);
876 }
877
878 if (server_try_cancel_thd != NULL) {
879 server_try_cancel_thd->join();
880 delete server_try_cancel_thd;
881 }
882
883 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
884 ServerTryCancel(&srv_ctx);
885 }
886
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800887 // The RPC has been cancelled at this point for sure (i.e irrespective of
888 // the value of `server_try_cancel` is). So, from this point forward, we
889 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800890
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800891 // Server sends the final message and cancelled status (but the RPC is
892 // already cancelled at this point. So we expect the operation to fail)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800893 srv_stream.Finish(send_response, Status::CANCELLED, tag(9));
894 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
895
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800896 // Client will see the cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800897 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla369a04a2016-02-01 10:53:13 -0800898 // TODO(sreek): The expectation here should be true. This is a bug (github
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800899 // issue #4972)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800900 Verifier(GetParam()).Expect(10, false).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800901 EXPECT_FALSE(recv_status.ok());
902 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
903 }
904
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800905 // Helper for testing server-streaming RPCs which are cancelled on the server.
906 // Depending on the value of server_try_cancel parameter, this will test one
907 // of the following three scenarios:
908 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before sending
909 // any messages to the client
910 //
911 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while sending
912 // messages to the client
913 //
914 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after sending all
915 // messages to the client (but before sending any status back to the
916 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800917 void TestServerStreamingServerCancel(
918 ServerTryCancelRequestPhase server_try_cancel) {
919 ResetStub();
920
921 EchoRequest send_request;
922 EchoRequest recv_request;
923 EchoResponse send_response;
924 EchoResponse recv_response;
925 Status recv_status;
926 ClientContext cli_ctx;
927 ServerContext srv_ctx;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800928 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
929
930 send_request.set_message("Ping");
931 // Initiate the 'ResponseStream' call on the client
932 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800933 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
934 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800935 // On the server, request to be notified of 'ResponseStream' calls and
936 // receive the call just made by the client
937 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
938 cq_.get(), cq_.get(), tag(2));
939 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
940 EXPECT_EQ(send_request.message(), recv_request.message());
941
942 bool expected_cq_result = true;
943 bool ignore_cq_result = false;
944
945 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
946 ServerTryCancel(&srv_ctx);
947
948 // We know for sure that all cq results will be false from this point
949 // since the server cancelled the RPC
950 expected_cq_result = false;
951 }
952
953 std::thread* server_try_cancel_thd = NULL;
954 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
955 server_try_cancel_thd = new std::thread(
956 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
957
958 // Server will cancel the RPC in a parallel thread while writing responses
959 // to the client. Since the cancellation can happen at anytime, some of
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800960 // the cq results (i.e those until cancellation) might be true but it is
961 // non deterministic. So better to ignore the cq results
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800962 ignore_cq_result = true;
963 }
964
965 // Server sends three messages (tags 3, 4 and 5)
966 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
967 send_response.set_message("Pong " + std::to_string(tag_idx));
968 srv_stream.Write(send_response, tag(tag_idx));
969 Verifier(GetParam())
970 .Expect(tag_idx, expected_cq_result)
971 .Verify(cq_.get(), ignore_cq_result);
972 }
973
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800974 if (server_try_cancel_thd != NULL) {
975 server_try_cancel_thd->join();
976 delete server_try_cancel_thd;
977 }
978
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800979 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
980 ServerTryCancel(&srv_ctx);
981 }
982
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800983 // Client attemts to read the three messages from the server
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800984 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
985 cli_stream->Read(&recv_response, tag(tag_idx));
986 Verifier(GetParam())
987 .Expect(tag_idx, expected_cq_result)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800988 .Verify(cq_.get(), ignore_cq_result);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800989 }
990
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800991 // The RPC has been cancelled at this point for sure (i.e irrespective of
992 // the value of `server_try_cancel` is). So, from this point forward, we
993 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800994
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800995 // Server finishes the stream (but the RPC is already cancelled)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800996 srv_stream.Finish(Status::CANCELLED, tag(9));
997 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
998
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800999 // Client will see the cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001000 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001001 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001002 EXPECT_FALSE(recv_status.ok());
1003 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
1004 }
1005
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001006 // Helper for testing bidirectinal-streaming RPCs which are cancelled on the
1007 // server.
1008 //
1009 // Depending on the value of server_try_cancel parameter, this will
1010 // test one of the following three scenarios:
1011 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading/
1012 // writing any messages from/to the client
1013 //
1014 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
1015 // messages from the client
1016 //
1017 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
1018 // messages from the client (but before sending any status back to the
1019 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001020 void TestBidiStreamingServerCancel(
1021 ServerTryCancelRequestPhase server_try_cancel) {
1022 ResetStub();
1023
1024 EchoRequest send_request;
1025 EchoRequest recv_request;
1026 EchoResponse send_response;
1027 EchoResponse recv_response;
1028 Status recv_status;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001029 ClientContext cli_ctx;
1030 ServerContext srv_ctx;
1031 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
1032
1033 // Initiate the call from the client side
1034 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001035 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
1036 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001037
1038 // On the server, request to be notified of the 'BidiStream' call and
1039 // receive the call just made by the client
1040 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
1041 tag(2));
1042 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
1043
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001044 // Client sends the first and the only message
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001045 send_request.set_message("Ping");
1046 cli_stream->Write(send_request, tag(3));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001047 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001048
1049 bool expected_cq_result = true;
1050 bool ignore_cq_result = false;
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001051
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001052 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
1053 ServerTryCancel(&srv_ctx);
1054
1055 // We know for sure that all cq results will be false from this point
1056 // since the server cancelled the RPC
1057 expected_cq_result = false;
1058 }
1059
1060 std::thread* server_try_cancel_thd = NULL;
1061 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
1062 server_try_cancel_thd = new std::thread(
1063 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
1064
1065 // Since server is going to cancel the RPC in a parallel thread, some of
1066 // the cq results (i.e those until the cancellation) might be true. Since
1067 // that number is non-deterministic, it is better to ignore the cq results
1068 ignore_cq_result = true;
1069 }
1070
1071 srv_stream.Read(&recv_request, tag(4));
1072 Verifier(GetParam())
1073 .Expect(4, expected_cq_result)
1074 .Verify(cq_.get(), ignore_cq_result);
1075
1076 send_response.set_message("Pong");
1077 srv_stream.Write(send_response, tag(5));
1078 Verifier(GetParam())
1079 .Expect(5, expected_cq_result)
1080 .Verify(cq_.get(), ignore_cq_result);
1081
1082 cli_stream->Read(&recv_response, tag(6));
1083 Verifier(GetParam())
1084 .Expect(6, expected_cq_result)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001085 .Verify(cq_.get(), ignore_cq_result);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001086
1087 // This is expected to succeed in all cases
1088 cli_stream->WritesDone(tag(7));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001089 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001090
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001091 // This is expected to fail in all cases i.e for all values of
1092 // server_try_cancel. This is becasue at this point, either there are no
1093 // more msgs from the client (because client called WritesDone) or the RPC
1094 // is cancelled on the server
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001095 srv_stream.Read(&recv_request, tag(8));
1096 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
1097
1098 if (server_try_cancel_thd != NULL) {
1099 server_try_cancel_thd->join();
1100 delete server_try_cancel_thd;
1101 }
1102
1103 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
1104 ServerTryCancel(&srv_ctx);
1105 }
1106
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001107 // The RPC has been cancelled at this point for sure (i.e irrespective of
1108 // the value of `server_try_cancel` is). So, from this point forward, we
1109 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001110
1111 srv_stream.Finish(Status::CANCELLED, tag(9));
1112 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
1113
1114 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001115 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001116 EXPECT_FALSE(recv_status.ok());
1117 EXPECT_EQ(grpc::StatusCode::CANCELLED, recv_status.error_code());
1118 }
1119};
1120
1121TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelBefore) {
1122 TestClientStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1123}
1124
1125TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelDuring) {
1126 TestClientStreamingServerCancel(CANCEL_DURING_PROCESSING);
1127}
1128
1129TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelAfter) {
1130 TestClientStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1131}
1132
1133TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelBefore) {
1134 TestServerStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1135}
1136
1137TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelDuring) {
1138 TestServerStreamingServerCancel(CANCEL_DURING_PROCESSING);
1139}
1140
1141TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelAfter) {
1142 TestServerStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1143}
1144
1145TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelBefore) {
1146 TestBidiStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1147}
1148
1149TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelDuring) {
1150 TestBidiStreamingServerCancel(CANCEL_DURING_PROCESSING);
1151}
1152
1153TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelAfter) {
1154 TestBidiStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1155}
1156
Craig Tiller4c06b822015-08-06 08:41:31 -07001157INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest,
1158 ::testing::Values(false, true));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001159INSTANTIATE_TEST_CASE_P(AsyncEnd2endServerTryCancel,
1160 AsyncEnd2endServerTryCancelTest,
1161 ::testing::Values(false));
Craig Tiller69f90e62015-08-06 08:32:35 -07001162
Craig Tiller0220cf12015-02-12 17:39:26 -08001163} // namespace
1164} // namespace testing
1165} // namespace grpc
1166
1167int main(int argc, char** argv) {
1168 grpc_test_init(argc, argv);
Craig Tiller0220cf12015-02-12 17:39:26 -08001169 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -07001170 return RUN_ALL_TESTS();
Craig Tiller0220cf12015-02-12 17:39:26 -08001171}