blob: cfb6c21edc9e6ea7098b29a93a63cf2b15650877 [file] [log] [blame]
Craig Tiller0220cf12015-02-12 17:39:26 -08001/*
2 *
Craig Tiller06059952015-02-18 08:34:56 -08003 * Copyright 2015, Google Inc.
Craig Tiller0220cf12015-02-12 17:39:26 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
Yang Gaoda699b82015-02-18 01:10:22 -080034#include <memory>
Craig Tiller0220cf12015-02-12 17:39:26 -080035
yang-g9e2f90c2015-08-21 15:35:03 -070036#include <grpc/grpc.h>
37#include <grpc/support/thd.h>
38#include <grpc/support/time.h>
yang-g8c2be9f2015-08-19 16:28:09 -070039#include <grpc++/channel.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080040#include <grpc++/client_context.h>
41#include <grpc++/create_channel.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080042#include <grpc++/server.h>
43#include <grpc++/server_builder.h>
44#include <grpc++/server_context.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080045#include <gtest/gtest.h>
46
yang-g9e2f90c2015-08-21 15:35:03 -070047#include "test/core/util/port.h"
48#include "test/core/util/test_config.h"
49#include "test/cpp/util/echo_duplicate.grpc.pb.h"
50#include "test/cpp/util/echo.grpc.pb.h"
yang-ge21908f2015-08-25 13:47:51 -070051#include "test/cpp/util/string_ref_helper.h"
Craig Tiller0220cf12015-02-12 17:39:26 -080052
Craig Tiller69f90e62015-08-06 08:32:35 -070053#ifdef GPR_POSIX_SOCKET
54#include "src/core/iomgr/pollset_posix.h"
55#endif
56
Craig Tiller0220cf12015-02-12 17:39:26 -080057using grpc::cpp::test::util::EchoRequest;
58using grpc::cpp::test::util::EchoResponse;
59using std::chrono::system_clock;
60
61namespace grpc {
62namespace testing {
63
64namespace {
65
Craig Tillerd6c98df2015-08-18 09:33:44 -070066void* tag(int i) { return (void*)(gpr_intptr)i; }
Yang Gaoc05b6cb2015-02-13 00:34:10 -080067
Craig Tiller69f90e62015-08-06 08:32:35 -070068#ifdef GPR_POSIX_SOCKET
Craig Tiller4c06b822015-08-06 08:41:31 -070069static int assert_non_blocking_poll(struct pollfd* pfds, nfds_t nfds,
70 int timeout) {
Craig Tiller69f90e62015-08-06 08:32:35 -070071 GPR_ASSERT(timeout == 0);
72 return poll(pfds, nfds, timeout);
73}
74
75class PollOverride {
Craig Tiller06cf3cc2015-05-13 13:11:01 -070076 public:
Craig Tiller69f90e62015-08-06 08:32:35 -070077 PollOverride(grpc_poll_function_type f) {
78 prev_ = grpc_poll_function;
79 grpc_poll_function = f;
80 }
81
Craig Tiller4c06b822015-08-06 08:41:31 -070082 ~PollOverride() { grpc_poll_function = prev_; }
Craig Tiller69f90e62015-08-06 08:32:35 -070083
84 private:
85 grpc_poll_function_type prev_;
86};
87
88class PollingCheckRegion : public PollOverride {
89 public:
Craig Tiller4c06b822015-08-06 08:41:31 -070090 explicit PollingCheckRegion(bool allow_blocking)
Craig Tiller69f90e62015-08-06 08:32:35 -070091 : PollOverride(allow_blocking ? poll : assert_non_blocking_poll) {}
92};
93#else
94class PollingCheckRegion {
95 public:
96 explicit PollingCheckRegion(bool allow_blocking) {}
97};
98#endif
99
100class Verifier : public PollingCheckRegion {
101 public:
102 explicit Verifier(bool spin) : PollingCheckRegion(!spin), spin_(spin) {}
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700103 Verifier& Expect(int i, bool expect_ok) {
104 expectations_[tag(i)] = expect_ok;
105 return *this;
vjpai7aadf462015-03-16 23:58:44 -0700106 }
Craig Tillerd6c98df2015-08-18 09:33:44 -0700107 void Verify(CompletionQueue* cq) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700108 GPR_ASSERT(!expectations_.empty());
109 while (!expectations_.empty()) {
110 bool ok;
111 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700112 if (spin_) {
113 for (;;) {
114 auto r = cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
115 if (r == CompletionQueue::TIMEOUT) continue;
116 if (r == CompletionQueue::GOT_EVENT) break;
117 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
118 abort();
119 }
120 } else {
121 EXPECT_TRUE(cq->Next(&got_tag, &ok));
122 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700123 auto it = expectations_.find(got_tag);
124 EXPECT_TRUE(it != expectations_.end());
125 EXPECT_EQ(it->second, ok);
126 expectations_.erase(it);
127 }
128 }
Craig Tillerd6c98df2015-08-18 09:33:44 -0700129 void Verify(CompletionQueue* cq,
130 std::chrono::system_clock::time_point deadline) {
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700131 if (expectations_.empty()) {
132 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700133 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700134 if (spin_) {
135 while (std::chrono::system_clock::now() < deadline) {
Craig Tiller4c06b822015-08-06 08:41:31 -0700136 EXPECT_EQ(
137 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)),
138 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700139 }
140 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700141 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
142 CompletionQueue::TIMEOUT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700143 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700144 } else {
145 while (!expectations_.empty()) {
146 bool ok;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700147 void* got_tag;
Craig Tiller69f90e62015-08-06 08:32:35 -0700148 if (spin_) {
149 for (;;) {
150 GPR_ASSERT(std::chrono::system_clock::now() < deadline);
Craig Tiller4c06b822015-08-06 08:41:31 -0700151 auto r =
152 cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
Craig Tiller69f90e62015-08-06 08:32:35 -0700153 if (r == CompletionQueue::TIMEOUT) continue;
154 if (r == CompletionQueue::GOT_EVENT) break;
155 gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
156 abort();
Craig Tiller4c06b822015-08-06 08:41:31 -0700157 }
Craig Tiller69f90e62015-08-06 08:32:35 -0700158 } else {
Craig Tiller4c06b822015-08-06 08:41:31 -0700159 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
160 CompletionQueue::GOT_EVENT);
Craig Tiller69f90e62015-08-06 08:32:35 -0700161 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700162 auto it = expectations_.find(got_tag);
163 EXPECT_TRUE(it != expectations_.end());
164 EXPECT_EQ(it->second, ok);
165 expectations_.erase(it);
166 }
167 }
168 }
169
170 private:
171 std::map<void*, bool> expectations_;
Craig Tiller69f90e62015-08-06 08:32:35 -0700172 bool spin_;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700173};
vjpai7aadf462015-03-16 23:58:44 -0700174
Craig Tiller69f90e62015-08-06 08:32:35 -0700175class AsyncEnd2endTest : public ::testing::TestWithParam<bool> {
Craig Tiller0220cf12015-02-12 17:39:26 -0800176 protected:
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700177 AsyncEnd2endTest() {}
Craig Tiller0220cf12015-02-12 17:39:26 -0800178
Craig Tillercf133f42015-02-26 14:05:56 -0800179 void SetUp() GRPC_OVERRIDE {
Craig Tiller0220cf12015-02-12 17:39:26 -0800180 int port = grpc_pick_unused_port_or_die();
181 server_address_ << "localhost:" << port;
182 // Setup server
183 ServerBuilder builder;
Craig Tillerd6c98df2015-08-18 09:33:44 -0700184 builder.AddListeningPort(server_address_.str(),
185 grpc::InsecureServerCredentials());
Craig Tiller0220cf12015-02-12 17:39:26 -0800186 builder.RegisterAsyncService(&service_);
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700187 cq_ = builder.AddCompletionQueue();
Craig Tiller0220cf12015-02-12 17:39:26 -0800188 server_ = builder.BuildAndStart();
189 }
190
Craig Tillercf133f42015-02-26 14:05:56 -0800191 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800192 server_->Shutdown();
193 void* ignored_tag;
194 bool ignored_ok;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700195 cq_->Shutdown();
196 while (cq_->Next(&ignored_tag, &ignored_ok))
Craig Tiller492968f2015-02-18 13:14:03 -0800197 ;
198 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800199
200 void ResetStub() {
yang-g730055d2015-08-27 12:29:45 -0700201 std::shared_ptr<Channel> channel =
202 CreateChannel(server_address_.str(), InsecureCredentials());
Nicolas "Pixel" Noble7fa51672015-09-02 02:29:09 +0200203 stub_ = grpc::cpp::test::util::TestService::NewStub(channel);
Craig Tiller0220cf12015-02-12 17:39:26 -0800204 }
205
Yang Gao406b32f2015-02-13 16:25:33 -0800206 void SendRpc(int num_rpcs) {
207 for (int i = 0; i < num_rpcs; i++) {
208 EchoRequest send_request;
209 EchoRequest recv_request;
210 EchoResponse send_response;
211 EchoResponse recv_response;
212 Status recv_status;
213
214 ClientContext cli_ctx;
215 ServerContext srv_ctx;
216 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
217
218 send_request.set_message("Hello");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800219 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700220 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800221
Craig Tillerd6c98df2015-08-18 09:33:44 -0700222 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
223 cq_.get(), tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800224
Craig Tiller69f90e62015-08-06 08:32:35 -0700225 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800226 EXPECT_EQ(send_request.message(), recv_request.message());
227
228 send_response.set_message(recv_request.message());
229 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700230 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800231
Yang Gao3a5e5492015-02-18 14:32:38 -0800232 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700233 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800234
235 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700236 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800237 }
238 }
239
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700240 std::unique_ptr<ServerCompletionQueue> cq_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800241 std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
242 std::unique_ptr<Server> server_;
243 grpc::cpp::test::util::TestService::AsyncService service_;
244 std::ostringstream server_address_;
245};
246
Craig Tiller69f90e62015-08-06 08:32:35 -0700247TEST_P(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800248 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800249 SendRpc(1);
250}
Yang Gaobb84a302015-02-12 23:30:12 -0800251
Craig Tiller69f90e62015-08-06 08:32:35 -0700252TEST_P(AsyncEnd2endTest, SequentialRpcs) {
Yang Gao406b32f2015-02-13 16:25:33 -0800253 ResetStub();
254 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800255}
256
vjpai7aadf462015-03-16 23:58:44 -0700257// Test a simple RPC using the async version of Next
Craig Tiller69f90e62015-08-06 08:32:35 -0700258TEST_P(AsyncEnd2endTest, AsyncNextRpc) {
vjpai7aadf462015-03-16 23:58:44 -0700259 ResetStub();
260
261 EchoRequest send_request;
262 EchoRequest recv_request;
263 EchoResponse send_response;
264 EchoResponse recv_response;
265 Status recv_status;
266
267 ClientContext cli_ctx;
268 ServerContext srv_ctx;
269 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
270
271 send_request.set_message("Hello");
Yang Gao757afae2015-03-17 15:49:26 -0700272 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700273 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
vjpai7aadf462015-03-16 23:58:44 -0700274
Yang Gao757afae2015-03-17 15:49:26 -0700275 std::chrono::system_clock::time_point time_now(
Craig Tillerf51199f2015-05-08 09:32:53 -0700276 std::chrono::system_clock::now());
277 std::chrono::system_clock::time_point time_limit(
278 std::chrono::system_clock::now() + std::chrono::seconds(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700279 Verifier(GetParam()).Verify(cq_.get(), time_now);
280 Verifier(GetParam()).Verify(cq_.get(), time_now);
vjpai7aadf462015-03-16 23:58:44 -0700281
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700282 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
283 cq_.get(), tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700284
Craig Tiller69f90e62015-08-06 08:32:35 -0700285 Verifier(GetParam()).Expect(2, true).Verify(cq_.get(), time_limit);
vjpai7aadf462015-03-16 23:58:44 -0700286 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700287
288 send_response.set_message(recv_request.message());
289 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller4c06b822015-08-06 08:41:31 -0700290 Verifier(GetParam())
291 .Expect(3, true)
292 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700293
294 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller4c06b822015-08-06 08:41:31 -0700295 Verifier(GetParam())
296 .Expect(4, true)
297 .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700298
299 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700300 EXPECT_TRUE(recv_status.ok());
vjpai7aadf462015-03-16 23:58:44 -0700301}
Yang Gao757afae2015-03-17 15:49:26 -0700302
Yang Gao0e0d8e12015-02-13 14:40:41 -0800303// Two pings and a final pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700304TEST_P(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800305 ResetStub();
306
307 EchoRequest send_request;
308 EchoRequest recv_request;
309 EchoResponse send_response;
310 EchoResponse recv_response;
311 Status recv_status;
312 ClientContext cli_ctx;
313 ServerContext srv_ctx;
314 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
315
316 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800317 std::unique_ptr<ClientAsyncWriter<EchoRequest> > cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700318 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800319
Craig Tillerd6c98df2015-08-18 09:33:44 -0700320 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
321 tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800322
Craig Tiller69f90e62015-08-06 08:32:35 -0700323 Verifier(GetParam()).Expect(2, true).Expect(1, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800324
325 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700326 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800327
328 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700329 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800330 EXPECT_EQ(send_request.message(), recv_request.message());
331
332 cli_stream->Write(send_request, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700333 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800334
335 srv_stream.Read(&recv_request, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700336 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800337
338 EXPECT_EQ(send_request.message(), recv_request.message());
339 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700340 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800341
342 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700343 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800344
345 send_response.set_message(recv_request.message());
346 srv_stream.Finish(send_response, Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700347 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800348
349 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700350 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800351
352 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700353 EXPECT_TRUE(recv_status.ok());
Yang Gao005f18a2015-02-13 10:22:33 -0800354}
355
Yang Gao0e0d8e12015-02-13 14:40:41 -0800356// One ping, two pongs.
Craig Tiller69f90e62015-08-06 08:32:35 -0700357TEST_P(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800358 ResetStub();
359
360 EchoRequest send_request;
361 EchoRequest recv_request;
362 EchoResponse send_response;
363 EchoResponse recv_response;
364 Status recv_status;
365 ClientContext cli_ctx;
366 ServerContext srv_ctx;
367 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
368
369 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800370 std::unique_ptr<ClientAsyncReader<EchoResponse> > cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700371 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800372
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700373 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700374 cq_.get(), cq_.get(), tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800375
Craig Tiller69f90e62015-08-06 08:32:35 -0700376 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800377 EXPECT_EQ(send_request.message(), recv_request.message());
378
379 send_response.set_message(recv_request.message());
380 srv_stream.Write(send_response, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700381 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800382
383 cli_stream->Read(&recv_response, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700384 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800385 EXPECT_EQ(send_response.message(), recv_response.message());
386
387 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700388 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800389
390 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700391 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800392 EXPECT_EQ(send_response.message(), recv_response.message());
393
394 srv_stream.Finish(Status::OK, tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700395 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800396
397 cli_stream->Read(&recv_response, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700398 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800399
400 cli_stream->Finish(&recv_status, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700401 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800402
Yang Gaoc1a2c312015-06-16 10:59:46 -0700403 EXPECT_TRUE(recv_status.ok());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800404}
405
406// One ping, one pong.
Craig Tiller69f90e62015-08-06 08:32:35 -0700407TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800408 ResetStub();
409
410 EchoRequest send_request;
411 EchoRequest recv_request;
412 EchoResponse send_response;
413 EchoResponse recv_response;
414 Status recv_status;
415 ClientContext cli_ctx;
416 ServerContext srv_ctx;
417 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
418
419 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800420 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse> >
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700421 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800422
Craig Tillerd6c98df2015-08-18 09:33:44 -0700423 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
424 tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800425
Craig Tiller69f90e62015-08-06 08:32:35 -0700426 Verifier(GetParam()).Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800427
428 cli_stream->Write(send_request, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700429 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800430
431 srv_stream.Read(&recv_request, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700432 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800433 EXPECT_EQ(send_request.message(), recv_request.message());
434
435 send_response.set_message(recv_request.message());
436 srv_stream.Write(send_response, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700437 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800438
439 cli_stream->Read(&recv_response, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700440 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800441 EXPECT_EQ(send_response.message(), recv_response.message());
442
443 cli_stream->WritesDone(tag(7));
Craig Tiller69f90e62015-08-06 08:32:35 -0700444 Verifier(GetParam()).Expect(7, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800445
446 srv_stream.Read(&recv_request, tag(8));
Craig Tiller69f90e62015-08-06 08:32:35 -0700447 Verifier(GetParam()).Expect(8, false).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800448
449 srv_stream.Finish(Status::OK, tag(9));
Craig Tiller69f90e62015-08-06 08:32:35 -0700450 Verifier(GetParam()).Expect(9, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800451
452 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller69f90e62015-08-06 08:32:35 -0700453 Verifier(GetParam()).Expect(10, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800454
Yang Gaoc1a2c312015-06-16 10:59:46 -0700455 EXPECT_TRUE(recv_status.ok());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800456}
457
Yang Gao406b32f2015-02-13 16:25:33 -0800458// Metadata tests
Craig Tiller69f90e62015-08-06 08:32:35 -0700459TEST_P(AsyncEnd2endTest, ClientInitialMetadataRpc) {
Yang Gao406b32f2015-02-13 16:25:33 -0800460 ResetStub();
461
462 EchoRequest send_request;
463 EchoRequest recv_request;
464 EchoResponse send_response;
465 EchoResponse recv_response;
466 Status recv_status;
467
468 ClientContext cli_ctx;
469 ServerContext srv_ctx;
470 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
471
472 send_request.set_message("Hello");
473 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
474 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
475 cli_ctx.AddMetadata(meta1.first, meta1.second);
476 cli_ctx.AddMetadata(meta2.first, meta2.second);
477
Yang Gao3a5e5492015-02-18 14:32:38 -0800478 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700479 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800480
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700481 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
482 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700483 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800484 EXPECT_EQ(send_request.message(), recv_request.message());
485 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700486 EXPECT_EQ(meta1.second,
487 ToString(client_initial_metadata.find(meta1.first)->second));
488 EXPECT_EQ(meta2.second,
489 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700490 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800491
492 send_response.set_message(recv_request.message());
493 response_writer.Finish(send_response, Status::OK, tag(3));
494
Craig Tiller69f90e62015-08-06 08:32:35 -0700495 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800496
Yang Gao3a5e5492015-02-18 14:32:38 -0800497 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700498 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800499
500 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700501 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800502}
503
Craig Tiller69f90e62015-08-06 08:32:35 -0700504TEST_P(AsyncEnd2endTest, ServerInitialMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800505 ResetStub();
506
507 EchoRequest send_request;
508 EchoRequest recv_request;
509 EchoResponse send_response;
510 EchoResponse recv_response;
511 Status recv_status;
512
513 ClientContext cli_ctx;
514 ServerContext srv_ctx;
515 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
516
517 send_request.set_message("Hello");
518 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
519 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
520
Yang Gao3a5e5492015-02-18 14:32:38 -0800521 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700522 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800523
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700524 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
525 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700526 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800527 EXPECT_EQ(send_request.message(), recv_request.message());
528 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
529 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
530 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700531 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800532
Yang Gao3a5e5492015-02-18 14:32:38 -0800533 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700534 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800535 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700536 EXPECT_EQ(meta1.second,
537 ToString(server_initial_metadata.find(meta1.first)->second));
538 EXPECT_EQ(meta2.second,
539 ToString(server_initial_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800540 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800541
542 send_response.set_message(recv_request.message());
543 response_writer.Finish(send_response, Status::OK, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700544 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800545
546 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700547 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800548
549 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700550 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800551}
552
Craig Tiller69f90e62015-08-06 08:32:35 -0700553TEST_P(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800554 ResetStub();
555
556 EchoRequest send_request;
557 EchoRequest recv_request;
558 EchoResponse send_response;
559 EchoResponse recv_response;
560 Status recv_status;
561
562 ClientContext cli_ctx;
563 ServerContext srv_ctx;
564 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
565
566 send_request.set_message("Hello");
567 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
568 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
569
Yang Gao3a5e5492015-02-18 14:32:38 -0800570 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700571 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800572
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700573 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
574 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700575 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800576 EXPECT_EQ(send_request.message(), recv_request.message());
577 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700578 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800579
580 send_response.set_message(recv_request.message());
581 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
582 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
583 response_writer.Finish(send_response, Status::OK, tag(4));
584
Craig Tiller69f90e62015-08-06 08:32:35 -0700585 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800586
Yang Gao3a5e5492015-02-18 14:32:38 -0800587 response_reader->Finish(&recv_response, &recv_status, tag(5));
Craig Tiller69f90e62015-08-06 08:32:35 -0700588 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800589 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700590 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800591 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700592 EXPECT_EQ(meta1.second,
593 ToString(server_trailing_metadata.find(meta1.first)->second));
594 EXPECT_EQ(meta2.second,
595 ToString(server_trailing_metadata.find(meta2.first)->second));
vjpaid5577aa2015-02-18 22:26:48 -0800596 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800597}
598
Craig Tiller69f90e62015-08-06 08:32:35 -0700599TEST_P(AsyncEnd2endTest, MetadataRpc) {
Yang Gao2b7f5372015-02-18 00:45:53 -0800600 ResetStub();
601
602 EchoRequest send_request;
603 EchoRequest recv_request;
604 EchoResponse send_response;
605 EchoResponse recv_response;
606 Status recv_status;
607
608 ClientContext cli_ctx;
609 ServerContext srv_ctx;
610 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
611
612 send_request.set_message("Hello");
613 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800614 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400615 "key2-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700616 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800617 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800618 std::pair<grpc::string, grpc::string> meta6(
619 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400620 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700621 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800622 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800623 std::pair<grpc::string, grpc::string> meta4(
624 "key6-bin",
Craig Tillerd6c98df2015-08-18 09:33:44 -0700625 grpc::string(
626 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800627
628 cli_ctx.AddMetadata(meta1.first, meta1.second);
629 cli_ctx.AddMetadata(meta2.first, meta2.second);
630
Yang Gao3a5e5492015-02-18 14:32:38 -0800631 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700632 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800633
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700634 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
635 cq_.get(), tag(2));
Craig Tiller69f90e62015-08-06 08:32:35 -0700636 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800637 EXPECT_EQ(send_request.message(), recv_request.message());
638 auto client_initial_metadata = srv_ctx.client_metadata();
yang-ge21908f2015-08-25 13:47:51 -0700639 EXPECT_EQ(meta1.second,
640 ToString(client_initial_metadata.find(meta1.first)->second));
641 EXPECT_EQ(meta2.second,
642 ToString(client_initial_metadata.find(meta2.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700643 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800644
645 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
646 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
647 response_writer.SendInitialMetadata(tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700648 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800649 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700650 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800651 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700652 EXPECT_EQ(meta3.second,
653 ToString(server_initial_metadata.find(meta3.first)->second));
654 EXPECT_EQ(meta4.second,
655 ToString(server_initial_metadata.find(meta4.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700656 EXPECT_GE(server_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao3a5e5492015-02-18 14:32:38 -0800657
658 send_response.set_message(recv_request.message());
659 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
660 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
661 response_writer.Finish(send_response, Status::OK, tag(5));
662
Craig Tiller69f90e62015-08-06 08:32:35 -0700663 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800664
Yang Gao3a5e5492015-02-18 14:32:38 -0800665 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller69f90e62015-08-06 08:32:35 -0700666 Verifier(GetParam()).Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800667 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700668 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800669 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
yang-ge21908f2015-08-25 13:47:51 -0700670 EXPECT_EQ(meta5.second,
671 ToString(server_trailing_metadata.find(meta5.first)->second));
672 EXPECT_EQ(meta6.second,
673 ToString(server_trailing_metadata.find(meta6.first)->second));
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700674 EXPECT_GE(server_trailing_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800675}
yang-gb3352562015-08-04 14:42:06 -0700676
677// Server uses AsyncNotifyWhenDone API to check for cancellation
Craig Tiller69f90e62015-08-06 08:32:35 -0700678TEST_P(AsyncEnd2endTest, ServerCheckCancellation) {
yang-gb3352562015-08-04 14:42:06 -0700679 ResetStub();
680
681 EchoRequest send_request;
682 EchoRequest recv_request;
683 EchoResponse send_response;
684 EchoResponse recv_response;
685 Status recv_status;
686
687 ClientContext cli_ctx;
688 ServerContext srv_ctx;
689 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
690
691 send_request.set_message("Hello");
692 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
693 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
694
695 srv_ctx.AsyncNotifyWhenDone(tag(5));
696 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
697 cq_.get(), tag(2));
698
Craig Tiller69f90e62015-08-06 08:32:35 -0700699 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700700 EXPECT_EQ(send_request.message(), recv_request.message());
701
702 cli_ctx.TryCancel();
Craig Tiller69f90e62015-08-06 08:32:35 -0700703 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700704 EXPECT_TRUE(srv_ctx.IsCancelled());
705
706 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700707 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700708
709 EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
710}
711
712// Server uses AsyncNotifyWhenDone API to check for normal finish
Craig Tiller69f90e62015-08-06 08:32:35 -0700713TEST_P(AsyncEnd2endTest, ServerCheckDone) {
yang-gb3352562015-08-04 14:42:06 -0700714 ResetStub();
715
716 EchoRequest send_request;
717 EchoRequest recv_request;
718 EchoResponse send_response;
719 EchoResponse recv_response;
720 Status recv_status;
721
722 ClientContext cli_ctx;
723 ServerContext srv_ctx;
724 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
725
726 send_request.set_message("Hello");
727 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
728 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
729
730 srv_ctx.AsyncNotifyWhenDone(tag(5));
731 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
732 cq_.get(), tag(2));
733
Craig Tiller69f90e62015-08-06 08:32:35 -0700734 Verifier(GetParam()).Expect(2, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700735 EXPECT_EQ(send_request.message(), recv_request.message());
736
737 send_response.set_message(recv_request.message());
738 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller69f90e62015-08-06 08:32:35 -0700739 Verifier(GetParam()).Expect(3, true).Verify(cq_.get());
740 Verifier(GetParam()).Expect(5, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700741 EXPECT_FALSE(srv_ctx.IsCancelled());
742
743 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller69f90e62015-08-06 08:32:35 -0700744 Verifier(GetParam()).Expect(4, true).Verify(cq_.get());
yang-gb3352562015-08-04 14:42:06 -0700745
746 EXPECT_EQ(send_response.message(), recv_response.message());
747 EXPECT_TRUE(recv_status.ok());
748}
749
Craig Tiller8f7bff72015-08-17 13:23:14 -0700750TEST_P(AsyncEnd2endTest, UnimplementedRpc) {
yang-g730055d2015-08-27 12:29:45 -0700751 std::shared_ptr<Channel> channel =
752 CreateChannel(server_address_.str(), InsecureCredentials());
yang-g9b7757d2015-08-13 11:15:53 -0700753 std::unique_ptr<grpc::cpp::test::util::UnimplementedService::Stub> stub;
Nicolas "Pixel" Noble7fa51672015-09-02 02:29:09 +0200754 stub = grpc::cpp::test::util::UnimplementedService::NewStub(channel);
yang-g9b7757d2015-08-13 11:15:53 -0700755 EchoRequest send_request;
756 EchoResponse recv_response;
757 Status recv_status;
758
759 ClientContext cli_ctx;
760 send_request.set_message("Hello");
761 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
762 stub->AsyncUnimplemented(&cli_ctx, send_request, cq_.get()));
763
764 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller8f7bff72015-08-17 13:23:14 -0700765 Verifier(GetParam()).Expect(4, false).Verify(cq_.get());
yang-g9b7757d2015-08-13 11:15:53 -0700766
767 EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
768 EXPECT_EQ("", recv_status.error_message());
769}
770
Craig Tiller4c06b822015-08-06 08:41:31 -0700771INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest,
772 ::testing::Values(false, true));
Craig Tiller69f90e62015-08-06 08:32:35 -0700773
Craig Tiller0220cf12015-02-12 17:39:26 -0800774} // namespace
775} // namespace testing
776} // namespace grpc
777
778int main(int argc, char** argv) {
779 grpc_test_init(argc, argv);
Craig Tiller0220cf12015-02-12 17:39:26 -0800780 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -0700781 return RUN_ALL_TESTS();
Craig Tiller0220cf12015-02-12 17:39:26 -0800782}