blob: 6c7eae53a40bd0a97c4c23c5e9161ebe1ef2226d [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
Vijay Paib31a9a02016-06-16 07:50:20 +000034#include <cinttypes>
Yang Gaoda699b82015-02-18 01:10:22 -080035#include <memory>
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -080036#include <thread>
Craig Tiller0220cf12015-02-12 17:39:26 -080037
yang-g8c2be9f2015-08-19 16:28:09 -070038#include <grpc++/channel.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080039#include <grpc++/client_context.h>
40#include <grpc++/create_channel.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080041#include <grpc++/server.h>
42#include <grpc++/server_builder.h>
43#include <grpc++/server_context.h>
Sree Kuchibhotlab0d0c8e2016-01-13 22:52:17 -080044#include <grpc/grpc.h>
45#include <grpc/support/thd.h>
46#include <grpc/support/time.h>
Vijay Paib65eda42016-02-16 13:48:05 -080047#include <grpc/support/tls.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080048#include <gtest/gtest.h>
49
Craig Tiller1b4e3302015-12-17 16:35:00 -080050#include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h"
51#include "src/proto/grpc/testing/echo.grpc.pb.h"
Sree Kuchibhotlab0d0c8e2016-01-13 22:52:17 -080052#include "test/core/util/port.h"
53#include "test/core/util/test_config.h"
yang-ge21908f2015-08-25 13:47:51 -070054#include "test/cpp/util/string_ref_helper.h"
Vijay Paidf8b62c2016-05-02 14:34:24 -070055#include "test/cpp/util/test_credentials_provider.h"
Craig Tiller0220cf12015-02-12 17:39:26 -080056
Craig Tiller69f90e62015-08-06 08:32:35 -070057#ifdef GPR_POSIX_SOCKET
Craig Tillerf45496f2016-03-30 07:41:19 -070058#include "src/core/lib/iomgr/ev_posix.h"
Craig Tiller69f90e62015-08-06 08:32:35 -070059#endif
60
Craig Tiller1b4e3302015-12-17 16:35:00 -080061using grpc::testing::EchoRequest;
62using grpc::testing::EchoResponse;
Vijay Paidf8b62c2016-05-02 14:34:24 -070063using grpc::testing::kTlsCredentialsType;
Craig Tiller0220cf12015-02-12 17:39:26 -080064using std::chrono::system_clock;
65
Vijay Paib65eda42016-02-16 13:48:05 -080066GPR_TLS_DECL(g_is_async_end2end_test);
67
Craig Tiller0220cf12015-02-12 17:39:26 -080068namespace grpc {
69namespace testing {
70
71namespace {
72
Craig Tiller7536af02015-12-22 13:49:30 -080073void* tag(int i) { return (void*)(intptr_t)i; }
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -080074int detag(void* p) { return static_cast<int>(reinterpret_cast<intptr_t>(p)); }
Yang Gaoc05b6cb2015-02-13 00:34:10 -080075
Craig Tiller69f90e62015-08-06 08:32:35 -070076#ifdef GPR_POSIX_SOCKET
Vijay Paib65eda42016-02-16 13:48:05 -080077static int maybe_assert_non_blocking_poll(struct pollfd* pfds, nfds_t nfds,
78 int timeout) {
79 if (gpr_tls_get(&g_is_async_end2end_test)) {
80 GPR_ASSERT(timeout == 0);
81 }
82 return poll(pfds, nfds, timeout);
Craig Tiller69f90e62015-08-06 08:32:35 -070083}
84
85class PollOverride {
Craig Tiller06cf3cc2015-05-13 13:11:01 -070086 public:
Craig Tiller69f90e62015-08-06 08:32:35 -070087 PollOverride(grpc_poll_function_type f) {
88 prev_ = grpc_poll_function;
89 grpc_poll_function = f;
90 }
91
Craig Tiller4c06b822015-08-06 08:41:31 -070092 ~PollOverride() { grpc_poll_function = prev_; }
Craig Tiller69f90e62015-08-06 08:32:35 -070093
94 private:
95 grpc_poll_function_type prev_;
96};
97
vjpaicf4daeb2016-02-15 02:33:54 -080098class PollingOverrider : public PollOverride {
Craig Tiller69f90e62015-08-06 08:32:35 -070099 public:
vjpaicf4daeb2016-02-15 02:33:54 -0800100 explicit PollingOverrider(bool allow_blocking)
Vijay Paib65eda42016-02-16 13:48:05 -0800101 : PollOverride(allow_blocking ? poll : maybe_assert_non_blocking_poll) {}
Craig Tiller69f90e62015-08-06 08:32:35 -0700102};
103#else
vjpaicf4daeb2016-02-15 02:33:54 -0800104class PollingOverrider {
Craig Tiller69f90e62015-08-06 08:32:35 -0700105 public:
vjpaicf4daeb2016-02-15 02:33:54 -0800106 explicit PollingOverrider(bool allow_blocking) {}
Craig Tiller69f90e62015-08-06 08:32:35 -0700107};
108#endif
109
vjpaicf4daeb2016-02-15 02:33:54 -0800110class Verifier {
Craig Tiller69f90e62015-08-06 08:32:35 -0700111 public:
vjpaicf4daeb2016-02-15 02:33:54 -0800112 explicit Verifier(bool spin) : spin_(spin) {}
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800113 // Expect sets the expected ok value for a specific tag
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700114 Verifier& Expect(int i, bool expect_ok) {
115 expectations_[tag(i)] = expect_ok;
116 return *this;
vjpai7aadf462015-03-16 23:58:44 -0700117 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800118
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800119 // Next waits for 1 async tag to complete, checks its
120 // expectations, and returns the tag
121 int Next(CompletionQueue* cq, bool ignore_ok) {
122 bool ok;
123 void* got_tag;
124 if (spin_) {
125 for (;;) {
126 auto r = cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
127 if (r == CompletionQueue::TIMEOUT) continue;
128 if (r == CompletionQueue::GOT_EVENT) break;
129 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
130 abort();
131 }
132 } else {
133 EXPECT_TRUE(cq->Next(&got_tag, &ok));
134 }
135 auto it = expectations_.find(got_tag);
136 EXPECT_TRUE(it != expectations_.end());
137 if (!ignore_ok) {
138 EXPECT_EQ(it->second, ok);
139 }
140 expectations_.erase(it);
141 return detag(got_tag);
142 }
143
144 // Verify keeps calling Next until all currently set
145 // expected tags are complete
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800146 void Verify(CompletionQueue* cq) { Verify(cq, false); }
147
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800148 // This version of Verify allows optionally ignoring the
149 // outcome of the expectation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800150 void Verify(CompletionQueue* cq, bool ignore_ok) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700151 GPR_ASSERT(!expectations_.empty());
152 while (!expectations_.empty()) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800153 Next(cq, ignore_ok);
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700154 }
155 }
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800156 // This version of Verify stops after a certain deadline
Craig Tillerd6c98df2015-08-18 09:33:44 -0700157 void Verify(CompletionQueue* cq,
158 std::chrono::system_clock::time_point deadline) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700159 if (expectations_.empty()) {
160 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700161 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700162 if (spin_) {
163 while (std::chrono::system_clock::now() < deadline) {
Craig Tiller4c06b822015-08-06 08:41:31 -0700164 EXPECT_EQ(
165 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)),
166 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700167 }
168 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700169 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
170 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700171 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700172 } else {
173 while (!expectations_.empty()) {
174 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700175 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700176 if (spin_) {
177 for (;;) {
178 GPR_ASSERT(std::chrono::system_clock::now() < deadline);
Craig Tiller4c06b822015-08-06 08:41:31 -0700179 auto r =
180 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
Craig Tiller69f90e62015-08-06 08:32:35 -0700181 if (r == CompletionQueue::TIMEOUT) continue;
182 if (r == CompletionQueue::GOT_EVENT) break;
183 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
184 abort();
Craig Tiller4c06b822015-08-06 08:41:31 -0700185 }
Craig Tiller69f90e62015-08-06 08:32:35 -0700186 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700187 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
188 CompletionQueue::GOT_EVENT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700189 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700190 auto it = expectations_.find(got_tag);
191 EXPECT_TRUE(it != expectations_.end());
192 EXPECT_EQ(it->second, ok);
193 expectations_.erase(it);
194 }
195 }
196 }
197
198 private:
199 std::map<void*, bool> expectations_;
Craig Tiller69f90e62015-08-06 08:32:35 -0700200 bool spin_;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700201};
vjpai7aadf462015-03-16 23:58:44 -0700202
Yuchen Zenga42ec212016-04-29 13:03:06 -0700203// This class disables the server builder plugins that may add sync services to
204// the server. If there are sync services, UnimplementedRpc test will triger
205// the sync unkown rpc routine on the server side, rather than the async one
206// that needs to be tested here.
207class ServerBuilderSyncPluginDisabler : public ::grpc::ServerBuilderOption {
208 public:
209 void UpdateArguments(ChannelArguments* arg) GRPC_OVERRIDE {}
210
vjpai97da6472016-06-13 09:56:26 -0700211 void UpdatePlugins(std::vector<std::unique_ptr<ServerBuilderPlugin>>* plugins)
Yuchen Zenga42ec212016-04-29 13:03:06 -0700212 GRPC_OVERRIDE {
213 auto plugin = plugins->begin();
214 while (plugin != plugins->end()) {
Vijay Pai15855f32016-06-10 12:25:32 -0700215 if ((*plugin)->has_sync_methods()) {
Yuchen Zenga42ec212016-04-29 13:03:06 -0700216 plugins->erase(plugin++);
217 } else {
218 plugin++;
219 }
220 }
221 }
222};
223
Vijay Paidf8b62c2016-05-02 14:34:24 -0700224class TestScenario {
225 public:
Vijay Paid7b1e702016-05-02 15:10:21 -0700226 TestScenario(bool non_block, const grpc::string& creds_type,
227 const grpc::string& content)
228 : disable_blocking(non_block),
229 credentials_type(creds_type),
230 message_content(content) {}
231 void Log() const {
Yuchen Zengbeaa3572016-06-10 15:46:14 -0700232 gpr_log(
233 GPR_INFO,
234 "Scenario: disable_blocking %d, credentials %s, message size %" PRIuPTR,
235 disable_blocking, credentials_type.c_str(), message_content.size());
Vijay Paid7b1e702016-05-02 15:10:21 -0700236 }
Vijay Paidf8b62c2016-05-02 14:34:24 -0700237 bool disable_blocking;
Vijay Pai679c75f2016-06-15 13:08:00 -0700238 // Although the below grpc::string's are logically const, we can't declare
239 // them const because of a limitation in the way old compilers (e.g., gcc-4.4)
240 // manage vector insertion using a copy constructor
241 grpc::string credentials_type;
242 grpc::string message_content;
Vijay Paidf8b62c2016-05-02 14:34:24 -0700243};
244
245class AsyncEnd2endTest : public ::testing::TestWithParam<TestScenario> {
Craig Tiller0220cf12015-02-12 17:39:26 -0800246 protected:
Vijay Paid7b1e702016-05-02 15:10:21 -0700247 AsyncEnd2endTest() { GetParam().Log(); }
Craig Tiller0220cf12015-02-12 17:39:26 -0800248
Craig Tillercf133f42015-02-26 14:05:56 -0800249 void SetUp() GRPC_OVERRIDE {
Vijay Paidf8b62c2016-05-02 14:34:24 -0700250 poll_overrider_.reset(new PollingOverrider(!GetParam().disable_blocking));
Vijay Pai018879a2016-02-16 09:20:50 -0800251
David Klempner6fb122d2016-05-13 15:24:17 -0700252 port_ = grpc_pick_unused_port_or_die();
253 server_address_ << "localhost:" << port_;
vjpai017ed622015-12-09 10:42:54 -0800254
Craig Tiller0220cf12015-02-12 17:39:26 -0800255 // Setup server
256 ServerBuilder builder;
Vijay Paidf8b62c2016-05-02 14:34:24 -0700257 auto server_creds = GetServerCredentials(GetParam().credentials_type);
258 builder.AddListeningPort(server_address_.str(), server_creds);
Craig Tiller15f383c2016-01-07 12:45:32 -0800259 builder.RegisterService(&service_);
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700260 cq_ = builder.AddCompletionQueue();
Yuchen Zenga42ec212016-04-29 13:03:06 -0700261
262 // TODO(zyc): make a test option to choose wheather sync plugins should be
263 // deleted
264 std::unique_ptr<ServerBuilderOption> sync_plugin_disabler(
265 new ServerBuilderSyncPluginDisabler());
266 builder.SetOption(move(sync_plugin_disabler));
Craig Tiller0220cf12015-02-12 17:39:26 -0800267 server_ = builder.BuildAndStart();
Vijay Paib65eda42016-02-16 13:48:05 -0800268
269 gpr_tls_set(&g_is_async_end2end_test, 1);
Craig Tiller0220cf12015-02-12 17:39:26 -0800270 }
271
Craig Tillercf133f42015-02-26 14:05:56 -0800272 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800273 server_->Shutdown();
274 void* ignored_tag;
275 bool ignored_ok;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700276 cq_->Shutdown();
277 while (cq_->Next(&ignored_tag, &ignored_ok))
Craig Tiller492968f2015-02-18 13:14:03 -0800278 ;
Vijay Pai018879a2016-02-16 09:20:50 -0800279 poll_overrider_.reset();
Vijay Paib65eda42016-02-16 13:48:05 -0800280 gpr_tls_set(&g_is_async_end2end_test, 0);
David Klempner6fb122d2016-05-13 15:24:17 -0700281 grpc_recycle_unused_port(port_);
Craig Tiller492968f2015-02-18 13:14:03 -0800282 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800283
284 void ResetStub() {
Vijay Paidf8b62c2016-05-02 14:34:24 -0700285 ChannelArguments args;
286 auto channel_creds =
287 GetChannelCredentials(GetParam().credentials_type, &args);
yang-g730055d2015-08-27 12:29:45 -0700288 std::shared_ptr<Channel> channel =
Vijay Paidf8b62c2016-05-02 14:34:24 -0700289 CreateCustomChannel(server_address_.str(), channel_creds, args);
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800290 stub_ = grpc::testing::EchoTestService::NewStub(channel);
Craig Tiller0220cf12015-02-12 17:39:26 -0800291 }
292
Yang Gao406b32f2015-02-13 16:25:33 -0800293 void SendRpc(int num_rpcs) {
294 for (int i = 0; i < num_rpcs; i++) {
295 EchoRequest send_request;
296 EchoRequest recv_request;
297 EchoResponse send_response;
298 EchoResponse recv_response;
299 Status recv_status;
300
301 ClientContext cli_ctx;
302 ServerContext srv_ctx;
303 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
304
Vijay Paid7b1e702016-05-02 15:10:21 -0700305 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800306 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700307 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800308
Craig Tillerd6c98df2015-08-18 09:33:44 -0700309 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
310 cq_.get(), tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800311
Vijay Paidf8b62c2016-05-02 14:34:24 -0700312 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800313 EXPECT_EQ(send_request.message(), recv_request.message());
314
315 send_response.set_message(recv_request.message());
316 response_writer.Finish(send_response, Status::OK, tag(3));
Yang Gao3a5e5492015-02-18 14:32:38 -0800317 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tillere4d27482016-05-03 12:19:33 -0700318 Verifier(GetParam().disable_blocking)
319 .Expect(3, true)
320 .Expect(4, true)
321 .Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800322
323 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700324 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800325 }
326 }
327
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700328 std::unique_ptr<ServerCompletionQueue> cq_;
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800329 std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800330 std::unique_ptr<Server> server_;
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800331 grpc::testing::EchoTestService::AsyncService service_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800332 std::ostringstream server_address_;
David Klempner6fb122d2016-05-13 15:24:17 -0700333 int port_;
vjpaicf4daeb2016-02-15 02:33:54 -0800334
Vijay Pai018879a2016-02-16 09:20:50 -0800335 std::unique_ptr<PollingOverrider> poll_overrider_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800336};
337
Craig Tiller69f90e62015-08-06 08:32:35 -0700338TEST_P(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800339 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800340 SendRpc(1);
341}
Yang Gaobb84a302015-02-12 23:30:12 -0800342
Craig Tiller69f90e62015-08-06 08:32:35 -0700343TEST_P(AsyncEnd2endTest, SequentialRpcs) {
Yang Gao406b32f2015-02-13 16:25:33 -0800344 ResetStub();
345 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800346}
347
vjpai7aadf462015-03-16 23:58:44 -0700348// Test a simple RPC using the async version of Next
Craig Tiller69f90e62015-08-06 08:32:35 -0700349TEST_P(AsyncEnd2endTest, AsyncNextRpc) {
vjpai7aadf462015-03-16 23:58:44 -0700350 ResetStub();
351
352 EchoRequest send_request;
353 EchoRequest recv_request;
354 EchoResponse send_response;
355 EchoResponse recv_response;
356 Status recv_status;
357
358 ClientContext cli_ctx;
359 ServerContext srv_ctx;
360 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
361
Vijay Paid7b1e702016-05-02 15:10:21 -0700362 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800363 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700364 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
vjpai7aadf462015-03-16 23:58:44 -0700365
Yang Gao757afae2015-03-17 15:49:26 -0700366 std::chrono::system_clock::time_point time_now(
Craig Tillerf51199f2015-05-08 09:32:53 -0700367 std::chrono::system_clock::now());
368 std::chrono::system_clock::time_point time_limit(
369 std::chrono::system_clock::now() + std::chrono::seconds(10));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700370 Verifier(GetParam().disable_blocking).Verify(cq_.get(), time_now);
371 Verifier(GetParam().disable_blocking).Verify(cq_.get(), time_now);
vjpai7aadf462015-03-16 23:58:44 -0700372
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700373 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
374 cq_.get(), tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700375
Vijay Paidf8b62c2016-05-02 14:34:24 -0700376 Verifier(GetParam().disable_blocking)
377 .Expect(2, true)
378 .Verify(cq_.get(), time_limit);
vjpai7aadf462015-03-16 23:58:44 -0700379 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700380
381 send_response.set_message(recv_request.message());
382 response_writer.Finish(send_response, Status::OK, tag(3));
vjpai7aadf462015-03-16 23:58:44 -0700383 response_reader->Finish(&recv_response, &recv_status, tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700384 Verifier(GetParam().disable_blocking)
Craig Tillere4d27482016-05-03 12:19:33 -0700385 .Expect(3, true)
Craig Tiller4c06b822015-08-06 08:41:31 -0700386 .Expect(4, true)
387 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700388
389 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700390 EXPECT_TRUE(recv_status.ok());
vjpai7aadf462015-03-16 23:58:44 -0700391}
Yang Gao757afae2015-03-17 15:49:26 -0700392
Yang Gao0e0d8e12015-02-13 14:40:41 -0800393// Two pings and a final pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700394TEST_P(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800395 ResetStub();
396
397 EchoRequest send_request;
398 EchoRequest recv_request;
399 EchoResponse send_response;
400 EchoResponse recv_response;
401 Status recv_status;
402 ClientContext cli_ctx;
403 ServerContext srv_ctx;
404 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
405
Vijay Paid7b1e702016-05-02 15:10:21 -0700406 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800407 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700408 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800409
Craig Tillerd6c98df2015-08-18 09:33:44 -0700410 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
411 tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800412
Vijay Paidf8b62c2016-05-02 14:34:24 -0700413 Verifier(GetParam().disable_blocking)
414 .Expect(2, true)
415 .Expect(1, true)
416 .Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800417
418 cli_stream->Write(send_request, tag(3));
Yang Gao005f18a2015-02-13 10:22:33 -0800419 srv_stream.Read(&recv_request, tag(4));
Craig Tillere4d27482016-05-03 12:19:33 -0700420 Verifier(GetParam().disable_blocking)
421 .Expect(3, true)
422 .Expect(4, true)
423 .Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800424 EXPECT_EQ(send_request.message(), recv_request.message());
425
426 cli_stream->Write(send_request, tag(5));
Yang Gao005f18a2015-02-13 10:22:33 -0800427 srv_stream.Read(&recv_request, tag(6));
Craig Tillere4d27482016-05-03 12:19:33 -0700428 Verifier(GetParam().disable_blocking)
429 .Expect(5, true)
430 .Expect(6, true)
431 .Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800432
433 EXPECT_EQ(send_request.message(), recv_request.message());
434 cli_stream->WritesDone(tag(7));
Yang Gao005f18a2015-02-13 10:22:33 -0800435 srv_stream.Read(&recv_request, tag(8));
Craig Tillere4d27482016-05-03 12:19:33 -0700436 Verifier(GetParam().disable_blocking)
437 .Expect(7, true)
438 .Expect(8, false)
439 .Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800440
441 send_response.set_message(recv_request.message());
442 srv_stream.Finish(send_response, Status::OK, tag(9));
Yang Gao005f18a2015-02-13 10:22:33 -0800443 cli_stream->Finish(&recv_status, tag(10));
Craig Tillere4d27482016-05-03 12:19:33 -0700444 Verifier(GetParam().disable_blocking)
445 .Expect(9, true)
446 .Expect(10, true)
447 .Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800448
449 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700450 EXPECT_TRUE(recv_status.ok());
Yang Gao005f18a2015-02-13 10:22:33 -0800451}
452
Yang Gao0e0d8e12015-02-13 14:40:41 -0800453// One ping, two pongs.
Craig Tiller69f90e62015-08-06 08:32:35 -0700454TEST_P(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800455 ResetStub();
456
457 EchoRequest send_request;
458 EchoRequest recv_request;
459 EchoResponse send_response;
460 EchoResponse recv_response;
461 Status recv_status;
462 ClientContext cli_ctx;
463 ServerContext srv_ctx;
464 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
465
Vijay Paid7b1e702016-05-02 15:10:21 -0700466 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800467 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700468 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800469
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700470 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700471 cq_.get(), cq_.get(), tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800472
Vijay Paidf8b62c2016-05-02 14:34:24 -0700473 Verifier(GetParam().disable_blocking)
474 .Expect(1, true)
475 .Expect(2, true)
476 .Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800477 EXPECT_EQ(send_request.message(), recv_request.message());
478
479 send_response.set_message(recv_request.message());
480 srv_stream.Write(send_response, tag(3));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800481 cli_stream->Read(&recv_response, tag(4));
Craig Tillere4d27482016-05-03 12:19:33 -0700482 Verifier(GetParam().disable_blocking)
483 .Expect(3, true)
484 .Expect(4, true)
485 .Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800486 EXPECT_EQ(send_response.message(), recv_response.message());
487
488 srv_stream.Write(send_response, tag(5));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800489 cli_stream->Read(&recv_response, tag(6));
Craig Tillere4d27482016-05-03 12:19:33 -0700490 Verifier(GetParam().disable_blocking)
491 .Expect(5, true)
492 .Expect(6, true)
493 .Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800494 EXPECT_EQ(send_response.message(), recv_response.message());
495
496 srv_stream.Finish(Status::OK, tag(7));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800497 cli_stream->Read(&recv_response, tag(8));
Craig Tillere4d27482016-05-03 12:19:33 -0700498 Verifier(GetParam().disable_blocking)
499 .Expect(7, true)
500 .Expect(8, false)
501 .Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800502
503 cli_stream->Finish(&recv_status, tag(9));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700504 Verifier(GetParam().disable_blocking).Expect(9, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800505
Yang Gaoc1a2c312015-06-16 10:59:46 -0700506 EXPECT_TRUE(recv_status.ok());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800507}
508
509// One ping, one pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700510TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800511 ResetStub();
512
513 EchoRequest send_request;
514 EchoRequest recv_request;
515 EchoResponse send_response;
516 EchoResponse recv_response;
517 Status recv_status;
518 ClientContext cli_ctx;
519 ServerContext srv_ctx;
520 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
521
Vijay Paid7b1e702016-05-02 15:10:21 -0700522 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800523 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700524 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800525
Craig Tillerd6c98df2015-08-18 09:33:44 -0700526 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
527 tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800528
Vijay Paidf8b62c2016-05-02 14:34:24 -0700529 Verifier(GetParam().disable_blocking)
530 .Expect(1, true)
531 .Expect(2, true)
532 .Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800533
534 cli_stream->Write(send_request, tag(3));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800535 srv_stream.Read(&recv_request, tag(4));
Craig Tillere4d27482016-05-03 12:19:33 -0700536 Verifier(GetParam().disable_blocking)
537 .Expect(3, true)
538 .Expect(4, true)
539 .Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800540 EXPECT_EQ(send_request.message(), recv_request.message());
541
542 send_response.set_message(recv_request.message());
543 srv_stream.Write(send_response, tag(5));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800544 cli_stream->Read(&recv_response, tag(6));
Craig Tillere4d27482016-05-03 12:19:33 -0700545 Verifier(GetParam().disable_blocking)
546 .Expect(5, true)
547 .Expect(6, true)
548 .Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800549 EXPECT_EQ(send_response.message(), recv_response.message());
550
551 cli_stream->WritesDone(tag(7));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800552 srv_stream.Read(&recv_request, tag(8));
Craig Tillere4d27482016-05-03 12:19:33 -0700553 Verifier(GetParam().disable_blocking)
554 .Expect(7, true)
555 .Expect(8, false)
556 .Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800557
558 srv_stream.Finish(Status::OK, tag(9));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800559 cli_stream->Finish(&recv_status, tag(10));
Craig Tillere4d27482016-05-03 12:19:33 -0700560 Verifier(GetParam().disable_blocking)
561 .Expect(9, true)
562 .Expect(10, true)
563 .Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800564
Yang Gaoc1a2c312015-06-16 10:59:46 -0700565 EXPECT_TRUE(recv_status.ok());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800566}
567
Yang Gao406b32f2015-02-13 16:25:33 -0800568// Metadata tests
Craig Tiller69f90e62015-08-06 08:32:35 -0700569TEST_P(AsyncEnd2endTest, ClientInitialMetadataRpc) {
Yang Gao406b32f2015-02-13 16:25:33 -0800570 ResetStub();
571
572 EchoRequest send_request;
573 EchoRequest recv_request;
574 EchoResponse send_response;
575 EchoResponse recv_response;
576 Status recv_status;
577
578 ClientContext cli_ctx;
579 ServerContext srv_ctx;
580 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
581
Vijay Paid7b1e702016-05-02 15:10:21 -0700582 send_request.set_message(GetParam().message_content);
Yang Gao406b32f2015-02-13 16:25:33 -0800583 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
584 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
Craig Tiller6f871642016-02-03 16:15:31 -0800585 std::pair<grpc::string, grpc::string> meta3("g.r.d-bin", "xyz");
Yang Gao406b32f2015-02-13 16:25:33 -0800586 cli_ctx.AddMetadata(meta1.first, meta1.second);
587 cli_ctx.AddMetadata(meta2.first, meta2.second);
Craig Tiller6f871642016-02-03 16:15:31 -0800588 cli_ctx.AddMetadata(meta3.first, meta3.second);
Yang Gao406b32f2015-02-13 16:25:33 -0800589
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800590 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700591 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800592
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700593 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
594 cq_.get(), tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700595 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800596 EXPECT_EQ(send_request.message(), recv_request.message());
597 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700598 EXPECT_EQ(meta1.second,
599 ToString(client_initial_metadata.find(meta1.first)->second));
600 EXPECT_EQ(meta2.second,
601 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller6f871642016-02-03 16:15:31 -0800602 EXPECT_EQ(meta3.second,
603 ToString(client_initial_metadata.find(meta3.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700604 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800605
606 send_response.set_message(recv_request.message());
607 response_writer.Finish(send_response, Status::OK, tag(3));
Yang Gao3a5e5492015-02-18 14:32:38 -0800608 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tillere4d27482016-05-03 12:19:33 -0700609 Verifier(GetParam().disable_blocking)
610 .Expect(3, true)
611 .Expect(4, true)
612 .Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800613
614 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700615 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800616}
617
Craig Tiller69f90e62015-08-06 08:32:35 -0700618TEST_P(AsyncEnd2endTest, ServerInitialMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800619 ResetStub();
620
621 EchoRequest send_request;
622 EchoRequest recv_request;
623 EchoResponse send_response;
624 EchoResponse recv_response;
625 Status recv_status;
626
627 ClientContext cli_ctx;
628 ServerContext srv_ctx;
629 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
630
Vijay Paid7b1e702016-05-02 15:10:21 -0700631 send_request.set_message(GetParam().message_content);
Yang Gao2b7f5372015-02-18 00:45:53 -0800632 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
633 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
634
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800635 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700636 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800637
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700638 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
639 cq_.get(), tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700640 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800641 EXPECT_EQ(send_request.message(), recv_request.message());
642 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
643 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
644 response_writer.SendInitialMetadata(tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700645 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800646
Yang Gao3a5e5492015-02-18 14:32:38 -0800647 response_reader->ReadInitialMetadata(tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700648 Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800649 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700650 EXPECT_EQ(meta1.second,
651 ToString(server_initial_metadata.find(meta1.first)->second));
652 EXPECT_EQ(meta2.second,
653 ToString(server_initial_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800654 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800655
656 send_response.set_message(recv_request.message());
657 response_writer.Finish(send_response, Status::OK, tag(5));
Yang Gao3a5e5492015-02-18 14:32:38 -0800658 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tillere4d27482016-05-03 12:19:33 -0700659 Verifier(GetParam().disable_blocking)
660 .Expect(5, true)
661 .Expect(6, true)
662 .Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800663
664 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700665 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800666}
667
Craig Tiller69f90e62015-08-06 08:32:35 -0700668TEST_P(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800669 ResetStub();
670
671 EchoRequest send_request;
672 EchoRequest recv_request;
673 EchoResponse send_response;
674 EchoResponse recv_response;
675 Status recv_status;
676
677 ClientContext cli_ctx;
678 ServerContext srv_ctx;
679 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
680
Vijay Paid7b1e702016-05-02 15:10:21 -0700681 send_request.set_message(GetParam().message_content);
Yang Gao2b7f5372015-02-18 00:45:53 -0800682 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
683 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
684
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800685 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700686 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800687
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700688 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
689 cq_.get(), tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700690 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800691 EXPECT_EQ(send_request.message(), recv_request.message());
692 response_writer.SendInitialMetadata(tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700693 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800694
695 send_response.set_message(recv_request.message());
696 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
697 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
698 response_writer.Finish(send_response, Status::OK, tag(4));
Yang Gao3a5e5492015-02-18 14:32:38 -0800699 response_reader->Finish(&recv_response, &recv_status, tag(5));
Craig Tillere4d27482016-05-03 12:19:33 -0700700
701 Verifier(GetParam().disable_blocking)
702 .Expect(4, true)
703 .Expect(5, true)
704 .Verify(cq_.get());
705
Yang Gao2b7f5372015-02-18 00:45:53 -0800706 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700707 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800708 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700709 EXPECT_EQ(meta1.second,
710 ToString(server_trailing_metadata.find(meta1.first)->second));
711 EXPECT_EQ(meta2.second,
712 ToString(server_trailing_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800713 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800714}
715
Craig Tiller69f90e62015-08-06 08:32:35 -0700716TEST_P(AsyncEnd2endTest, MetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800717 ResetStub();
718
719 EchoRequest send_request;
720 EchoRequest recv_request;
721 EchoResponse send_response;
722 EchoResponse recv_response;
723 Status recv_status;
724
725 ClientContext cli_ctx;
726 ServerContext srv_ctx;
727 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
728
Vijay Paid7b1e702016-05-02 15:10:21 -0700729 send_request.set_message(GetParam().message_content);
Yang Gao2b7f5372015-02-18 00:45:53 -0800730 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800731 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400732 "key2-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700733 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800734 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800735 std::pair<grpc::string, grpc::string> meta6(
736 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400737 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700738 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800739 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800740 std::pair<grpc::string, grpc::string> meta4(
741 "key6-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700742 grpc::string(
743 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800744
745 cli_ctx.AddMetadata(meta1.first, meta1.second);
746 cli_ctx.AddMetadata(meta2.first, meta2.second);
747
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800748 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700749 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800750
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700751 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
752 cq_.get(), tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700753 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800754 EXPECT_EQ(send_request.message(), recv_request.message());
755 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700756 EXPECT_EQ(meta1.second,
757 ToString(client_initial_metadata.find(meta1.first)->second));
758 EXPECT_EQ(meta2.second,
759 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700760 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800761
762 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
763 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
764 response_writer.SendInitialMetadata(tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700765 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800766 response_reader->ReadInitialMetadata(tag(4));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700767 Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800768 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700769 EXPECT_EQ(meta3.second,
770 ToString(server_initial_metadata.find(meta3.first)->second));
771 EXPECT_EQ(meta4.second,
772 ToString(server_initial_metadata.find(meta4.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700773 EXPECT_GE(server_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao3a5e5492015-02-18 14:32:38 -0800774
775 send_response.set_message(recv_request.message());
776 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
777 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
778 response_writer.Finish(send_response, Status::OK, tag(5));
Yang Gao3a5e5492015-02-18 14:32:38 -0800779 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tillere4d27482016-05-03 12:19:33 -0700780
781 Verifier(GetParam().disable_blocking)
782 .Expect(5, true)
783 .Expect(6, true)
784 .Verify(cq_.get());
785
Yang Gao3a5e5492015-02-18 14:32:38 -0800786 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700787 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800788 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700789 EXPECT_EQ(meta5.second,
790 ToString(server_trailing_metadata.find(meta5.first)->second));
791 EXPECT_EQ(meta6.second,
792 ToString(server_trailing_metadata.find(meta6.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700793 EXPECT_GE(server_trailing_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800794}
yang-gb3352562015-08-04 14:42:06 -0700795
796// Server uses AsyncNotifyWhenDone API to check for cancellation
Craig Tiller69f90e62015-08-06 08:32:35 -0700797TEST_P(AsyncEnd2endTest, ServerCheckCancellation) {
yang-gb3352562015-08-04 14:42:06 -0700798 ResetStub();
799
800 EchoRequest send_request;
801 EchoRequest recv_request;
802 EchoResponse send_response;
803 EchoResponse recv_response;
804 Status recv_status;
805
806 ClientContext cli_ctx;
807 ServerContext srv_ctx;
808 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
809
Vijay Paid7b1e702016-05-02 15:10:21 -0700810 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800811 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700812 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
813
814 srv_ctx.AsyncNotifyWhenDone(tag(5));
815 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
816 cq_.get(), tag(2));
817
Vijay Paidf8b62c2016-05-02 14:34:24 -0700818 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700819 EXPECT_EQ(send_request.message(), recv_request.message());
820
821 cli_ctx.TryCancel();
Vijay Paidf8b62c2016-05-02 14:34:24 -0700822 Verifier(GetParam().disable_blocking).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700823 EXPECT_TRUE(srv_ctx.IsCancelled());
824
825 response_reader->Finish(&recv_response, &recv_status, tag(4));
yang-g15759f62016-06-01 11:21:27 -0700826 Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700827
828 EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
829}
830
831// Server uses AsyncNotifyWhenDone API to check for normal finish
Craig Tiller69f90e62015-08-06 08:32:35 -0700832TEST_P(AsyncEnd2endTest, ServerCheckDone) {
yang-gb3352562015-08-04 14:42:06 -0700833 ResetStub();
834
835 EchoRequest send_request;
836 EchoRequest recv_request;
837 EchoResponse send_response;
838 EchoResponse recv_response;
839 Status recv_status;
840
841 ClientContext cli_ctx;
842 ServerContext srv_ctx;
843 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
844
Vijay Paid7b1e702016-05-02 15:10:21 -0700845 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800846 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700847 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
848
849 srv_ctx.AsyncNotifyWhenDone(tag(5));
850 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
851 cq_.get(), tag(2));
852
Vijay Paidf8b62c2016-05-02 14:34:24 -0700853 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700854 EXPECT_EQ(send_request.message(), recv_request.message());
855
856 send_response.set_message(recv_request.message());
857 response_writer.Finish(send_response, Status::OK, tag(3));
yang-gb3352562015-08-04 14:42:06 -0700858 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tillere4d27482016-05-03 12:19:33 -0700859 Verifier(GetParam().disable_blocking)
860 .Expect(3, true)
861 .Expect(4, true)
862 .Expect(5, true)
863 .Verify(cq_.get());
864 EXPECT_FALSE(srv_ctx.IsCancelled());
yang-gb3352562015-08-04 14:42:06 -0700865
866 EXPECT_EQ(send_response.message(), recv_response.message());
867 EXPECT_TRUE(recv_status.ok());
868}
869
Craig Tiller8f7bff72015-08-17 13:23:14 -0700870TEST_P(AsyncEnd2endTest, UnimplementedRpc) {
Vijay Paidf8b62c2016-05-02 14:34:24 -0700871 ChannelArguments args;
872 auto channel_creds =
873 GetChannelCredentials(GetParam().credentials_type, &args);
yang-g730055d2015-08-27 12:29:45 -0700874 std::shared_ptr<Channel> channel =
Vijay Paidf8b62c2016-05-02 14:34:24 -0700875 CreateCustomChannel(server_address_.str(), channel_creds, args);
Craig Tiller1b4e3302015-12-17 16:35:00 -0800876 std::unique_ptr<grpc::testing::UnimplementedService::Stub> stub;
877 stub = grpc::testing::UnimplementedService::NewStub(channel);
yang-g9b7757d2015-08-13 11:15:53 -0700878 EchoRequest send_request;
879 EchoResponse recv_response;
880 Status recv_status;
881
882 ClientContext cli_ctx;
Vijay Paid7b1e702016-05-02 15:10:21 -0700883 send_request.set_message(GetParam().message_content);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800884 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-g9b7757d2015-08-13 11:15:53 -0700885 stub->AsyncUnimplemented(&cli_ctx, send_request, cq_.get()));
886
887 response_reader->Finish(&recv_response, &recv_status, tag(4));
yang-g15759f62016-06-01 11:21:27 -0700888 Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
yang-g9b7757d2015-08-13 11:15:53 -0700889
890 EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
891 EXPECT_EQ("", recv_status.error_message());
892}
893
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800894// This class is for testing scenarios where RPCs are cancelled on the server
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800895// by calling ServerContext::TryCancel(). Server uses AsyncNotifyWhenDone
896// API to check for cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800897class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
898 protected:
899 typedef enum {
900 DO_NOT_CANCEL = 0,
901 CANCEL_BEFORE_PROCESSING,
902 CANCEL_DURING_PROCESSING,
903 CANCEL_AFTER_PROCESSING
904 } ServerTryCancelRequestPhase;
905
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -0800906 // Helper for testing client-streaming RPCs which are cancelled on the server.
907 // Depending on the value of server_try_cancel parameter, this will test one
908 // of the following three scenarios:
909 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading
910 // any messages from the client
911 //
912 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
913 // messages from the client
914 //
915 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
916 // messages from the client (but before sending any status back to the
917 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800918 void TestClientStreamingServerCancel(
919 ServerTryCancelRequestPhase server_try_cancel) {
920 ResetStub();
921
922 EchoRequest send_request;
923 EchoRequest recv_request;
924 EchoResponse send_response;
925 EchoResponse recv_response;
926 Status recv_status;
927
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800928 ClientContext cli_ctx;
929 ServerContext srv_ctx;
930 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
931
932 // Initiate the 'RequestStream' call on client
933 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800934 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700935 Verifier(GetParam().disable_blocking).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800936
937 // On the server, request to be notified of 'RequestStream' calls
938 // and receive the 'RequestStream' call just made by the client
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800939 srv_ctx.AsyncNotifyWhenDone(tag(11));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800940 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
941 tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700942 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800943
944 // Client sends 3 messages (tags 3, 4 and 5)
945 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
Vijay Paia63271c2016-06-15 12:56:38 -0700946 send_request.set_message("Ping " + grpc::to_string(tag_idx));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800947 cli_stream->Write(send_request, tag(tag_idx));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700948 Verifier(GetParam().disable_blocking)
949 .Expect(tag_idx, true)
950 .Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800951 }
952 cli_stream->WritesDone(tag(6));
Vijay Paidf8b62c2016-05-02 14:34:24 -0700953 Verifier(GetParam().disable_blocking).Expect(6, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800954
955 bool expected_server_cq_result = true;
956 bool ignore_cq_result = false;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800957 bool want_done_tag = false;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800958
959 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800960 srv_ctx.TryCancel();
Vijay Paidf8b62c2016-05-02 14:34:24 -0700961 Verifier(GetParam().disable_blocking).Expect(11, true).Verify(cq_.get());
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800962 EXPECT_TRUE(srv_ctx.IsCancelled());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800963
964 // Since cancellation is done before server reads any results, we know
965 // for sure that all cq results will return false from this point forward
966 expected_server_cq_result = false;
967 }
968
969 std::thread* server_try_cancel_thd = NULL;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800970
Vijay Paidf8b62c2016-05-02 14:34:24 -0700971 auto verif = Verifier(GetParam().disable_blocking);
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800972
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800973 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800974 server_try_cancel_thd =
975 new std::thread(&ServerContext::TryCancel, &srv_ctx);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800976 // Server will cancel the RPC in a parallel thread while reading the
977 // requests from the client. Since the cancellation can happen at anytime,
978 // some of the cq results (i.e those until cancellation) might be true but
979 // its non deterministic. So better to ignore the cq results
980 ignore_cq_result = true;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800981 // Expect that we might possibly see the done tag that
982 // indicates cancellation completion in this case
983 want_done_tag = true;
984 verif.Expect(11, true);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800985 }
986
987 // Server reads 3 messages (tags 6, 7 and 8)
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800988 // But if want_done_tag is true, we might also see tag 11
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800989 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
990 srv_stream.Read(&recv_request, tag(tag_idx));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -0800991 // Note that we'll add something to the verifier and verify that
992 // something was seen, but it might be tag 11 and not what we
993 // just added
994 int got_tag = verif.Expect(tag_idx, expected_server_cq_result)
995 .Next(cq_.get(), ignore_cq_result);
996 GPR_ASSERT((got_tag == tag_idx) || (got_tag == 11 && want_done_tag));
997 if (got_tag == 11) {
998 EXPECT_TRUE(srv_ctx.IsCancelled());
999 want_done_tag = false;
1000 // Now get the other entry that we were waiting on
1001 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), tag_idx);
1002 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001003 }
1004
1005 if (server_try_cancel_thd != NULL) {
1006 server_try_cancel_thd->join();
1007 delete server_try_cancel_thd;
1008 }
1009
1010 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001011 srv_ctx.TryCancel();
1012 want_done_tag = true;
1013 verif.Expect(11, true);
1014 }
1015
1016 if (want_done_tag) {
1017 verif.Verify(cq_.get());
1018 EXPECT_TRUE(srv_ctx.IsCancelled());
1019 want_done_tag = false;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001020 }
1021
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001022 // The RPC has been cancelled at this point for sure (i.e irrespective of
1023 // the value of `server_try_cancel` is). So, from this point forward, we
1024 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001025
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001026 // Server sends the final message and cancelled status (but the RPC is
1027 // already cancelled at this point. So we expect the operation to fail)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001028 srv_stream.Finish(send_response, Status::CANCELLED, tag(9));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001029 Verifier(GetParam().disable_blocking).Expect(9, false).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001030
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001031 // Client will see the cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001032 cli_stream->Finish(&recv_status, tag(10));
yang-g15759f62016-06-01 11:21:27 -07001033 Verifier(GetParam().disable_blocking).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001034 EXPECT_FALSE(recv_status.ok());
1035 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
1036 }
1037
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001038 // Helper for testing server-streaming RPCs which are cancelled on the server.
1039 // Depending on the value of server_try_cancel parameter, this will test one
1040 // of the following three scenarios:
1041 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before sending
1042 // any messages to the client
1043 //
1044 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while sending
1045 // messages to the client
1046 //
1047 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after sending all
1048 // messages to the client (but before sending any status back to the
1049 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001050 void TestServerStreamingServerCancel(
1051 ServerTryCancelRequestPhase server_try_cancel) {
1052 ResetStub();
1053
1054 EchoRequest send_request;
1055 EchoRequest recv_request;
1056 EchoResponse send_response;
1057 EchoResponse recv_response;
1058 Status recv_status;
1059 ClientContext cli_ctx;
1060 ServerContext srv_ctx;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001061 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
1062
1063 send_request.set_message("Ping");
1064 // Initiate the 'ResponseStream' call on the client
1065 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001066 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001067 Verifier(GetParam().disable_blocking).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001068 // On the server, request to be notified of 'ResponseStream' calls and
1069 // receive the call just made by the client
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001070 srv_ctx.AsyncNotifyWhenDone(tag(11));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001071 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
1072 cq_.get(), cq_.get(), tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001073 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001074 EXPECT_EQ(send_request.message(), recv_request.message());
1075
1076 bool expected_cq_result = true;
1077 bool ignore_cq_result = false;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001078 bool want_done_tag = false;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001079
1080 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001081 srv_ctx.TryCancel();
Vijay Paidf8b62c2016-05-02 14:34:24 -07001082 Verifier(GetParam().disable_blocking).Expect(11, true).Verify(cq_.get());
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001083 EXPECT_TRUE(srv_ctx.IsCancelled());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001084
1085 // We know for sure that all cq results will be false from this point
1086 // since the server cancelled the RPC
1087 expected_cq_result = false;
1088 }
1089
1090 std::thread* server_try_cancel_thd = NULL;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001091
Vijay Paidf8b62c2016-05-02 14:34:24 -07001092 auto verif = Verifier(GetParam().disable_blocking);
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001093
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001094 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001095 server_try_cancel_thd =
1096 new std::thread(&ServerContext::TryCancel, &srv_ctx);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001097
1098 // Server will cancel the RPC in a parallel thread while writing responses
1099 // to the client. Since the cancellation can happen at anytime, some of
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001100 // the cq results (i.e those until cancellation) might be true but it is
1101 // non deterministic. So better to ignore the cq results
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001102 ignore_cq_result = true;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001103 // Expect that we might possibly see the done tag that
1104 // indicates cancellation completion in this case
1105 want_done_tag = true;
1106 verif.Expect(11, true);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001107 }
1108
1109 // Server sends three messages (tags 3, 4 and 5)
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001110 // But if want_done tag is true, we might also see tag 11
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001111 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
Vijay Paia63271c2016-06-15 12:56:38 -07001112 send_response.set_message("Pong " + grpc::to_string(tag_idx));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001113 srv_stream.Write(send_response, tag(tag_idx));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001114 // Note that we'll add something to the verifier and verify that
1115 // something was seen, but it might be tag 11 and not what we
1116 // just added
1117 int got_tag = verif.Expect(tag_idx, expected_cq_result)
1118 .Next(cq_.get(), ignore_cq_result);
1119 GPR_ASSERT((got_tag == tag_idx) || (got_tag == 11 && want_done_tag));
1120 if (got_tag == 11) {
1121 EXPECT_TRUE(srv_ctx.IsCancelled());
1122 want_done_tag = false;
1123 // Now get the other entry that we were waiting on
1124 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), tag_idx);
1125 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001126 }
1127
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001128 if (server_try_cancel_thd != NULL) {
1129 server_try_cancel_thd->join();
1130 delete server_try_cancel_thd;
1131 }
1132
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001133 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001134 srv_ctx.TryCancel();
1135 want_done_tag = true;
1136 verif.Expect(11, true);
yang-gad0df7b2016-02-22 10:00:20 -08001137
1138 // Client reads may fail bacause it is notified that the stream is
1139 // cancelled.
1140 ignore_cq_result = true;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001141 }
1142
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001143 if (want_done_tag) {
1144 verif.Verify(cq_.get());
1145 EXPECT_TRUE(srv_ctx.IsCancelled());
1146 want_done_tag = false;
1147 }
1148
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001149 // Client attemts to read the three messages from the server
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001150 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
1151 cli_stream->Read(&recv_response, tag(tag_idx));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001152 Verifier(GetParam().disable_blocking)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001153 .Expect(tag_idx, expected_cq_result)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001154 .Verify(cq_.get(), ignore_cq_result);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001155 }
1156
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001157 // The RPC has been cancelled at this point for sure (i.e irrespective of
1158 // the value of `server_try_cancel` is). So, from this point forward, we
1159 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001160
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001161 // Server finishes the stream (but the RPC is already cancelled)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001162 srv_stream.Finish(Status::CANCELLED, tag(9));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001163 Verifier(GetParam().disable_blocking).Expect(9, false).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001164
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001165 // Client will see the cancellation
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001166 cli_stream->Finish(&recv_status, tag(10));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001167 Verifier(GetParam().disable_blocking).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001168 EXPECT_FALSE(recv_status.ok());
1169 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
1170 }
1171
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001172 // Helper for testing bidirectinal-streaming RPCs which are cancelled on the
1173 // server.
1174 //
1175 // Depending on the value of server_try_cancel parameter, this will
1176 // test one of the following three scenarios:
1177 // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading/
1178 // writing any messages from/to the client
1179 //
1180 // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
1181 // messages from the client
1182 //
1183 // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
1184 // messages from the client (but before sending any status back to the
1185 // client)
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001186 void TestBidiStreamingServerCancel(
1187 ServerTryCancelRequestPhase server_try_cancel) {
1188 ResetStub();
1189
1190 EchoRequest send_request;
1191 EchoRequest recv_request;
1192 EchoResponse send_response;
1193 EchoResponse recv_response;
1194 Status recv_status;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001195 ClientContext cli_ctx;
1196 ServerContext srv_ctx;
1197 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
1198
1199 // Initiate the call from the client side
1200 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001201 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001202 Verifier(GetParam().disable_blocking).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001203
1204 // On the server, request to be notified of the 'BidiStream' call and
1205 // receive the call just made by the client
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001206 srv_ctx.AsyncNotifyWhenDone(tag(11));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001207 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
1208 tag(2));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001209 Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001210
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001211 // Client sends the first and the only message
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001212 send_request.set_message("Ping");
1213 cli_stream->Write(send_request, tag(3));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001214 Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001215
1216 bool expected_cq_result = true;
1217 bool ignore_cq_result = false;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001218 bool want_done_tag = false;
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001219
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001220 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001221 srv_ctx.TryCancel();
Vijay Paidf8b62c2016-05-02 14:34:24 -07001222 Verifier(GetParam().disable_blocking).Expect(11, true).Verify(cq_.get());
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001223 EXPECT_TRUE(srv_ctx.IsCancelled());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001224
1225 // We know for sure that all cq results will be false from this point
1226 // since the server cancelled the RPC
1227 expected_cq_result = false;
1228 }
1229
1230 std::thread* server_try_cancel_thd = NULL;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001231
Vijay Paidf8b62c2016-05-02 14:34:24 -07001232 auto verif = Verifier(GetParam().disable_blocking);
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001233
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001234 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001235 server_try_cancel_thd =
1236 new std::thread(&ServerContext::TryCancel, &srv_ctx);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001237
1238 // Since server is going to cancel the RPC in a parallel thread, some of
1239 // the cq results (i.e those until the cancellation) might be true. Since
1240 // that number is non-deterministic, it is better to ignore the cq results
1241 ignore_cq_result = true;
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001242 // Expect that we might possibly see the done tag that
1243 // indicates cancellation completion in this case
1244 want_done_tag = true;
1245 verif.Expect(11, true);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001246 }
1247
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001248 int got_tag;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001249 srv_stream.Read(&recv_request, tag(4));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001250 verif.Expect(4, expected_cq_result);
1251 got_tag = verif.Next(cq_.get(), ignore_cq_result);
1252 GPR_ASSERT((got_tag == 4) || (got_tag == 11 && want_done_tag));
1253 if (got_tag == 11) {
1254 EXPECT_TRUE(srv_ctx.IsCancelled());
1255 want_done_tag = false;
1256 // Now get the other entry that we were waiting on
1257 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 4);
1258 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001259
1260 send_response.set_message("Pong");
1261 srv_stream.Write(send_response, tag(5));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001262 verif.Expect(5, expected_cq_result);
1263 got_tag = verif.Next(cq_.get(), ignore_cq_result);
1264 GPR_ASSERT((got_tag == 5) || (got_tag == 11 && want_done_tag));
1265 if (got_tag == 11) {
1266 EXPECT_TRUE(srv_ctx.IsCancelled());
1267 want_done_tag = false;
1268 // Now get the other entry that we were waiting on
1269 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 5);
1270 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001271
1272 cli_stream->Read(&recv_response, tag(6));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001273 verif.Expect(6, expected_cq_result);
1274 got_tag = verif.Next(cq_.get(), ignore_cq_result);
1275 GPR_ASSERT((got_tag == 6) || (got_tag == 11 && want_done_tag));
1276 if (got_tag == 11) {
1277 EXPECT_TRUE(srv_ctx.IsCancelled());
1278 want_done_tag = false;
1279 // Now get the other entry that we were waiting on
1280 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 6);
1281 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001282
1283 // This is expected to succeed in all cases
1284 cli_stream->WritesDone(tag(7));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001285 verif.Expect(7, true);
1286 got_tag = verif.Next(cq_.get(), ignore_cq_result);
1287 GPR_ASSERT((got_tag == 7) || (got_tag == 11 && want_done_tag));
1288 if (got_tag == 11) {
1289 EXPECT_TRUE(srv_ctx.IsCancelled());
1290 want_done_tag = false;
1291 // Now get the other entry that we were waiting on
1292 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 7);
1293 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001294
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001295 // This is expected to fail in all cases i.e for all values of
Vijay Pai018879a2016-02-16 09:20:50 -08001296 // server_try_cancel. This is because at this point, either there are no
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001297 // more msgs from the client (because client called WritesDone) or the RPC
1298 // is cancelled on the server
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001299 srv_stream.Read(&recv_request, tag(8));
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001300 verif.Expect(8, false);
1301 got_tag = verif.Next(cq_.get(), ignore_cq_result);
1302 GPR_ASSERT((got_tag == 8) || (got_tag == 11 && want_done_tag));
1303 if (got_tag == 11) {
1304 EXPECT_TRUE(srv_ctx.IsCancelled());
1305 want_done_tag = false;
1306 // Now get the other entry that we were waiting on
1307 EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 8);
1308 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001309
1310 if (server_try_cancel_thd != NULL) {
1311 server_try_cancel_thd->join();
1312 delete server_try_cancel_thd;
1313 }
1314
1315 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
Sree Kuchibhotlab0d15672016-03-07 10:51:02 -08001316 srv_ctx.TryCancel();
1317 want_done_tag = true;
1318 verif.Expect(11, true);
1319 }
1320
1321 if (want_done_tag) {
1322 verif.Verify(cq_.get());
1323 EXPECT_TRUE(srv_ctx.IsCancelled());
1324 want_done_tag = false;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001325 }
1326
Sree Kuchibhotla0f242ac2016-01-29 18:12:19 -08001327 // The RPC has been cancelled at this point for sure (i.e irrespective of
1328 // the value of `server_try_cancel` is). So, from this point forward, we
1329 // know that cq results are supposed to return false on server.
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001330
1331 srv_stream.Finish(Status::CANCELLED, tag(9));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001332 Verifier(GetParam().disable_blocking).Expect(9, false).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001333
1334 cli_stream->Finish(&recv_status, tag(10));
Vijay Paidf8b62c2016-05-02 14:34:24 -07001335 Verifier(GetParam().disable_blocking).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001336 EXPECT_FALSE(recv_status.ok());
1337 EXPECT_EQ(grpc::StatusCode::CANCELLED, recv_status.error_code());
1338 }
1339};
1340
1341TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelBefore) {
1342 TestClientStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1343}
1344
1345TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelDuring) {
1346 TestClientStreamingServerCancel(CANCEL_DURING_PROCESSING);
1347}
1348
1349TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelAfter) {
1350 TestClientStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1351}
1352
1353TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelBefore) {
1354 TestServerStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1355}
1356
1357TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelDuring) {
1358 TestServerStreamingServerCancel(CANCEL_DURING_PROCESSING);
1359}
1360
1361TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelAfter) {
1362 TestServerStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1363}
1364
1365TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelBefore) {
1366 TestBidiStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1367}
1368
1369TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelDuring) {
1370 TestBidiStreamingServerCancel(CANCEL_DURING_PROCESSING);
1371}
1372
1373TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelAfter) {
1374 TestBidiStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1375}
1376
Vijay Paidf8b62c2016-05-02 14:34:24 -07001377std::vector<TestScenario> CreateTestScenarios(bool test_disable_blocking,
Vijay Paid7b1e702016-05-02 15:10:21 -07001378 bool test_secure,
1379 int test_big_limit) {
Vijay Paidf8b62c2016-05-02 14:34:24 -07001380 std::vector<TestScenario> scenarios;
1381 std::vector<grpc::string> credentials_types;
Vijay Paid7b1e702016-05-02 15:10:21 -07001382 std::vector<grpc::string> messages;
1383
Vijay Paidf8b62c2016-05-02 14:34:24 -07001384 credentials_types.push_back(kInsecureCredentialsType);
Vijay Paid7b1e702016-05-02 15:10:21 -07001385 auto sec_list = GetSecureCredentialsTypeList();
1386 for (auto sec = sec_list.begin(); sec != sec_list.end(); sec++) {
1387 credentials_types.push_back(*sec);
1388 }
1389
1390 messages.push_back("Hello");
1391 for (int sz = 1; sz < test_big_limit; sz *= 2) {
1392 grpc::string big_msg;
1393 for (int i = 0; i < sz * 1024; i++) {
1394 char c = 'a' + (i % 26);
1395 big_msg += c;
1396 }
1397 messages.push_back(big_msg);
1398 }
1399
1400 for (auto cred = credentials_types.begin(); cred != credentials_types.end();
1401 ++cred) {
1402 for (auto msg = messages.begin(); msg != messages.end(); msg++) {
Vijay Pai679c75f2016-06-15 13:08:00 -07001403 scenarios.emplace_back(false, *cred, *msg);
Vijay Paid7b1e702016-05-02 15:10:21 -07001404 if (test_disable_blocking) {
Vijay Pai679c75f2016-06-15 13:08:00 -07001405 scenarios.emplace_back(true, *cred, *msg);
Vijay Paid7b1e702016-05-02 15:10:21 -07001406 }
Vijay Paidf8b62c2016-05-02 14:34:24 -07001407 }
1408 }
1409 return scenarios;
1410}
1411
Craig Tiller4c06b822015-08-06 08:41:31 -07001412INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest,
Vijay Paid7b1e702016-05-02 15:10:21 -07001413 ::testing::ValuesIn(CreateTestScenarios(true, true,
1414 1024)));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001415INSTANTIATE_TEST_CASE_P(AsyncEnd2endServerTryCancel,
1416 AsyncEnd2endServerTryCancelTest,
Vijay Paid7b1e702016-05-02 15:10:21 -07001417 ::testing::ValuesIn(CreateTestScenarios(false, false,
1418 0)));
Craig Tiller69f90e62015-08-06 08:32:35 -07001419
Craig Tiller0220cf12015-02-12 17:39:26 -08001420} // namespace
1421} // namespace testing
1422} // namespace grpc
1423
1424int main(int argc, char** argv) {
1425 grpc_test_init(argc, argv);
Vijay Paib65eda42016-02-16 13:48:05 -08001426 gpr_tls_init(&g_is_async_end2end_test);
Craig Tiller0220cf12015-02-12 17:39:26 -08001427 ::testing::InitGoogleTest(&argc, argv);
Vijay Paib65eda42016-02-16 13:48:05 -08001428 int ret = RUN_ALL_TESTS();
1429 gpr_tls_destroy(&g_is_async_end2end_test);
1430 return ret;
Craig Tiller0220cf12015-02-12 17:39:26 -08001431}