blob: 8800a87345085f520390086ebc0b24f89b6fc7d7 [file] [log] [blame]
Craig Tiller0220cf12015-02-12 17:39:26 -08001/*
2 *
murgatroid993466c4b2016-01-12 10:26:04 -08003 * Copyright 2015-2016, Google Inc.
Craig Tiller0220cf12015-02-12 17:39:26 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
Yang Gaoda699b82015-02-18 01:10:22 -080034#include <memory>
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -080035#include <thread>
Craig Tiller0220cf12015-02-12 17:39:26 -080036
yang-g8c2be9f2015-08-19 16:28:09 -070037#include <grpc++/channel.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080038#include <grpc++/client_context.h>
39#include <grpc++/create_channel.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080040#include <grpc++/server.h>
41#include <grpc++/server_builder.h>
42#include <grpc++/server_context.h>
Sree Kuchibhotlab0d0c8e2016-01-13 22:52:17 -080043#include <grpc/grpc.h>
44#include <grpc/support/thd.h>
45#include <grpc/support/time.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080046#include <gtest/gtest.h>
47
Craig Tiller1b4e3302015-12-17 16:35:00 -080048#include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h"
49#include "src/proto/grpc/testing/echo.grpc.pb.h"
Sree Kuchibhotlab0d0c8e2016-01-13 22:52:17 -080050#include "test/core/util/port.h"
51#include "test/core/util/test_config.h"
yang-ge21908f2015-08-25 13:47:51 -070052#include "test/cpp/util/string_ref_helper.h"
Craig Tiller0220cf12015-02-12 17:39:26 -080053
Craig Tiller69f90e62015-08-06 08:32:35 -070054#ifdef GPR_POSIX_SOCKET
55#include "src/core/iomgr/pollset_posix.h"
56#endif
57
Craig Tiller1b4e3302015-12-17 16:35:00 -080058using grpc::testing::EchoRequest;
59using grpc::testing::EchoResponse;
Craig Tiller0220cf12015-02-12 17:39:26 -080060using std::chrono::system_clock;
61
62namespace grpc {
63namespace testing {
64
65namespace {
66
Craig Tiller7536af02015-12-22 13:49:30 -080067void* tag(int i) { return (void*)(intptr_t)i; }
Yang Gaoc05b6cb2015-02-13 00:34:10 -080068
Craig Tiller69f90e62015-08-06 08:32:35 -070069#ifdef GPR_POSIX_SOCKET
Craig Tiller4c06b822015-08-06 08:41:31 -070070static int assert_non_blocking_poll(struct pollfd* pfds, nfds_t nfds,
71 int timeout) {
Craig Tiller69f90e62015-08-06 08:32:35 -070072 GPR_ASSERT(timeout == 0);
73 return poll(pfds, nfds, timeout);
74}
75
76class PollOverride {
Craig Tiller06cf3cc2015-05-13 13:11:01 -070077 public:
Craig Tiller69f90e62015-08-06 08:32:35 -070078 PollOverride(grpc_poll_function_type f) {
79 prev_ = grpc_poll_function;
80 grpc_poll_function = f;
81 }
82
Craig Tiller4c06b822015-08-06 08:41:31 -070083 ~PollOverride() { grpc_poll_function = prev_; }
Craig Tiller69f90e62015-08-06 08:32:35 -070084
85 private:
86 grpc_poll_function_type prev_;
87};
88
89class PollingCheckRegion : public PollOverride {
90 public:
Craig Tiller4c06b822015-08-06 08:41:31 -070091 explicit PollingCheckRegion(bool allow_blocking)
Craig Tiller69f90e62015-08-06 08:32:35 -070092 : PollOverride(allow_blocking ? poll : assert_non_blocking_poll) {}
93};
94#else
95class PollingCheckRegion {
96 public:
97 explicit PollingCheckRegion(bool allow_blocking) {}
98};
99#endif
100
101class Verifier : public PollingCheckRegion {
102 public:
103 explicit Verifier(bool spin) : PollingCheckRegion(!spin), spin_(spin) {}
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700104 Verifier& Expect(int i, bool expect_ok) {
105 expectations_[tag(i)] = expect_ok;
106 return *this;
vjpai7aadf462015-03-16 23:58:44 -0700107 }
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800108
109 void Verify(CompletionQueue* cq) { Verify(cq, false); }
110
111 void Verify(CompletionQueue* cq, bool ignore_ok) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700112 GPR_ASSERT(!expectations_.empty());
113 while (!expectations_.empty()) {
114 bool ok;
115 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700116 if (spin_) {
117 for (;;) {
118 auto r = cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
119 if (r == CompletionQueue::TIMEOUT) continue;
120 if (r == CompletionQueue::GOT_EVENT) break;
121 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
122 abort();
123 }
124 } else {
125 EXPECT_TRUE(cq->Next(&got_tag, &ok));
126 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700127 auto it = expectations_.find(got_tag);
128 EXPECT_TRUE(it != expectations_.end());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800129 if (!ignore_ok) {
130 EXPECT_EQ(it->second, ok);
131 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700132 expectations_.erase(it);
133 }
134 }
Craig Tillerd6c98df2015-08-18 09:33:44 -0700135 void Verify(CompletionQueue* cq,
136 std::chrono::system_clock::time_point deadline) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700137 if (expectations_.empty()) {
138 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700139 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700140 if (spin_) {
141 while (std::chrono::system_clock::now() < deadline) {
Craig Tiller4c06b822015-08-06 08:41:31 -0700142 EXPECT_EQ(
143 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)),
144 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700145 }
146 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700147 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
148 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700149 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700150 } else {
151 while (!expectations_.empty()) {
152 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700153 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700154 if (spin_) {
155 for (;;) {
156 GPR_ASSERT(std::chrono::system_clock::now() < deadline);
Craig Tiller4c06b822015-08-06 08:41:31 -0700157 auto r =
158 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
Craig Tiller69f90e62015-08-06 08:32:35 -0700159 if (r == CompletionQueue::TIMEOUT) continue;
160 if (r == CompletionQueue::GOT_EVENT) break;
161 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
162 abort();
Craig Tiller4c06b822015-08-06 08:41:31 -0700163 }
Craig Tiller69f90e62015-08-06 08:32:35 -0700164 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700165 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
166 CompletionQueue::GOT_EVENT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700167 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700168 auto it = expectations_.find(got_tag);
169 EXPECT_TRUE(it != expectations_.end());
170 EXPECT_EQ(it->second, ok);
171 expectations_.erase(it);
172 }
173 }
174 }
175
176 private:
177 std::map<void*, bool> expectations_;
Craig Tiller69f90e62015-08-06 08:32:35 -0700178 bool spin_;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700179};
vjpai7aadf462015-03-16 23:58:44 -0700180
Craig Tiller69f90e62015-08-06 08:32:35 -0700181class AsyncEnd2endTest : public ::testing::TestWithParam<bool> {
Craig Tiller0220cf12015-02-12 17:39:26 -0800182 protected:
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700183 AsyncEnd2endTest() {}
Craig Tiller0220cf12015-02-12 17:39:26 -0800184
Craig Tillercf133f42015-02-26 14:05:56 -0800185 void SetUp() GRPC_OVERRIDE {
Craig Tiller0220cf12015-02-12 17:39:26 -0800186 int port = grpc_pick_unused_port_or_die();
187 server_address_ << "localhost:" << port;
vjpai017ed622015-12-09 10:42:54 -0800188
Craig Tiller0220cf12015-02-12 17:39:26 -0800189 // Setup server
190 ServerBuilder builder;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700191 builder.AddListeningPort(server_address_.str(),
192 grpc::InsecureServerCredentials());
Craig Tiller15f383c2016-01-07 12:45:32 -0800193 builder.RegisterService(&service_);
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700194 cq_ = builder.AddCompletionQueue();
Craig Tiller0220cf12015-02-12 17:39:26 -0800195 server_ = builder.BuildAndStart();
196 }
197
Craig Tillercf133f42015-02-26 14:05:56 -0800198 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800199 server_->Shutdown();
200 void* ignored_tag;
201 bool ignored_ok;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700202 cq_->Shutdown();
203 while (cq_->Next(&ignored_tag, &ignored_ok))
Craig Tiller492968f2015-02-18 13:14:03 -0800204 ;
205 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800206
207 void ResetStub() {
yang-g730055d2015-08-27 12:29:45 -0700208 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -0700209 CreateChannel(server_address_.str(), InsecureChannelCredentials());
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800210 stub_ = grpc::testing::EchoTestService::NewStub(channel);
Craig Tiller0220cf12015-02-12 17:39:26 -0800211 }
212
Yang Gao406b32f2015-02-13 16:25:33 -0800213 void SendRpc(int num_rpcs) {
214 for (int i = 0; i < num_rpcs; i++) {
215 EchoRequest send_request;
216 EchoRequest recv_request;
217 EchoResponse send_response;
218 EchoResponse recv_response;
219 Status recv_status;
220
221 ClientContext cli_ctx;
222 ServerContext srv_ctx;
223 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
224
225 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800226 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700227 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800228
Craig Tillerd6c98df2015-08-18 09:33:44 -0700229 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
230 cq_.get(), tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800231
Craig Tiller69f90e62015-08-06 08:32:35 -0700232 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800233 EXPECT_EQ(send_request.message(), recv_request.message());
234
235 send_response.set_message(recv_request.message());
236 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700237 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800238
Yang Gao3a5e5492015-02-18 14:32:38 -0800239 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700240 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800241
242 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700243 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800244 }
245 }
246
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700247 std::unique_ptr<ServerCompletionQueue> cq_;
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800248 std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800249 std::unique_ptr<Server> server_;
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800250 grpc::testing::EchoTestService::AsyncService service_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800251 std::ostringstream server_address_;
252};
253
Craig Tiller69f90e62015-08-06 08:32:35 -0700254TEST_P(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800255 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800256 SendRpc(1);
257}
Yang Gaobb84a302015-02-12 23:30:12 -0800258
Craig Tiller69f90e62015-08-06 08:32:35 -0700259TEST_P(AsyncEnd2endTest, SequentialRpcs) {
Yang Gao406b32f2015-02-13 16:25:33 -0800260 ResetStub();
261 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800262}
263
vjpai7aadf462015-03-16 23:58:44 -0700264// Test a simple RPC using the async version of Next
Craig Tiller69f90e62015-08-06 08:32:35 -0700265TEST_P(AsyncEnd2endTest, AsyncNextRpc) {
vjpai7aadf462015-03-16 23:58:44 -0700266 ResetStub();
267
268 EchoRequest send_request;
269 EchoRequest recv_request;
270 EchoResponse send_response;
271 EchoResponse recv_response;
272 Status recv_status;
273
274 ClientContext cli_ctx;
275 ServerContext srv_ctx;
276 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
277
278 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800279 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700280 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
vjpai7aadf462015-03-16 23:58:44 -0700281
Yang Gao757afae2015-03-17 15:49:26 -0700282 std::chrono::system_clock::time_point time_now(
Craig Tillerf51199f2015-05-08 09:32:53 -0700283 std::chrono::system_clock::now());
284 std::chrono::system_clock::time_point time_limit(
285 std::chrono::system_clock::now() + std::chrono::seconds(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700286 Verifier(GetParam()).Verify(cq_.get(), time_now);
287 Verifier(GetParam()).Verify(cq_.get(), time_now);
vjpai7aadf462015-03-16 23:58:44 -0700288
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700289 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
290 cq_.get(), tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700291
Craig Tiller69f90e62015-08-06 08:32:35 -0700292 Verifier(GetParam()).Expect(2, true).Verify(cq_.get(), time_limit);
vjpai7aadf462015-03-16 23:58:44 -0700293 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700294
295 send_response.set_message(recv_request.message());
296 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller4c06b822015-08-06 08:41:31 -0700297 Verifier(GetParam())
298 .Expect(3, true)
299 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700300
301 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller4c06b822015-08-06 08:41:31 -0700302 Verifier(GetParam())
303 .Expect(4, true)
304 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700305
306 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700307 EXPECT_TRUE(recv_status.ok());
vjpai7aadf462015-03-16 23:58:44 -0700308}
Yang Gao757afae2015-03-17 15:49:26 -0700309
Yang Gao0e0d8e12015-02-13 14:40:41 -0800310// Two pings and a final pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700311TEST_P(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800312 ResetStub();
313
314 EchoRequest send_request;
315 EchoRequest recv_request;
316 EchoResponse send_response;
317 EchoResponse recv_response;
318 Status recv_status;
319 ClientContext cli_ctx;
320 ServerContext srv_ctx;
321 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
322
323 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800324 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700325 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800326
Craig Tillerd6c98df2015-08-18 09:33:44 -0700327 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
328 tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800329
Craig Tiller69f90e62015-08-06 08:32:35 -0700330 Verifier(GetParam()).Expect(2, true).Expect(1, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800331
332 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700333 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800334
335 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700336 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800337 EXPECT_EQ(send_request.message(), recv_request.message());
338
339 cli_stream->Write(send_request, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700340 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800341
342 srv_stream.Read(&recv_request, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700343 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800344
345 EXPECT_EQ(send_request.message(), recv_request.message());
346 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700347 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800348
349 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700350 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800351
352 send_response.set_message(recv_request.message());
353 srv_stream.Finish(send_response, Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700354 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800355
356 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700357 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800358
359 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700360 EXPECT_TRUE(recv_status.ok());
Yang Gao005f18a2015-02-13 10:22:33 -0800361}
362
Yang Gao0e0d8e12015-02-13 14:40:41 -0800363// One ping, two pongs.
Craig Tiller69f90e62015-08-06 08:32:35 -0700364TEST_P(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800365 ResetStub();
366
367 EchoRequest send_request;
368 EchoRequest recv_request;
369 EchoResponse send_response;
370 EchoResponse recv_response;
371 Status recv_status;
372 ClientContext cli_ctx;
373 ServerContext srv_ctx;
374 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
375
376 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800377 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700378 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800379
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700380 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700381 cq_.get(), cq_.get(), tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800382
Craig Tiller69f90e62015-08-06 08:32:35 -0700383 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800384 EXPECT_EQ(send_request.message(), recv_request.message());
385
386 send_response.set_message(recv_request.message());
387 srv_stream.Write(send_response, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700388 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800389
390 cli_stream->Read(&recv_response, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700391 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800392 EXPECT_EQ(send_response.message(), recv_response.message());
393
394 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700395 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800396
397 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700398 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800399 EXPECT_EQ(send_response.message(), recv_response.message());
400
401 srv_stream.Finish(Status::OK, tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700402 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800403
404 cli_stream->Read(&recv_response, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700405 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800406
407 cli_stream->Finish(&recv_status, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700408 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800409
Yang Gaoc1a2c312015-06-16 10:59:46 -0700410 EXPECT_TRUE(recv_status.ok());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800411}
412
413// One ping, one pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700414TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800415 ResetStub();
416
417 EchoRequest send_request;
418 EchoRequest recv_request;
419 EchoResponse send_response;
420 EchoResponse recv_response;
421 Status recv_status;
422 ClientContext cli_ctx;
423 ServerContext srv_ctx;
424 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
425
426 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800427 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700428 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800429
Craig Tillerd6c98df2015-08-18 09:33:44 -0700430 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
431 tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800432
Craig Tiller69f90e62015-08-06 08:32:35 -0700433 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800434
435 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700436 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800437
438 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700439 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800440 EXPECT_EQ(send_request.message(), recv_request.message());
441
442 send_response.set_message(recv_request.message());
443 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700444 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800445
446 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700447 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800448 EXPECT_EQ(send_response.message(), recv_response.message());
449
450 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700451 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800452
453 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700454 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800455
456 srv_stream.Finish(Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700457 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800458
459 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700460 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800461
Yang Gaoc1a2c312015-06-16 10:59:46 -0700462 EXPECT_TRUE(recv_status.ok());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800463}
464
Yang Gao406b32f2015-02-13 16:25:33 -0800465// Metadata tests
Craig Tiller69f90e62015-08-06 08:32:35 -0700466TEST_P(AsyncEnd2endTest, ClientInitialMetadataRpc) {
Yang Gao406b32f2015-02-13 16:25:33 -0800467 ResetStub();
468
469 EchoRequest send_request;
470 EchoRequest recv_request;
471 EchoResponse send_response;
472 EchoResponse recv_response;
473 Status recv_status;
474
475 ClientContext cli_ctx;
476 ServerContext srv_ctx;
477 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
478
479 send_request.set_message("Hello");
480 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
481 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
482 cli_ctx.AddMetadata(meta1.first, meta1.second);
483 cli_ctx.AddMetadata(meta2.first, meta2.second);
484
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800485 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700486 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800487
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700488 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
489 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700490 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800491 EXPECT_EQ(send_request.message(), recv_request.message());
492 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700493 EXPECT_EQ(meta1.second,
494 ToString(client_initial_metadata.find(meta1.first)->second));
495 EXPECT_EQ(meta2.second,
496 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700497 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800498
499 send_response.set_message(recv_request.message());
500 response_writer.Finish(send_response, Status::OK, tag(3));
501
Craig Tiller69f90e62015-08-06 08:32:35 -0700502 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800503
Yang Gao3a5e5492015-02-18 14:32:38 -0800504 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700505 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800506
507 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700508 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800509}
510
Craig Tiller69f90e62015-08-06 08:32:35 -0700511TEST_P(AsyncEnd2endTest, ServerInitialMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800512 ResetStub();
513
514 EchoRequest send_request;
515 EchoRequest recv_request;
516 EchoResponse send_response;
517 EchoResponse recv_response;
518 Status recv_status;
519
520 ClientContext cli_ctx;
521 ServerContext srv_ctx;
522 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
523
524 send_request.set_message("Hello");
525 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
526 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
527
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800528 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700529 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800530
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700531 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
532 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700533 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800534 EXPECT_EQ(send_request.message(), recv_request.message());
535 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
536 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
537 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700538 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800539
Yang Gao3a5e5492015-02-18 14:32:38 -0800540 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700541 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800542 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700543 EXPECT_EQ(meta1.second,
544 ToString(server_initial_metadata.find(meta1.first)->second));
545 EXPECT_EQ(meta2.second,
546 ToString(server_initial_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800547 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800548
549 send_response.set_message(recv_request.message());
550 response_writer.Finish(send_response, Status::OK, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700551 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800552
553 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700554 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800555
556 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700557 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800558}
559
Craig Tiller69f90e62015-08-06 08:32:35 -0700560TEST_P(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800561 ResetStub();
562
563 EchoRequest send_request;
564 EchoRequest recv_request;
565 EchoResponse send_response;
566 EchoResponse recv_response;
567 Status recv_status;
568
569 ClientContext cli_ctx;
570 ServerContext srv_ctx;
571 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
572
573 send_request.set_message("Hello");
574 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
575 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
576
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800577 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700578 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800579
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700580 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
581 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700582 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800583 EXPECT_EQ(send_request.message(), recv_request.message());
584 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700585 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800586
587 send_response.set_message(recv_request.message());
588 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
589 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
590 response_writer.Finish(send_response, Status::OK, tag(4));
591
Craig Tiller69f90e62015-08-06 08:32:35 -0700592 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800593
Yang Gao3a5e5492015-02-18 14:32:38 -0800594 response_reader->Finish(&recv_response, &recv_status, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700595 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800596 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700597 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800598 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700599 EXPECT_EQ(meta1.second,
600 ToString(server_trailing_metadata.find(meta1.first)->second));
601 EXPECT_EQ(meta2.second,
602 ToString(server_trailing_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800603 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800604}
605
Craig Tiller69f90e62015-08-06 08:32:35 -0700606TEST_P(AsyncEnd2endTest, MetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800607 ResetStub();
608
609 EchoRequest send_request;
610 EchoRequest recv_request;
611 EchoResponse send_response;
612 EchoResponse recv_response;
613 Status recv_status;
614
615 ClientContext cli_ctx;
616 ServerContext srv_ctx;
617 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
618
619 send_request.set_message("Hello");
620 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800621 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400622 "key2-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700623 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800624 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800625 std::pair<grpc::string, grpc::string> meta6(
626 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400627 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700628 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800629 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800630 std::pair<grpc::string, grpc::string> meta4(
631 "key6-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700632 grpc::string(
633 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800634
635 cli_ctx.AddMetadata(meta1.first, meta1.second);
636 cli_ctx.AddMetadata(meta2.first, meta2.second);
637
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800638 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700639 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800640
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700641 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
642 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700643 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800644 EXPECT_EQ(send_request.message(), recv_request.message());
645 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700646 EXPECT_EQ(meta1.second,
647 ToString(client_initial_metadata.find(meta1.first)->second));
648 EXPECT_EQ(meta2.second,
649 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700650 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800651
652 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
653 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
654 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700655 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800656 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700657 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800658 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700659 EXPECT_EQ(meta3.second,
660 ToString(server_initial_metadata.find(meta3.first)->second));
661 EXPECT_EQ(meta4.second,
662 ToString(server_initial_metadata.find(meta4.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700663 EXPECT_GE(server_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao3a5e5492015-02-18 14:32:38 -0800664
665 send_response.set_message(recv_request.message());
666 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
667 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
668 response_writer.Finish(send_response, Status::OK, tag(5));
669
Craig Tiller69f90e62015-08-06 08:32:35 -0700670 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800671
Yang Gao3a5e5492015-02-18 14:32:38 -0800672 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700673 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800674 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700675 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800676 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700677 EXPECT_EQ(meta5.second,
678 ToString(server_trailing_metadata.find(meta5.first)->second));
679 EXPECT_EQ(meta6.second,
680 ToString(server_trailing_metadata.find(meta6.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700681 EXPECT_GE(server_trailing_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800682}
yang-gb3352562015-08-04 14:42:06 -0700683
684// Server uses AsyncNotifyWhenDone API to check for cancellation
Craig Tiller69f90e62015-08-06 08:32:35 -0700685TEST_P(AsyncEnd2endTest, ServerCheckCancellation) {
yang-gb3352562015-08-04 14:42:06 -0700686 ResetStub();
687
688 EchoRequest send_request;
689 EchoRequest recv_request;
690 EchoResponse send_response;
691 EchoResponse recv_response;
692 Status recv_status;
693
694 ClientContext cli_ctx;
695 ServerContext srv_ctx;
696 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
697
698 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800699 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700700 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
701
702 srv_ctx.AsyncNotifyWhenDone(tag(5));
703 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
704 cq_.get(), tag(2));
705
Craig Tiller69f90e62015-08-06 08:32:35 -0700706 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700707 EXPECT_EQ(send_request.message(), recv_request.message());
708
709 cli_ctx.TryCancel();
Craig Tiller69f90e62015-08-06 08:32:35 -0700710 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700711 EXPECT_TRUE(srv_ctx.IsCancelled());
712
713 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700714 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700715
716 EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
717}
718
719// Server uses AsyncNotifyWhenDone API to check for normal finish
Craig Tiller69f90e62015-08-06 08:32:35 -0700720TEST_P(AsyncEnd2endTest, ServerCheckDone) {
yang-gb3352562015-08-04 14:42:06 -0700721 ResetStub();
722
723 EchoRequest send_request;
724 EchoRequest recv_request;
725 EchoResponse send_response;
726 EchoResponse recv_response;
727 Status recv_status;
728
729 ClientContext cli_ctx;
730 ServerContext srv_ctx;
731 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
732
733 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800734 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-gb3352562015-08-04 14:42:06 -0700735 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
736
737 srv_ctx.AsyncNotifyWhenDone(tag(5));
738 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
739 cq_.get(), tag(2));
740
Craig Tiller69f90e62015-08-06 08:32:35 -0700741 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700742 EXPECT_EQ(send_request.message(), recv_request.message());
743
744 send_response.set_message(recv_request.message());
745 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700746 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
747 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700748 EXPECT_FALSE(srv_ctx.IsCancelled());
749
750 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700751 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700752
753 EXPECT_EQ(send_response.message(), recv_response.message());
754 EXPECT_TRUE(recv_status.ok());
755}
756
Craig Tiller8f7bff72015-08-17 13:23:14 -0700757TEST_P(AsyncEnd2endTest, UnimplementedRpc) {
yang-g730055d2015-08-27 12:29:45 -0700758 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -0700759 CreateChannel(server_address_.str(), InsecureChannelCredentials());
Craig Tiller1b4e3302015-12-17 16:35:00 -0800760 std::unique_ptr<grpc::testing::UnimplementedService::Stub> stub;
761 stub = grpc::testing::UnimplementedService::NewStub(channel);
yang-g9b7757d2015-08-13 11:15:53 -0700762 EchoRequest send_request;
763 EchoResponse recv_response;
764 Status recv_status;
765
766 ClientContext cli_ctx;
767 send_request.set_message("Hello");
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800768 std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
yang-g9b7757d2015-08-13 11:15:53 -0700769 stub->AsyncUnimplemented(&cli_ctx, send_request, cq_.get()));
770
771 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller8f7bff72015-08-17 13:23:14 -0700772 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-g9b7757d2015-08-13 11:15:53 -0700773
774 EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
775 EXPECT_EQ("", recv_status.error_message());
776}
777
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800778class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
779 protected:
780 typedef enum {
781 DO_NOT_CANCEL = 0,
782 CANCEL_BEFORE_PROCESSING,
783 CANCEL_DURING_PROCESSING,
784 CANCEL_AFTER_PROCESSING
785 } ServerTryCancelRequestPhase;
786
787 void ServerTryCancel(ServerContext* context) {
788 EXPECT_FALSE(context->IsCancelled());
789 context->TryCancel();
790 gpr_log(GPR_INFO, "Server called TryCancel()");
791 EXPECT_TRUE(context->IsCancelled());
792 }
793
794 void TestClientStreamingServerCancel(
795 ServerTryCancelRequestPhase server_try_cancel) {
796 ResetStub();
797
798 EchoRequest send_request;
799 EchoRequest recv_request;
800 EchoResponse send_response;
801 EchoResponse recv_response;
802 Status recv_status;
803
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800804 ClientContext cli_ctx;
805 ServerContext srv_ctx;
806 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
807
808 // Initiate the 'RequestStream' call on client
809 std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800810 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
811 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800812
813 // On the server, request to be notified of 'RequestStream' calls
814 // and receive the 'RequestStream' call just made by the client
815 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
816 tag(2));
817 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
818
819 // Client sends 3 messages (tags 3, 4 and 5)
820 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
821 send_request.set_message("Ping " + std::to_string(tag_idx));
822 cli_stream->Write(send_request, tag(tag_idx));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800823 Verifier(GetParam()).Expect(tag_idx, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800824 }
825 cli_stream->WritesDone(tag(6));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800826 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800827
828 bool expected_server_cq_result = true;
829 bool ignore_cq_result = false;
830
831 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
832 ServerTryCancel(&srv_ctx);
833
834 // Since cancellation is done before server reads any results, we know
835 // for sure that all cq results will return false from this point forward
836 expected_server_cq_result = false;
837 }
838
839 std::thread* server_try_cancel_thd = NULL;
840 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
841 server_try_cancel_thd = new std::thread(
842 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
843 // Server will cancel the RPC in a parallel thread while reading the
844 // requests from the client. Since the cancellation can happen at anytime,
845 // some of the cq results (i.e those until cancellation) might be true but
846 // its non deterministic. So better to ignore the cq results
847 ignore_cq_result = true;
848 }
849
850 // Server reads 3 messages (tags 6, 7 and 8)
851 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
852 srv_stream.Read(&recv_request, tag(tag_idx));
853 Verifier(GetParam())
854 .Expect(tag_idx, expected_server_cq_result)
855 .Verify(cq_.get(), ignore_cq_result);
856 }
857
858 if (server_try_cancel_thd != NULL) {
859 server_try_cancel_thd->join();
860 delete server_try_cancel_thd;
861 }
862
863 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
864 ServerTryCancel(&srv_ctx);
865 }
866
867 // Note: The RPC has been cancelled at this point for sure. So, from this
868 // point forward, we know that cq results are supposed to return false on
869 // server.
870
871 send_response.set_message("Pong");
872 srv_stream.Finish(send_response, Status::CANCELLED, tag(9));
873 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
874
875 cli_stream->Finish(&recv_status, tag(10));
876 // TODO: sreek: The expectation here should be true. This seems like a bug.
877 // Investigating
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800878 Verifier(GetParam()).Expect(10, false).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800879 EXPECT_FALSE(recv_status.ok());
880 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
881 }
882
883 void TestServerStreamingServerCancel(
884 ServerTryCancelRequestPhase server_try_cancel) {
885 ResetStub();
886
887 EchoRequest send_request;
888 EchoRequest recv_request;
889 EchoResponse send_response;
890 EchoResponse recv_response;
891 Status recv_status;
892 ClientContext cli_ctx;
893 ServerContext srv_ctx;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800894 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
895
896 send_request.set_message("Ping");
897 // Initiate the 'ResponseStream' call on the client
898 std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800899 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
900 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800901
902 // On the server, request to be notified of 'ResponseStream' calls and
903 // receive the call just made by the client
904 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
905 cq_.get(), cq_.get(), tag(2));
906 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
907 EXPECT_EQ(send_request.message(), recv_request.message());
908
909 bool expected_cq_result = true;
910 bool ignore_cq_result = false;
911
912 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
913 ServerTryCancel(&srv_ctx);
914
915 // We know for sure that all cq results will be false from this point
916 // since the server cancelled the RPC
917 expected_cq_result = false;
918 }
919
920 std::thread* server_try_cancel_thd = NULL;
921 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
922 server_try_cancel_thd = new std::thread(
923 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
924
925 // Server will cancel the RPC in a parallel thread while writing responses
926 // to the client. Since the cancellation can happen at anytime, some of
927 // the cq results (i.e those until cancellation) might be true but
928 // its non deterministic. So better to ignore the cq results
929 ignore_cq_result = true;
930 }
931
932 // Server sends three messages (tags 3, 4 and 5)
933 for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
934 send_response.set_message("Pong " + std::to_string(tag_idx));
935 srv_stream.Write(send_response, tag(tag_idx));
936 Verifier(GetParam())
937 .Expect(tag_idx, expected_cq_result)
938 .Verify(cq_.get(), ignore_cq_result);
939 }
940
941 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
942 ServerTryCancel(&srv_ctx);
943 }
944
945 // Client attemts to read the three messages
946 for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
947 cli_stream->Read(&recv_response, tag(tag_idx));
948 Verifier(GetParam())
949 .Expect(tag_idx, expected_cq_result)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800950 .Verify(cq_.get(), ignore_cq_result);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800951 }
952
953 if (server_try_cancel_thd != NULL) {
954 server_try_cancel_thd->join();
955 delete server_try_cancel_thd;
956 }
957
958 // Note: At this point, we know that server has cancelled the request for
959 // sure.
960
961 // Server finishes the stream
962 srv_stream.Finish(Status::CANCELLED, tag(9));
963 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
964
965 // Client receives the cancellation
966 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800967 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800968 EXPECT_FALSE(recv_status.ok());
969 EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
970 }
971
972 void TestBidiStreamingServerCancel(
973 ServerTryCancelRequestPhase server_try_cancel) {
974 ResetStub();
975
976 EchoRequest send_request;
977 EchoRequest recv_request;
978 EchoResponse send_response;
979 EchoResponse recv_response;
980 Status recv_status;
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800981 ClientContext cli_ctx;
982 ServerContext srv_ctx;
983 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
984
985 // Initiate the call from the client side
986 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800987 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
988 Verifier(GetParam()).Expect(1, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800989
990 // On the server, request to be notified of the 'BidiStream' call and
991 // receive the call just made by the client
992 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
993 tag(2));
994 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
995
996 send_request.set_message("Ping");
997 cli_stream->Write(send_request, tag(3));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -0800998 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -0800999
1000 bool expected_cq_result = true;
1001 bool ignore_cq_result = false;
1002 if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
1003 ServerTryCancel(&srv_ctx);
1004
1005 // We know for sure that all cq results will be false from this point
1006 // since the server cancelled the RPC
1007 expected_cq_result = false;
1008 }
1009
1010 std::thread* server_try_cancel_thd = NULL;
1011 if (server_try_cancel == CANCEL_DURING_PROCESSING) {
1012 server_try_cancel_thd = new std::thread(
1013 &AsyncEnd2endServerTryCancelTest::ServerTryCancel, this, &srv_ctx);
1014
1015 // Since server is going to cancel the RPC in a parallel thread, some of
1016 // the cq results (i.e those until the cancellation) might be true. Since
1017 // that number is non-deterministic, it is better to ignore the cq results
1018 ignore_cq_result = true;
1019 }
1020
1021 srv_stream.Read(&recv_request, tag(4));
1022 Verifier(GetParam())
1023 .Expect(4, expected_cq_result)
1024 .Verify(cq_.get(), ignore_cq_result);
1025
1026 send_response.set_message("Pong");
1027 srv_stream.Write(send_response, tag(5));
1028 Verifier(GetParam())
1029 .Expect(5, expected_cq_result)
1030 .Verify(cq_.get(), ignore_cq_result);
1031
1032 cli_stream->Read(&recv_response, tag(6));
1033 Verifier(GetParam())
1034 .Expect(6, expected_cq_result)
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001035 .Verify(cq_.get(), ignore_cq_result);
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001036
1037 // This is expected to succeed in all cases
1038 cli_stream->WritesDone(tag(7));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001039 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001040
1041 // This is expected to fail in all cases (Either there are no more msgs from
1042 // the client or the RPC is cancelled on the server)
1043 srv_stream.Read(&recv_request, tag(8));
1044 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
1045
1046 if (server_try_cancel_thd != NULL) {
1047 server_try_cancel_thd->join();
1048 delete server_try_cancel_thd;
1049 }
1050
1051 if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
1052 ServerTryCancel(&srv_ctx);
1053 }
1054
1055 // At this point, we know that the server cancelled the request for sure
1056
1057 srv_stream.Finish(Status::CANCELLED, tag(9));
1058 Verifier(GetParam()).Expect(9, false).Verify(cq_.get());
1059
1060 cli_stream->Finish(&recv_status, tag(10));
Sree Kuchibhotla4fb59082016-01-29 11:16:24 -08001061 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001062 EXPECT_FALSE(recv_status.ok());
1063 EXPECT_EQ(grpc::StatusCode::CANCELLED, recv_status.error_code());
1064 }
1065};
1066
1067TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelBefore) {
1068 TestClientStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1069}
1070
1071TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelDuring) {
1072 TestClientStreamingServerCancel(CANCEL_DURING_PROCESSING);
1073}
1074
1075TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelAfter) {
1076 TestClientStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1077}
1078
1079TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelBefore) {
1080 TestServerStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1081}
1082
1083TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelDuring) {
1084 TestServerStreamingServerCancel(CANCEL_DURING_PROCESSING);
1085}
1086
1087TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelAfter) {
1088 TestServerStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1089}
1090
1091TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelBefore) {
1092 TestBidiStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
1093}
1094
1095TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelDuring) {
1096 TestBidiStreamingServerCancel(CANCEL_DURING_PROCESSING);
1097}
1098
1099TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelAfter) {
1100 TestBidiStreamingServerCancel(CANCEL_AFTER_PROCESSING);
1101}
1102
Craig Tiller4c06b822015-08-06 08:41:31 -07001103INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest,
1104 ::testing::Values(false, true));
Sree Kuchibhotla944f4cf2016-01-27 14:37:26 -08001105INSTANTIATE_TEST_CASE_P(AsyncEnd2endServerTryCancel,
1106 AsyncEnd2endServerTryCancelTest,
1107 ::testing::Values(false));
Craig Tiller69f90e62015-08-06 08:32:35 -07001108
Craig Tiller0220cf12015-02-12 17:39:26 -08001109} // namespace
1110} // namespace testing
1111} // namespace grpc
1112
1113int main(int argc, char** argv) {
1114 grpc_test_init(argc, argv);
Craig Tiller0220cf12015-02-12 17:39:26 -08001115 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -07001116 return RUN_ALL_TESTS();
Craig Tiller0220cf12015-02-12 17:39:26 -08001117}