blob: 0deb2eff95bbb39786c2f562c7e0c3b5def91b3e [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
89class PollingCheckRegion : public PollOverride {
90 public:
Craig Tiller4c06b822015-08-06 08:41:31 -070091 explicit PollingCheckRegion(bool allow_blocking)
Craig Tiller69f90e62015-08-06 08:32:35 -070092 : PollOverride(allow_blocking ? poll : assert_non_blocking_poll) {}
93};
94#else
95class PollingCheckRegion {
96 public:
97 explicit PollingCheckRegion(bool allow_blocking) {}
98};
99#endif
100
101class Verifier : public PollingCheckRegion {
102 public:
103 explicit Verifier(bool spin) : PollingCheckRegion(!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:
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700183 AsyncEnd2endTest() {}
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_;
252};
253
Craig Tiller69f90e62015-08-06 08:32:35 -0700254TEST_P(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800255 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800256 SendRpc(1);
257}
Yang Gaobb84a302015-02-12 23:30:12 -0800258
Craig Tiller69f90e62015-08-06 08:32:35 -0700259TEST_P(AsyncEnd2endTest, SequentialRpcs) {
Yang Gao406b32f2015-02-13 16:25:33 -0800260 ResetStub();
261 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800262}
263
vjpai7aadf462015-03-16 23:58:44 -0700264// Test a simple RPC using the async version of Next
Craig Tiller69f90e62015-08-06 08:32:35 -0700265TEST_P(AsyncEnd2endTest, AsyncNextRpc) {
vjpai7aadf462015-03-16 23:58:44 -0700266 ResetStub();
267
268 EchoRequest send_request;
269 EchoRequest recv_request;
270 EchoResponse send_response;
271 EchoResponse recv_response;
272 Status recv_status;
273
274 ClientContext cli_ctx;
275 ServerContext srv_ctx;
276 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
277
278 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800279 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700280 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
vjpai7aadf462015-03-16 23:58:44 -0700281
Yang Gao757afae2015-03-17 15:49:26 -0700282 std::chrono::system_clock::time_point time_now(
Craig Tillerf51199f2015-05-08 09:32:53 -0700283 std::chrono::system_clock::now());
284 std::chrono::system_clock::time_point time_limit(
285 std::chrono::system_clock::now() + std::chrono::seconds(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700286 Verifier(GetParam()).Verify(cq_.get(), time_now);
287 Verifier(GetParam()).Verify(cq_.get(), time_now);
vjpai7aadf462015-03-16 23:58:44 -0700288
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700289 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
290 cq_.get(), tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700291
Craig Tiller69f90e62015-08-06 08:32:35 -0700292 Verifier(GetParam()).Expect(2, true).Verify(cq_.get(), time_limit);
vjpai7aadf462015-03-16 23:58:44 -0700293 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700294
295 send_response.set_message(recv_request.message());
296 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller4c06b822015-08-06 08:41:31 -0700297 Verifier(GetParam())
298 .Expect(3, true)
299 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700300
301 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller4c06b822015-08-06 08:41:31 -0700302 Verifier(GetParam())
303 .Expect(4, true)
304 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700305
306 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700307 EXPECT_TRUE(recv_status.ok());
vjpai7aadf462015-03-16 23:58:44 -0700308}
Yang Gao757afae2015-03-17 15:49:26 -0700309
Yang Gao0e0d8e12015-02-13 14:40:41 -0800310// Two pings and a final pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700311TEST_P(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800312 ResetStub();
313
314 EchoRequest send_request;
315 EchoRequest recv_request;
316 EchoResponse send_response;
317 EchoResponse recv_response;
318 Status recv_status;
319 ClientContext cli_ctx;
320 ServerContext srv_ctx;
321 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
322
323 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800324 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700325 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800326
Craig Tillerd6c98df2015-08-18 09:33:44 -0700327 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
328 tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800329
Craig Tiller69f90e62015-08-06 08:32:35 -0700330 Verifier(GetParam()).Expect(2, true).Expect(1, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800331
332 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700333 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800334
335 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700336 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800337 EXPECT_EQ(send_request.message(), recv_request.message());
338
339 cli_stream->Write(send_request, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700340 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800341
342 srv_stream.Read(&recv_request, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700343 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800344
345 EXPECT_EQ(send_request.message(), recv_request.message());
346 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700347 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800348
349 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700350 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800351
352 send_response.set_message(recv_request.message());
353 srv_stream.Finish(send_response, Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700354 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800355
356 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700357 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800358
359 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700360 EXPECT_TRUE(recv_status.ok());
Yang Gao005f18a2015-02-13 10:22:33 -0800361}
362
Yang Gao0e0d8e12015-02-13 14:40:41 -0800363// One ping, two pongs.
Craig Tiller69f90e62015-08-06 08:32:35 -0700364TEST_P(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800365 ResetStub();
366
367 EchoRequest send_request;
368 EchoRequest recv_request;
369 EchoResponse send_response;
370 EchoResponse recv_response;
371 Status recv_status;
372 ClientContext cli_ctx;
373 ServerContext srv_ctx;
374 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
375
376 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800377 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700378 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800379
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700380 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700381 cq_.get(), cq_.get(), tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800382
Craig Tiller69f90e62015-08-06 08:32:35 -0700383 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800384 EXPECT_EQ(send_request.message(), recv_request.message());
385
386 send_response.set_message(recv_request.message());
387 srv_stream.Write(send_response, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700388 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800389
390 cli_stream->Read(&recv_response, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700391 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800392 EXPECT_EQ(send_response.message(), recv_response.message());
393
394 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700395 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800396
397 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700398 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800399 EXPECT_EQ(send_response.message(), recv_response.message());
400
401 srv_stream.Finish(Status::OK, tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700402 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800403
404 cli_stream->Read(&recv_response, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700405 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800406
407 cli_stream->Finish(&recv_status, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700408 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800409
Yang Gaoc1a2c312015-06-16 10:59:46 -0700410 EXPECT_TRUE(recv_status.ok());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800411}
412
413// One ping, one pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700414TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800415 ResetStub();
416
417 EchoRequest send_request;
418 EchoRequest recv_request;
419 EchoResponse send_response;
420 EchoResponse recv_response;
421 Status recv_status;
422 ClientContext cli_ctx;
423 ServerContext srv_ctx;
424 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
425
426 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800427 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700428 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800429
Craig Tillerd6c98df2015-08-18 09:33:44 -0700430 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
431 tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800432
Craig Tiller69f90e62015-08-06 08:32:35 -0700433 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800434
435 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700436 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800437
438 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700439 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800440 EXPECT_EQ(send_request.message(), recv_request.message());
441
442 send_response.set_message(recv_request.message());
443 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700444 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800445
446 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700447 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800448 EXPECT_EQ(send_response.message(), recv_response.message());
449
450 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700451 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800452
453 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700454 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800455
456 srv_stream.Finish(Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700457 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800458
459 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700460 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800461
Yang Gaoc1a2c312015-06-16 10:59:46 -0700462 EXPECT_TRUE(recv_status.ok());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800463}
464
Yang Gao406b32f2015-02-13 16:25:33 -0800465// Metadata tests
Craig Tiller69f90e62015-08-06 08:32:35 -0700466TEST_P(AsyncEnd2endTest, ClientInitialMetadataRpc) {
Yang Gao406b32f2015-02-13 16:25:33 -0800467 ResetStub();
468
469 EchoRequest send_request;
470 EchoRequest recv_request;
471 EchoResponse send_response;
472 EchoResponse recv_response;
473 Status recv_status;
474
475 ClientContext cli_ctx;
476 ServerContext srv_ctx;
477 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
478
479 send_request.set_message("Hello");
480 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
481 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
482 cli_ctx.AddMetadata(meta1.first, meta1.second);
483 cli_ctx.AddMetadata(meta2.first, meta2.second);
484
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800485 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700486 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800487
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700488 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
489 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700490 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800491 EXPECT_EQ(send_request.message(), recv_request.message());
492 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700493 EXPECT_EQ(meta1.second,
494 ToString(client_initial_metadata.find(meta1.first)->second));
495 EXPECT_EQ(meta2.second,
496 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700497 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800498
499 send_response.set_message(recv_request.message());
500 response_writer.Finish(send_response, Status::OK, tag(3));
501
Craig Tiller69f90e62015-08-06 08:32:35 -0700502 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800503
Yang Gao3a5e5492015-02-18 14:32:38 -0800504 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700505 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800506
507 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700508 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800509}
510
Craig Tiller69f90e62015-08-06 08:32:35 -0700511TEST_P(AsyncEnd2endTest, ServerInitialMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800512 ResetStub();
513
514 EchoRequest send_request;
515 EchoRequest recv_request;
516 EchoResponse send_response;
517 EchoResponse recv_response;
518 Status recv_status;
519
520 ClientContext cli_ctx;
521 ServerContext srv_ctx;
522 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
523
524 send_request.set_message("Hello");
525 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
526 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
527
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800528 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700529 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800530
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700531 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
532 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700533 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800534 EXPECT_EQ(send_request.message(), recv_request.message());
535 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
536 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
537 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700538 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800539
Yang Gao3a5e5492015-02-18 14:32:38 -0800540 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700541 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800542 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700543 EXPECT_EQ(meta1.second,
544 ToString(server_initial_metadata.find(meta1.first)->second));
545 EXPECT_EQ(meta2.second,
546 ToString(server_initial_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800547 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800548
549 send_response.set_message(recv_request.message());
550 response_writer.Finish(send_response, Status::OK, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700551 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800552
553 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700554 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800555
556 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700557 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800558}
559
Craig Tiller69f90e62015-08-06 08:32:35 -0700560TEST_P(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800561 ResetStub();
562
563 EchoRequest send_request;
564 EchoRequest recv_request;
565 EchoResponse send_response;
566 EchoResponse recv_response;
567 Status recv_status;
568
569 ClientContext cli_ctx;
570 ServerContext srv_ctx;
571 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
572
573 send_request.set_message("Hello");
574 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
575 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
576
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800577 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700578 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800579
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700580 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
581 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700582 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800583 EXPECT_EQ(send_request.message(), recv_request.message());
584 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700585 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800586
587 send_response.set_message(recv_request.message());
588 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
589 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
590 response_writer.Finish(send_response, Status::OK, tag(4));
591
Craig Tiller69f90e62015-08-06 08:32:35 -0700592 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800593
Yang Gao3a5e5492015-02-18 14:32:38 -0800594 response_reader->Finish(&recv_response, &recv_status, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700595 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800596 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700597 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800598 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700599 EXPECT_EQ(meta1.second,
600 ToString(server_trailing_metadata.find(meta1.first)->second));
601 EXPECT_EQ(meta2.second,
602 ToString(server_trailing_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800603 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800604}
605
Craig Tiller69f90e62015-08-06 08:32:35 -0700606TEST_P(AsyncEnd2endTest, MetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800607 ResetStub();
608
609 EchoRequest send_request;
610 EchoRequest recv_request;
611 EchoResponse send_response;
612 EchoResponse recv_response;
613 Status recv_status;
614
615 ClientContext cli_ctx;
616 ServerContext srv_ctx;
617 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
618
619 send_request.set_message("Hello");
620 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800621 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400622 "key2-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700623 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800624 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800625 std::pair<grpc::string, grpc::string> meta6(
626 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400627 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700628 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800629 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800630 std::pair<grpc::string, grpc::string> meta4(
631 "key6-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700632 grpc::string(
633 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800634
635 cli_ctx.AddMetadata(meta1.first, meta1.second);
636 cli_ctx.AddMetadata(meta2.first, meta2.second);
637
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800638 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700639 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800640
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700641 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
642 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700643 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800644 EXPECT_EQ(send_request.message(), recv_request.message());
645 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700646 EXPECT_EQ(meta1.second,
647 ToString(client_initial_metadata.find(meta1.first)->second));
648 EXPECT_EQ(meta2.second,
649 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700650 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800651
652 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
653 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
654 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700655 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800656 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700657 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800658 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700659 EXPECT_EQ(meta3.second,
660 ToString(server_initial_metadata.find(meta3.first)->second));
661 EXPECT_EQ(meta4.second,
662 ToString(server_initial_metadata.find(meta4.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700663 EXPECT_GE(server_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao3a5e5492015-02-18 14:32:38 -0800664
665 send_response.set_message(recv_request.message());
666 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
667 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
668 response_writer.Finish(send_response, Status::OK, tag(5));
669
Craig Tiller69f90e62015-08-06 08:32:35 -0700670 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800671
Yang Gao3a5e5492015-02-18 14:32:38 -0800672 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700673 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800674 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700675 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800676 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700677 EXPECT_EQ(meta5.second,
678 ToString(server_trailing_metadata.find(meta5.first)->second));
679 EXPECT_EQ(meta6.second,
680 ToString(server_trailing_metadata.find(meta6.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700681 EXPECT_GE(server_trailing_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800682}
yang-gb3352562015-08-04 14:42:06 -0700683
684// Server uses AsyncNotifyWhenDone API to check for cancellation
Craig Tiller69f90e62015-08-06 08:32:35 -0700685TEST_P(AsyncEnd2endTest, ServerCheckCancellation) {
yang-gb3352562015-08-04 14:42:06 -0700686 ResetStub();
687
688 EchoRequest send_request;
689 EchoRequest recv_request;
690 EchoResponse send_response;
691 EchoResponse recv_response;
692 Status recv_status;
693
694 ClientContext cli_ctx;
695 ServerContext srv_ctx;
696 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
697
698 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800699 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700700 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
701
702 srv_ctx.AsyncNotifyWhenDone(tag(5));
703 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
704 cq_.get(), tag(2));
705
Craig Tiller69f90e62015-08-06 08:32:35 -0700706 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700707 EXPECT_EQ(send_request.message(), recv_request.message());
708
709 cli_ctx.TryCancel();
Craig Tiller69f90e62015-08-06 08:32:35 -0700710 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700711 EXPECT_TRUE(srv_ctx.IsCancelled());
712
713 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700714 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700715
716 EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
717}
718
719// Server uses AsyncNotifyWhenDone API to check for normal finish
Craig Tiller69f90e62015-08-06 08:32:35 -0700720TEST_P(AsyncEnd2endTest, ServerCheckDone) {
yang-gb3352562015-08-04 14:42:06 -0700721 ResetStub();
722
723 EchoRequest send_request;
724 EchoRequest recv_request;
725 EchoResponse send_response;
726 EchoResponse recv_response;
727 Status recv_status;
728
729 ClientContext cli_ctx;
730 ServerContext srv_ctx;
731 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
732
733 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800734 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700735 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
736
737 srv_ctx.AsyncNotifyWhenDone(tag(5));
738 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
739 cq_.get(), tag(2));
740
Craig Tiller69f90e62015-08-06 08:32:35 -0700741 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700742 EXPECT_EQ(send_request.message(), recv_request.message());
743
744 send_response.set_message(recv_request.message());
745 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700746 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
747 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700748 EXPECT_FALSE(srv_ctx.IsCancelled());
749
750 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700751 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700752
753 EXPECT_EQ(send_response.message(), recv_response.message());
754 EXPECT_TRUE(recv_status.ok());
755}
756
Craig Tiller8f7bff72015-08-17 13:23:14 -0700757TEST_P(AsyncEnd2endTest, UnimplementedRpc) {
yang-g730055d2015-08-27 12:29:45 -0700758 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -0700759 CreateChannel(server_address_.str(), InsecureChannelCredentials());
Craig Tiller1b4e3302015-12-17 16:35:00 -0800760 std::unique_ptr<grpc::testing::UnimplementedService::Stub> stub;
761 stub = grpc::testing::UnimplementedService::NewStub(channel);
yang-g9b7757d2015-08-13 11:15:53 -0700762 EchoRequest send_request;
763 EchoResponse recv_response;
764 Status recv_status;
765
766 ClientContext cli_ctx;
767 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800768 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-g9b7757d2015-08-13 11:15:53 -0700769 stub->AsyncUnimplemented(&cli_ctx, send_request, cq_.get()));
770
771 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller8f7bff72015-08-17 13:23:14 -0700772 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-g9b7757d2015-08-13 11:15:53 -0700773
774 EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
775 EXPECT_EQ("", recv_status.error_message());
776}
777
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800778// This class is for testing scenarios where RPCs are cancelled on the server
779// by calling ServerContext::TryCancel()
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800780class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
781 protected:
782 typedef enum {
783 DO_NOT_CANCEL = 0,
784 CANCEL_BEFORE_PROCESSING,
785 CANCEL_DURING_PROCESSING,
786 CANCEL_AFTER_PROCESSING
787 } ServerTryCancelRequestPhase;
788
789 void ServerTryCancel(ServerContext* context) {
790 EXPECT_FALSE(context->IsCancelled());
791 context->TryCancel();
792 gpr_log(GPR_INFO, "Server called TryCancel()");
793 EXPECT_TRUE(context->IsCancelled());
794 }
795
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800796 // Helper for testing client-streaming RPCs which are cancelled on the server.
797 // Depending on the value of server_try_cancel parameter, this will test one
798 // of the following three scenarios:
799 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading
800 // any messages from the client
801 //
802 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
803 // messages from the client
804 //
805 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
806 // messages from the client (but before sending any status back to the
807 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800808 void TestClientStreamingServerCancel(
809 ServerTryCancelRequestPhase server_try_cancel) {
810 ResetStub();
811
812 EchoRequest send_request;
813 EchoRequest recv_request;
814 EchoResponse send_response;
815 EchoResponse recv_response;
816 Status recv_status;
817
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800818 ClientContext cli_ctx;
819 ServerContext srv_ctx;
820 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
821
822 // Initiate the 'RequestStream' call on client
823 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800824 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
825 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800826
827 // On the server, request to be notified of 'RequestStream' calls
828 // and receive the 'RequestStream' call just made by the client
829 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
830 tag(2));
831 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
832
833 // Client sends 3 messages (tags 3, 4 and 5)
834 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
835 send_request.set_message("Ping " + std::to_string(tag_idx));
836 cli_stream->Write(send_request, tag(tag_idx));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800837 Verifier(GetParam()).Expect(tag_idx, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800838 }
839 cli_stream->WritesDone(tag(6));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800840 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800841
842 bool expected_server_cq_result = true;
843 bool ignore_cq_result = false;
844
845 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
846 ServerTryCancel(&srv_ctx);
847
848 // Since cancellation is done before server reads any results, we know
849 // for sure that all cq results will return false from this point forward
850 expected_server_cq_result = false;
851 }
852
853 std::thread* server_try_cancel_thd = NULL;
854 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
855 server_try_cancel_thd = new std::thread(
856 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
857 // Server will cancel the RPC in a parallel thread while reading the
858 // requests from the client. Since the cancellation can happen at anytime,
859 // some of the cq results (i.e those until cancellation) might be true but
860 // its non deterministic. So better to ignore the cq results
861 ignore_cq_result = true;
862 }
863
864 // Server reads 3 messages (tags 6, 7 and 8)
865 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
866 srv_stream.Read(&recv_request, tag(tag_idx));
867 Verifier(GetParam())
868 .Expect(tag_idx, expected_server_cq_result)
869 .Verify(cq_.get(), ignore_cq_result);
870 }
871
872 if (server_try_cancel_thd != NULL) {
873 server_try_cancel_thd->join();
874 delete server_try_cancel_thd;
875 }
876
877 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
878 ServerTryCancel(&srv_ctx);
879 }
880
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800881 // The RPC has been cancelled at this point for sure (i.e irrespective of
882 // the value of `server_try_cancel` is). So, from this point forward, we
883 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800884
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800885 // Server sends the final message and cancelled status (but the RPC is
886 // already cancelled at this point. So we expect the operation to fail)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800887 send_response.set_message("Pong");
888 srv_stream.Finish(send_response, Status::CANCELLED, tag(9));
889 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
890
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800891 // Client will see the cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800892 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800893 // TODO: sreek: The expectation here should be true. This is a bug (github
894 // issue #4972)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800895 Verifier(GetParam()).Expect(10, false).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800896 EXPECT_FALSE(recv_status.ok());
897 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
898 }
899
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800900 // Helper for testing server-streaming RPCs which are cancelled on the server.
901 // Depending on the value of server_try_cancel parameter, this will test one
902 // of the following three scenarios:
903 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before sending
904 // any messages to the client
905 //
906 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while sending
907 // messages to the client
908 //
909 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after sending all
910 // messages to the client (but before sending any status back to the
911 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800912 void TestServerStreamingServerCancel(
913 ServerTryCancelRequestPhase server_try_cancel) {
914 ResetStub();
915
916 EchoRequest send_request;
917 EchoRequest recv_request;
918 EchoResponse send_response;
919 EchoResponse recv_response;
920 Status recv_status;
921 ClientContext cli_ctx;
922 ServerContext srv_ctx;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800923 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
924
925 send_request.set_message("Ping");
926 // Initiate the 'ResponseStream' call on the client
927 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800928 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
929 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800930 // On the server, request to be notified of 'ResponseStream' calls and
931 // receive the call just made by the client
932 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
933 cq_.get(), cq_.get(), tag(2));
934 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
935 EXPECT_EQ(send_request.message(), recv_request.message());
936
937 bool expected_cq_result = true;
938 bool ignore_cq_result = false;
939
940 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
941 ServerTryCancel(&srv_ctx);
942
943 // We know for sure that all cq results will be false from this point
944 // since the server cancelled the RPC
945 expected_cq_result = false;
946 }
947
948 std::thread* server_try_cancel_thd = NULL;
949 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
950 server_try_cancel_thd = new std::thread(
951 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
952
953 // Server will cancel the RPC in a parallel thread while writing responses
954 // to the client. Since the cancellation can happen at anytime, some of
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800955 // the cq results (i.e those until cancellation) might be true but it is
956 // non deterministic. So better to ignore the cq results
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800957 ignore_cq_result = true;
958 }
959
960 // Server sends three messages (tags 3, 4 and 5)
961 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
962 send_response.set_message("Pong " + std::to_string(tag_idx));
963 srv_stream.Write(send_response, tag(tag_idx));
964 Verifier(GetParam())
965 .Expect(tag_idx, expected_cq_result)
966 .Verify(cq_.get(), ignore_cq_result);
967 }
968
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800969 if (server_try_cancel_thd != NULL) {
970 server_try_cancel_thd->join();
971 delete server_try_cancel_thd;
972 }
973
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800974 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
975 ServerTryCancel(&srv_ctx);
976 }
977
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800978 // Client attemts to read the three messages from the server
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800979 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
980 cli_stream->Read(&recv_response, tag(tag_idx));
981 Verifier(GetParam())
982 .Expect(tag_idx, expected_cq_result)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800983 .Verify(cq_.get(), ignore_cq_result);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800984 }
985
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800986 // The RPC has been cancelled at this point for sure (i.e irrespective of
987 // the value of `server_try_cancel` is). So, from this point forward, we
988 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800989
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800990 // Server finishes the stream (but the RPC is already cancelled)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800991 srv_stream.Finish(Status::CANCELLED, tag(9));
992 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
993
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800994 // Client will see the cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800995 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800996 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800997 EXPECT_FALSE(recv_status.ok());
998 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
999 }
1000
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001001 // Helper for testing bidirectinal-streaming RPCs which are cancelled on the
1002 // server.
1003 //
1004 // Depending on the value of server_try_cancel parameter, this will
1005 // test one of the following three scenarios:
1006 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading/
1007 // writing any messages from/to the client
1008 //
1009 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
1010 // messages from the client
1011 //
1012 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
1013 // messages from the client (but before sending any status back to the
1014 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001015 void TestBidiStreamingServerCancel(
1016 ServerTryCancelRequestPhase server_try_cancel) {
1017 ResetStub();
1018
1019 EchoRequest send_request;
1020 EchoRequest recv_request;
1021 EchoResponse send_response;
1022 EchoResponse recv_response;
1023 Status recv_status;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001024 ClientContext cli_ctx;
1025 ServerContext srv_ctx;
1026 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
1027
1028 // Initiate the call from the client side
1029 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001030 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
1031 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001032
1033 // On the server, request to be notified of the 'BidiStream' call and
1034 // receive the call just made by the client
1035 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
1036 tag(2));
1037 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
1038
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001039 // Client sends the first and the only message
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001040 send_request.set_message("Ping");
1041 cli_stream->Write(send_request, tag(3));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001042 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001043
1044 bool expected_cq_result = true;
1045 bool ignore_cq_result = false;
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001046
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001047 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
1048 ServerTryCancel(&srv_ctx);
1049
1050 // We know for sure that all cq results will be false from this point
1051 // since the server cancelled the RPC
1052 expected_cq_result = false;
1053 }
1054
1055 std::thread* server_try_cancel_thd = NULL;
1056 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
1057 server_try_cancel_thd = new std::thread(
1058 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
1059
1060 // Since server is going to cancel the RPC in a parallel thread, some of
1061 // the cq results (i.e those until the cancellation) might be true. Since
1062 // that number is non-deterministic, it is better to ignore the cq results
1063 ignore_cq_result = true;
1064 }
1065
1066 srv_stream.Read(&recv_request, tag(4));
1067 Verifier(GetParam())
1068 .Expect(4, expected_cq_result)
1069 .Verify(cq_.get(), ignore_cq_result);
1070
1071 send_response.set_message("Pong");
1072 srv_stream.Write(send_response, tag(5));
1073 Verifier(GetParam())
1074 .Expect(5, expected_cq_result)
1075 .Verify(cq_.get(), ignore_cq_result);
1076
1077 cli_stream->Read(&recv_response, tag(6));
1078 Verifier(GetParam())
1079 .Expect(6, expected_cq_result)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001080 .Verify(cq_.get(), ignore_cq_result);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001081
1082 // This is expected to succeed in all cases
1083 cli_stream->WritesDone(tag(7));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001084 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001085
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001086 // This is expected to fail in all cases i.e for all values of
1087 // server_try_cancel. This is becasue at this point, either there are no
1088 // more msgs from the client (because client called WritesDone) or the RPC
1089 // is cancelled on the server
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001090 srv_stream.Read(&recv_request, tag(8));
1091 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
1092
1093 if (server_try_cancel_thd != NULL) {
1094 server_try_cancel_thd->join();
1095 delete server_try_cancel_thd;
1096 }
1097
1098 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
1099 ServerTryCancel(&srv_ctx);
1100 }
1101
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001102 // The RPC has been cancelled at this point for sure (i.e irrespective of
1103 // the value of `server_try_cancel` is). So, from this point forward, we
1104 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001105
1106 srv_stream.Finish(Status::CANCELLED, tag(9));
1107 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
1108
1109 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001110 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001111 EXPECT_FALSE(recv_status.ok());
1112 EXPECT_EQ(grpc::StatusCode::CANCELLED, recv_status.error_code());
1113 }
1114};
1115
1116TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelBefore) {
1117 TestClientStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1118}
1119
1120TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelDuring) {
1121 TestClientStreamingServerCancel(CANCEL_DURING_PROCESSING);
1122}
1123
1124TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelAfter) {
1125 TestClientStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1126}
1127
1128TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelBefore) {
1129 TestServerStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1130}
1131
1132TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelDuring) {
1133 TestServerStreamingServerCancel(CANCEL_DURING_PROCESSING);
1134}
1135
1136TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelAfter) {
1137 TestServerStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1138}
1139
1140TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelBefore) {
1141 TestBidiStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1142}
1143
1144TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelDuring) {
1145 TestBidiStreamingServerCancel(CANCEL_DURING_PROCESSING);
1146}
1147
1148TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelAfter) {
1149 TestBidiStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1150}
1151
Craig Tiller4c06b822015-08-06 08:41:31 -07001152INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest,
1153 ::testing::Values(false, true));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001154INSTANTIATE_TEST_CASE_P(AsyncEnd2endServerTryCancel,
1155 AsyncEnd2endServerTryCancelTest,
1156 ::testing::Values(false));
Craig Tiller69f90e62015-08-06 08:32:35 -07001157
Craig Tiller0220cf12015-02-12 17:39:26 -08001158} // namespace
1159} // namespace testing
1160} // namespace grpc
1161
1162int main(int argc, char** argv) {
1163 grpc_test_init(argc, argv);
Craig Tiller0220cf12015-02-12 17:39:26 -08001164 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -07001165 return RUN_ALL_TESTS();
Craig Tiller0220cf12015-02-12 17:39:26 -08001166}