blob: 9ca3bf98f85c470abda4ef0482c0e16acac6922c [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>
Vijay Paib65eda42016-02-16 13:48:05 -080046#include <grpc/support/tls.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080047#include <gtest/gtest.h>
48
Craig Tiller1b4e3302015-12-17 16:35:00 -080049#include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h"
50#include "src/proto/grpc/testing/echo.grpc.pb.h"
Sree Kuchibhotlab0d0c8e2016-01-13 22:52:17 -080051#include "test/core/util/port.h"
52#include "test/core/util/test_config.h"
yang-ge21908f2015-08-25 13:47:51 -070053#include "test/cpp/util/string_ref_helper.h"
Craig Tiller0220cf12015-02-12 17:39:26 -080054
Craig Tiller69f90e62015-08-06 08:32:35 -070055#ifdef GPR_POSIX_SOCKET
56#include "src/core/iomgr/pollset_posix.h"
57#endif
58
Craig Tiller1b4e3302015-12-17 16:35:00 -080059using grpc::testing::EchoRequest;
60using grpc::testing::EchoResponse;
Craig Tiller0220cf12015-02-12 17:39:26 -080061using std::chrono::system_clock;
62
Vijay Paib65eda42016-02-16 13:48:05 -080063GPR_TLS_DECL(g_is_async_end2end_test);
64
Craig Tiller0220cf12015-02-12 17:39:26 -080065namespace grpc {
66namespace testing {
67
68namespace {
69
Craig Tiller7536af02015-12-22 13:49:30 -080070void* tag(int i) { return (void*)(intptr_t)i; }
Yang Gaoc05b6cb2015-02-13 00:34:10 -080071
Craig Tiller69f90e62015-08-06 08:32:35 -070072#ifdef GPR_POSIX_SOCKET
Vijay Paib65eda42016-02-16 13:48:05 -080073static int maybe_assert_non_blocking_poll(struct pollfd* pfds, nfds_t nfds,
74 int timeout) {
75 if (gpr_tls_get(&g_is_async_end2end_test)) {
76 GPR_ASSERT(timeout == 0);
77 }
78 return poll(pfds, nfds, timeout);
Craig Tiller69f90e62015-08-06 08:32:35 -070079}
80
81class PollOverride {
Craig Tiller06cf3cc2015-05-13 13:11:01 -070082 public:
Craig Tiller69f90e62015-08-06 08:32:35 -070083 PollOverride(grpc_poll_function_type f) {
84 prev_ = grpc_poll_function;
85 grpc_poll_function = f;
86 }
87
Craig Tiller4c06b822015-08-06 08:41:31 -070088 ~PollOverride() { grpc_poll_function = prev_; }
Craig Tiller69f90e62015-08-06 08:32:35 -070089
90 private:
91 grpc_poll_function_type prev_;
92};
93
vjpaicf4daeb2016-02-15 02:33:54 -080094class PollingOverrider : public PollOverride {
Craig Tiller69f90e62015-08-06 08:32:35 -070095 public:
vjpaicf4daeb2016-02-15 02:33:54 -080096 explicit PollingOverrider(bool allow_blocking)
Vijay Paib65eda42016-02-16 13:48:05 -080097 : PollOverride(allow_blocking ? poll : maybe_assert_non_blocking_poll) {}
Craig Tiller69f90e62015-08-06 08:32:35 -070098};
99#else
vjpaicf4daeb2016-02-15 02:33:54 -0800100class PollingOverrider {
Craig Tiller69f90e62015-08-06 08:32:35 -0700101 public:
vjpaicf4daeb2016-02-15 02:33:54 -0800102 explicit PollingOverrider(bool allow_blocking) {}
Craig Tiller69f90e62015-08-06 08:32:35 -0700103};
104#endif
105
vjpaicf4daeb2016-02-15 02:33:54 -0800106class Verifier {
Craig Tiller69f90e62015-08-06 08:32:35 -0700107 public:
vjpaicf4daeb2016-02-15 02:33:54 -0800108 explicit Verifier(bool spin) : spin_(spin) {}
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700109 Verifier& Expect(int i, bool expect_ok) {
110 expectations_[tag(i)] = expect_ok;
111 return *this;
vjpai7aadf462015-03-16 23:58:44 -0700112 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800113
114 void Verify(CompletionQueue* cq) { Verify(cq, false); }
115
116 void Verify(CompletionQueue* cq, bool ignore_ok) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700117 GPR_ASSERT(!expectations_.empty());
118 while (!expectations_.empty()) {
119 bool ok;
120 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700121 if (spin_) {
122 for (;;) {
123 auto r = cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
124 if (r == CompletionQueue::TIMEOUT) continue;
125 if (r == CompletionQueue::GOT_EVENT) break;
126 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
127 abort();
128 }
129 } else {
130 EXPECT_TRUE(cq->Next(&got_tag, &ok));
131 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700132 auto it = expectations_.find(got_tag);
133 EXPECT_TRUE(it != expectations_.end());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800134 if (!ignore_ok) {
135 EXPECT_EQ(it->second, ok);
136 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700137 expectations_.erase(it);
138 }
139 }
Craig Tillerd6c98df2015-08-18 09:33:44 -0700140 void Verify(CompletionQueue* cq,
141 std::chrono::system_clock::time_point deadline) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700142 if (expectations_.empty()) {
143 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700144 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700145 if (spin_) {
146 while (std::chrono::system_clock::now() < deadline) {
Craig Tiller4c06b822015-08-06 08:41:31 -0700147 EXPECT_EQ(
148 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)),
149 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700150 }
151 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700152 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
153 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700154 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700155 } else {
156 while (!expectations_.empty()) {
157 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700158 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700159 if (spin_) {
160 for (;;) {
161 GPR_ASSERT(std::chrono::system_clock::now() < deadline);
Craig Tiller4c06b822015-08-06 08:41:31 -0700162 auto r =
163 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
Craig Tiller69f90e62015-08-06 08:32:35 -0700164 if (r == CompletionQueue::TIMEOUT) continue;
165 if (r == CompletionQueue::GOT_EVENT) break;
166 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
167 abort();
Craig Tiller4c06b822015-08-06 08:41:31 -0700168 }
Craig Tiller69f90e62015-08-06 08:32:35 -0700169 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700170 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
171 CompletionQueue::GOT_EVENT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700172 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700173 auto it = expectations_.find(got_tag);
174 EXPECT_TRUE(it != expectations_.end());
175 EXPECT_EQ(it->second, ok);
176 expectations_.erase(it);
177 }
178 }
179 }
180
181 private:
182 std::map<void*, bool> expectations_;
Craig Tiller69f90e62015-08-06 08:32:35 -0700183 bool spin_;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700184};
vjpai7aadf462015-03-16 23:58:44 -0700185
Craig Tiller69f90e62015-08-06 08:32:35 -0700186class AsyncEnd2endTest : public ::testing::TestWithParam<bool> {
Craig Tiller0220cf12015-02-12 17:39:26 -0800187 protected:
Vijay Pai018879a2016-02-16 09:20:50 -0800188 AsyncEnd2endTest() {}
Craig Tiller0220cf12015-02-12 17:39:26 -0800189
Craig Tillercf133f42015-02-26 14:05:56 -0800190 void SetUp() GRPC_OVERRIDE {
Vijay Pai018879a2016-02-16 09:20:50 -0800191 poll_overrider_.reset(new PollingOverrider(!GetParam()));
192
Craig Tiller0220cf12015-02-12 17:39:26 -0800193 int port = grpc_pick_unused_port_or_die();
194 server_address_ << "localhost:" << port;
vjpai017ed622015-12-09 10:42:54 -0800195
Craig Tiller0220cf12015-02-12 17:39:26 -0800196 // Setup server
197 ServerBuilder builder;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700198 builder.AddListeningPort(server_address_.str(),
199 grpc::InsecureServerCredentials());
Craig Tiller15f383c2016-01-07 12:45:32 -0800200 builder.RegisterService(&service_);
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700201 cq_ = builder.AddCompletionQueue();
Craig Tiller0220cf12015-02-12 17:39:26 -0800202 server_ = builder.BuildAndStart();
Vijay Paib65eda42016-02-16 13:48:05 -0800203
204 gpr_tls_set(&g_is_async_end2end_test, 1);
Craig Tiller0220cf12015-02-12 17:39:26 -0800205 }
206
Craig Tillercf133f42015-02-26 14:05:56 -0800207 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800208 server_->Shutdown();
209 void* ignored_tag;
210 bool ignored_ok;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700211 cq_->Shutdown();
212 while (cq_->Next(&ignored_tag, &ignored_ok))
Craig Tiller492968f2015-02-18 13:14:03 -0800213 ;
Vijay Pai018879a2016-02-16 09:20:50 -0800214 poll_overrider_.reset();
Vijay Paib65eda42016-02-16 13:48:05 -0800215 gpr_tls_set(&g_is_async_end2end_test, 0);
Craig Tiller492968f2015-02-18 13:14:03 -0800216 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800217
218 void ResetStub() {
yang-g730055d2015-08-27 12:29:45 -0700219 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -0700220 CreateChannel(server_address_.str(), InsecureChannelCredentials());
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800221 stub_ = grpc::testing::EchoTestService::NewStub(channel);
Craig Tiller0220cf12015-02-12 17:39:26 -0800222 }
223
Yang Gao406b32f2015-02-13 16:25:33 -0800224 void SendRpc(int num_rpcs) {
225 for (int i = 0; i < num_rpcs; i++) {
226 EchoRequest send_request;
227 EchoRequest recv_request;
228 EchoResponse send_response;
229 EchoResponse recv_response;
230 Status recv_status;
231
232 ClientContext cli_ctx;
233 ServerContext srv_ctx;
234 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
235
236 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800237 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700238 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800239
Craig Tillerd6c98df2015-08-18 09:33:44 -0700240 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
241 cq_.get(), tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800242
Craig Tiller69f90e62015-08-06 08:32:35 -0700243 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800244 EXPECT_EQ(send_request.message(), recv_request.message());
245
246 send_response.set_message(recv_request.message());
247 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700248 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800249
Yang Gao3a5e5492015-02-18 14:32:38 -0800250 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700251 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800252
253 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700254 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800255 }
256 }
257
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700258 std::unique_ptr<ServerCompletionQueue> cq_;
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800259 std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800260 std::unique_ptr<Server> server_;
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800261 grpc::testing::EchoTestService::AsyncService service_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800262 std::ostringstream server_address_;
vjpaicf4daeb2016-02-15 02:33:54 -0800263
Vijay Pai018879a2016-02-16 09:20:50 -0800264 std::unique_ptr<PollingOverrider> poll_overrider_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800265};
266
Craig Tiller69f90e62015-08-06 08:32:35 -0700267TEST_P(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800268 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800269 SendRpc(1);
270}
Yang Gaobb84a302015-02-12 23:30:12 -0800271
Craig Tiller69f90e62015-08-06 08:32:35 -0700272TEST_P(AsyncEnd2endTest, SequentialRpcs) {
Yang Gao406b32f2015-02-13 16:25:33 -0800273 ResetStub();
274 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800275}
276
vjpai7aadf462015-03-16 23:58:44 -0700277// Test a simple RPC using the async version of Next
Craig Tiller69f90e62015-08-06 08:32:35 -0700278TEST_P(AsyncEnd2endTest, AsyncNextRpc) {
vjpai7aadf462015-03-16 23:58:44 -0700279 ResetStub();
280
281 EchoRequest send_request;
282 EchoRequest recv_request;
283 EchoResponse send_response;
284 EchoResponse recv_response;
285 Status recv_status;
286
287 ClientContext cli_ctx;
288 ServerContext srv_ctx;
289 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
290
291 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800292 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700293 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
vjpai7aadf462015-03-16 23:58:44 -0700294
Yang Gao757afae2015-03-17 15:49:26 -0700295 std::chrono::system_clock::time_point time_now(
Craig Tillerf51199f2015-05-08 09:32:53 -0700296 std::chrono::system_clock::now());
297 std::chrono::system_clock::time_point time_limit(
298 std::chrono::system_clock::now() + std::chrono::seconds(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700299 Verifier(GetParam()).Verify(cq_.get(), time_now);
300 Verifier(GetParam()).Verify(cq_.get(), time_now);
vjpai7aadf462015-03-16 23:58:44 -0700301
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700302 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
303 cq_.get(), tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700304
Craig Tiller69f90e62015-08-06 08:32:35 -0700305 Verifier(GetParam()).Expect(2, true).Verify(cq_.get(), time_limit);
vjpai7aadf462015-03-16 23:58:44 -0700306 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700307
308 send_response.set_message(recv_request.message());
309 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller4c06b822015-08-06 08:41:31 -0700310 Verifier(GetParam())
311 .Expect(3, true)
312 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700313
314 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller4c06b822015-08-06 08:41:31 -0700315 Verifier(GetParam())
316 .Expect(4, true)
317 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700318
319 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700320 EXPECT_TRUE(recv_status.ok());
vjpai7aadf462015-03-16 23:58:44 -0700321}
Yang Gao757afae2015-03-17 15:49:26 -0700322
Yang Gao0e0d8e12015-02-13 14:40:41 -0800323// Two pings and a final pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700324TEST_P(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800325 ResetStub();
326
327 EchoRequest send_request;
328 EchoRequest recv_request;
329 EchoResponse send_response;
330 EchoResponse recv_response;
331 Status recv_status;
332 ClientContext cli_ctx;
333 ServerContext srv_ctx;
334 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
335
336 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800337 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700338 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800339
Craig Tillerd6c98df2015-08-18 09:33:44 -0700340 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
341 tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800342
Craig Tiller69f90e62015-08-06 08:32:35 -0700343 Verifier(GetParam()).Expect(2, true).Expect(1, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800344
345 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700346 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800347
348 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700349 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800350 EXPECT_EQ(send_request.message(), recv_request.message());
351
352 cli_stream->Write(send_request, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700353 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800354
355 srv_stream.Read(&recv_request, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700356 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800357
358 EXPECT_EQ(send_request.message(), recv_request.message());
359 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700360 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800361
362 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700363 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800364
365 send_response.set_message(recv_request.message());
366 srv_stream.Finish(send_response, Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700367 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800368
369 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700370 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800371
372 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700373 EXPECT_TRUE(recv_status.ok());
Yang Gao005f18a2015-02-13 10:22:33 -0800374}
375
Yang Gao0e0d8e12015-02-13 14:40:41 -0800376// One ping, two pongs.
Craig Tiller69f90e62015-08-06 08:32:35 -0700377TEST_P(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800378 ResetStub();
379
380 EchoRequest send_request;
381 EchoRequest recv_request;
382 EchoResponse send_response;
383 EchoResponse recv_response;
384 Status recv_status;
385 ClientContext cli_ctx;
386 ServerContext srv_ctx;
387 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
388
389 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800390 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700391 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800392
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700393 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700394 cq_.get(), cq_.get(), tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800395
Craig Tiller69f90e62015-08-06 08:32:35 -0700396 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800397 EXPECT_EQ(send_request.message(), recv_request.message());
398
399 send_response.set_message(recv_request.message());
400 srv_stream.Write(send_response, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700401 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800402
403 cli_stream->Read(&recv_response, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700404 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800405 EXPECT_EQ(send_response.message(), recv_response.message());
406
407 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700408 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800409
410 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700411 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800412 EXPECT_EQ(send_response.message(), recv_response.message());
413
414 srv_stream.Finish(Status::OK, tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700415 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800416
417 cli_stream->Read(&recv_response, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700418 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800419
420 cli_stream->Finish(&recv_status, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700421 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800422
Yang Gaoc1a2c312015-06-16 10:59:46 -0700423 EXPECT_TRUE(recv_status.ok());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800424}
425
426// One ping, one pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700427TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800428 ResetStub();
429
430 EchoRequest send_request;
431 EchoRequest recv_request;
432 EchoResponse send_response;
433 EchoResponse recv_response;
434 Status recv_status;
435 ClientContext cli_ctx;
436 ServerContext srv_ctx;
437 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
438
439 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800440 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700441 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800442
Craig Tillerd6c98df2015-08-18 09:33:44 -0700443 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
444 tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800445
Craig Tiller69f90e62015-08-06 08:32:35 -0700446 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800447
448 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700449 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800450
451 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700452 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800453 EXPECT_EQ(send_request.message(), recv_request.message());
454
455 send_response.set_message(recv_request.message());
456 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700457 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800458
459 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700460 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800461 EXPECT_EQ(send_response.message(), recv_response.message());
462
463 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700464 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800465
466 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700467 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800468
469 srv_stream.Finish(Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700470 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800471
472 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700473 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800474
Yang Gaoc1a2c312015-06-16 10:59:46 -0700475 EXPECT_TRUE(recv_status.ok());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800476}
477
Yang Gao406b32f2015-02-13 16:25:33 -0800478// Metadata tests
Craig Tiller69f90e62015-08-06 08:32:35 -0700479TEST_P(AsyncEnd2endTest, ClientInitialMetadataRpc) {
Yang Gao406b32f2015-02-13 16:25:33 -0800480 ResetStub();
481
482 EchoRequest send_request;
483 EchoRequest recv_request;
484 EchoResponse send_response;
485 EchoResponse recv_response;
486 Status recv_status;
487
488 ClientContext cli_ctx;
489 ServerContext srv_ctx;
490 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
491
492 send_request.set_message("Hello");
493 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
494 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
Craig Tiller6f871642016-02-03 16:15:31 -0800495 std::pair<grpc::string, grpc::string> meta3("g.r.d-bin", "xyz");
Yang Gao406b32f2015-02-13 16:25:33 -0800496 cli_ctx.AddMetadata(meta1.first, meta1.second);
497 cli_ctx.AddMetadata(meta2.first, meta2.second);
Craig Tiller6f871642016-02-03 16:15:31 -0800498 cli_ctx.AddMetadata(meta3.first, meta3.second);
Yang Gao406b32f2015-02-13 16:25:33 -0800499
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800500 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700501 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800502
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700503 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
504 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700505 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800506 EXPECT_EQ(send_request.message(), recv_request.message());
507 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700508 EXPECT_EQ(meta1.second,
509 ToString(client_initial_metadata.find(meta1.first)->second));
510 EXPECT_EQ(meta2.second,
511 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller6f871642016-02-03 16:15:31 -0800512 EXPECT_EQ(meta3.second,
513 ToString(client_initial_metadata.find(meta3.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700514 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800515
516 send_response.set_message(recv_request.message());
517 response_writer.Finish(send_response, Status::OK, tag(3));
518
Craig Tiller69f90e62015-08-06 08:32:35 -0700519 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800520
Yang Gao3a5e5492015-02-18 14:32:38 -0800521 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700522 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800523
524 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700525 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800526}
527
Craig Tiller69f90e62015-08-06 08:32:35 -0700528TEST_P(AsyncEnd2endTest, ServerInitialMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800529 ResetStub();
530
531 EchoRequest send_request;
532 EchoRequest recv_request;
533 EchoResponse send_response;
534 EchoResponse recv_response;
535 Status recv_status;
536
537 ClientContext cli_ctx;
538 ServerContext srv_ctx;
539 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
540
541 send_request.set_message("Hello");
542 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
543 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
544
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800545 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700546 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800547
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700548 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
549 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700550 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800551 EXPECT_EQ(send_request.message(), recv_request.message());
552 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
553 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
554 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700555 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800556
Yang Gao3a5e5492015-02-18 14:32:38 -0800557 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700558 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800559 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700560 EXPECT_EQ(meta1.second,
561 ToString(server_initial_metadata.find(meta1.first)->second));
562 EXPECT_EQ(meta2.second,
563 ToString(server_initial_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800564 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800565
566 send_response.set_message(recv_request.message());
567 response_writer.Finish(send_response, Status::OK, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700568 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800569
570 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700571 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800572
573 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700574 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800575}
576
Craig Tiller69f90e62015-08-06 08:32:35 -0700577TEST_P(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800578 ResetStub();
579
580 EchoRequest send_request;
581 EchoRequest recv_request;
582 EchoResponse send_response;
583 EchoResponse recv_response;
584 Status recv_status;
585
586 ClientContext cli_ctx;
587 ServerContext srv_ctx;
588 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
589
590 send_request.set_message("Hello");
591 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
592 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
593
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800594 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700595 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800596
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700597 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
598 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700599 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800600 EXPECT_EQ(send_request.message(), recv_request.message());
601 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700602 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800603
604 send_response.set_message(recv_request.message());
605 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
606 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
607 response_writer.Finish(send_response, Status::OK, tag(4));
608
Craig Tiller69f90e62015-08-06 08:32:35 -0700609 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800610
Yang Gao3a5e5492015-02-18 14:32:38 -0800611 response_reader->Finish(&recv_response, &recv_status, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700612 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800613 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700614 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800615 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700616 EXPECT_EQ(meta1.second,
617 ToString(server_trailing_metadata.find(meta1.first)->second));
618 EXPECT_EQ(meta2.second,
619 ToString(server_trailing_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800620 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800621}
622
Craig Tiller69f90e62015-08-06 08:32:35 -0700623TEST_P(AsyncEnd2endTest, MetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800624 ResetStub();
625
626 EchoRequest send_request;
627 EchoRequest recv_request;
628 EchoResponse send_response;
629 EchoResponse recv_response;
630 Status recv_status;
631
632 ClientContext cli_ctx;
633 ServerContext srv_ctx;
634 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
635
636 send_request.set_message("Hello");
637 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800638 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400639 "key2-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700640 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800641 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800642 std::pair<grpc::string, grpc::string> meta6(
643 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400644 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700645 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800646 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800647 std::pair<grpc::string, grpc::string> meta4(
648 "key6-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700649 grpc::string(
650 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800651
652 cli_ctx.AddMetadata(meta1.first, meta1.second);
653 cli_ctx.AddMetadata(meta2.first, meta2.second);
654
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800655 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700656 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800657
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700658 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
659 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700660 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800661 EXPECT_EQ(send_request.message(), recv_request.message());
662 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700663 EXPECT_EQ(meta1.second,
664 ToString(client_initial_metadata.find(meta1.first)->second));
665 EXPECT_EQ(meta2.second,
666 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700667 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800668
669 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
670 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
671 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700672 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800673 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700674 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800675 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700676 EXPECT_EQ(meta3.second,
677 ToString(server_initial_metadata.find(meta3.first)->second));
678 EXPECT_EQ(meta4.second,
679 ToString(server_initial_metadata.find(meta4.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700680 EXPECT_GE(server_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao3a5e5492015-02-18 14:32:38 -0800681
682 send_response.set_message(recv_request.message());
683 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
684 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
685 response_writer.Finish(send_response, Status::OK, tag(5));
686
Craig Tiller69f90e62015-08-06 08:32:35 -0700687 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800688
Yang Gao3a5e5492015-02-18 14:32:38 -0800689 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700690 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800691 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700692 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800693 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700694 EXPECT_EQ(meta5.second,
695 ToString(server_trailing_metadata.find(meta5.first)->second));
696 EXPECT_EQ(meta6.second,
697 ToString(server_trailing_metadata.find(meta6.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700698 EXPECT_GE(server_trailing_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800699}
yang-gb3352562015-08-04 14:42:06 -0700700
701// Server uses AsyncNotifyWhenDone API to check for cancellation
Craig Tiller69f90e62015-08-06 08:32:35 -0700702TEST_P(AsyncEnd2endTest, ServerCheckCancellation) {
yang-gb3352562015-08-04 14:42:06 -0700703 ResetStub();
704
705 EchoRequest send_request;
706 EchoRequest recv_request;
707 EchoResponse send_response;
708 EchoResponse recv_response;
709 Status recv_status;
710
711 ClientContext cli_ctx;
712 ServerContext srv_ctx;
713 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
714
715 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800716 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700717 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
718
719 srv_ctx.AsyncNotifyWhenDone(tag(5));
720 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
721 cq_.get(), tag(2));
722
Craig Tiller69f90e62015-08-06 08:32:35 -0700723 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700724 EXPECT_EQ(send_request.message(), recv_request.message());
725
726 cli_ctx.TryCancel();
Craig Tiller69f90e62015-08-06 08:32:35 -0700727 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700728 EXPECT_TRUE(srv_ctx.IsCancelled());
729
730 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700731 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700732
733 EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
734}
735
736// Server uses AsyncNotifyWhenDone API to check for normal finish
Craig Tiller69f90e62015-08-06 08:32:35 -0700737TEST_P(AsyncEnd2endTest, ServerCheckDone) {
yang-gb3352562015-08-04 14:42:06 -0700738 ResetStub();
739
740 EchoRequest send_request;
741 EchoRequest recv_request;
742 EchoResponse send_response;
743 EchoResponse recv_response;
744 Status recv_status;
745
746 ClientContext cli_ctx;
747 ServerContext srv_ctx;
748 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
749
750 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800751 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700752 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
753
754 srv_ctx.AsyncNotifyWhenDone(tag(5));
755 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
756 cq_.get(), tag(2));
757
Craig Tiller69f90e62015-08-06 08:32:35 -0700758 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700759 EXPECT_EQ(send_request.message(), recv_request.message());
760
761 send_response.set_message(recv_request.message());
762 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700763 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
764 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700765 EXPECT_FALSE(srv_ctx.IsCancelled());
766
767 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700768 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700769
770 EXPECT_EQ(send_response.message(), recv_response.message());
771 EXPECT_TRUE(recv_status.ok());
772}
773
Craig Tiller8f7bff72015-08-17 13:23:14 -0700774TEST_P(AsyncEnd2endTest, UnimplementedRpc) {
yang-g730055d2015-08-27 12:29:45 -0700775 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -0700776 CreateChannel(server_address_.str(), InsecureChannelCredentials());
Craig Tiller1b4e3302015-12-17 16:35:00 -0800777 std::unique_ptr<grpc::testing::UnimplementedService::Stub> stub;
778 stub = grpc::testing::UnimplementedService::NewStub(channel);
yang-g9b7757d2015-08-13 11:15:53 -0700779 EchoRequest send_request;
780 EchoResponse recv_response;
781 Status recv_status;
782
783 ClientContext cli_ctx;
784 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800785 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-g9b7757d2015-08-13 11:15:53 -0700786 stub->AsyncUnimplemented(&cli_ctx, send_request, cq_.get()));
787
788 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller8f7bff72015-08-17 13:23:14 -0700789 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-g9b7757d2015-08-13 11:15:53 -0700790
791 EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
792 EXPECT_EQ("", recv_status.error_message());
793}
794
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800795// This class is for testing scenarios where RPCs are cancelled on the server
796// by calling ServerContext::TryCancel()
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800797class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
798 protected:
799 typedef enum {
800 DO_NOT_CANCEL = 0,
801 CANCEL_BEFORE_PROCESSING,
802 CANCEL_DURING_PROCESSING,
803 CANCEL_AFTER_PROCESSING
804 } ServerTryCancelRequestPhase;
805
806 void ServerTryCancel(ServerContext* context) {
807 EXPECT_FALSE(context->IsCancelled());
808 context->TryCancel();
809 gpr_log(GPR_INFO, "Server called TryCancel()");
810 EXPECT_TRUE(context->IsCancelled());
811 }
812
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800813 // Helper for testing client-streaming RPCs which are cancelled on the server.
814 // Depending on the value of server_try_cancel parameter, this will test one
815 // of the following three scenarios:
816 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading
817 // any messages from the client
818 //
819 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
820 // messages from the client
821 //
822 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
823 // messages from the client (but before sending any status back to the
824 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800825 void TestClientStreamingServerCancel(
826 ServerTryCancelRequestPhase server_try_cancel) {
827 ResetStub();
828
829 EchoRequest send_request;
830 EchoRequest recv_request;
831 EchoResponse send_response;
832 EchoResponse recv_response;
833 Status recv_status;
834
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800835 ClientContext cli_ctx;
836 ServerContext srv_ctx;
837 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
838
839 // Initiate the 'RequestStream' call on client
840 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800841 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
842 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800843
844 // On the server, request to be notified of 'RequestStream' calls
845 // and receive the 'RequestStream' call just made by the client
846 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
847 tag(2));
848 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
849
850 // Client sends 3 messages (tags 3, 4 and 5)
851 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
852 send_request.set_message("Ping " + std::to_string(tag_idx));
853 cli_stream->Write(send_request, tag(tag_idx));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800854 Verifier(GetParam()).Expect(tag_idx, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800855 }
856 cli_stream->WritesDone(tag(6));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800857 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800858
859 bool expected_server_cq_result = true;
860 bool ignore_cq_result = false;
861
862 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
863 ServerTryCancel(&srv_ctx);
864
865 // Since cancellation is done before server reads any results, we know
866 // for sure that all cq results will return false from this point forward
867 expected_server_cq_result = false;
868 }
869
870 std::thread* server_try_cancel_thd = NULL;
871 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
872 server_try_cancel_thd = new std::thread(
873 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
874 // Server will cancel the RPC in a parallel thread while reading the
875 // requests from the client. Since the cancellation can happen at anytime,
876 // some of the cq results (i.e those until cancellation) might be true but
877 // its non deterministic. So better to ignore the cq results
878 ignore_cq_result = true;
879 }
880
881 // Server reads 3 messages (tags 6, 7 and 8)
882 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
883 srv_stream.Read(&recv_request, tag(tag_idx));
884 Verifier(GetParam())
885 .Expect(tag_idx, expected_server_cq_result)
886 .Verify(cq_.get(), ignore_cq_result);
887 }
888
889 if (server_try_cancel_thd != NULL) {
890 server_try_cancel_thd->join();
891 delete server_try_cancel_thd;
892 }
893
894 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
895 ServerTryCancel(&srv_ctx);
896 }
897
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800898 // The RPC has been cancelled at this point for sure (i.e irrespective of
899 // the value of `server_try_cancel` is). So, from this point forward, we
900 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800901
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800902 // Server sends the final message and cancelled status (but the RPC is
903 // already cancelled at this point. So we expect the operation to fail)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800904 srv_stream.Finish(send_response, Status::CANCELLED, tag(9));
905 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
906
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800907 // Client will see the cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800908 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla369a04a2016-02-01 10:53:13 -0800909 // TODO(sreek): The expectation here should be true. This is a bug (github
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800910 // issue #4972)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800911 Verifier(GetParam()).Expect(10, false).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800912 EXPECT_FALSE(recv_status.ok());
913 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
914 }
915
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800916 // Helper for testing server-streaming RPCs which are cancelled on the server.
917 // Depending on the value of server_try_cancel parameter, this will test one
918 // of the following three scenarios:
919 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before sending
920 // any messages to the client
921 //
922 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while sending
923 // messages to the client
924 //
925 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after sending all
926 // messages to the client (but before sending any status back to the
927 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800928 void TestServerStreamingServerCancel(
929 ServerTryCancelRequestPhase server_try_cancel) {
930 ResetStub();
931
932 EchoRequest send_request;
933 EchoRequest recv_request;
934 EchoResponse send_response;
935 EchoResponse recv_response;
936 Status recv_status;
937 ClientContext cli_ctx;
938 ServerContext srv_ctx;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800939 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
940
941 send_request.set_message("Ping");
942 // Initiate the 'ResponseStream' call on the client
943 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800944 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
945 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800946 // On the server, request to be notified of 'ResponseStream' calls and
947 // receive the call just made by the client
948 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
949 cq_.get(), cq_.get(), tag(2));
950 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
951 EXPECT_EQ(send_request.message(), recv_request.message());
952
953 bool expected_cq_result = true;
954 bool ignore_cq_result = false;
955
956 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
957 ServerTryCancel(&srv_ctx);
958
959 // We know for sure that all cq results will be false from this point
960 // since the server cancelled the RPC
961 expected_cq_result = false;
962 }
963
964 std::thread* server_try_cancel_thd = NULL;
965 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
966 server_try_cancel_thd = new std::thread(
967 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
968
969 // Server will cancel the RPC in a parallel thread while writing responses
970 // to the client. Since the cancellation can happen at anytime, some of
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800971 // the cq results (i.e those until cancellation) might be true but it is
972 // non deterministic. So better to ignore the cq results
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800973 ignore_cq_result = true;
974 }
975
976 // Server sends three messages (tags 3, 4 and 5)
977 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
978 send_response.set_message("Pong " + std::to_string(tag_idx));
979 srv_stream.Write(send_response, tag(tag_idx));
980 Verifier(GetParam())
981 .Expect(tag_idx, expected_cq_result)
982 .Verify(cq_.get(), ignore_cq_result);
983 }
984
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800985 if (server_try_cancel_thd != NULL) {
986 server_try_cancel_thd->join();
987 delete server_try_cancel_thd;
988 }
989
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800990 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
991 ServerTryCancel(&srv_ctx);
yang-gad0df7b2016-02-22 10:00:20 -0800992
993 // Client reads may fail bacause it is notified that the stream is
994 // cancelled.
995 ignore_cq_result = true;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800996 }
997
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800998 // Client attemts to read the three messages from the server
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800999 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
1000 cli_stream->Read(&recv_response, tag(tag_idx));
1001 Verifier(GetParam())
1002 .Expect(tag_idx, expected_cq_result)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001003 .Verify(cq_.get(), ignore_cq_result);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001004 }
1005
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001006 // The RPC has been cancelled at this point for sure (i.e irrespective of
1007 // the value of `server_try_cancel` is). So, from this point forward, we
1008 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001009
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001010 // Server finishes the stream (but the RPC is already cancelled)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001011 srv_stream.Finish(Status::CANCELLED, tag(9));
1012 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
1013
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001014 // Client will see the cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001015 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001016 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001017 EXPECT_FALSE(recv_status.ok());
1018 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
1019 }
1020
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001021 // Helper for testing bidirectinal-streaming RPCs which are cancelled on the
1022 // server.
1023 //
1024 // Depending on the value of server_try_cancel parameter, this will
1025 // test one of the following three scenarios:
1026 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading/
1027 // writing any messages from/to the client
1028 //
1029 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
1030 // messages from the client
1031 //
1032 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
1033 // messages from the client (but before sending any status back to the
1034 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001035 void TestBidiStreamingServerCancel(
1036 ServerTryCancelRequestPhase server_try_cancel) {
1037 ResetStub();
1038
1039 EchoRequest send_request;
1040 EchoRequest recv_request;
1041 EchoResponse send_response;
1042 EchoResponse recv_response;
1043 Status recv_status;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001044 ClientContext cli_ctx;
1045 ServerContext srv_ctx;
1046 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
1047
1048 // Initiate the call from the client side
1049 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001050 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
1051 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001052
1053 // On the server, request to be notified of the 'BidiStream' call and
1054 // receive the call just made by the client
1055 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
1056 tag(2));
1057 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
1058
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001059 // Client sends the first and the only message
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001060 send_request.set_message("Ping");
1061 cli_stream->Write(send_request, tag(3));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001062 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001063
1064 bool expected_cq_result = true;
1065 bool ignore_cq_result = false;
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001066
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001067 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
1068 ServerTryCancel(&srv_ctx);
1069
1070 // We know for sure that all cq results will be false from this point
1071 // since the server cancelled the RPC
1072 expected_cq_result = false;
1073 }
1074
1075 std::thread* server_try_cancel_thd = NULL;
1076 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
1077 server_try_cancel_thd = new std::thread(
1078 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
1079
1080 // Since server is going to cancel the RPC in a parallel thread, some of
1081 // the cq results (i.e those until the cancellation) might be true. Since
1082 // that number is non-deterministic, it is better to ignore the cq results
1083 ignore_cq_result = true;
1084 }
1085
1086 srv_stream.Read(&recv_request, tag(4));
1087 Verifier(GetParam())
1088 .Expect(4, expected_cq_result)
1089 .Verify(cq_.get(), ignore_cq_result);
1090
1091 send_response.set_message("Pong");
1092 srv_stream.Write(send_response, tag(5));
1093 Verifier(GetParam())
1094 .Expect(5, expected_cq_result)
1095 .Verify(cq_.get(), ignore_cq_result);
1096
1097 cli_stream->Read(&recv_response, tag(6));
1098 Verifier(GetParam())
1099 .Expect(6, expected_cq_result)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001100 .Verify(cq_.get(), ignore_cq_result);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001101
1102 // This is expected to succeed in all cases
1103 cli_stream->WritesDone(tag(7));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001104 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001105
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001106 // This is expected to fail in all cases i.e for all values of
Vijay Pai018879a2016-02-16 09:20:50 -08001107 // server_try_cancel. This is because at this point, either there are no
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001108 // more msgs from the client (because client called WritesDone) or the RPC
1109 // is cancelled on the server
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001110 srv_stream.Read(&recv_request, tag(8));
1111 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
1112
1113 if (server_try_cancel_thd != NULL) {
1114 server_try_cancel_thd->join();
1115 delete server_try_cancel_thd;
1116 }
1117
1118 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
1119 ServerTryCancel(&srv_ctx);
1120 }
1121
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001122 // The RPC has been cancelled at this point for sure (i.e irrespective of
1123 // the value of `server_try_cancel` is). So, from this point forward, we
1124 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001125
1126 srv_stream.Finish(Status::CANCELLED, tag(9));
1127 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
1128
1129 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001130 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001131 EXPECT_FALSE(recv_status.ok());
1132 EXPECT_EQ(grpc::StatusCode::CANCELLED, recv_status.error_code());
1133 }
1134};
1135
1136TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelBefore) {
1137 TestClientStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1138}
1139
1140TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelDuring) {
1141 TestClientStreamingServerCancel(CANCEL_DURING_PROCESSING);
1142}
1143
1144TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelAfter) {
1145 TestClientStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1146}
1147
1148TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelBefore) {
1149 TestServerStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1150}
1151
1152TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelDuring) {
1153 TestServerStreamingServerCancel(CANCEL_DURING_PROCESSING);
1154}
1155
1156TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelAfter) {
1157 TestServerStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1158}
1159
1160TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelBefore) {
1161 TestBidiStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1162}
1163
1164TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelDuring) {
1165 TestBidiStreamingServerCancel(CANCEL_DURING_PROCESSING);
1166}
1167
1168TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelAfter) {
1169 TestBidiStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1170}
1171
Craig Tiller4c06b822015-08-06 08:41:31 -07001172INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest,
1173 ::testing::Values(false, true));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001174INSTANTIATE_TEST_CASE_P(AsyncEnd2endServerTryCancel,
1175 AsyncEnd2endServerTryCancelTest,
1176 ::testing::Values(false));
Craig Tiller69f90e62015-08-06 08:32:35 -07001177
Craig Tiller0220cf12015-02-12 17:39:26 -08001178} // namespace
1179} // namespace testing
1180} // namespace grpc
1181
1182int main(int argc, char** argv) {
1183 grpc_test_init(argc, argv);
Vijay Paib65eda42016-02-16 13:48:05 -08001184 gpr_tls_init(&g_is_async_end2end_test);
Craig Tiller0220cf12015-02-12 17:39:26 -08001185 ::testing::InitGoogleTest(&argc, argv);
Vijay Paib65eda42016-02-16 13:48:05 -08001186 int ret = RUN_ALL_TESTS();
1187 gpr_tls_destroy(&g_is_async_end2end_test);
1188 return ret;
Craig Tiller0220cf12015-02-12 17:39:26 -08001189}