blob: 945018230234ef49eb510db8f6aa2e7a78768b65 [file] [log] [blame]
Yang Gao0cb6c252015-03-11 00:30:57 -07001/*
2 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003 * Copyright 2015 gRPC authors.
Yang Gao0cb6c252015-03-11 00:30:57 -07004 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
Yang Gao0cb6c252015-03-11 00:30:57 -07008 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009 * http://www.apache.org/licenses/LICENSE-2.0
Yang Gao0cb6c252015-03-11 00:30:57 -070010 *
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
Yang Gao0cb6c252015-03-11 00:30:57 -070016 *
17 */
18
Yang Gao0cb6c252015-03-11 00:30:57 -070019#include <memory>
20
yang-g8c2be9f2015-08-19 16:28:09 -070021#include <grpc++/channel.h>
Yang Gao0cb6c252015-03-11 00:30:57 -070022#include <grpc++/client_context.h>
23#include <grpc++/create_channel.h>
yang-g9e2f90c2015-08-21 15:35:03 -070024#include <grpc++/generic/async_generic_service.h>
25#include <grpc++/generic/generic_stub.h>
yang-g17487f92016-06-03 15:21:15 -070026#include <grpc++/impl/codegen/proto_utils.h>
Yang Gao0cb6c252015-03-11 00:30:57 -070027#include <grpc++/server.h>
28#include <grpc++/server_builder.h>
29#include <grpc++/server_context.h>
yang-g9e2f90c2015-08-21 15:35:03 -070030#include <grpc++/support/slice.h>
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -080031#include <grpc/grpc.h>
32#include <grpc/support/thd.h>
33#include <grpc/support/time.h>
Yang Gao0cb6c252015-03-11 00:30:57 -070034
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -080035#include "src/proto/grpc/testing/echo.grpc.pb.h"
yang-g9e2f90c2015-08-21 15:35:03 -070036#include "test/core/util/port.h"
37#include "test/core/util/test_config.h"
yang-g9f173142016-01-15 12:46:40 -080038#include "test/cpp/util/byte_buffer_proto_helper.h"
Yang Gao0cb6c252015-03-11 00:30:57 -070039
Nicolas "Pixel" Noble3726e3d2017-05-10 18:33:12 +020040#include <gtest/gtest.h>
41
Craig Tiller1b4e3302015-12-17 16:35:00 -080042using grpc::testing::EchoRequest;
43using grpc::testing::EchoResponse;
Yang Gao0cb6c252015-03-11 00:30:57 -070044using std::chrono::system_clock;
45
46namespace grpc {
47namespace testing {
48namespace {
49
Craig Tiller7536af02015-12-22 13:49:30 -080050void* tag(int i) { return (void*)(intptr_t)i; }
Yang Gao0cb6c252015-03-11 00:30:57 -070051
52void verify_ok(CompletionQueue* cq, int i, bool expect_ok) {
53 bool ok;
54 void* got_tag;
55 EXPECT_TRUE(cq->Next(&got_tag, &ok));
56 EXPECT_EQ(expect_ok, ok);
57 EXPECT_EQ(tag(i), got_tag);
58}
59
Yang Gao005eb882015-03-11 22:17:13 -070060class GenericEnd2endTest : public ::testing::Test {
Yang Gao0cb6c252015-03-11 00:30:57 -070061 protected:
yang-g4fac82b2016-01-15 13:15:32 -080062 GenericEnd2endTest() : server_host_("localhost") {}
Yang Gao0cb6c252015-03-11 00:30:57 -070063
Vijay Paic0b2acb2016-11-01 16:31:56 -070064 void SetUp() override {
Yang Gao0cb6c252015-03-11 00:30:57 -070065 int port = grpc_pick_unused_port_or_die();
yang-g940d5552015-07-31 22:11:41 -070066 server_address_ << server_host_ << ":" << port;
Yang Gao0cb6c252015-03-11 00:30:57 -070067 // Setup server
68 ServerBuilder builder;
Craig Tillerd6c98df2015-08-18 09:33:44 -070069 builder.AddListeningPort(server_address_.str(),
70 InsecureServerCredentials());
Yang Gao49996492015-03-12 16:40:19 -070071 builder.RegisterAsyncGenericService(&generic_service_);
vjpaiba2b8ed2015-12-09 10:24:47 -080072 // Include a second call to RegisterAsyncGenericService to make sure that
73 // we get an error in the log, since it is not allowed to have 2 async
74 // generic services
75 builder.RegisterAsyncGenericService(&generic_service_);
Craig Tillerf9e6adf2015-05-06 11:45:59 -070076 srv_cq_ = builder.AddCompletionQueue();
Yang Gao0cb6c252015-03-11 00:30:57 -070077 server_ = builder.BuildAndStart();
78 }
79
Vijay Paic0b2acb2016-11-01 16:31:56 -070080 void TearDown() override {
Yang Gao0cb6c252015-03-11 00:30:57 -070081 server_->Shutdown();
82 void* ignored_tag;
83 bool ignored_ok;
84 cli_cq_.Shutdown();
Craig Tillerf9e6adf2015-05-06 11:45:59 -070085 srv_cq_->Shutdown();
Yang Gao0cb6c252015-03-11 00:30:57 -070086 while (cli_cq_.Next(&ignored_tag, &ignored_ok))
87 ;
Craig Tillerf9e6adf2015-05-06 11:45:59 -070088 while (srv_cq_->Next(&ignored_tag, &ignored_ok))
Yang Gao0cb6c252015-03-11 00:30:57 -070089 ;
90 }
91
92 void ResetStub() {
yang-g730055d2015-08-27 12:29:45 -070093 std::shared_ptr<Channel> channel =
Julien Boeufe5adc0e2015-10-12 14:08:10 -070094 CreateChannel(server_address_.str(), InsecureChannelCredentials());
Yang Gao993d5402015-03-19 13:35:49 -070095 generic_stub_.reset(new GenericStub(channel));
Yang Gao0cb6c252015-03-11 00:30:57 -070096 }
97
Craig Tillerf9e6adf2015-05-06 11:45:59 -070098 void server_ok(int i) { verify_ok(srv_cq_.get(), i, true); }
Yang Gao0cb6c252015-03-11 00:30:57 -070099 void client_ok(int i) { verify_ok(&cli_cq_, i, true); }
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700100 void server_fail(int i) { verify_ok(srv_cq_.get(), i, false); }
Yang Gao0cb6c252015-03-11 00:30:57 -0700101 void client_fail(int i) { verify_ok(&cli_cq_, i, false); }
102
103 void SendRpc(int num_rpcs) {
yang-ga044f6d2017-05-11 15:37:51 -0700104 SendRpc(num_rpcs, false, gpr_inf_future(GPR_CLOCK_MONOTONIC));
105 }
106
107 void SendRpc(int num_rpcs, bool check_deadline, gpr_timespec deadline) {
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800108 const grpc::string kMethodName("/grpc.cpp.test.util.EchoTestService/Echo");
Yang Gao0cb6c252015-03-11 00:30:57 -0700109 for (int i = 0; i < num_rpcs; i++) {
110 EchoRequest send_request;
111 EchoRequest recv_request;
112 EchoResponse send_response;
113 EchoResponse recv_response;
114 Status recv_status;
115
116 ClientContext cli_ctx;
Yang Gao005eb882015-03-11 22:17:13 -0700117 GenericServerContext srv_ctx;
Yang Gao49996492015-03-12 16:40:19 -0700118 GenericServerAsyncReaderWriter stream(&srv_ctx);
Yang Gao0cb6c252015-03-11 00:30:57 -0700119
Yang Gao3b3097f2015-04-21 11:47:45 -0700120 // The string needs to be long enough to test heap-based slice.
121 send_request.set_message("Hello world. Hello world. Hello world.");
yang-ga044f6d2017-05-11 15:37:51 -0700122
123 if (check_deadline) {
124 cli_ctx.set_deadline(deadline);
125 }
126
Yang Gao993d5402015-03-19 13:35:49 -0700127 std::unique_ptr<GenericClientAsyncReaderWriter> call =
128 generic_stub_->Call(&cli_ctx, kMethodName, &cli_cq_, tag(1));
Yang Gao0cb6c252015-03-11 00:30:57 -0700129 client_ok(1);
Yang Gao993d5402015-03-19 13:35:49 -0700130 std::unique_ptr<ByteBuffer> send_buffer =
131 SerializeToByteBuffer(&send_request);
132 call->Write(*send_buffer, tag(2));
yang-gf64befd2016-03-21 14:04:10 -0700133 // Send ByteBuffer can be destroyed after calling Write.
134 send_buffer.reset();
Yang Gao993d5402015-03-19 13:35:49 -0700135 client_ok(2);
136 call->WritesDone(tag(3));
137 client_ok(3);
Yang Gao0cb6c252015-03-11 00:30:57 -0700138
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700139 generic_service_.RequestCall(&srv_ctx, &stream, srv_cq_.get(),
140 srv_cq_.get(), tag(4));
Yang Gao0cb6c252015-03-11 00:30:57 -0700141
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700142 verify_ok(srv_cq_.get(), 4, true);
Craig Tillerdc31ef32015-08-25 07:11:35 -0700143 EXPECT_EQ(server_host_, srv_ctx.host().substr(0, server_host_.length()));
Yang Gao993d5402015-03-19 13:35:49 -0700144 EXPECT_EQ(kMethodName, srv_ctx.method());
yang-ga044f6d2017-05-11 15:37:51 -0700145
146 if (check_deadline) {
147 EXPECT_TRUE(gpr_time_similar(deadline, srv_ctx.raw_deadline(),
Craig Tillerff58b272017-09-21 10:40:42 -0700148 gpr_time_from_millis(1000, GPR_TIMESPAN)));
yang-ga044f6d2017-05-11 15:37:51 -0700149 }
150
Yang Gao0cb6c252015-03-11 00:30:57 -0700151 ByteBuffer recv_buffer;
Yang Gao993d5402015-03-19 13:35:49 -0700152 stream.Read(&recv_buffer, tag(5));
153 server_ok(5);
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700154 EXPECT_TRUE(ParseFromByteBuffer(&recv_buffer, &recv_request));
Yang Gao0cb6c252015-03-11 00:30:57 -0700155 EXPECT_EQ(send_request.message(), recv_request.message());
156
157 send_response.set_message(recv_request.message());
Yang Gao993d5402015-03-19 13:35:49 -0700158 send_buffer = SerializeToByteBuffer(&send_response);
159 stream.Write(*send_buffer, tag(6));
yang-gf64befd2016-03-21 14:04:10 -0700160 send_buffer.reset();
Yang Gao993d5402015-03-19 13:35:49 -0700161 server_ok(6);
Yang Gao0cb6c252015-03-11 00:30:57 -0700162
Yang Gao993d5402015-03-19 13:35:49 -0700163 stream.Finish(Status::OK, tag(7));
164 server_ok(7);
Yang Gao0cb6c252015-03-11 00:30:57 -0700165
Yang Gao993d5402015-03-19 13:35:49 -0700166 recv_buffer.Clear();
167 call->Read(&recv_buffer, tag(8));
168 client_ok(8);
169 EXPECT_TRUE(ParseFromByteBuffer(&recv_buffer, &recv_response));
170
171 call->Finish(&recv_status, tag(9));
172 client_ok(9);
Yang Gao0cb6c252015-03-11 00:30:57 -0700173
174 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700175 EXPECT_TRUE(recv_status.ok());
Yang Gao0cb6c252015-03-11 00:30:57 -0700176 }
177 }
178
179 CompletionQueue cli_cq_;
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700180 std::unique_ptr<ServerCompletionQueue> srv_cq_;
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800181 std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
Yang Gao993d5402015-03-19 13:35:49 -0700182 std::unique_ptr<grpc::GenericStub> generic_stub_;
Yang Gao0cb6c252015-03-11 00:30:57 -0700183 std::unique_ptr<Server> server_;
Yang Gao49996492015-03-12 16:40:19 -0700184 AsyncGenericService generic_service_;
yang-g940d5552015-07-31 22:11:41 -0700185 const grpc::string server_host_;
Yang Gao0cb6c252015-03-11 00:30:57 -0700186 std::ostringstream server_address_;
187};
188
Yang Gao005eb882015-03-11 22:17:13 -0700189TEST_F(GenericEnd2endTest, SimpleRpc) {
Yang Gao0cb6c252015-03-11 00:30:57 -0700190 ResetStub();
191 SendRpc(1);
192}
193
Yang Gao005eb882015-03-11 22:17:13 -0700194TEST_F(GenericEnd2endTest, SequentialRpcs) {
Yang Gao0cb6c252015-03-11 00:30:57 -0700195 ResetStub();
196 SendRpc(10);
197}
198
Vijay Pai2046d0b2017-09-19 15:30:11 -0700199TEST_F(GenericEnd2endTest, SequentialUnaryRpcs) {
200 ResetStub();
201 const int num_rpcs = 10;
202 const grpc::string kMethodName("/grpc.cpp.test.util.EchoTestService/Echo");
203 for (int i = 0; i < num_rpcs; i++) {
204 EchoRequest send_request;
205 EchoRequest recv_request;
206 EchoResponse send_response;
207 EchoResponse recv_response;
208 Status recv_status;
209
210 ClientContext cli_ctx;
211 GenericServerContext srv_ctx;
212 GenericServerAsyncReaderWriter stream(&srv_ctx);
213
214 // The string needs to be long enough to test heap-based slice.
215 send_request.set_message("Hello world. Hello world. Hello world.");
216
217 std::unique_ptr<ByteBuffer> cli_send_buffer =
218 SerializeToByteBuffer(&send_request);
219 std::unique_ptr<GenericClientAsyncResponseReader> call =
220 generic_stub_->PrepareUnaryCall(&cli_ctx, kMethodName,
221 *cli_send_buffer.get(), &cli_cq_);
222 call->StartCall();
223 ByteBuffer cli_recv_buffer;
224 call->Finish(&cli_recv_buffer, &recv_status, tag(1));
225
226 generic_service_.RequestCall(&srv_ctx, &stream, srv_cq_.get(),
227 srv_cq_.get(), tag(4));
228
229 verify_ok(srv_cq_.get(), 4, true);
230 EXPECT_EQ(server_host_, srv_ctx.host().substr(0, server_host_.length()));
231 EXPECT_EQ(kMethodName, srv_ctx.method());
232
233 ByteBuffer srv_recv_buffer;
234 stream.Read(&srv_recv_buffer, tag(5));
235 server_ok(5);
236 EXPECT_TRUE(ParseFromByteBuffer(&srv_recv_buffer, &recv_request));
237 EXPECT_EQ(send_request.message(), recv_request.message());
238
239 send_response.set_message(recv_request.message());
240 std::unique_ptr<ByteBuffer> srv_send_buffer =
241 SerializeToByteBuffer(&send_response);
242 stream.Write(*srv_send_buffer, tag(6));
243 server_ok(6);
244
245 stream.Finish(Status::OK, tag(7));
246 server_ok(7);
247
248 client_ok(1);
249 EXPECT_TRUE(ParseFromByteBuffer(&cli_recv_buffer, &recv_response));
250 EXPECT_EQ(send_response.message(), recv_response.message());
251 EXPECT_TRUE(recv_status.ok());
252 }
253}
254
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700255// One ping, one pong.
256TEST_F(GenericEnd2endTest, SimpleBidiStreaming) {
257 ResetStub();
258
Sree Kuchibhotla5a05f512016-01-13 22:43:20 -0800259 const grpc::string kMethodName(
260 "/grpc.cpp.test.util.EchoTestService/BidiStream");
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700261 EchoRequest send_request;
262 EchoRequest recv_request;
263 EchoResponse send_response;
264 EchoResponse recv_response;
265 Status recv_status;
266 ClientContext cli_ctx;
267 GenericServerContext srv_ctx;
268 GenericServerAsyncReaderWriter srv_stream(&srv_ctx);
269
Craig Tillerbf6abee2015-07-19 22:31:04 -0700270 cli_ctx.set_compression_algorithm(GRPC_COMPRESS_GZIP);
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700271 send_request.set_message("Hello");
Yang Gao993d5402015-03-19 13:35:49 -0700272 std::unique_ptr<GenericClientAsyncReaderWriter> cli_stream =
273 generic_stub_->Call(&cli_ctx, kMethodName, &cli_cq_, tag(1));
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700274 client_ok(1);
275
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700276 generic_service_.RequestCall(&srv_ctx, &srv_stream, srv_cq_.get(),
277 srv_cq_.get(), tag(2));
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700278
Craig Tillerf9e6adf2015-05-06 11:45:59 -0700279 verify_ok(srv_cq_.get(), 2, true);
Craig Tillerdc31ef32015-08-25 07:11:35 -0700280 EXPECT_EQ(server_host_, srv_ctx.host().substr(0, server_host_.length()));
Yang Gao993d5402015-03-19 13:35:49 -0700281 EXPECT_EQ(kMethodName, srv_ctx.method());
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700282
Yang Gao993d5402015-03-19 13:35:49 -0700283 std::unique_ptr<ByteBuffer> send_buffer =
284 SerializeToByteBuffer(&send_request);
285 cli_stream->Write(*send_buffer, tag(3));
yang-gf64befd2016-03-21 14:04:10 -0700286 send_buffer.reset();
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700287 client_ok(3);
288
289 ByteBuffer recv_buffer;
Yang Gao45c09db2015-03-13 15:49:35 -0700290 srv_stream.Read(&recv_buffer, tag(4));
291 server_ok(4);
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700292 EXPECT_TRUE(ParseFromByteBuffer(&recv_buffer, &recv_request));
293 EXPECT_EQ(send_request.message(), recv_request.message());
294
295 send_response.set_message(recv_request.message());
Yang Gao993d5402015-03-19 13:35:49 -0700296 send_buffer = SerializeToByteBuffer(&send_response);
297 srv_stream.Write(*send_buffer, tag(5));
yang-gf64befd2016-03-21 14:04:10 -0700298 send_buffer.reset();
Yang Gao45c09db2015-03-13 15:49:35 -0700299 server_ok(5);
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700300
Yang Gao993d5402015-03-19 13:35:49 -0700301 cli_stream->Read(&recv_buffer, tag(6));
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700302 client_ok(6);
Yang Gao993d5402015-03-19 13:35:49 -0700303 EXPECT_TRUE(ParseFromByteBuffer(&recv_buffer, &recv_response));
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700304 EXPECT_EQ(send_response.message(), recv_response.message());
305
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700306 cli_stream->WritesDone(tag(7));
307 client_ok(7);
308
Yang Gao45c09db2015-03-13 15:49:35 -0700309 srv_stream.Read(&recv_buffer, tag(8));
310 server_fail(8);
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700311
Yang Gao45c09db2015-03-13 15:49:35 -0700312 srv_stream.Finish(Status::OK, tag(9));
313 server_ok(9);
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700314
315 cli_stream->Finish(&recv_status, tag(10));
316 client_ok(10);
317
318 EXPECT_EQ(send_response.message(), recv_response.message());
Yang Gaoc1a2c312015-06-16 10:59:46 -0700319 EXPECT_TRUE(recv_status.ok());
Yang Gao9fbbc7b2015-03-13 15:33:08 -0700320}
321
yang-ga044f6d2017-05-11 15:37:51 -0700322TEST_F(GenericEnd2endTest, Deadline) {
323 ResetStub();
324 SendRpc(1, true, gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC),
325 gpr_time_from_seconds(10, GPR_TIMESPAN)));
326}
327
Yang Gao0cb6c252015-03-11 00:30:57 -0700328} // namespace
329} // namespace testing
330} // namespace grpc
331
332int main(int argc, char** argv) {
333 grpc_test_init(argc, argv);
Yang Gao0cb6c252015-03-11 00:30:57 -0700334 ::testing::InitGoogleTest(&argc, argv);
Yang Gaoc4b6ffb2015-04-23 16:35:24 -0700335 return RUN_ALL_TESTS();
Yang Gao0cb6c252015-03-11 00:30:57 -0700336}