generic_end2end_test.cc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. /*
  2. *
  3. * Copyright 2015 gRPC authors.
  4. *
  5. * 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
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * 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.
  16. *
  17. */
  18. #include <memory>
  19. #include <thread>
  20. #include <gtest/gtest.h>
  21. #include "absl/memory/memory.h"
  22. #include <grpc/grpc.h>
  23. #include <grpc/support/time.h>
  24. #include <grpcpp/channel.h>
  25. #include <grpcpp/client_context.h>
  26. #include <grpcpp/create_channel.h>
  27. #include <grpcpp/generic/async_generic_service.h>
  28. #include <grpcpp/generic/generic_stub.h>
  29. #include <grpcpp/impl/codegen/proto_utils.h>
  30. #include <grpcpp/server.h>
  31. #include <grpcpp/server_builder.h>
  32. #include <grpcpp/server_context.h>
  33. #include <grpcpp/support/slice.h>
  34. #include "src/proto/grpc/testing/echo.grpc.pb.h"
  35. #include "test/core/util/port.h"
  36. #include "test/core/util/test_config.h"
  37. #include "test/cpp/util/byte_buffer_proto_helper.h"
  38. using grpc::testing::EchoRequest;
  39. using grpc::testing::EchoResponse;
  40. namespace grpc {
  41. namespace testing {
  42. namespace {
  43. void* tag(int i) { return reinterpret_cast<void*>(i); }
  44. void verify_ok(CompletionQueue* cq, int i, bool expect_ok) {
  45. bool ok;
  46. void* got_tag;
  47. EXPECT_TRUE(cq->Next(&got_tag, &ok));
  48. EXPECT_EQ(expect_ok, ok);
  49. EXPECT_EQ(tag(i), got_tag);
  50. }
  51. class GenericEnd2endTest : public ::testing::Test {
  52. protected:
  53. GenericEnd2endTest() : server_host_("localhost") {}
  54. void SetUp() override {
  55. shut_down_ = false;
  56. int port = grpc_pick_unused_port_or_die();
  57. server_address_ << server_host_ << ":" << port;
  58. // Setup server
  59. ServerBuilder builder;
  60. builder.AddListeningPort(server_address_.str(),
  61. InsecureServerCredentials());
  62. builder.RegisterAsyncGenericService(&generic_service_);
  63. // Include a second call to RegisterAsyncGenericService to make sure that
  64. // we get an error in the log, since it is not allowed to have 2 async
  65. // generic services
  66. builder.RegisterAsyncGenericService(&generic_service_);
  67. srv_cq_ = builder.AddCompletionQueue();
  68. server_ = builder.BuildAndStart();
  69. }
  70. void ShutDownServerAndCQs() {
  71. if (!shut_down_) {
  72. server_->Shutdown();
  73. void* ignored_tag;
  74. bool ignored_ok;
  75. cli_cq_.Shutdown();
  76. srv_cq_->Shutdown();
  77. while (cli_cq_.Next(&ignored_tag, &ignored_ok)) {
  78. }
  79. while (srv_cq_->Next(&ignored_tag, &ignored_ok)) {
  80. }
  81. shut_down_ = true;
  82. }
  83. }
  84. void TearDown() override { ShutDownServerAndCQs(); }
  85. void ResetStub() {
  86. std::shared_ptr<Channel> channel = grpc::CreateChannel(
  87. server_address_.str(), InsecureChannelCredentials());
  88. stub_ = grpc::testing::EchoTestService::NewStub(channel);
  89. generic_stub_ = absl::make_unique<GenericStub>(channel);
  90. }
  91. void server_ok(int i) { verify_ok(srv_cq_.get(), i, true); }
  92. void client_ok(int i) { verify_ok(&cli_cq_, i, true); }
  93. void server_fail(int i) { verify_ok(srv_cq_.get(), i, false); }
  94. void client_fail(int i) { verify_ok(&cli_cq_, i, false); }
  95. void SendRpc(int num_rpcs) {
  96. SendRpc(num_rpcs, false, gpr_inf_future(GPR_CLOCK_MONOTONIC));
  97. }
  98. void SendRpc(int num_rpcs, bool check_deadline, gpr_timespec deadline) {
  99. const std::string kMethodName("/grpc.cpp.test.util.EchoTestService/Echo");
  100. for (int i = 0; i < num_rpcs; i++) {
  101. EchoRequest send_request;
  102. EchoRequest recv_request;
  103. EchoResponse send_response;
  104. EchoResponse recv_response;
  105. Status recv_status;
  106. ClientContext cli_ctx;
  107. GenericServerContext srv_ctx;
  108. GenericServerAsyncReaderWriter stream(&srv_ctx);
  109. // The string needs to be long enough to test heap-based slice.
  110. send_request.set_message("Hello world. Hello world. Hello world.");
  111. if (check_deadline) {
  112. cli_ctx.set_deadline(deadline);
  113. }
  114. // Rather than using the original kMethodName, make a short-lived
  115. // copy to also confirm that we don't refer to this object beyond
  116. // the initial call preparation
  117. const std::string* method_name = new std::string(kMethodName);
  118. std::unique_ptr<GenericClientAsyncReaderWriter> call =
  119. generic_stub_->PrepareCall(&cli_ctx, *method_name, &cli_cq_);
  120. delete method_name; // Make sure that this is not needed after invocation
  121. std::thread request_call([this]() { server_ok(4); });
  122. call->StartCall(tag(1));
  123. client_ok(1);
  124. std::unique_ptr<ByteBuffer> send_buffer =
  125. SerializeToByteBuffer(&send_request);
  126. call->Write(*send_buffer, tag(2));
  127. // Send ByteBuffer can be destroyed after calling Write.
  128. send_buffer.reset();
  129. client_ok(2);
  130. call->WritesDone(tag(3));
  131. client_ok(3);
  132. generic_service_.RequestCall(&srv_ctx, &stream, srv_cq_.get(),
  133. srv_cq_.get(), tag(4));
  134. request_call.join();
  135. EXPECT_EQ(server_host_, srv_ctx.host().substr(0, server_host_.length()));
  136. EXPECT_EQ(kMethodName, srv_ctx.method());
  137. if (check_deadline) {
  138. EXPECT_TRUE(gpr_time_similar(deadline, srv_ctx.raw_deadline(),
  139. gpr_time_from_millis(1000, GPR_TIMESPAN)));
  140. }
  141. ByteBuffer recv_buffer;
  142. stream.Read(&recv_buffer, tag(5));
  143. server_ok(5);
  144. EXPECT_TRUE(ParseFromByteBuffer(&recv_buffer, &recv_request));
  145. EXPECT_EQ(send_request.message(), recv_request.message());
  146. send_response.set_message(recv_request.message());
  147. send_buffer = SerializeToByteBuffer(&send_response);
  148. stream.Write(*send_buffer, tag(6));
  149. send_buffer.reset();
  150. server_ok(6);
  151. stream.Finish(Status::OK, tag(7));
  152. server_ok(7);
  153. recv_buffer.Clear();
  154. call->Read(&recv_buffer, tag(8));
  155. client_ok(8);
  156. EXPECT_TRUE(ParseFromByteBuffer(&recv_buffer, &recv_response));
  157. call->Finish(&recv_status, tag(9));
  158. client_ok(9);
  159. EXPECT_EQ(send_response.message(), recv_response.message());
  160. EXPECT_TRUE(recv_status.ok());
  161. }
  162. }
  163. // Return errors to up to one call that comes in on the supplied completion
  164. // queue, until the CQ is being shut down (and therefore we can no longer
  165. // enqueue further events).
  166. void DriveCompletionQueue() {
  167. enum class Event : uintptr_t {
  168. kCallReceived,
  169. kResponseSent,
  170. };
  171. // Request the call, but only if the main thread hasn't beaten us to
  172. // shutting down the CQ.
  173. grpc::GenericServerContext server_context;
  174. grpc::GenericServerAsyncReaderWriter reader_writer(&server_context);
  175. {
  176. std::lock_guard<std::mutex> lock(shutting_down_mu_);
  177. if (!shutting_down_) {
  178. generic_service_.RequestCall(
  179. &server_context, &reader_writer, srv_cq_.get(), srv_cq_.get(),
  180. reinterpret_cast<void*>(Event::kCallReceived));
  181. }
  182. }
  183. // Process events.
  184. {
  185. Event event;
  186. bool ok;
  187. while (srv_cq_->Next(reinterpret_cast<void**>(&event), &ok)) {
  188. std::lock_guard<std::mutex> lock(shutting_down_mu_);
  189. if (shutting_down_) {
  190. // The main thread has started shutting down. Simply continue to drain
  191. // events.
  192. continue;
  193. }
  194. switch (event) {
  195. case Event::kCallReceived:
  196. reader_writer.Finish(
  197. grpc::Status(grpc::StatusCode::UNIMPLEMENTED, "go away"),
  198. reinterpret_cast<void*>(Event::kResponseSent));
  199. break;
  200. case Event::kResponseSent:
  201. // We are done.
  202. break;
  203. }
  204. }
  205. }
  206. }
  207. CompletionQueue cli_cq_;
  208. std::unique_ptr<ServerCompletionQueue> srv_cq_;
  209. std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
  210. std::unique_ptr<grpc::GenericStub> generic_stub_;
  211. std::unique_ptr<Server> server_;
  212. AsyncGenericService generic_service_;
  213. const std::string server_host_;
  214. std::ostringstream server_address_;
  215. bool shutting_down_;
  216. bool shut_down_;
  217. std::mutex shutting_down_mu_;
  218. };
  219. TEST_F(GenericEnd2endTest, SimpleRpc) {
  220. ResetStub();
  221. SendRpc(1);
  222. }
  223. TEST_F(GenericEnd2endTest, SequentialRpcs) {
  224. ResetStub();
  225. SendRpc(10);
  226. }
  227. TEST_F(GenericEnd2endTest, SequentialUnaryRpcs) {
  228. ResetStub();
  229. const int num_rpcs = 10;
  230. const std::string kMethodName("/grpc.cpp.test.util.EchoTestService/Echo");
  231. for (int i = 0; i < num_rpcs; i++) {
  232. EchoRequest send_request;
  233. EchoRequest recv_request;
  234. EchoResponse send_response;
  235. EchoResponse recv_response;
  236. Status recv_status;
  237. ClientContext cli_ctx;
  238. GenericServerContext srv_ctx;
  239. GenericServerAsyncReaderWriter stream(&srv_ctx);
  240. // The string needs to be long enough to test heap-based slice.
  241. send_request.set_message("Hello world. Hello world. Hello world.");
  242. std::unique_ptr<ByteBuffer> cli_send_buffer =
  243. SerializeToByteBuffer(&send_request);
  244. std::thread request_call([this]() { server_ok(4); });
  245. std::unique_ptr<GenericClientAsyncResponseReader> call =
  246. generic_stub_->PrepareUnaryCall(&cli_ctx, kMethodName, *cli_send_buffer,
  247. &cli_cq_);
  248. call->StartCall();
  249. ByteBuffer cli_recv_buffer;
  250. call->Finish(&cli_recv_buffer, &recv_status, tag(1));
  251. std::thread client_check([this] { client_ok(1); });
  252. generic_service_.RequestCall(&srv_ctx, &stream, srv_cq_.get(),
  253. srv_cq_.get(), tag(4));
  254. request_call.join();
  255. EXPECT_EQ(server_host_, srv_ctx.host().substr(0, server_host_.length()));
  256. EXPECT_EQ(kMethodName, srv_ctx.method());
  257. ByteBuffer srv_recv_buffer;
  258. stream.Read(&srv_recv_buffer, tag(5));
  259. server_ok(5);
  260. EXPECT_TRUE(ParseFromByteBuffer(&srv_recv_buffer, &recv_request));
  261. EXPECT_EQ(send_request.message(), recv_request.message());
  262. send_response.set_message(recv_request.message());
  263. std::unique_ptr<ByteBuffer> srv_send_buffer =
  264. SerializeToByteBuffer(&send_response);
  265. stream.Write(*srv_send_buffer, tag(6));
  266. server_ok(6);
  267. stream.Finish(Status::OK, tag(7));
  268. server_ok(7);
  269. client_check.join();
  270. EXPECT_TRUE(ParseFromByteBuffer(&cli_recv_buffer, &recv_response));
  271. EXPECT_EQ(send_response.message(), recv_response.message());
  272. EXPECT_TRUE(recv_status.ok());
  273. }
  274. }
  275. // One ping, one pong.
  276. TEST_F(GenericEnd2endTest, SimpleBidiStreaming) {
  277. ResetStub();
  278. const std::string kMethodName(
  279. "/grpc.cpp.test.util.EchoTestService/BidiStream");
  280. EchoRequest send_request;
  281. EchoRequest recv_request;
  282. EchoResponse send_response;
  283. EchoResponse recv_response;
  284. Status recv_status;
  285. ClientContext cli_ctx;
  286. GenericServerContext srv_ctx;
  287. GenericServerAsyncReaderWriter srv_stream(&srv_ctx);
  288. cli_ctx.set_compression_algorithm(GRPC_COMPRESS_GZIP);
  289. send_request.set_message("Hello");
  290. std::thread request_call([this]() { server_ok(2); });
  291. std::unique_ptr<GenericClientAsyncReaderWriter> cli_stream =
  292. generic_stub_->PrepareCall(&cli_ctx, kMethodName, &cli_cq_);
  293. cli_stream->StartCall(tag(1));
  294. client_ok(1);
  295. generic_service_.RequestCall(&srv_ctx, &srv_stream, srv_cq_.get(),
  296. srv_cq_.get(), tag(2));
  297. request_call.join();
  298. EXPECT_EQ(server_host_, srv_ctx.host().substr(0, server_host_.length()));
  299. EXPECT_EQ(kMethodName, srv_ctx.method());
  300. std::unique_ptr<ByteBuffer> send_buffer =
  301. SerializeToByteBuffer(&send_request);
  302. cli_stream->Write(*send_buffer, tag(3));
  303. send_buffer.reset();
  304. client_ok(3);
  305. ByteBuffer recv_buffer;
  306. srv_stream.Read(&recv_buffer, tag(4));
  307. server_ok(4);
  308. EXPECT_TRUE(ParseFromByteBuffer(&recv_buffer, &recv_request));
  309. EXPECT_EQ(send_request.message(), recv_request.message());
  310. send_response.set_message(recv_request.message());
  311. send_buffer = SerializeToByteBuffer(&send_response);
  312. srv_stream.Write(*send_buffer, tag(5));
  313. send_buffer.reset();
  314. server_ok(5);
  315. cli_stream->Read(&recv_buffer, tag(6));
  316. client_ok(6);
  317. EXPECT_TRUE(ParseFromByteBuffer(&recv_buffer, &recv_response));
  318. EXPECT_EQ(send_response.message(), recv_response.message());
  319. cli_stream->WritesDone(tag(7));
  320. client_ok(7);
  321. srv_stream.Read(&recv_buffer, tag(8));
  322. server_fail(8);
  323. srv_stream.Finish(Status::OK, tag(9));
  324. server_ok(9);
  325. cli_stream->Finish(&recv_status, tag(10));
  326. client_ok(10);
  327. EXPECT_EQ(send_response.message(), recv_response.message());
  328. EXPECT_TRUE(recv_status.ok());
  329. }
  330. TEST_F(GenericEnd2endTest, Deadline) {
  331. ResetStub();
  332. SendRpc(1, true,
  333. gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC),
  334. gpr_time_from_seconds(10, GPR_TIMESPAN)));
  335. }
  336. TEST_F(GenericEnd2endTest, ShortDeadline) {
  337. ResetStub();
  338. ClientContext cli_ctx;
  339. EchoRequest request;
  340. EchoResponse response;
  341. shutting_down_ = false;
  342. std::thread driver([this] { DriveCompletionQueue(); });
  343. request.set_message("");
  344. cli_ctx.set_deadline(gpr_time_add(gpr_now(GPR_CLOCK_MONOTONIC),
  345. gpr_time_from_micros(500, GPR_TIMESPAN)));
  346. Status s = stub_->Echo(&cli_ctx, request, &response);
  347. EXPECT_FALSE(s.ok());
  348. {
  349. std::lock_guard<std::mutex> lock(shutting_down_mu_);
  350. shutting_down_ = true;
  351. }
  352. ShutDownServerAndCQs();
  353. driver.join();
  354. }
  355. } // namespace
  356. } // namespace testing
  357. } // namespace grpc
  358. int main(int argc, char** argv) {
  359. grpc::testing::TestEnvironment env(argc, argv);
  360. ::testing::InitGoogleTest(&argc, argv);
  361. return RUN_ALL_TESTS();
  362. }