blob: 9b53bdc9990c99e58e6097fc775075e413cab01e [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
Nicolas Noble89219162015-04-07 18:01:18 -070036#include "test/core/util/port.h"
Craig Tiller0220cf12015-02-12 17:39:26 -080037#include "test/core/util/test_config.h"
Nicolas "Pixel" Noble0caebbf2015-04-09 23:08:51 +020038#include "test/cpp/util/echo_duplicate.grpc.pb.h"
39#include "test/cpp/util/echo.grpc.pb.h"
Yang Gao3a5e5492015-02-18 14:32:38 -080040#include <grpc++/async_unary_call.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080041#include <grpc++/channel_arguments.h>
42#include <grpc++/channel_interface.h>
43#include <grpc++/client_context.h>
44#include <grpc++/create_channel.h>
45#include <grpc++/credentials.h>
46#include <grpc++/server.h>
47#include <grpc++/server_builder.h>
48#include <grpc++/server_context.h>
Craig Tiller42bc87c2015-02-23 08:50:19 -080049#include <grpc++/server_credentials.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080050#include <grpc++/status.h>
51#include <grpc++/stream.h>
Nicolas Noble89219162015-04-07 18:01:18 -070052#include <grpc++/time.h>
Craig Tiller0220cf12015-02-12 17:39:26 -080053#include <gtest/gtest.h>
54
55#include <grpc/grpc.h>
56#include <grpc/support/thd.h>
57#include <grpc/support/time.h>
58
59using grpc::cpp::test::util::EchoRequest;
60using grpc::cpp::test::util::EchoResponse;
61using std::chrono::system_clock;
62
63namespace grpc {
64namespace testing {
65
66namespace {
67
Yang Gao6baa9b62015-03-17 10:49:39 -070068void* tag(int i) { return (void*)(gpr_intptr) i; }
Yang Gaoc05b6cb2015-02-13 00:34:10 -080069
Craig Tiller06cf3cc2015-05-13 13:11:01 -070070class Verifier {
71 public:
72 Verifier& Expect(int i, bool expect_ok) {
73 expectations_[tag(i)] = expect_ok;
74 return *this;
vjpai7aadf462015-03-16 23:58:44 -070075 }
Craig Tiller06cf3cc2015-05-13 13:11:01 -070076 void Verify(CompletionQueue *cq) {
77 GPR_ASSERT(!expectations_.empty());
78 while (!expectations_.empty()) {
79 bool ok;
80 void* got_tag;
81 EXPECT_TRUE(cq->Next(&got_tag, &ok));
82 auto it = expectations_.find(got_tag);
83 EXPECT_TRUE(it != expectations_.end());
84 EXPECT_EQ(it->second, ok);
85 expectations_.erase(it);
86 }
87 }
88 void Verify(CompletionQueue *cq, std::chrono::system_clock::time_point deadline) {
89 if (expectations_.empty()) {
90 bool ok;
91 void *got_tag;
92 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), CompletionQueue::TIMEOUT);
93 } else {
94 while (!expectations_.empty()) {
95 bool ok;
96 void *got_tag;
97 EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline), CompletionQueue::GOT_EVENT);
98 auto it = expectations_.find(got_tag);
99 EXPECT_TRUE(it != expectations_.end());
100 EXPECT_EQ(it->second, ok);
101 expectations_.erase(it);
102 }
103 }
104 }
105
106 private:
107 std::map<void*, bool> expectations_;
108};
vjpai7aadf462015-03-16 23:58:44 -0700109
Yang Gao406b32f2015-02-13 16:25:33 -0800110class AsyncEnd2endTest : public ::testing::Test {
Craig Tiller0220cf12015-02-12 17:39:26 -0800111 protected:
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700112 AsyncEnd2endTest() {}
Craig Tiller0220cf12015-02-12 17:39:26 -0800113
Craig Tillercf133f42015-02-26 14:05:56 -0800114 void SetUp() GRPC_OVERRIDE {
Craig Tiller0220cf12015-02-12 17:39:26 -0800115 int port = grpc_pick_unused_port_or_die();
116 server_address_ << "localhost:" << port;
117 // Setup server
118 ServerBuilder builder;
Nicolas Noblecfd60732015-03-18 16:27:43 -0700119 builder.AddListeningPort(server_address_.str(), grpc::InsecureServerCredentials());
Craig Tiller0220cf12015-02-12 17:39:26 -0800120 builder.RegisterAsyncService(&service_);
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700121 cq_ = builder.AddCompletionQueue();
Craig Tiller0220cf12015-02-12 17:39:26 -0800122 server_ = builder.BuildAndStart();
123 }
124
Craig Tillercf133f42015-02-26 14:05:56 -0800125 void TearDown() GRPC_OVERRIDE {
Craig Tiller492968f2015-02-18 13:14:03 -0800126 server_->Shutdown();
127 void* ignored_tag;
128 bool ignored_ok;
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700129 cq_->Shutdown();
130 while (cq_->Next(&ignored_tag, &ignored_ok))
Craig Tiller492968f2015-02-18 13:14:03 -0800131 ;
132 }
Craig Tiller0220cf12015-02-12 17:39:26 -0800133
134 void ResetStub() {
Craig Tiller47c83fd2015-02-21 22:45:35 -0800135 std::shared_ptr<ChannelInterface> channel = CreateChannel(
136 server_address_.str(), InsecureCredentials(), ChannelArguments());
Craig Tillerfd1b49b2015-02-23 12:53:39 -0800137 stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel));
Craig Tiller0220cf12015-02-12 17:39:26 -0800138 }
139
Yang Gao406b32f2015-02-13 16:25:33 -0800140 void SendRpc(int num_rpcs) {
141 for (int i = 0; i < num_rpcs; i++) {
142 EchoRequest send_request;
143 EchoRequest recv_request;
144 EchoResponse send_response;
145 EchoResponse recv_response;
146 Status recv_status;
147
148 ClientContext cli_ctx;
149 ServerContext srv_ctx;
150 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
151
152 send_request.set_message("Hello");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800153 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700154 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800155
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700156 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700157 cq_.get(), cq_.get(), tag(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800158
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700159 Verifier().Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800160 EXPECT_EQ(send_request.message(), recv_request.message());
161
162 send_response.set_message(recv_request.message());
163 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700164 Verifier().Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800165
Yang Gao3a5e5492015-02-18 14:32:38 -0800166 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700167 Verifier().Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800168
169 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700170 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800171 }
172 }
173
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700174 std::unique_ptr<ServerCompletionQueue> cq_;
Craig Tiller0220cf12015-02-12 17:39:26 -0800175 std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
176 std::unique_ptr<Server> server_;
177 grpc::cpp::test::util::TestService::AsyncService service_;
178 std::ostringstream server_address_;
179};
180
Yang Gao406b32f2015-02-13 16:25:33 -0800181TEST_F(AsyncEnd2endTest, SimpleRpc) {
Craig Tiller0220cf12015-02-12 17:39:26 -0800182 ResetStub();
Yang Gao406b32f2015-02-13 16:25:33 -0800183 SendRpc(1);
184}
Yang Gaobb84a302015-02-12 23:30:12 -0800185
Yang Gao406b32f2015-02-13 16:25:33 -0800186TEST_F(AsyncEnd2endTest, SequentialRpcs) {
187 ResetStub();
188 SendRpc(10);
Craig Tiller0220cf12015-02-12 17:39:26 -0800189}
190
vjpai7aadf462015-03-16 23:58:44 -0700191// Test a simple RPC using the async version of Next
192TEST_F(AsyncEnd2endTest, AsyncNextRpc) {
193 ResetStub();
194
195 EchoRequest send_request;
196 EchoRequest recv_request;
197 EchoResponse send_response;
198 EchoResponse recv_response;
199 Status recv_status;
200
201 ClientContext cli_ctx;
202 ServerContext srv_ctx;
203 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
204
205 send_request.set_message("Hello");
Yang Gao757afae2015-03-17 15:49:26 -0700206 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700207 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
vjpai7aadf462015-03-16 23:58:44 -0700208
Yang Gao757afae2015-03-17 15:49:26 -0700209 std::chrono::system_clock::time_point time_now(
Craig Tillerf51199f2015-05-08 09:32:53 -0700210 std::chrono::system_clock::now());
211 std::chrono::system_clock::time_point time_limit(
212 std::chrono::system_clock::now() + std::chrono::seconds(10));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700213 Verifier().Verify(cq_.get(), time_now);
214 Verifier().Verify(cq_.get(), time_now);
vjpai7aadf462015-03-16 23:58:44 -0700215
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700216 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
217 cq_.get(), tag(2));
vjpai7aadf462015-03-16 23:58:44 -0700218
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700219 Verifier().Expect(2, true).Verify(cq_.get(), time_limit);
vjpai7aadf462015-03-16 23:58:44 -0700220 EXPECT_EQ(send_request.message(), recv_request.message());
vjpai7aadf462015-03-16 23:58:44 -0700221
222 send_response.set_message(recv_request.message());
223 response_writer.Finish(send_response, Status::OK, tag(3));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700224 Verifier().Expect(3, true).Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700225
226 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700227 Verifier().Expect(4, true).Verify(cq_.get(), std::chrono::system_clock::time_point::max());
vjpai7aadf462015-03-16 23:58:44 -0700228
229 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700230 EXPECT_TRUE(recv_status.ok());
vjpai7aadf462015-03-16 23:58:44 -0700231}
Yang Gao757afae2015-03-17 15:49:26 -0700232
Yang Gao0e0d8e12015-02-13 14:40:41 -0800233// Two pings and a final pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800234TEST_F(AsyncEnd2endTest, SimpleClientStreaming) {
Yang Gao005f18a2015-02-13 10:22:33 -0800235 ResetStub();
236
237 EchoRequest send_request;
238 EchoRequest recv_request;
239 EchoResponse send_response;
240 EchoResponse recv_response;
241 Status recv_status;
242 ClientContext cli_ctx;
243 ServerContext srv_ctx;
244 ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
245
246 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800247 std::unique_ptr<ClientAsyncWriter<EchoRequest> > cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700248 stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
Yang Gao005f18a2015-02-13 10:22:33 -0800249
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700250 service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(),
251 cq_.get(), tag(2));
Yang Gao005f18a2015-02-13 10:22:33 -0800252
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700253 Verifier().Expect(2, true).Expect(1, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800254
255 cli_stream->Write(send_request, tag(3));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700256 Verifier().Expect(3, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800257
258 srv_stream.Read(&recv_request, tag(4));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700259 Verifier().Expect(4, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800260 EXPECT_EQ(send_request.message(), recv_request.message());
261
262 cli_stream->Write(send_request, tag(5));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700263 Verifier().Expect(5, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800264
265 srv_stream.Read(&recv_request, tag(6));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700266 Verifier().Expect(6, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800267
268 EXPECT_EQ(send_request.message(), recv_request.message());
269 cli_stream->WritesDone(tag(7));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700270 Verifier().Expect(7, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800271
272 srv_stream.Read(&recv_request, tag(8));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700273 Verifier().Expect(8, false).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800274
275 send_response.set_message(recv_request.message());
276 srv_stream.Finish(send_response, Status::OK, tag(9));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700277 Verifier().Expect(9, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800278
279 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700280 Verifier().Expect(10, true).Verify(cq_.get());
Yang Gao005f18a2015-02-13 10:22:33 -0800281
282 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700283 EXPECT_TRUE(recv_status.ok());
Yang Gao005f18a2015-02-13 10:22:33 -0800284}
285
Yang Gao0e0d8e12015-02-13 14:40:41 -0800286// One ping, two pongs.
Yang Gao406b32f2015-02-13 16:25:33 -0800287TEST_F(AsyncEnd2endTest, SimpleServerStreaming) {
Yang Gao0e0d8e12015-02-13 14:40:41 -0800288 ResetStub();
289
290 EchoRequest send_request;
291 EchoRequest recv_request;
292 EchoResponse send_response;
293 EchoResponse recv_response;
294 Status recv_status;
295 ClientContext cli_ctx;
296 ServerContext srv_ctx;
297 ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
298
299 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800300 std::unique_ptr<ClientAsyncReader<EchoResponse> > cli_stream(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700301 stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800302
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700303 service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700304 cq_.get(), cq_.get(), tag(2));
Yang Gao0e0d8e12015-02-13 14:40:41 -0800305
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700306 Verifier().Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800307 EXPECT_EQ(send_request.message(), recv_request.message());
308
309 send_response.set_message(recv_request.message());
310 srv_stream.Write(send_response, tag(3));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700311 Verifier().Expect(3, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800312
313 cli_stream->Read(&recv_response, tag(4));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700314 Verifier().Expect(4, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800315 EXPECT_EQ(send_response.message(), recv_response.message());
316
317 srv_stream.Write(send_response, tag(5));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700318 Verifier().Expect(5, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800319
320 cli_stream->Read(&recv_response, tag(6));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700321 Verifier().Expect(6, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800322 EXPECT_EQ(send_response.message(), recv_response.message());
323
324 srv_stream.Finish(Status::OK, tag(7));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700325 Verifier().Expect(7, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800326
327 cli_stream->Read(&recv_response, tag(8));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700328 Verifier().Expect(8, false).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800329
330 cli_stream->Finish(&recv_status, tag(9));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700331 Verifier().Expect(9, true).Verify(cq_.get());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800332
Yang Gaoc1a2c312015-06-16 10:59:46 -0700333 EXPECT_TRUE(recv_status.ok());
Yang Gao0e0d8e12015-02-13 14:40:41 -0800334}
335
336// One ping, one pong.
Yang Gao406b32f2015-02-13 16:25:33 -0800337TEST_F(AsyncEnd2endTest, SimpleBidiStreaming) {
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800338 ResetStub();
339
340 EchoRequest send_request;
341 EchoRequest recv_request;
342 EchoResponse send_response;
343 EchoResponse recv_response;
344 Status recv_status;
345 ClientContext cli_ctx;
346 ServerContext srv_ctx;
347 ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
348
349 send_request.set_message("Hello");
Yang Gaoda699b82015-02-18 01:10:22 -0800350 std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse> >
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700351 cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800352
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700353 service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(),
354 cq_.get(), tag(2));
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800355
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700356 Verifier().Expect(1, true).Expect(2, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800357
358 cli_stream->Write(send_request, tag(3));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700359 Verifier().Expect(3, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800360
361 srv_stream.Read(&recv_request, tag(4));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700362 Verifier().Expect(4, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800363 EXPECT_EQ(send_request.message(), recv_request.message());
364
365 send_response.set_message(recv_request.message());
366 srv_stream.Write(send_response, tag(5));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700367 Verifier().Expect(5, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800368
369 cli_stream->Read(&recv_response, tag(6));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700370 Verifier().Expect(6, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800371 EXPECT_EQ(send_response.message(), recv_response.message());
372
373 cli_stream->WritesDone(tag(7));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700374 Verifier().Expect(7, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800375
376 srv_stream.Read(&recv_request, tag(8));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700377 Verifier().Expect(8, false).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800378
379 srv_stream.Finish(Status::OK, tag(9));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700380 Verifier().Expect(9, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800381
382 cli_stream->Finish(&recv_status, tag(10));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700383 Verifier().Expect(10, true).Verify(cq_.get());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800384
Yang Gaoc1a2c312015-06-16 10:59:46 -0700385 EXPECT_TRUE(recv_status.ok());
Yang Gaoc05b6cb2015-02-13 00:34:10 -0800386}
387
Yang Gao406b32f2015-02-13 16:25:33 -0800388// Metadata tests
389TEST_F(AsyncEnd2endTest, ClientInitialMetadataRpc) {
390 ResetStub();
391
392 EchoRequest send_request;
393 EchoRequest recv_request;
394 EchoResponse send_response;
395 EchoResponse recv_response;
396 Status recv_status;
397
398 ClientContext cli_ctx;
399 ServerContext srv_ctx;
400 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
401
402 send_request.set_message("Hello");
403 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
404 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
405 cli_ctx.AddMetadata(meta1.first, meta1.second);
406 cli_ctx.AddMetadata(meta2.first, meta2.second);
407
Yang Gao3a5e5492015-02-18 14:32:38 -0800408 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700409 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao406b32f2015-02-13 16:25:33 -0800410
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700411 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
412 cq_.get(), tag(2));
413 Verifier().Expect(2, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800414 EXPECT_EQ(send_request.message(), recv_request.message());
415 auto client_initial_metadata = srv_ctx.client_metadata();
416 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
417 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700418 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao406b32f2015-02-13 16:25:33 -0800419
420 send_response.set_message(recv_request.message());
421 response_writer.Finish(send_response, Status::OK, tag(3));
422
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700423 Verifier().Expect(3, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800424
Yang Gao3a5e5492015-02-18 14:32:38 -0800425 response_reader->Finish(&recv_response, &recv_status, tag(4));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700426 Verifier().Expect(4, true).Verify(cq_.get());
Yang Gao406b32f2015-02-13 16:25:33 -0800427
428 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700429 EXPECT_TRUE(recv_status.ok());
Yang Gao406b32f2015-02-13 16:25:33 -0800430}
431
Yang Gao2b7f5372015-02-18 00:45:53 -0800432TEST_F(AsyncEnd2endTest, ServerInitialMetadataRpc) {
433 ResetStub();
434
435 EchoRequest send_request;
436 EchoRequest recv_request;
437 EchoResponse send_response;
438 EchoResponse recv_response;
439 Status recv_status;
440
441 ClientContext cli_ctx;
442 ServerContext srv_ctx;
443 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
444
445 send_request.set_message("Hello");
446 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
447 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
448
Yang Gao3a5e5492015-02-18 14:32:38 -0800449 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700450 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800451
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700452 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
453 cq_.get(), tag(2));
454 Verifier().Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800455 EXPECT_EQ(send_request.message(), recv_request.message());
456 srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
457 srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
458 response_writer.SendInitialMetadata(tag(3));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700459 Verifier().Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800460
Yang Gao3a5e5492015-02-18 14:32:38 -0800461 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700462 Verifier().Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800463 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
464 EXPECT_EQ(meta1.second, server_initial_metadata.find(meta1.first)->second);
465 EXPECT_EQ(meta2.second, server_initial_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800466 EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
Yang Gao3a5e5492015-02-18 14:32:38 -0800467
468 send_response.set_message(recv_request.message());
469 response_writer.Finish(send_response, Status::OK, tag(5));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700470 Verifier().Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800471
472 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700473 Verifier().Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800474
475 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700476 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800477}
478
479TEST_F(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
480 ResetStub();
481
482 EchoRequest send_request;
483 EchoRequest recv_request;
484 EchoResponse send_response;
485 EchoResponse recv_response;
486 Status recv_status;
487
488 ClientContext cli_ctx;
489 ServerContext srv_ctx;
490 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
491
492 send_request.set_message("Hello");
493 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
494 std::pair<grpc::string, grpc::string> meta2("key2", "val2");
495
Yang Gao3a5e5492015-02-18 14:32:38 -0800496 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700497 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800498
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700499 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
500 cq_.get(), tag(2));
501 Verifier().Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800502 EXPECT_EQ(send_request.message(), recv_request.message());
503 response_writer.SendInitialMetadata(tag(3));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700504 Verifier().Expect(3, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800505
506 send_response.set_message(recv_request.message());
507 srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
508 srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
509 response_writer.Finish(send_response, Status::OK, tag(4));
510
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700511 Verifier().Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800512
Yang Gao3a5e5492015-02-18 14:32:38 -0800513 response_reader->Finish(&recv_response, &recv_status, tag(5));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700514 Verifier().Expect(5, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800515 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700516 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800517 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
518 EXPECT_EQ(meta1.second, server_trailing_metadata.find(meta1.first)->second);
519 EXPECT_EQ(meta2.second, server_trailing_metadata.find(meta2.first)->second);
vjpaid5577aa2015-02-18 22:26:48 -0800520 EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
Yang Gao2b7f5372015-02-18 00:45:53 -0800521}
522
523TEST_F(AsyncEnd2endTest, MetadataRpc) {
524 ResetStub();
525
526 EchoRequest send_request;
527 EchoRequest recv_request;
528 EchoResponse send_response;
529 EchoResponse recv_response;
530 Status recv_status;
531
532 ClientContext cli_ctx;
533 ServerContext srv_ctx;
534 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
535
536 send_request.set_message("Hello");
537 std::pair<grpc::string, grpc::string> meta1("key1", "val1");
Yang Gao3a5e5492015-02-18 14:32:38 -0800538 std::pair<grpc::string, grpc::string> meta2(
Vijay Pai92a928f2015-03-26 16:30:22 -0400539 "key2-bin",
540 grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc",
541 13));
Yang Gao2b7f5372015-02-18 00:45:53 -0800542 std::pair<grpc::string, grpc::string> meta3("key3", "val3");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800543 std::pair<grpc::string, grpc::string> meta6(
544 "key4-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400545 grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
546 14));
Yang Gao2b7f5372015-02-18 00:45:53 -0800547 std::pair<grpc::string, grpc::string> meta5("key5", "val5");
Craig Tiller47c83fd2015-02-21 22:45:35 -0800548 std::pair<grpc::string, grpc::string> meta4(
549 "key6-bin",
Vijay Pai92a928f2015-03-26 16:30:22 -0400550 grpc::string("\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee",
551 15));
Yang Gao2b7f5372015-02-18 00:45:53 -0800552
553 cli_ctx.AddMetadata(meta1.first, meta1.second);
554 cli_ctx.AddMetadata(meta2.first, meta2.second);
555
Yang Gao3a5e5492015-02-18 14:32:38 -0800556 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700557 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
Yang Gao2b7f5372015-02-18 00:45:53 -0800558
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700559 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
560 cq_.get(), tag(2));
561 Verifier().Expect(2, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800562 EXPECT_EQ(send_request.message(), recv_request.message());
563 auto client_initial_metadata = srv_ctx.client_metadata();
564 EXPECT_EQ(meta1.second, client_initial_metadata.find(meta1.first)->second);
565 EXPECT_EQ(meta2.second, client_initial_metadata.find(meta2.first)->second);
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700566 EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800567
568 srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
569 srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
570 response_writer.SendInitialMetadata(tag(3));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700571 Verifier().Expect(3, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800572 response_reader->ReadInitialMetadata(tag(4));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700573 Verifier().Expect(4, true).Verify(cq_.get());
Yang Gao2b7f5372015-02-18 00:45:53 -0800574 auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
575 EXPECT_EQ(meta3.second, server_initial_metadata.find(meta3.first)->second);
576 EXPECT_EQ(meta4.second, server_initial_metadata.find(meta4.first)->second);
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700577 EXPECT_GE(server_initial_metadata.size(), static_cast<size_t>(2));
Yang Gao3a5e5492015-02-18 14:32:38 -0800578
579 send_response.set_message(recv_request.message());
580 srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
581 srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
582 response_writer.Finish(send_response, Status::OK, tag(5));
583
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700584 Verifier().Expect(5, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800585
Yang Gao3a5e5492015-02-18 14:32:38 -0800586 response_reader->Finish(&recv_response, &recv_status, tag(6));
Craig Tiller06cf3cc2015-05-13 13:11:01 -0700587 Verifier().Expect(6, true).Verify(cq_.get());
Yang Gao3a5e5492015-02-18 14:32:38 -0800588 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700589 EXPECT_TRUE(recv_status.ok());
Yang Gao2b7f5372015-02-18 00:45:53 -0800590 auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
591 EXPECT_EQ(meta5.second, server_trailing_metadata.find(meta5.first)->second);
592 EXPECT_EQ(meta6.second, server_trailing_metadata.find(meta6.first)->second);
Craig Tiller8bf2dca2015-07-10 13:08:41 -0700593 EXPECT_GE(server_trailing_metadata.size(), static_cast<size_t>(2));
Yang Gao2b7f5372015-02-18 00:45:53 -0800594}
yang-gb3352562015-08-04 14:42:06 -0700595
596// Server uses AsyncNotifyWhenDone API to check for cancellation
597TEST_F(AsyncEnd2endTest, ServerCheckCancellation) {
598 ResetStub();
599
600 EchoRequest send_request;
601 EchoRequest recv_request;
602 EchoResponse send_response;
603 EchoResponse recv_response;
604 Status recv_status;
605
606 ClientContext cli_ctx;
607 ServerContext srv_ctx;
608 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
609
610 send_request.set_message("Hello");
611 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
612 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
613
614 srv_ctx.AsyncNotifyWhenDone(tag(5));
615 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
616 cq_.get(), tag(2));
617
618 Verifier().Expect(2, true).Verify(cq_.get());
619 EXPECT_EQ(send_request.message(), recv_request.message());
620
621 cli_ctx.TryCancel();
622 Verifier().Expect(5, true).Verify(cq_.get());
623 EXPECT_TRUE(srv_ctx.IsCancelled());
624
625 response_reader->Finish(&recv_response, &recv_status, tag(4));
626 Verifier().Expect(4, false).Verify(cq_.get());
627
628 EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
629}
630
631// Server uses AsyncNotifyWhenDone API to check for normal finish
632TEST_F(AsyncEnd2endTest, ServerCheckDone) {
633 ResetStub();
634
635 EchoRequest send_request;
636 EchoRequest recv_request;
637 EchoResponse send_response;
638 EchoResponse recv_response;
639 Status recv_status;
640
641 ClientContext cli_ctx;
642 ServerContext srv_ctx;
643 grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
644
645 send_request.set_message("Hello");
646 std::unique_ptr<ClientAsyncResponseReader<EchoResponse> > response_reader(
647 stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
648
649 srv_ctx.AsyncNotifyWhenDone(tag(5));
650 service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
651 cq_.get(), tag(2));
652
653 Verifier().Expect(2, true).Verify(cq_.get());
654 EXPECT_EQ(send_request.message(), recv_request.message());
655
656 send_response.set_message(recv_request.message());
657 response_writer.Finish(send_response, Status::OK, tag(3));
658 Verifier().Expect(3, true).Verify(cq_.get());
659 Verifier().Expect(5, true).Verify(cq_.get());
660 EXPECT_FALSE(srv_ctx.IsCancelled());
661
662 response_reader->Finish(&recv_response, &recv_status, tag(4));
663 Verifier().Expect(4, true).Verify(cq_.get());
664
665 EXPECT_EQ(send_response.message(), recv_response.message());
666 EXPECT_TRUE(recv_status.ok());
667}
668
Craig Tiller0220cf12015-02-12 17:39:26 -0800669} // namespace
670} // namespace testing
671} // namespace grpc
672
673int main(int argc, char** argv) {
674 grpc_test_init(argc, argv);
Craig Tiller0220cf12015-02-12 17:39:26 -0800675 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -0700676 return RUN_ALL_TESTS();
Craig Tiller0220cf12015-02-12 17:39:26 -0800677}