blob: 4de181b90115bab07a2c81dc0c095f973a7a2e5f [file] [log] [blame]
Craig Tiller0220cf12015-02-12 17:39:26 -08001/*
2 *
Craig Tiller6169d5f2016-03-31 07:46:18 -07003 * Copyright 2015, Google Inc.
Craig Tiller0220cf12015-02-12 17:39:26 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
Yang Gaoda699b82015-02-18 01:10:22 -080034#include <memory>
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"
Vijay Paidf8b62c2016-05-02 14:34:24 -070054#include "test/cpp/util/test_credentials_provider.h"
Craig Tiller0220cf12015-02-12 17:39:26 -080055
Craig Tiller69f90e62015-08-06 08:32:35 -070056#ifdef GPR_POSIX_SOCKET
Craig Tillerf45496f2016-03-30 07:41:19 -070057#include "src/core/lib/iomgr/ev_posix.h"
Craig Tiller69f90e62015-08-06 08:32:35 -070058#endif
59
Craig Tiller1b4e3302015-12-17 16:35:00 -080060using grpc::testing::EchoRequest;
61using grpc::testing::EchoResponse;
Vijay Paidf8b62c2016-05-02 14:34:24 -070062using grpc::testing::kTlsCredentialsType;
Craig Tiller0220cf12015-02-12 17:39:26 -080063using std::chrono::system_clock;
64
Vijay Paib65eda42016-02-16 13:48:05 -080065GPR_TLS_DECL(g_is_async_end2end_test);
66
Craig Tiller0220cf12015-02-12 17:39:26 -080067namespace grpc {
68namespace testing {
69
70namespace {
71
Craig Tiller7536af02015-12-22 13:49:30 -080072void* tag(int i) { return (void*)(intptr_t)i; }
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -080073int detag(void* p) { return static_cast<int>(reinterpret_cast<intptr_t>(p)); }
Yang Gaoc05b6cb2015-02-13 00:34:10 -080074
Craig Tiller69f90e62015-08-06 08:32:35 -070075#ifdef GPR_POSIX_SOCKET
Vijay Paib65eda42016-02-16 13:48:05 -080076static int maybe_assert_non_blocking_poll(struct pollfd* pfds, nfds_t nfds,
77 int timeout) {
78 if (gpr_tls_get(&g_is_async_end2end_test)) {
79 GPR_ASSERT(timeout == 0);
80 }
81 return poll(pfds, nfds, timeout);
Craig Tiller69f90e62015-08-06 08:32:35 -070082}
83
84class PollOverride {
Craig Tiller06cf3cc2015-05-13 13:11:01 -070085 public:
Craig Tiller69f90e62015-08-06 08:32:35 -070086 PollOverride(grpc_poll_function_type f) {
87 prev_ = grpc_poll_function;
88 grpc_poll_function = f;
89 }
90
Craig Tiller4c06b822015-08-06 08:41:31 -070091 ~PollOverride() { grpc_poll_function = prev_; }
Craig Tiller69f90e62015-08-06 08:32:35 -070092
93 private:
94 grpc_poll_function_type prev_;
95};
96
vjpaicf4daeb2016-02-15 02:33:54 -080097class PollingOverrider : public PollOverride {
Craig Tiller69f90e62015-08-06 08:32:35 -070098 public:
vjpaicf4daeb2016-02-15 02:33:54 -080099 explicit PollingOverrider(bool allow_blocking)
Vijay Paib65eda42016-02-16 13:48:05 -0800100 : PollOverride(allow_blocking ? poll : maybe_assert_non_blocking_poll) {}
Craig Tiller69f90e62015-08-06 08:32:35 -0700101};
102#else
vjpaicf4daeb2016-02-15 02:33:54 -0800103class PollingOverrider {
Craig Tiller69f90e62015-08-06 08:32:35 -0700104 public:
vjpaicf4daeb2016-02-15 02:33:54 -0800105 explicit PollingOverrider(bool allow_blocking) {}
Craig Tiller69f90e62015-08-06 08:32:35 -0700106};
107#endif
108
vjpaicf4daeb2016-02-15 02:33:54 -0800109class Verifier {
Craig Tiller69f90e62015-08-06 08:32:35 -0700110 public:
vjpaicf4daeb2016-02-15 02:33:54 -0800111 explicit Verifier(bool spin) : spin_(spin) {}
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800112 // Expect sets the expected ok value for a specific tag
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700113 Verifier& Expect(int i, bool expect_ok) {
114 expectations_[tag(i)] = expect_ok;
115 return *this;
vjpai7aadf462015-03-16 23:58:44 -0700116 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800117
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800118 // Next waits for 1 async tag to complete, checks its
119 // expectations, and returns the tag
120 int Next(CompletionQueue* cq, bool ignore_ok) {
121 bool ok;
122 void* got_tag;
123 if (spin_) {
124 for (;;) {
125 auto r = cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
126 if (r == CompletionQueue::TIMEOUT) continue;
127 if (r == CompletionQueue::GOT_EVENT) break;
128 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
129 abort();
130 }
131 } else {
132 EXPECT_TRUE(cq->Next(&got_tag, &ok));
133 }
134 auto it = expectations_.find(got_tag);
135 EXPECT_TRUE(it != expectations_.end());
136 if (!ignore_ok) {
137 EXPECT_EQ(it->second, ok);
138 }
139 expectations_.erase(it);
140 return detag(got_tag);
141 }
142
143 // Verify keeps calling Next until all currently set
144 // expected tags are complete
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800145 void Verify(CompletionQueue* cq) { Verify(cq, false); }
146
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800147 // This version of Verify allows optionally ignoring the
148 // outcome of the expectation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800149 void Verify(CompletionQueue* cq, bool ignore_ok) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700150 GPR_ASSERT(!expectations_.empty());
151 while (!expectations_.empty()) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800152 Next(cq, ignore_ok);
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700153 }
154 }
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800155 // This version of Verify stops after a certain deadline
Craig Tillerd6c98df2015-08-18 09:33:44 -0700156 void Verify(CompletionQueue* cq,
157 std::chrono::system_clock::time_point deadline) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700158 if (expectations_.empty()) {
159 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700160 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700161 if (spin_) {
162 while (std::chrono::system_clock::now() < deadline) {
Craig Tiller4c06b822015-08-06 08:41:31 -0700163 EXPECT_EQ(
164 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)),
165 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700166 }
167 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700168 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
169 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700170 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700171 } else {
172 while (!expectations_.empty()) {
173 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700174 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700175 if (spin_) {
176 for (;;) {
177 GPR_ASSERT(std::chrono::system_clock::now() < deadline);
Craig Tiller4c06b822015-08-06 08:41:31 -0700178 auto r =
179 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
Craig Tiller69f90e62015-08-06 08:32:35 -0700180 if (r == CompletionQueue::TIMEOUT) continue;
181 if (r == CompletionQueue::GOT_EVENT) break;
182 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
183 abort();
Craig Tiller4c06b822015-08-06 08:41:31 -0700184 }
Craig Tiller69f90e62015-08-06 08:32:35 -0700185 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700186 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
187 CompletionQueue::GOT_EVENT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700188 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700189 auto it = expectations_.find(got_tag);
190 EXPECT_TRUE(it != expectations_.end());
191 EXPECT_EQ(it->second, ok);
192 expectations_.erase(it);
193 }
194 }
195 }
196
197 private:
198 std::map<void*, bool> expectations_;
Craig Tiller69f90e62015-08-06 08:32:35 -0700199 bool spin_;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700200};
vjpai7aadf462015-03-16 23:58:44 -0700201
Vijay Paidf8b62c2016-05-02 14:34:24 -0700202class TestScenario {
203 public:
Vijay Paid7b1e702016-05-02 15:10:21 -0700204 TestScenario(bool non_block, const grpc::string& creds_type,
205 const grpc::string& content)
206 : disable_blocking(non_block),
207 credentials_type(creds_type),
208 message_content(content) {}
209 void Log() const {
210 gpr_log(GPR_INFO,
211 "Scenario: disable_blocking %d, credentials %s, message size %d",
212 disable_blocking, credentials_type.c_str(), message_content.size());
213 }
Vijay Paidf8b62c2016-05-02 14:34:24 -0700214 bool disable_blocking;
215 const grpc::string credentials_type;
Vijay Paid7b1e702016-05-02 15:10:21 -0700216 const grpc::string message_content;
Vijay Paidf8b62c2016-05-02 14:34:24 -0700217};
218
219class AsyncEnd2endTest : public ::testing::TestWithParam<TestScenario> {
Craig Tiller0220cf12015-02-12 17:39:26 -0800220 protected:
Vijay Paid7b1e702016-05-02 15:10:21 -0700221 AsyncEnd2endTest() { GetParam().Log(); }
Craig Tiller0220cf12015-02-12 17:39:26 -0800222
Craig Tillercf133f42015-02-26 14:05:56 -0800223 void SetUp() GRPC_OVERRIDE {
Vijay Paidf8b62c2016-05-02 14:34:24 -0700224 poll_overrider_.reset(new PollingOverrider(!GetParam().disable_blocking));
Vijay Pai018879a2016-02-16 09:20:50 -0800225
Craig Tiller0220cf12015-02-12 17:39:26 -0800226 int port = grpc_pick_unused_port_or_die();
227 server_address_ << "localhost:" << port;
vjpai017ed622015-12-09 10:42:54 -0800228
Craig Tiller0220cf12015-02-12 17:39:26 -0800229 // Setup server
230 ServerBuilder builder;
Vijay Paidf8b62c2016-05-02 14:34:24 -0700231 auto server_creds = GetServerCredentials(GetParam().credentials_type);
232 builder.AddListeningPort(server_address_.str(), server_creds);
Craig Tiller15f383c2016-01-07 12:45:32 -0800233 builder.RegisterService(&service_);
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700234 cq_ = builder.AddCompletionQueue();
Craig Tiller0220cf12015-02-12 17:39:26 -0800235 server_ = builder.BuildAndStart();
Vijay Paib65eda42016-02-16 13:48:05 -0800236
237 gpr_tls_set(&g_is_async_end2end_test, 1);
Craig Tiller0220cf12015-02-12 17:39:26 -0800238 }
239
Craig Tillercf133f42015-02-26 14:05:56 -0800240 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800241 server_->Shutdown();
242 void* ignored_tag;
243 bool ignored_ok;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700244 cq_->Shutdown();
245 while (cq_->Next(&ignored_tag, &ignored_ok))
Craig Tiller492968f2015-02-18 13:14:03 -0800246 ;
Vijay Pai018879a2016-02-16 09:20:50 -0800247 poll_overrider_.reset();
Vijay Paib65eda42016-02-16 13:48:05 -0800248 gpr_tls_set(&g_is_async_end2end_test, 0);
Craig Tiller492968f2015-02-18 13:14:03 -0800249 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800250
251 void ResetStub() {
Vijay Paidf8b62c2016-05-02 14:34:24 -0700252 ChannelArguments args;
253 auto channel_creds =
254 GetChannelCredentials(GetParam().credentials_type, &args);
yang-g730055d2015-08-27 12:29:45 -0700255 std::shared_ptr<Channel> channel =
Vijay Paidf8b62c2016-05-02 14:34:24 -0700256 CreateCustomChannel(server_address_.str(), channel_creds, args);
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800257 stub_ = grpc::testing::EchoTestService::NewStub(channel);
Craig Tiller0220cf12015-02-12 17:39:26 -0800258 }
259
Yang Gao406b32f2015-02-13 16:25:33 -0800260 void SendRpc(int num_rpcs) {
261 for (int i = 0; i < num_rpcs; i++) {
262 EchoRequest send_request;
263 EchoRequest recv_request;
264 EchoResponse send_response;
265 EchoResponse recv_response;
266 Status recv_status;
267
268 ClientContext cli_ctx;
269 ServerContext srv_ctx;
270 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
271
Vijay Paid7b1e702016-05-02 15:10:21 -0700272 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800273 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700274 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800275
Craig Tillerd6c98df2015-08-18 09:33:44 -0700276 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
277 cq_.get(), tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800278
Vijay Paidf8b62c2016-05-02 14:34:24 -0700279 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800280 EXPECT_EQ(send_request.message(), recv_request.message());
281
282 send_response.set_message(recv_request.message());
283 response_writer.Finish(send_response, Status::OK, tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700284 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800285
Yang Gao3a5e5492015-02-18 14:32:38 -0800286 response_reader->Finish(&recv_response, &recv_status, tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700287 Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800288
289 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700290 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800291 }
292 }
293
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700294 std::unique_ptr<ServerCompletionQueue> cq_;
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800295 std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800296 std::unique_ptr<Server> server_;
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800297 grpc::testing::EchoTestService::AsyncService service_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800298 std::ostringstream server_address_;
vjpaicf4daeb2016-02-15 02:33:54 -0800299
Vijay Pai018879a2016-02-16 09:20:50 -0800300 std::unique_ptr<PollingOverrider> poll_overrider_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800301};
302
Craig Tiller69f90e62015-08-06 08:32:35 -0700303TEST_P(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800304 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800305 SendRpc(1);
306}
Yang Gaobb84a302015-02-12 23:30:12 -0800307
Craig Tiller69f90e62015-08-06 08:32:35 -0700308TEST_P(AsyncEnd2endTest, SequentialRpcs) {
Yang Gao406b32f2015-02-13 16:25:33 -0800309 ResetStub();
310 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800311}
312
vjpai7aadf462015-03-16 23:58:44 -0700313// Test a simple RPC using the async version of Next
Craig Tiller69f90e62015-08-06 08:32:35 -0700314TEST_P(AsyncEnd2endTest, AsyncNextRpc) {
vjpai7aadf462015-03-16 23:58:44 -0700315 ResetStub();
316
317 EchoRequest send_request;
318 EchoRequest recv_request;
319 EchoResponse send_response;
320 EchoResponse recv_response;
321 Status recv_status;
322
323 ClientContext cli_ctx;
324 ServerContext srv_ctx;
325 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
326
Vijay Paid7b1e702016-05-02 15:10:21 -0700327 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800328 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700329 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
vjpai7aadf462015-03-16 23:58:44 -0700330
Yang Gao757afae2015-03-17 15:49:26 -0700331 std::chrono::system_clock::time_point time_now(
Craig Tillerf51199f2015-05-08 09:32:53 -0700332 std::chrono::system_clock::now());
333 std::chrono::system_clock::time_point time_limit(
334 std::chrono::system_clock::now() + std::chrono::seconds(10));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700335 Verifier(GetParam().disable_blocking).Verify(cq_.get(), time_now);
336 Verifier(GetParam().disable_blocking).Verify(cq_.get(), time_now);
vjpai7aadf462015-03-16 23:58:44 -0700337
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700338 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
339 cq_.get(), tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700340
Vijay Paidf8b62c2016-05-02 14:34:24 -0700341 Verifier(GetParam().disable_blocking)
342 .Expect(2, true)
343 .Verify(cq_.get(), time_limit);
vjpai7aadf462015-03-16 23:58:44 -0700344 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700345
346 send_response.set_message(recv_request.message());
347 response_writer.Finish(send_response, Status::OK, tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700348 Verifier(GetParam().disable_blocking)
Craig Tiller4c06b822015-08-06 08:41:31 -0700349 .Expect(3, true)
350 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700351
352 response_reader->Finish(&recv_response, &recv_status, tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700353 Verifier(GetParam().disable_blocking)
Craig Tiller4c06b822015-08-06 08:41:31 -0700354 .Expect(4, true)
355 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700356
357 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700358 EXPECT_TRUE(recv_status.ok());
vjpai7aadf462015-03-16 23:58:44 -0700359}
Yang Gao757afae2015-03-17 15:49:26 -0700360
Yang Gao0e0d8e12015-02-13 14:40:41 -0800361// Two pings and a final pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700362TEST_P(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800363 ResetStub();
364
365 EchoRequest send_request;
366 EchoRequest recv_request;
367 EchoResponse send_response;
368 EchoResponse recv_response;
369 Status recv_status;
370 ClientContext cli_ctx;
371 ServerContext srv_ctx;
372 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
373
Vijay Paid7b1e702016-05-02 15:10:21 -0700374 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800375 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700376 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800377
Craig Tillerd6c98df2015-08-18 09:33:44 -0700378 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
379 tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800380
Vijay Paidf8b62c2016-05-02 14:34:24 -0700381 Verifier(GetParam().disable_blocking)
382 .Expect(2, true)
383 .Expect(1, true)
384 .Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800385
386 cli_stream->Write(send_request, tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700387 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800388
389 srv_stream.Read(&recv_request, tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700390 Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800391 EXPECT_EQ(send_request.message(), recv_request.message());
392
393 cli_stream->Write(send_request, tag(5));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700394 Verifier(GetParam().disable_blocking).Expect(5, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800395
396 srv_stream.Read(&recv_request, tag(6));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700397 Verifier(GetParam().disable_blocking).Expect(6, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800398
399 EXPECT_EQ(send_request.message(), recv_request.message());
400 cli_stream->WritesDone(tag(7));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700401 Verifier(GetParam().disable_blocking).Expect(7, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800402
403 srv_stream.Read(&recv_request, tag(8));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700404 Verifier(GetParam().disable_blocking).Expect(8, false).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800405
406 send_response.set_message(recv_request.message());
407 srv_stream.Finish(send_response, Status::OK, tag(9));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700408 Verifier(GetParam().disable_blocking).Expect(9, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800409
410 cli_stream->Finish(&recv_status, tag(10));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700411 Verifier(GetParam().disable_blocking).Expect(10, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800412
413 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700414 EXPECT_TRUE(recv_status.ok());
Yang Gao005f18a2015-02-13 10:22:33 -0800415}
416
Yang Gao0e0d8e12015-02-13 14:40:41 -0800417// One ping, two pongs.
Craig Tiller69f90e62015-08-06 08:32:35 -0700418TEST_P(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800419 ResetStub();
420
421 EchoRequest send_request;
422 EchoRequest recv_request;
423 EchoResponse send_response;
424 EchoResponse recv_response;
425 Status recv_status;
426 ClientContext cli_ctx;
427 ServerContext srv_ctx;
428 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
429
Vijay Paid7b1e702016-05-02 15:10:21 -0700430 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800431 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700432 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800433
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700434 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700435 cq_.get(), cq_.get(), tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800436
Vijay Paidf8b62c2016-05-02 14:34:24 -0700437 Verifier(GetParam().disable_blocking)
438 .Expect(1, true)
439 .Expect(2, true)
440 .Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800441 EXPECT_EQ(send_request.message(), recv_request.message());
442
443 send_response.set_message(recv_request.message());
444 srv_stream.Write(send_response, tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700445 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800446
447 cli_stream->Read(&recv_response, tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700448 Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800449 EXPECT_EQ(send_response.message(), recv_response.message());
450
451 srv_stream.Write(send_response, tag(5));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700452 Verifier(GetParam().disable_blocking).Expect(5, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800453
454 cli_stream->Read(&recv_response, tag(6));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700455 Verifier(GetParam().disable_blocking).Expect(6, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800456 EXPECT_EQ(send_response.message(), recv_response.message());
457
458 srv_stream.Finish(Status::OK, tag(7));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700459 Verifier(GetParam().disable_blocking).Expect(7, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800460
461 cli_stream->Read(&recv_response, tag(8));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700462 Verifier(GetParam().disable_blocking).Expect(8, false).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800463
464 cli_stream->Finish(&recv_status, tag(9));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700465 Verifier(GetParam().disable_blocking).Expect(9, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800466
Yang Gaoc1a2c312015-06-16 10:59:46 -0700467 EXPECT_TRUE(recv_status.ok());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800468}
469
470// One ping, one pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700471TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800472 ResetStub();
473
474 EchoRequest send_request;
475 EchoRequest recv_request;
476 EchoResponse send_response;
477 EchoResponse recv_response;
478 Status recv_status;
479 ClientContext cli_ctx;
480 ServerContext srv_ctx;
481 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
482
Vijay Paid7b1e702016-05-02 15:10:21 -0700483 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800484 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700485 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800486
Craig Tillerd6c98df2015-08-18 09:33:44 -0700487 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
488 tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800489
Vijay Paidf8b62c2016-05-02 14:34:24 -0700490 Verifier(GetParam().disable_blocking)
491 .Expect(1, true)
492 .Expect(2, true)
493 .Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800494
495 cli_stream->Write(send_request, tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700496 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800497
498 srv_stream.Read(&recv_request, tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700499 Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800500 EXPECT_EQ(send_request.message(), recv_request.message());
501
502 send_response.set_message(recv_request.message());
503 srv_stream.Write(send_response, tag(5));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700504 Verifier(GetParam().disable_blocking).Expect(5, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800505
506 cli_stream->Read(&recv_response, tag(6));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700507 Verifier(GetParam().disable_blocking).Expect(6, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800508 EXPECT_EQ(send_response.message(), recv_response.message());
509
510 cli_stream->WritesDone(tag(7));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700511 Verifier(GetParam().disable_blocking).Expect(7, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800512
513 srv_stream.Read(&recv_request, tag(8));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700514 Verifier(GetParam().disable_blocking).Expect(8, false).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800515
516 srv_stream.Finish(Status::OK, tag(9));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700517 Verifier(GetParam().disable_blocking).Expect(9, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800518
519 cli_stream->Finish(&recv_status, tag(10));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700520 Verifier(GetParam().disable_blocking).Expect(10, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800521
Yang Gaoc1a2c312015-06-16 10:59:46 -0700522 EXPECT_TRUE(recv_status.ok());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800523}
524
Yang Gao406b32f2015-02-13 16:25:33 -0800525// Metadata tests
Craig Tiller69f90e62015-08-06 08:32:35 -0700526TEST_P(AsyncEnd2endTest, ClientInitialMetadataRpc) {
Yang Gao406b32f2015-02-13 16:25:33 -0800527 ResetStub();
528
529 EchoRequest send_request;
530 EchoRequest recv_request;
531 EchoResponse send_response;
532 EchoResponse recv_response;
533 Status recv_status;
534
535 ClientContext cli_ctx;
536 ServerContext srv_ctx;
537 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
538
Vijay Paid7b1e702016-05-02 15:10:21 -0700539 send_request.set_message(GetParam().message_content);
Yang Gao406b32f2015-02-13 16:25:33 -0800540 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
541 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
Craig Tiller6f871642016-02-03 16:15:31 -0800542 std::pair<grpc::string, grpc::string> meta3("g.r.d-bin", "xyz");
Yang Gao406b32f2015-02-13 16:25:33 -0800543 cli_ctx.AddMetadata(meta1.first, meta1.second);
544 cli_ctx.AddMetadata(meta2.first, meta2.second);
Craig Tiller6f871642016-02-03 16:15:31 -0800545 cli_ctx.AddMetadata(meta3.first, meta3.second);
Yang Gao406b32f2015-02-13 16:25:33 -0800546
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800547 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700548 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800549
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700550 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
551 cq_.get(), tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700552 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800553 EXPECT_EQ(send_request.message(), recv_request.message());
554 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700555 EXPECT_EQ(meta1.second,
556 ToString(client_initial_metadata.find(meta1.first)->second));
557 EXPECT_EQ(meta2.second,
558 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller6f871642016-02-03 16:15:31 -0800559 EXPECT_EQ(meta3.second,
560 ToString(client_initial_metadata.find(meta3.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700561 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800562
563 send_response.set_message(recv_request.message());
564 response_writer.Finish(send_response, Status::OK, tag(3));
565
Vijay Paidf8b62c2016-05-02 14:34:24 -0700566 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800567
Yang Gao3a5e5492015-02-18 14:32:38 -0800568 response_reader->Finish(&recv_response, &recv_status, tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700569 Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800570
571 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700572 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800573}
574
Craig Tiller69f90e62015-08-06 08:32:35 -0700575TEST_P(AsyncEnd2endTest, ServerInitialMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800576 ResetStub();
577
578 EchoRequest send_request;
579 EchoRequest recv_request;
580 EchoResponse send_response;
581 EchoResponse recv_response;
582 Status recv_status;
583
584 ClientContext cli_ctx;
585 ServerContext srv_ctx;
586 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
587
Vijay Paid7b1e702016-05-02 15:10:21 -0700588 send_request.set_message(GetParam().message_content);
Yang Gao2b7f5372015-02-18 00:45:53 -0800589 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
590 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
591
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800592 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700593 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800594
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700595 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
596 cq_.get(), tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700597 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800598 EXPECT_EQ(send_request.message(), recv_request.message());
599 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
600 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
601 response_writer.SendInitialMetadata(tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700602 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800603
Yang Gao3a5e5492015-02-18 14:32:38 -0800604 response_reader->ReadInitialMetadata(tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700605 Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800606 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700607 EXPECT_EQ(meta1.second,
608 ToString(server_initial_metadata.find(meta1.first)->second));
609 EXPECT_EQ(meta2.second,
610 ToString(server_initial_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800611 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800612
613 send_response.set_message(recv_request.message());
614 response_writer.Finish(send_response, Status::OK, tag(5));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700615 Verifier(GetParam().disable_blocking).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800616
617 response_reader->Finish(&recv_response, &recv_status, tag(6));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700618 Verifier(GetParam().disable_blocking).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800619
620 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700621 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800622}
623
Craig Tiller69f90e62015-08-06 08:32:35 -0700624TEST_P(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800625 ResetStub();
626
627 EchoRequest send_request;
628 EchoRequest recv_request;
629 EchoResponse send_response;
630 EchoResponse recv_response;
631 Status recv_status;
632
633 ClientContext cli_ctx;
634 ServerContext srv_ctx;
635 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
636
Vijay Paid7b1e702016-05-02 15:10:21 -0700637 send_request.set_message(GetParam().message_content);
Yang Gao2b7f5372015-02-18 00:45:53 -0800638 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
639 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
640
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800641 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700642 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800643
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700644 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
645 cq_.get(), tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700646 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800647 EXPECT_EQ(send_request.message(), recv_request.message());
648 response_writer.SendInitialMetadata(tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700649 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800650
651 send_response.set_message(recv_request.message());
652 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
653 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
654 response_writer.Finish(send_response, Status::OK, tag(4));
655
Vijay Paidf8b62c2016-05-02 14:34:24 -0700656 Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800657
Yang Gao3a5e5492015-02-18 14:32:38 -0800658 response_reader->Finish(&recv_response, &recv_status, tag(5));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700659 Verifier(GetParam().disable_blocking).Expect(5, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800660 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700661 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800662 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700663 EXPECT_EQ(meta1.second,
664 ToString(server_trailing_metadata.find(meta1.first)->second));
665 EXPECT_EQ(meta2.second,
666 ToString(server_trailing_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800667 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800668}
669
Craig Tiller69f90e62015-08-06 08:32:35 -0700670TEST_P(AsyncEnd2endTest, MetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800671 ResetStub();
672
673 EchoRequest send_request;
674 EchoRequest recv_request;
675 EchoResponse send_response;
676 EchoResponse recv_response;
677 Status recv_status;
678
679 ClientContext cli_ctx;
680 ServerContext srv_ctx;
681 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
682
Vijay Paid7b1e702016-05-02 15:10:21 -0700683 send_request.set_message(GetParam().message_content);
Yang Gao2b7f5372015-02-18 00:45:53 -0800684 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800685 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400686 "key2-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700687 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800688 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800689 std::pair<grpc::string, grpc::string> meta6(
690 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400691 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700692 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800693 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800694 std::pair<grpc::string, grpc::string> meta4(
695 "key6-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700696 grpc::string(
697 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800698
699 cli_ctx.AddMetadata(meta1.first, meta1.second);
700 cli_ctx.AddMetadata(meta2.first, meta2.second);
701
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800702 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700703 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800704
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700705 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
706 cq_.get(), tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700707 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800708 EXPECT_EQ(send_request.message(), recv_request.message());
709 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700710 EXPECT_EQ(meta1.second,
711 ToString(client_initial_metadata.find(meta1.first)->second));
712 EXPECT_EQ(meta2.second,
713 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700714 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800715
716 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
717 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
718 response_writer.SendInitialMetadata(tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700719 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800720 response_reader->ReadInitialMetadata(tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700721 Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800722 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700723 EXPECT_EQ(meta3.second,
724 ToString(server_initial_metadata.find(meta3.first)->second));
725 EXPECT_EQ(meta4.second,
726 ToString(server_initial_metadata.find(meta4.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700727 EXPECT_GE(server_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao3a5e5492015-02-18 14:32:38 -0800728
729 send_response.set_message(recv_request.message());
730 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
731 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
732 response_writer.Finish(send_response, Status::OK, tag(5));
733
Vijay Paidf8b62c2016-05-02 14:34:24 -0700734 Verifier(GetParam().disable_blocking).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800735
Yang Gao3a5e5492015-02-18 14:32:38 -0800736 response_reader->Finish(&recv_response, &recv_status, tag(6));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700737 Verifier(GetParam().disable_blocking).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800738 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700739 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800740 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700741 EXPECT_EQ(meta5.second,
742 ToString(server_trailing_metadata.find(meta5.first)->second));
743 EXPECT_EQ(meta6.second,
744 ToString(server_trailing_metadata.find(meta6.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700745 EXPECT_GE(server_trailing_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800746}
yang-gb3352562015-08-04 14:42:06 -0700747
748// Server uses AsyncNotifyWhenDone API to check for cancellation
Craig Tiller69f90e62015-08-06 08:32:35 -0700749TEST_P(AsyncEnd2endTest, ServerCheckCancellation) {
yang-gb3352562015-08-04 14:42:06 -0700750 ResetStub();
751
752 EchoRequest send_request;
753 EchoRequest recv_request;
754 EchoResponse send_response;
755 EchoResponse recv_response;
756 Status recv_status;
757
758 ClientContext cli_ctx;
759 ServerContext srv_ctx;
760 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
761
Vijay Paid7b1e702016-05-02 15:10:21 -0700762 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800763 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700764 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
765
766 srv_ctx.AsyncNotifyWhenDone(tag(5));
767 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
768 cq_.get(), tag(2));
769
Vijay Paidf8b62c2016-05-02 14:34:24 -0700770 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700771 EXPECT_EQ(send_request.message(), recv_request.message());
772
773 cli_ctx.TryCancel();
Vijay Paidf8b62c2016-05-02 14:34:24 -0700774 Verifier(GetParam().disable_blocking).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700775 EXPECT_TRUE(srv_ctx.IsCancelled());
776
777 response_reader->Finish(&recv_response, &recv_status, tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700778 Verifier(GetParam().disable_blocking).Expect(4, false).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700779
780 EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
781}
782
783// Server uses AsyncNotifyWhenDone API to check for normal finish
Craig Tiller69f90e62015-08-06 08:32:35 -0700784TEST_P(AsyncEnd2endTest, ServerCheckDone) {
yang-gb3352562015-08-04 14:42:06 -0700785 ResetStub();
786
787 EchoRequest send_request;
788 EchoRequest recv_request;
789 EchoResponse send_response;
790 EchoResponse recv_response;
791 Status recv_status;
792
793 ClientContext cli_ctx;
794 ServerContext srv_ctx;
795 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
796
Vijay Paid7b1e702016-05-02 15:10:21 -0700797 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800798 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700799 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
800
801 srv_ctx.AsyncNotifyWhenDone(tag(5));
802 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
803 cq_.get(), tag(2));
804
Vijay Paidf8b62c2016-05-02 14:34:24 -0700805 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700806 EXPECT_EQ(send_request.message(), recv_request.message());
807
808 send_response.set_message(recv_request.message());
809 response_writer.Finish(send_response, Status::OK, tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700810 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
811 Verifier(GetParam().disable_blocking).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700812 EXPECT_FALSE(srv_ctx.IsCancelled());
813
814 response_reader->Finish(&recv_response, &recv_status, tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700815 Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700816
817 EXPECT_EQ(send_response.message(), recv_response.message());
818 EXPECT_TRUE(recv_status.ok());
819}
820
Craig Tiller8f7bff72015-08-17 13:23:14 -0700821TEST_P(AsyncEnd2endTest, UnimplementedRpc) {
Vijay Paidf8b62c2016-05-02 14:34:24 -0700822 ChannelArguments args;
823 auto channel_creds =
824 GetChannelCredentials(GetParam().credentials_type, &args);
yang-g730055d2015-08-27 12:29:45 -0700825 std::shared_ptr<Channel> channel =
Vijay Paidf8b62c2016-05-02 14:34:24 -0700826 CreateCustomChannel(server_address_.str(), channel_creds, args);
Craig Tiller1b4e3302015-12-17 16:35:00 -0800827 std::unique_ptr<grpc::testing::UnimplementedService::Stub> stub;
828 stub = grpc::testing::UnimplementedService::NewStub(channel);
yang-g9b7757d2015-08-13 11:15:53 -0700829 EchoRequest send_request;
830 EchoResponse recv_response;
831 Status recv_status;
832
833 ClientContext cli_ctx;
Vijay Paid7b1e702016-05-02 15:10:21 -0700834 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800835 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-g9b7757d2015-08-13 11:15:53 -0700836 stub->AsyncUnimplemented(&cli_ctx, send_request, cq_.get()));
837
838 response_reader->Finish(&recv_response, &recv_status, tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700839 Verifier(GetParam().disable_blocking).Expect(4, false).Verify(cq_.get());
yang-g9b7757d2015-08-13 11:15:53 -0700840
841 EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
842 EXPECT_EQ("", recv_status.error_message());
843}
844
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800845// This class is for testing scenarios where RPCs are cancelled on the server
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800846// by calling ServerContext::TryCancel(). Server uses AsyncNotifyWhenDone
847// API to check for cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800848class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
849 protected:
850 typedef enum {
851 DO_NOT_CANCEL = 0,
852 CANCEL_BEFORE_PROCESSING,
853 CANCEL_DURING_PROCESSING,
854 CANCEL_AFTER_PROCESSING
855 } ServerTryCancelRequestPhase;
856
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800857 // Helper for testing client-streaming RPCs which are cancelled on the server.
858 // Depending on the value of server_try_cancel parameter, this will test one
859 // of the following three scenarios:
860 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading
861 // any messages from the client
862 //
863 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
864 // messages from the client
865 //
866 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
867 // messages from the client (but before sending any status back to the
868 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800869 void TestClientStreamingServerCancel(
870 ServerTryCancelRequestPhase server_try_cancel) {
871 ResetStub();
872
873 EchoRequest send_request;
874 EchoRequest recv_request;
875 EchoResponse send_response;
876 EchoResponse recv_response;
877 Status recv_status;
878
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800879 ClientContext cli_ctx;
880 ServerContext srv_ctx;
881 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
882
883 // Initiate the 'RequestStream' call on client
884 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800885 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700886 Verifier(GetParam().disable_blocking).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800887
888 // On the server, request to be notified of 'RequestStream' calls
889 // and receive the 'RequestStream' call just made by the client
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800890 srv_ctx.AsyncNotifyWhenDone(tag(11));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800891 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
892 tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700893 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800894
895 // Client sends 3 messages (tags 3, 4 and 5)
896 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
897 send_request.set_message("Ping " + std::to_string(tag_idx));
898 cli_stream->Write(send_request, tag(tag_idx));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700899 Verifier(GetParam().disable_blocking)
900 .Expect(tag_idx, true)
901 .Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800902 }
903 cli_stream->WritesDone(tag(6));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700904 Verifier(GetParam().disable_blocking).Expect(6, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800905
906 bool expected_server_cq_result = true;
907 bool ignore_cq_result = false;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800908 bool want_done_tag = false;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800909
910 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800911 srv_ctx.TryCancel();
Vijay Paidf8b62c2016-05-02 14:34:24 -0700912 Verifier(GetParam().disable_blocking).Expect(11, true).Verify(cq_.get());
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800913 EXPECT_TRUE(srv_ctx.IsCancelled());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800914
915 // Since cancellation is done before server reads any results, we know
916 // for sure that all cq results will return false from this point forward
917 expected_server_cq_result = false;
918 }
919
920 std::thread* server_try_cancel_thd = NULL;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800921
Vijay Paidf8b62c2016-05-02 14:34:24 -0700922 auto verif = Verifier(GetParam().disable_blocking);
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800923
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800924 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800925 server_try_cancel_thd =
926 new std::thread(&ServerContext::TryCancel, &srv_ctx);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800927 // Server will cancel the RPC in a parallel thread while reading the
928 // requests from the client. Since the cancellation can happen at anytime,
929 // some of the cq results (i.e those until cancellation) might be true but
930 // its non deterministic. So better to ignore the cq results
931 ignore_cq_result = true;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800932 // Expect that we might possibly see the done tag that
933 // indicates cancellation completion in this case
934 want_done_tag = true;
935 verif.Expect(11, true);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800936 }
937
938 // Server reads 3 messages (tags 6, 7 and 8)
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800939 // But if want_done_tag is true, we might also see tag 11
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800940 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
941 srv_stream.Read(&recv_request, tag(tag_idx));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800942 // Note that we'll add something to the verifier and verify that
943 // something was seen, but it might be tag 11 and not what we
944 // just added
945 int got_tag = verif.Expect(tag_idx, expected_server_cq_result)
946 .Next(cq_.get(), ignore_cq_result);
947 GPR_ASSERT((got_tag == tag_idx) || (got_tag == 11 && want_done_tag));
948 if (got_tag == 11) {
949 EXPECT_TRUE(srv_ctx.IsCancelled());
950 want_done_tag = false;
951 // Now get the other entry that we were waiting on
952 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), tag_idx);
953 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800954 }
955
956 if (server_try_cancel_thd != NULL) {
957 server_try_cancel_thd->join();
958 delete server_try_cancel_thd;
959 }
960
961 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800962 srv_ctx.TryCancel();
963 want_done_tag = true;
964 verif.Expect(11, true);
965 }
966
967 if (want_done_tag) {
968 verif.Verify(cq_.get());
969 EXPECT_TRUE(srv_ctx.IsCancelled());
970 want_done_tag = false;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800971 }
972
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800973 // The RPC has been cancelled at this point for sure (i.e irrespective of
974 // the value of `server_try_cancel` is). So, from this point forward, we
975 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800976
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800977 // Server sends the final message and cancelled status (but the RPC is
978 // already cancelled at this point. So we expect the operation to fail)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800979 srv_stream.Finish(send_response, Status::CANCELLED, tag(9));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700980 Verifier(GetParam().disable_blocking).Expect(9, false).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800981
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800982 // Client will see the cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800983 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla369a04a2016-02-01 10:53:13 -0800984 // TODO(sreek): The expectation here should be true. This is a bug (github
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800985 // issue #4972)
Vijay Paidf8b62c2016-05-02 14:34:24 -0700986 Verifier(GetParam().disable_blocking).Expect(10, false).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800987 EXPECT_FALSE(recv_status.ok());
988 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
989 }
990
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800991 // Helper for testing server-streaming RPCs which are cancelled on the server.
992 // Depending on the value of server_try_cancel parameter, this will test one
993 // of the following three scenarios:
994 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before sending
995 // any messages to the client
996 //
997 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while sending
998 // messages to the client
999 //
1000 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after sending all
1001 // messages to the client (but before sending any status back to the
1002 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001003 void TestServerStreamingServerCancel(
1004 ServerTryCancelRequestPhase server_try_cancel) {
1005 ResetStub();
1006
1007 EchoRequest send_request;
1008 EchoRequest recv_request;
1009 EchoResponse send_response;
1010 EchoResponse recv_response;
1011 Status recv_status;
1012 ClientContext cli_ctx;
1013 ServerContext srv_ctx;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001014 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
1015
1016 send_request.set_message("Ping");
1017 // Initiate the 'ResponseStream' call on the client
1018 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001019 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001020 Verifier(GetParam().disable_blocking).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001021 // On the server, request to be notified of 'ResponseStream' calls and
1022 // receive the call just made by the client
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001023 srv_ctx.AsyncNotifyWhenDone(tag(11));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001024 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
1025 cq_.get(), cq_.get(), tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001026 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001027 EXPECT_EQ(send_request.message(), recv_request.message());
1028
1029 bool expected_cq_result = true;
1030 bool ignore_cq_result = false;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001031 bool want_done_tag = false;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001032
1033 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001034 srv_ctx.TryCancel();
Vijay Paidf8b62c2016-05-02 14:34:24 -07001035 Verifier(GetParam().disable_blocking).Expect(11, true).Verify(cq_.get());
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001036 EXPECT_TRUE(srv_ctx.IsCancelled());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001037
1038 // We know for sure that all cq results will be false from this point
1039 // since the server cancelled the RPC
1040 expected_cq_result = false;
1041 }
1042
1043 std::thread* server_try_cancel_thd = NULL;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001044
Vijay Paidf8b62c2016-05-02 14:34:24 -07001045 auto verif = Verifier(GetParam().disable_blocking);
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001046
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001047 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001048 server_try_cancel_thd =
1049 new std::thread(&ServerContext::TryCancel, &srv_ctx);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001050
1051 // Server will cancel the RPC in a parallel thread while writing responses
1052 // to the client. Since the cancellation can happen at anytime, some of
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001053 // the cq results (i.e those until cancellation) might be true but it is
1054 // non deterministic. So better to ignore the cq results
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001055 ignore_cq_result = true;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001056 // Expect that we might possibly see the done tag that
1057 // indicates cancellation completion in this case
1058 want_done_tag = true;
1059 verif.Expect(11, true);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001060 }
1061
1062 // Server sends three messages (tags 3, 4 and 5)
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001063 // But if want_done tag is true, we might also see tag 11
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001064 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
1065 send_response.set_message("Pong " + std::to_string(tag_idx));
1066 srv_stream.Write(send_response, tag(tag_idx));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001067 // Note that we'll add something to the verifier and verify that
1068 // something was seen, but it might be tag 11 and not what we
1069 // just added
1070 int got_tag = verif.Expect(tag_idx, expected_cq_result)
1071 .Next(cq_.get(), ignore_cq_result);
1072 GPR_ASSERT((got_tag == tag_idx) || (got_tag == 11 && want_done_tag));
1073 if (got_tag == 11) {
1074 EXPECT_TRUE(srv_ctx.IsCancelled());
1075 want_done_tag = false;
1076 // Now get the other entry that we were waiting on
1077 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), tag_idx);
1078 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001079 }
1080
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001081 if (server_try_cancel_thd != NULL) {
1082 server_try_cancel_thd->join();
1083 delete server_try_cancel_thd;
1084 }
1085
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001086 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001087 srv_ctx.TryCancel();
1088 want_done_tag = true;
1089 verif.Expect(11, true);
yang-gad0df7b2016-02-22 10:00:20 -08001090
1091 // Client reads may fail bacause it is notified that the stream is
1092 // cancelled.
1093 ignore_cq_result = true;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001094 }
1095
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001096 if (want_done_tag) {
1097 verif.Verify(cq_.get());
1098 EXPECT_TRUE(srv_ctx.IsCancelled());
1099 want_done_tag = false;
1100 }
1101
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001102 // Client attemts to read the three messages from the server
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001103 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
1104 cli_stream->Read(&recv_response, tag(tag_idx));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001105 Verifier(GetParam().disable_blocking)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001106 .Expect(tag_idx, expected_cq_result)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001107 .Verify(cq_.get(), ignore_cq_result);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001108 }
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
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001114 // Server finishes the stream (but the RPC is already cancelled)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001115 srv_stream.Finish(Status::CANCELLED, tag(9));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001116 Verifier(GetParam().disable_blocking).Expect(9, false).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001117
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001118 // Client will see the cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001119 cli_stream->Finish(&recv_status, tag(10));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001120 Verifier(GetParam().disable_blocking).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001121 EXPECT_FALSE(recv_status.ok());
1122 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
1123 }
1124
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001125 // Helper for testing bidirectinal-streaming RPCs which are cancelled on the
1126 // server.
1127 //
1128 // Depending on the value of server_try_cancel parameter, this will
1129 // test one of the following three scenarios:
1130 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading/
1131 // writing any messages from/to the client
1132 //
1133 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
1134 // messages from the client
1135 //
1136 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
1137 // messages from the client (but before sending any status back to the
1138 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001139 void TestBidiStreamingServerCancel(
1140 ServerTryCancelRequestPhase server_try_cancel) {
1141 ResetStub();
1142
1143 EchoRequest send_request;
1144 EchoRequest recv_request;
1145 EchoResponse send_response;
1146 EchoResponse recv_response;
1147 Status recv_status;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001148 ClientContext cli_ctx;
1149 ServerContext srv_ctx;
1150 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
1151
1152 // Initiate the call from the client side
1153 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001154 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001155 Verifier(GetParam().disable_blocking).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001156
1157 // On the server, request to be notified of the 'BidiStream' call and
1158 // receive the call just made by the client
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001159 srv_ctx.AsyncNotifyWhenDone(tag(11));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001160 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
1161 tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001162 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001163
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001164 // Client sends the first and the only message
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001165 send_request.set_message("Ping");
1166 cli_stream->Write(send_request, tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001167 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001168
1169 bool expected_cq_result = true;
1170 bool ignore_cq_result = false;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001171 bool want_done_tag = false;
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001172
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001173 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001174 srv_ctx.TryCancel();
Vijay Paidf8b62c2016-05-02 14:34:24 -07001175 Verifier(GetParam().disable_blocking).Expect(11, true).Verify(cq_.get());
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001176 EXPECT_TRUE(srv_ctx.IsCancelled());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001177
1178 // We know for sure that all cq results will be false from this point
1179 // since the server cancelled the RPC
1180 expected_cq_result = false;
1181 }
1182
1183 std::thread* server_try_cancel_thd = NULL;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001184
Vijay Paidf8b62c2016-05-02 14:34:24 -07001185 auto verif = Verifier(GetParam().disable_blocking);
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001186
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001187 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001188 server_try_cancel_thd =
1189 new std::thread(&ServerContext::TryCancel, &srv_ctx);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001190
1191 // Since server is going to cancel the RPC in a parallel thread, some of
1192 // the cq results (i.e those until the cancellation) might be true. Since
1193 // that number is non-deterministic, it is better to ignore the cq results
1194 ignore_cq_result = true;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001195 // Expect that we might possibly see the done tag that
1196 // indicates cancellation completion in this case
1197 want_done_tag = true;
1198 verif.Expect(11, true);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001199 }
1200
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001201 int got_tag;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001202 srv_stream.Read(&recv_request, tag(4));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001203 verif.Expect(4, expected_cq_result);
1204 got_tag = verif.Next(cq_.get(), ignore_cq_result);
1205 GPR_ASSERT((got_tag == 4) || (got_tag == 11 && want_done_tag));
1206 if (got_tag == 11) {
1207 EXPECT_TRUE(srv_ctx.IsCancelled());
1208 want_done_tag = false;
1209 // Now get the other entry that we were waiting on
1210 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 4);
1211 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001212
1213 send_response.set_message("Pong");
1214 srv_stream.Write(send_response, tag(5));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001215 verif.Expect(5, expected_cq_result);
1216 got_tag = verif.Next(cq_.get(), ignore_cq_result);
1217 GPR_ASSERT((got_tag == 5) || (got_tag == 11 && want_done_tag));
1218 if (got_tag == 11) {
1219 EXPECT_TRUE(srv_ctx.IsCancelled());
1220 want_done_tag = false;
1221 // Now get the other entry that we were waiting on
1222 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 5);
1223 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001224
1225 cli_stream->Read(&recv_response, tag(6));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001226 verif.Expect(6, expected_cq_result);
1227 got_tag = verif.Next(cq_.get(), ignore_cq_result);
1228 GPR_ASSERT((got_tag == 6) || (got_tag == 11 && want_done_tag));
1229 if (got_tag == 11) {
1230 EXPECT_TRUE(srv_ctx.IsCancelled());
1231 want_done_tag = false;
1232 // Now get the other entry that we were waiting on
1233 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 6);
1234 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001235
1236 // This is expected to succeed in all cases
1237 cli_stream->WritesDone(tag(7));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001238 verif.Expect(7, true);
1239 got_tag = verif.Next(cq_.get(), ignore_cq_result);
1240 GPR_ASSERT((got_tag == 7) || (got_tag == 11 && want_done_tag));
1241 if (got_tag == 11) {
1242 EXPECT_TRUE(srv_ctx.IsCancelled());
1243 want_done_tag = false;
1244 // Now get the other entry that we were waiting on
1245 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 7);
1246 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001247
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001248 // This is expected to fail in all cases i.e for all values of
Vijay Pai018879a2016-02-16 09:20:50 -08001249 // server_try_cancel. This is because at this point, either there are no
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001250 // more msgs from the client (because client called WritesDone) or the RPC
1251 // is cancelled on the server
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001252 srv_stream.Read(&recv_request, tag(8));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001253 verif.Expect(8, false);
1254 got_tag = verif.Next(cq_.get(), ignore_cq_result);
1255 GPR_ASSERT((got_tag == 8) || (got_tag == 11 && want_done_tag));
1256 if (got_tag == 11) {
1257 EXPECT_TRUE(srv_ctx.IsCancelled());
1258 want_done_tag = false;
1259 // Now get the other entry that we were waiting on
1260 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 8);
1261 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001262
1263 if (server_try_cancel_thd != NULL) {
1264 server_try_cancel_thd->join();
1265 delete server_try_cancel_thd;
1266 }
1267
1268 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001269 srv_ctx.TryCancel();
1270 want_done_tag = true;
1271 verif.Expect(11, true);
1272 }
1273
1274 if (want_done_tag) {
1275 verif.Verify(cq_.get());
1276 EXPECT_TRUE(srv_ctx.IsCancelled());
1277 want_done_tag = false;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001278 }
1279
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001280 // The RPC has been cancelled at this point for sure (i.e irrespective of
1281 // the value of `server_try_cancel` is). So, from this point forward, we
1282 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001283
1284 srv_stream.Finish(Status::CANCELLED, tag(9));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001285 Verifier(GetParam().disable_blocking).Expect(9, false).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001286
1287 cli_stream->Finish(&recv_status, tag(10));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001288 Verifier(GetParam().disable_blocking).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001289 EXPECT_FALSE(recv_status.ok());
1290 EXPECT_EQ(grpc::StatusCode::CANCELLED, recv_status.error_code());
1291 }
1292};
1293
1294TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelBefore) {
1295 TestClientStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1296}
1297
1298TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelDuring) {
1299 TestClientStreamingServerCancel(CANCEL_DURING_PROCESSING);
1300}
1301
1302TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelAfter) {
1303 TestClientStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1304}
1305
1306TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelBefore) {
1307 TestServerStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1308}
1309
1310TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelDuring) {
1311 TestServerStreamingServerCancel(CANCEL_DURING_PROCESSING);
1312}
1313
1314TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelAfter) {
1315 TestServerStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1316}
1317
1318TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelBefore) {
1319 TestBidiStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1320}
1321
1322TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelDuring) {
1323 TestBidiStreamingServerCancel(CANCEL_DURING_PROCESSING);
1324}
1325
1326TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelAfter) {
1327 TestBidiStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1328}
1329
Vijay Paidf8b62c2016-05-02 14:34:24 -07001330std::vector<TestScenario> CreateTestScenarios(bool test_disable_blocking,
Vijay Paid7b1e702016-05-02 15:10:21 -07001331 bool test_secure,
1332 int test_big_limit) {
Vijay Paidf8b62c2016-05-02 14:34:24 -07001333 std::vector<TestScenario> scenarios;
1334 std::vector<grpc::string> credentials_types;
Vijay Paid7b1e702016-05-02 15:10:21 -07001335 std::vector<grpc::string> messages;
1336
Vijay Paidf8b62c2016-05-02 14:34:24 -07001337 credentials_types.push_back(kInsecureCredentialsType);
Vijay Paid7b1e702016-05-02 15:10:21 -07001338 auto sec_list = GetSecureCredentialsTypeList();
1339 for (auto sec = sec_list.begin(); sec != sec_list.end(); sec++) {
1340 credentials_types.push_back(*sec);
1341 }
1342
1343 messages.push_back("Hello");
1344 for (int sz = 1; sz < test_big_limit; sz *= 2) {
1345 grpc::string big_msg;
1346 for (int i = 0; i < sz * 1024; i++) {
1347 char c = 'a' + (i % 26);
1348 big_msg += c;
1349 }
1350 messages.push_back(big_msg);
1351 }
1352
1353 for (auto cred = credentials_types.begin(); cred != credentials_types.end();
1354 ++cred) {
1355 for (auto msg = messages.begin(); msg != messages.end(); msg++) {
1356 scenarios.push_back(TestScenario(false, *cred, *msg));
1357 if (test_disable_blocking) {
1358 scenarios.push_back(TestScenario(true, *cred, *msg));
1359 }
Vijay Paidf8b62c2016-05-02 14:34:24 -07001360 }
1361 }
1362 return scenarios;
1363}
1364
Craig Tiller4c06b822015-08-06 08:41:31 -07001365INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest,
Vijay Paid7b1e702016-05-02 15:10:21 -07001366 ::testing::ValuesIn(CreateTestScenarios(true, true,
1367 1024)));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001368INSTANTIATE_TEST_CASE_P(AsyncEnd2endServerTryCancel,
1369 AsyncEnd2endServerTryCancelTest,
Vijay Paid7b1e702016-05-02 15:10:21 -07001370 ::testing::ValuesIn(CreateTestScenarios(false, false,
1371 0)));
Craig Tiller69f90e62015-08-06 08:32:35 -07001372
Craig Tiller0220cf12015-02-12 17:39:26 -08001373} // namespace
1374} // namespace testing
1375} // namespace grpc
1376
1377int main(int argc, char** argv) {
1378 grpc_test_init(argc, argv);
Vijay Paib65eda42016-02-16 13:48:05 -08001379 gpr_tls_init(&g_is_async_end2end_test);
Craig Tiller0220cf12015-02-12 17:39:26 -08001380 ::testing::InitGoogleTest(&argc, argv);
Vijay Paib65eda42016-02-16 13:48:05 -08001381 int ret = RUN_ALL_TESTS();
1382 gpr_tls_destroy(&g_is_async_end2end_test);
1383 return ret;
Craig Tiller0220cf12015-02-12 17:39:26 -08001384}