blob: aa99061fe983af9f75e1cc45750f63927bcee3ed [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
Vijay Pai018879a2016-02-16 09:20:50 -080070static int non_blocking_poll(struct pollfd* pfds, nfds_t nfds,
Craig Tiller4c06b822015-08-06 08:41:31 -070071 int timeout) {
Vijay Pai018879a2016-02-16 09:20:50 -080072 /* ignore timeout and always use timeout 0 */
73 return poll(pfds, nfds, 0);
Craig Tiller69f90e62015-08-06 08:32:35 -070074}
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)
Vijay Pai018879a2016-02-16 09:20:50 -080092 : PollOverride(allow_blocking ? poll : non_blocking_poll) {}
Craig Tiller69f90e62015-08-06 08:32:35 -070093};
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:
Vijay Pai018879a2016-02-16 09:20:50 -0800183 AsyncEnd2endTest() {}
Craig Tiller0220cf12015-02-12 17:39:26 -0800184
Craig Tillercf133f42015-02-26 14:05:56 -0800185 void SetUp() GRPC_OVERRIDE {
Vijay Pai018879a2016-02-16 09:20:50 -0800186 poll_overrider_.reset(new PollingOverrider(!GetParam()));
187
Craig Tiller0220cf12015-02-12 17:39:26 -0800188 int port = grpc_pick_unused_port_or_die();
189 server_address_ << "localhost:" << port;
vjpai017ed622015-12-09 10:42:54 -0800190
Craig Tiller0220cf12015-02-12 17:39:26 -0800191 // Setup server
192 ServerBuilder builder;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700193 builder.AddListeningPort(server_address_.str(),
194 grpc::InsecureServerCredentials());
Craig Tiller15f383c2016-01-07 12:45:32 -0800195 builder.RegisterService(&service_);
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700196 cq_ = builder.AddCompletionQueue();
Craig Tiller0220cf12015-02-12 17:39:26 -0800197 server_ = builder.BuildAndStart();
198 }
199
Craig Tillercf133f42015-02-26 14:05:56 -0800200 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800201 server_->Shutdown();
202 void* ignored_tag;
203 bool ignored_ok;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700204 cq_->Shutdown();
205 while (cq_->Next(&ignored_tag, &ignored_ok))
Craig Tiller492968f2015-02-18 13:14:03 -0800206 ;
Vijay Pai018879a2016-02-16 09:20:50 -0800207 poll_overrider_.reset();
Craig Tiller492968f2015-02-18 13:14:03 -0800208 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800209
210 void ResetStub() {
yang-g730055d2015-08-27 12:29:45 -0700211 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -0700212 CreateChannel(server_address_.str(), InsecureChannelCredentials());
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800213 stub_ = grpc::testing::EchoTestService::NewStub(channel);
Craig Tiller0220cf12015-02-12 17:39:26 -0800214 }
215
Yang Gao406b32f2015-02-13 16:25:33 -0800216 void SendRpc(int num_rpcs) {
217 for (int i = 0; i < num_rpcs; i++) {
218 EchoRequest send_request;
219 EchoRequest recv_request;
220 EchoResponse send_response;
221 EchoResponse recv_response;
222 Status recv_status;
223
224 ClientContext cli_ctx;
225 ServerContext srv_ctx;
226 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
227
228 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800229 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700230 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800231
Craig Tillerd6c98df2015-08-18 09:33:44 -0700232 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
233 cq_.get(), tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800234
Craig Tiller69f90e62015-08-06 08:32:35 -0700235 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800236 EXPECT_EQ(send_request.message(), recv_request.message());
237
238 send_response.set_message(recv_request.message());
239 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700240 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800241
Yang Gao3a5e5492015-02-18 14:32:38 -0800242 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700243 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800244
245 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700246 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800247 }
248 }
249
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700250 std::unique_ptr<ServerCompletionQueue> cq_;
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800251 std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800252 std::unique_ptr<Server> server_;
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800253 grpc::testing::EchoTestService::AsyncService service_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800254 std::ostringstream server_address_;
vjpaicf4daeb2016-02-15 02:33:54 -0800255
Vijay Pai018879a2016-02-16 09:20:50 -0800256 std::unique_ptr<PollingOverrider> poll_overrider_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800257};
258
Craig Tiller69f90e62015-08-06 08:32:35 -0700259TEST_P(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800260 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800261 SendRpc(1);
262}
Yang Gaobb84a302015-02-12 23:30:12 -0800263
Craig Tiller69f90e62015-08-06 08:32:35 -0700264TEST_P(AsyncEnd2endTest, SequentialRpcs) {
Yang Gao406b32f2015-02-13 16:25:33 -0800265 ResetStub();
266 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800267}
268
vjpai7aadf462015-03-16 23:58:44 -0700269// Test a simple RPC using the async version of Next
Craig Tiller69f90e62015-08-06 08:32:35 -0700270TEST_P(AsyncEnd2endTest, AsyncNextRpc) {
vjpai7aadf462015-03-16 23:58:44 -0700271 ResetStub();
272
273 EchoRequest send_request;
274 EchoRequest recv_request;
275 EchoResponse send_response;
276 EchoResponse recv_response;
277 Status recv_status;
278
279 ClientContext cli_ctx;
280 ServerContext srv_ctx;
281 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
282
283 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800284 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700285 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
vjpai7aadf462015-03-16 23:58:44 -0700286
Yang Gao757afae2015-03-17 15:49:26 -0700287 std::chrono::system_clock::time_point time_now(
Craig Tillerf51199f2015-05-08 09:32:53 -0700288 std::chrono::system_clock::now());
289 std::chrono::system_clock::time_point time_limit(
290 std::chrono::system_clock::now() + std::chrono::seconds(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700291 Verifier(GetParam()).Verify(cq_.get(), time_now);
292 Verifier(GetParam()).Verify(cq_.get(), time_now);
vjpai7aadf462015-03-16 23:58:44 -0700293
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700294 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
295 cq_.get(), tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700296
Craig Tiller69f90e62015-08-06 08:32:35 -0700297 Verifier(GetParam()).Expect(2, true).Verify(cq_.get(), time_limit);
vjpai7aadf462015-03-16 23:58:44 -0700298 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700299
300 send_response.set_message(recv_request.message());
301 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller4c06b822015-08-06 08:41:31 -0700302 Verifier(GetParam())
303 .Expect(3, true)
304 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700305
306 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller4c06b822015-08-06 08:41:31 -0700307 Verifier(GetParam())
308 .Expect(4, true)
309 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700310
311 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700312 EXPECT_TRUE(recv_status.ok());
vjpai7aadf462015-03-16 23:58:44 -0700313}
Yang Gao757afae2015-03-17 15:49:26 -0700314
Yang Gao0e0d8e12015-02-13 14:40:41 -0800315// Two pings and a final pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700316TEST_P(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800317 ResetStub();
318
319 EchoRequest send_request;
320 EchoRequest recv_request;
321 EchoResponse send_response;
322 EchoResponse recv_response;
323 Status recv_status;
324 ClientContext cli_ctx;
325 ServerContext srv_ctx;
326 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
327
328 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800329 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700330 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800331
Craig Tillerd6c98df2015-08-18 09:33:44 -0700332 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
333 tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800334
Craig Tiller69f90e62015-08-06 08:32:35 -0700335 Verifier(GetParam()).Expect(2, true).Expect(1, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800336
337 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700338 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800339
340 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700341 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800342 EXPECT_EQ(send_request.message(), recv_request.message());
343
344 cli_stream->Write(send_request, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700345 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800346
347 srv_stream.Read(&recv_request, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700348 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800349
350 EXPECT_EQ(send_request.message(), recv_request.message());
351 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700352 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800353
354 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700355 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800356
357 send_response.set_message(recv_request.message());
358 srv_stream.Finish(send_response, Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700359 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800360
361 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700362 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800363
364 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700365 EXPECT_TRUE(recv_status.ok());
Yang Gao005f18a2015-02-13 10:22:33 -0800366}
367
Yang Gao0e0d8e12015-02-13 14:40:41 -0800368// One ping, two pongs.
Craig Tiller69f90e62015-08-06 08:32:35 -0700369TEST_P(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800370 ResetStub();
371
372 EchoRequest send_request;
373 EchoRequest recv_request;
374 EchoResponse send_response;
375 EchoResponse recv_response;
376 Status recv_status;
377 ClientContext cli_ctx;
378 ServerContext srv_ctx;
379 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
380
381 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800382 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700383 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800384
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700385 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700386 cq_.get(), cq_.get(), tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800387
Craig Tiller69f90e62015-08-06 08:32:35 -0700388 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800389 EXPECT_EQ(send_request.message(), recv_request.message());
390
391 send_response.set_message(recv_request.message());
392 srv_stream.Write(send_response, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700393 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800394
395 cli_stream->Read(&recv_response, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700396 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800397 EXPECT_EQ(send_response.message(), recv_response.message());
398
399 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700400 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800401
402 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700403 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800404 EXPECT_EQ(send_response.message(), recv_response.message());
405
406 srv_stream.Finish(Status::OK, tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700407 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800408
409 cli_stream->Read(&recv_response, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700410 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800411
412 cli_stream->Finish(&recv_status, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700413 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800414
Yang Gaoc1a2c312015-06-16 10:59:46 -0700415 EXPECT_TRUE(recv_status.ok());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800416}
417
418// One ping, one pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700419TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800420 ResetStub();
421
422 EchoRequest send_request;
423 EchoRequest recv_request;
424 EchoResponse send_response;
425 EchoResponse recv_response;
426 Status recv_status;
427 ClientContext cli_ctx;
428 ServerContext srv_ctx;
429 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
430
431 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800432 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700433 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800434
Craig Tillerd6c98df2015-08-18 09:33:44 -0700435 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
436 tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800437
Craig Tiller69f90e62015-08-06 08:32:35 -0700438 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800439
440 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700441 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800442
443 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700444 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800445 EXPECT_EQ(send_request.message(), recv_request.message());
446
447 send_response.set_message(recv_request.message());
448 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700449 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800450
451 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700452 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800453 EXPECT_EQ(send_response.message(), recv_response.message());
454
455 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700456 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800457
458 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700459 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800460
461 srv_stream.Finish(Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700462 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800463
464 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700465 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800466
Yang Gaoc1a2c312015-06-16 10:59:46 -0700467 EXPECT_TRUE(recv_status.ok());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800468}
469
Yang Gao406b32f2015-02-13 16:25:33 -0800470// Metadata tests
Craig Tiller69f90e62015-08-06 08:32:35 -0700471TEST_P(AsyncEnd2endTest, ClientInitialMetadataRpc) {
Yang Gao406b32f2015-02-13 16:25:33 -0800472 ResetStub();
473
474 EchoRequest send_request;
475 EchoRequest recv_request;
476 EchoResponse send_response;
477 EchoResponse recv_response;
478 Status recv_status;
479
480 ClientContext cli_ctx;
481 ServerContext srv_ctx;
482 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
483
484 send_request.set_message("Hello");
485 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
486 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
Craig Tiller6f871642016-02-03 16:15:31 -0800487 std::pair<grpc::string, grpc::string> meta3("g.r.d-bin", "xyz");
Yang Gao406b32f2015-02-13 16:25:33 -0800488 cli_ctx.AddMetadata(meta1.first, meta1.second);
489 cli_ctx.AddMetadata(meta2.first, meta2.second);
Craig Tiller6f871642016-02-03 16:15:31 -0800490 cli_ctx.AddMetadata(meta3.first, meta3.second);
Yang Gao406b32f2015-02-13 16:25:33 -0800491
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800492 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700493 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800494
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700495 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
496 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700497 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800498 EXPECT_EQ(send_request.message(), recv_request.message());
499 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700500 EXPECT_EQ(meta1.second,
501 ToString(client_initial_metadata.find(meta1.first)->second));
502 EXPECT_EQ(meta2.second,
503 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller6f871642016-02-03 16:15:31 -0800504 EXPECT_EQ(meta3.second,
505 ToString(client_initial_metadata.find(meta3.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700506 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800507
508 send_response.set_message(recv_request.message());
509 response_writer.Finish(send_response, Status::OK, tag(3));
510
Craig Tiller69f90e62015-08-06 08:32:35 -0700511 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800512
Yang Gao3a5e5492015-02-18 14:32:38 -0800513 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700514 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800515
516 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700517 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800518}
519
Craig Tiller69f90e62015-08-06 08:32:35 -0700520TEST_P(AsyncEnd2endTest, ServerInitialMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800521 ResetStub();
522
523 EchoRequest send_request;
524 EchoRequest recv_request;
525 EchoResponse send_response;
526 EchoResponse recv_response;
527 Status recv_status;
528
529 ClientContext cli_ctx;
530 ServerContext srv_ctx;
531 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
532
533 send_request.set_message("Hello");
534 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
535 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
536
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800537 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700538 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800539
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700540 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
541 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700542 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800543 EXPECT_EQ(send_request.message(), recv_request.message());
544 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
545 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
546 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700547 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800548
Yang Gao3a5e5492015-02-18 14:32:38 -0800549 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700550 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800551 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700552 EXPECT_EQ(meta1.second,
553 ToString(server_initial_metadata.find(meta1.first)->second));
554 EXPECT_EQ(meta2.second,
555 ToString(server_initial_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800556 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800557
558 send_response.set_message(recv_request.message());
559 response_writer.Finish(send_response, Status::OK, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700560 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800561
562 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700563 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800564
565 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700566 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800567}
568
Craig Tiller69f90e62015-08-06 08:32:35 -0700569TEST_P(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800570 ResetStub();
571
572 EchoRequest send_request;
573 EchoRequest recv_request;
574 EchoResponse send_response;
575 EchoResponse recv_response;
576 Status recv_status;
577
578 ClientContext cli_ctx;
579 ServerContext srv_ctx;
580 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
581
582 send_request.set_message("Hello");
583 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
584 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
585
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800586 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700587 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800588
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700589 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
590 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700591 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800592 EXPECT_EQ(send_request.message(), recv_request.message());
593 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700594 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800595
596 send_response.set_message(recv_request.message());
597 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
598 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
599 response_writer.Finish(send_response, Status::OK, tag(4));
600
Craig Tiller69f90e62015-08-06 08:32:35 -0700601 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800602
Yang Gao3a5e5492015-02-18 14:32:38 -0800603 response_reader->Finish(&recv_response, &recv_status, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700604 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800605 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700606 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800607 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700608 EXPECT_EQ(meta1.second,
609 ToString(server_trailing_metadata.find(meta1.first)->second));
610 EXPECT_EQ(meta2.second,
611 ToString(server_trailing_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800612 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800613}
614
Craig Tiller69f90e62015-08-06 08:32:35 -0700615TEST_P(AsyncEnd2endTest, MetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800616 ResetStub();
617
618 EchoRequest send_request;
619 EchoRequest recv_request;
620 EchoResponse send_response;
621 EchoResponse recv_response;
622 Status recv_status;
623
624 ClientContext cli_ctx;
625 ServerContext srv_ctx;
626 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
627
628 send_request.set_message("Hello");
629 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800630 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400631 "key2-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700632 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800633 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800634 std::pair<grpc::string, grpc::string> meta6(
635 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400636 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700637 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800638 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800639 std::pair<grpc::string, grpc::string> meta4(
640 "key6-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700641 grpc::string(
642 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800643
644 cli_ctx.AddMetadata(meta1.first, meta1.second);
645 cli_ctx.AddMetadata(meta2.first, meta2.second);
646
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800647 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700648 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800649
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700650 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
651 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700652 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800653 EXPECT_EQ(send_request.message(), recv_request.message());
654 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700655 EXPECT_EQ(meta1.second,
656 ToString(client_initial_metadata.find(meta1.first)->second));
657 EXPECT_EQ(meta2.second,
658 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700659 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800660
661 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
662 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
663 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700664 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800665 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700666 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800667 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700668 EXPECT_EQ(meta3.second,
669 ToString(server_initial_metadata.find(meta3.first)->second));
670 EXPECT_EQ(meta4.second,
671 ToString(server_initial_metadata.find(meta4.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700672 EXPECT_GE(server_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao3a5e5492015-02-18 14:32:38 -0800673
674 send_response.set_message(recv_request.message());
675 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
676 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
677 response_writer.Finish(send_response, Status::OK, tag(5));
678
Craig Tiller69f90e62015-08-06 08:32:35 -0700679 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800680
Yang Gao3a5e5492015-02-18 14:32:38 -0800681 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700682 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800683 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700684 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800685 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700686 EXPECT_EQ(meta5.second,
687 ToString(server_trailing_metadata.find(meta5.first)->second));
688 EXPECT_EQ(meta6.second,
689 ToString(server_trailing_metadata.find(meta6.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700690 EXPECT_GE(server_trailing_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800691}
yang-gb3352562015-08-04 14:42:06 -0700692
693// Server uses AsyncNotifyWhenDone API to check for cancellation
Craig Tiller69f90e62015-08-06 08:32:35 -0700694TEST_P(AsyncEnd2endTest, ServerCheckCancellation) {
yang-gb3352562015-08-04 14:42:06 -0700695 ResetStub();
696
697 EchoRequest send_request;
698 EchoRequest recv_request;
699 EchoResponse send_response;
700 EchoResponse recv_response;
701 Status recv_status;
702
703 ClientContext cli_ctx;
704 ServerContext srv_ctx;
705 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
706
707 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800708 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700709 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
710
711 srv_ctx.AsyncNotifyWhenDone(tag(5));
712 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
713 cq_.get(), tag(2));
714
Craig Tiller69f90e62015-08-06 08:32:35 -0700715 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700716 EXPECT_EQ(send_request.message(), recv_request.message());
717
718 cli_ctx.TryCancel();
Craig Tiller69f90e62015-08-06 08:32:35 -0700719 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700720 EXPECT_TRUE(srv_ctx.IsCancelled());
721
722 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700723 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700724
725 EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
726}
727
728// Server uses AsyncNotifyWhenDone API to check for normal finish
Craig Tiller69f90e62015-08-06 08:32:35 -0700729TEST_P(AsyncEnd2endTest, ServerCheckDone) {
yang-gb3352562015-08-04 14:42:06 -0700730 ResetStub();
731
732 EchoRequest send_request;
733 EchoRequest recv_request;
734 EchoResponse send_response;
735 EchoResponse recv_response;
736 Status recv_status;
737
738 ClientContext cli_ctx;
739 ServerContext srv_ctx;
740 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
741
742 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800743 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700744 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
745
746 srv_ctx.AsyncNotifyWhenDone(tag(5));
747 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
748 cq_.get(), tag(2));
749
Craig Tiller69f90e62015-08-06 08:32:35 -0700750 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700751 EXPECT_EQ(send_request.message(), recv_request.message());
752
753 send_response.set_message(recv_request.message());
754 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700755 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
756 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700757 EXPECT_FALSE(srv_ctx.IsCancelled());
758
759 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700760 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700761
762 EXPECT_EQ(send_response.message(), recv_response.message());
763 EXPECT_TRUE(recv_status.ok());
764}
765
Craig Tiller8f7bff72015-08-17 13:23:14 -0700766TEST_P(AsyncEnd2endTest, UnimplementedRpc) {
yang-g730055d2015-08-27 12:29:45 -0700767 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -0700768 CreateChannel(server_address_.str(), InsecureChannelCredentials());
Craig Tiller1b4e3302015-12-17 16:35:00 -0800769 std::unique_ptr<grpc::testing::UnimplementedService::Stub> stub;
770 stub = grpc::testing::UnimplementedService::NewStub(channel);
yang-g9b7757d2015-08-13 11:15:53 -0700771 EchoRequest send_request;
772 EchoResponse recv_response;
773 Status recv_status;
774
775 ClientContext cli_ctx;
776 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800777 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-g9b7757d2015-08-13 11:15:53 -0700778 stub->AsyncUnimplemented(&cli_ctx, send_request, cq_.get()));
779
780 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller8f7bff72015-08-17 13:23:14 -0700781 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-g9b7757d2015-08-13 11:15:53 -0700782
783 EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
784 EXPECT_EQ("", recv_status.error_message());
785}
786
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800787// This class is for testing scenarios where RPCs are cancelled on the server
788// by calling ServerContext::TryCancel()
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800789class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
790 protected:
791 typedef enum {
792 DO_NOT_CANCEL = 0,
793 CANCEL_BEFORE_PROCESSING,
794 CANCEL_DURING_PROCESSING,
795 CANCEL_AFTER_PROCESSING
796 } ServerTryCancelRequestPhase;
797
798 void ServerTryCancel(ServerContext* context) {
799 EXPECT_FALSE(context->IsCancelled());
800 context->TryCancel();
801 gpr_log(GPR_INFO, "Server called TryCancel()");
802 EXPECT_TRUE(context->IsCancelled());
803 }
804
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800805 // Helper for testing client-streaming RPCs which are cancelled on the server.
806 // Depending on the value of server_try_cancel parameter, this will test one
807 // of the following three scenarios:
808 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading
809 // any messages from the client
810 //
811 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
812 // messages from the client
813 //
814 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
815 // messages from the client (but before sending any status back to the
816 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800817 void TestClientStreamingServerCancel(
818 ServerTryCancelRequestPhase server_try_cancel) {
819 ResetStub();
820
821 EchoRequest send_request;
822 EchoRequest recv_request;
823 EchoResponse send_response;
824 EchoResponse recv_response;
825 Status recv_status;
826
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800827 ClientContext cli_ctx;
828 ServerContext srv_ctx;
829 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
830
831 // Initiate the 'RequestStream' call on client
832 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800833 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
834 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800835
836 // On the server, request to be notified of 'RequestStream' calls
837 // and receive the 'RequestStream' call just made by the client
838 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
839 tag(2));
840 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
841
842 // Client sends 3 messages (tags 3, 4 and 5)
843 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
844 send_request.set_message("Ping " + std::to_string(tag_idx));
845 cli_stream->Write(send_request, tag(tag_idx));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800846 Verifier(GetParam()).Expect(tag_idx, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800847 }
848 cli_stream->WritesDone(tag(6));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800849 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800850
851 bool expected_server_cq_result = true;
852 bool ignore_cq_result = false;
853
854 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
855 ServerTryCancel(&srv_ctx);
856
857 // Since cancellation is done before server reads any results, we know
858 // for sure that all cq results will return false from this point forward
859 expected_server_cq_result = false;
860 }
861
862 std::thread* server_try_cancel_thd = NULL;
863 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
864 server_try_cancel_thd = new std::thread(
865 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
866 // Server will cancel the RPC in a parallel thread while reading the
867 // requests from the client. Since the cancellation can happen at anytime,
868 // some of the cq results (i.e those until cancellation) might be true but
869 // its non deterministic. So better to ignore the cq results
870 ignore_cq_result = true;
871 }
872
873 // Server reads 3 messages (tags 6, 7 and 8)
874 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
875 srv_stream.Read(&recv_request, tag(tag_idx));
876 Verifier(GetParam())
877 .Expect(tag_idx, expected_server_cq_result)
878 .Verify(cq_.get(), ignore_cq_result);
879 }
880
881 if (server_try_cancel_thd != NULL) {
882 server_try_cancel_thd->join();
883 delete server_try_cancel_thd;
884 }
885
886 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
887 ServerTryCancel(&srv_ctx);
888 }
889
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800890 // The RPC has been cancelled at this point for sure (i.e irrespective of
891 // the value of `server_try_cancel` is). So, from this point forward, we
892 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800893
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800894 // Server sends the final message and cancelled status (but the RPC is
895 // already cancelled at this point. So we expect the operation to fail)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800896 srv_stream.Finish(send_response, Status::CANCELLED, tag(9));
897 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
898
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800899 // Client will see the cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800900 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla369a04a2016-02-01 10:53:13 -0800901 // TODO(sreek): The expectation here should be true. This is a bug (github
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800902 // issue #4972)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800903 Verifier(GetParam()).Expect(10, false).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800904 EXPECT_FALSE(recv_status.ok());
905 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
906 }
907
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800908 // Helper for testing server-streaming RPCs which are cancelled on the server.
909 // Depending on the value of server_try_cancel parameter, this will test one
910 // of the following three scenarios:
911 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before sending
912 // any messages to the client
913 //
914 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while sending
915 // messages to the client
916 //
917 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after sending all
918 // messages to the client (but before sending any status back to the
919 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800920 void TestServerStreamingServerCancel(
921 ServerTryCancelRequestPhase server_try_cancel) {
922 ResetStub();
923
924 EchoRequest send_request;
925 EchoRequest recv_request;
926 EchoResponse send_response;
927 EchoResponse recv_response;
928 Status recv_status;
929 ClientContext cli_ctx;
930 ServerContext srv_ctx;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800931 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
932
933 send_request.set_message("Ping");
934 // Initiate the 'ResponseStream' call on the client
935 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800936 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
937 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800938 // On the server, request to be notified of 'ResponseStream' calls and
939 // receive the call just made by the client
940 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
941 cq_.get(), cq_.get(), tag(2));
942 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
943 EXPECT_EQ(send_request.message(), recv_request.message());
944
945 bool expected_cq_result = true;
946 bool ignore_cq_result = false;
947
948 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
949 ServerTryCancel(&srv_ctx);
950
951 // We know for sure that all cq results will be false from this point
952 // since the server cancelled the RPC
953 expected_cq_result = false;
954 }
955
956 std::thread* server_try_cancel_thd = NULL;
957 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
958 server_try_cancel_thd = new std::thread(
959 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
960
961 // Server will cancel the RPC in a parallel thread while writing responses
962 // to the client. Since the cancellation can happen at anytime, some of
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800963 // the cq results (i.e those until cancellation) might be true but it is
964 // non deterministic. So better to ignore the cq results
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800965 ignore_cq_result = true;
966 }
967
968 // Server sends three messages (tags 3, 4 and 5)
969 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
970 send_response.set_message("Pong " + std::to_string(tag_idx));
971 srv_stream.Write(send_response, tag(tag_idx));
972 Verifier(GetParam())
973 .Expect(tag_idx, expected_cq_result)
974 .Verify(cq_.get(), ignore_cq_result);
975 }
976
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800977 if (server_try_cancel_thd != NULL) {
978 server_try_cancel_thd->join();
979 delete server_try_cancel_thd;
980 }
981
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800982 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
983 ServerTryCancel(&srv_ctx);
984 }
985
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800986 // Client attemts to read the three messages from the server
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800987 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
988 cli_stream->Read(&recv_response, tag(tag_idx));
989 Verifier(GetParam())
990 .Expect(tag_idx, expected_cq_result)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800991 .Verify(cq_.get(), ignore_cq_result);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800992 }
993
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800994 // The RPC has been cancelled at this point for sure (i.e irrespective of
995 // the value of `server_try_cancel` is). So, from this point forward, we
996 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800997
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800998 // Server finishes the stream (but the RPC is already cancelled)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800999 srv_stream.Finish(Status::CANCELLED, tag(9));
1000 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
1001
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001002 // Client will see the cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001003 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001004 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001005 EXPECT_FALSE(recv_status.ok());
1006 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
1007 }
1008
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001009 // Helper for testing bidirectinal-streaming RPCs which are cancelled on the
1010 // server.
1011 //
1012 // Depending on the value of server_try_cancel parameter, this will
1013 // test one of the following three scenarios:
1014 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading/
1015 // writing any messages from/to the client
1016 //
1017 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
1018 // messages from the client
1019 //
1020 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
1021 // messages from the client (but before sending any status back to the
1022 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001023 void TestBidiStreamingServerCancel(
1024 ServerTryCancelRequestPhase server_try_cancel) {
1025 ResetStub();
1026
1027 EchoRequest send_request;
1028 EchoRequest recv_request;
1029 EchoResponse send_response;
1030 EchoResponse recv_response;
1031 Status recv_status;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001032 ClientContext cli_ctx;
1033 ServerContext srv_ctx;
1034 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
1035
1036 // Initiate the call from the client side
1037 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001038 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
1039 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001040
1041 // On the server, request to be notified of the 'BidiStream' call and
1042 // receive the call just made by the client
1043 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
1044 tag(2));
1045 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
1046
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001047 // Client sends the first and the only message
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001048 send_request.set_message("Ping");
1049 cli_stream->Write(send_request, tag(3));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001050 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001051
1052 bool expected_cq_result = true;
1053 bool ignore_cq_result = false;
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001054
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001055 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
1056 ServerTryCancel(&srv_ctx);
1057
1058 // We know for sure that all cq results will be false from this point
1059 // since the server cancelled the RPC
1060 expected_cq_result = false;
1061 }
1062
1063 std::thread* server_try_cancel_thd = NULL;
1064 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
1065 server_try_cancel_thd = new std::thread(
1066 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
1067
1068 // Since server is going to cancel the RPC in a parallel thread, some of
1069 // the cq results (i.e those until the cancellation) might be true. Since
1070 // that number is non-deterministic, it is better to ignore the cq results
1071 ignore_cq_result = true;
1072 }
1073
1074 srv_stream.Read(&recv_request, tag(4));
1075 Verifier(GetParam())
1076 .Expect(4, expected_cq_result)
1077 .Verify(cq_.get(), ignore_cq_result);
1078
1079 send_response.set_message("Pong");
1080 srv_stream.Write(send_response, tag(5));
1081 Verifier(GetParam())
1082 .Expect(5, expected_cq_result)
1083 .Verify(cq_.get(), ignore_cq_result);
1084
1085 cli_stream->Read(&recv_response, tag(6));
1086 Verifier(GetParam())
1087 .Expect(6, expected_cq_result)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001088 .Verify(cq_.get(), ignore_cq_result);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001089
1090 // This is expected to succeed in all cases
1091 cli_stream->WritesDone(tag(7));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001092 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001093
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001094 // This is expected to fail in all cases i.e for all values of
Vijay Pai018879a2016-02-16 09:20:50 -08001095 // server_try_cancel. This is because at this point, either there are no
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001096 // more msgs from the client (because client called WritesDone) or the RPC
1097 // is cancelled on the server
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001098 srv_stream.Read(&recv_request, tag(8));
1099 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
1100
1101 if (server_try_cancel_thd != NULL) {
1102 server_try_cancel_thd->join();
1103 delete server_try_cancel_thd;
1104 }
1105
1106 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
1107 ServerTryCancel(&srv_ctx);
1108 }
1109
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001110 // The RPC has been cancelled at this point for sure (i.e irrespective of
1111 // the value of `server_try_cancel` is). So, from this point forward, we
1112 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001113
1114 srv_stream.Finish(Status::CANCELLED, tag(9));
1115 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
1116
1117 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001118 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001119 EXPECT_FALSE(recv_status.ok());
1120 EXPECT_EQ(grpc::StatusCode::CANCELLED, recv_status.error_code());
1121 }
1122};
1123
1124TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelBefore) {
1125 TestClientStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1126}
1127
1128TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelDuring) {
1129 TestClientStreamingServerCancel(CANCEL_DURING_PROCESSING);
1130}
1131
1132TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelAfter) {
1133 TestClientStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1134}
1135
1136TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelBefore) {
1137 TestServerStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1138}
1139
1140TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelDuring) {
1141 TestServerStreamingServerCancel(CANCEL_DURING_PROCESSING);
1142}
1143
1144TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelAfter) {
1145 TestServerStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1146}
1147
1148TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelBefore) {
1149 TestBidiStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1150}
1151
1152TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelDuring) {
1153 TestBidiStreamingServerCancel(CANCEL_DURING_PROCESSING);
1154}
1155
1156TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelAfter) {
1157 TestBidiStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1158}
1159
Craig Tiller4c06b822015-08-06 08:41:31 -07001160INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest,
1161 ::testing::Values(false, true));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001162INSTANTIATE_TEST_CASE_P(AsyncEnd2endServerTryCancel,
1163 AsyncEnd2endServerTryCancelTest,
1164 ::testing::Values(false));
Craig Tiller69f90e62015-08-06 08:32:35 -07001165
Craig Tiller0220cf12015-02-12 17:39:26 -08001166} // namespace
1167} // namespace testing
1168} // namespace grpc
1169
1170int main(int argc, char** argv) {
1171 grpc_test_init(argc, argv);
Craig Tiller0220cf12015-02-12 17:39:26 -08001172 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -07001173 return RUN_ALL_TESTS();
Craig Tiller0220cf12015-02-12 17:39:26 -08001174}