server_interceptors_end2end_test.cc 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. /*
  2. *
  3. * Copyright 2018 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 <vector>
  20. #include <gtest/gtest.h>
  21. #include "absl/memory/memory.h"
  22. #include "absl/strings/match.h"
  23. #include <grpcpp/channel.h>
  24. #include <grpcpp/client_context.h>
  25. #include <grpcpp/create_channel.h>
  26. #include <grpcpp/generic/generic_stub.h>
  27. #include <grpcpp/impl/codegen/proto_utils.h>
  28. #include <grpcpp/server.h>
  29. #include <grpcpp/server_builder.h>
  30. #include <grpcpp/server_context.h>
  31. #include <grpcpp/support/server_interceptor.h>
  32. #include "src/proto/grpc/testing/echo.grpc.pb.h"
  33. #include "test/core/util/port.h"
  34. #include "test/core/util/test_config.h"
  35. #include "test/cpp/end2end/interceptors_util.h"
  36. #include "test/cpp/end2end/test_service_impl.h"
  37. #include "test/cpp/util/byte_buffer_proto_helper.h"
  38. namespace grpc {
  39. namespace testing {
  40. namespace {
  41. class LoggingInterceptor : public experimental::Interceptor {
  42. public:
  43. explicit LoggingInterceptor(experimental::ServerRpcInfo* info) {
  44. info_ = info;
  45. // Check the method name and compare to the type
  46. const char* method = info->method();
  47. experimental::ServerRpcInfo::Type type = info->type();
  48. // Check that we use one of our standard methods with expected type.
  49. // Also allow the health checking service.
  50. // We accept BIDI_STREAMING for Echo in case it's an AsyncGenericService
  51. // being tested (the GenericRpc test).
  52. // The empty method is for the Unimplemented requests that arise
  53. // when draining the CQ.
  54. EXPECT_TRUE(
  55. strstr(method, "/grpc.health") == method ||
  56. (strcmp(method, "/grpc.testing.EchoTestService/Echo") == 0 &&
  57. (type == experimental::ServerRpcInfo::Type::UNARY ||
  58. type == experimental::ServerRpcInfo::Type::BIDI_STREAMING)) ||
  59. (strcmp(method, "/grpc.testing.EchoTestService/RequestStream") == 0 &&
  60. type == experimental::ServerRpcInfo::Type::CLIENT_STREAMING) ||
  61. (strcmp(method, "/grpc.testing.EchoTestService/ResponseStream") == 0 &&
  62. type == experimental::ServerRpcInfo::Type::SERVER_STREAMING) ||
  63. (strcmp(method, "/grpc.testing.EchoTestService/BidiStream") == 0 &&
  64. type == experimental::ServerRpcInfo::Type::BIDI_STREAMING) ||
  65. strcmp(method, "/grpc.testing.EchoTestService/Unimplemented") == 0 ||
  66. (strcmp(method, "") == 0 &&
  67. type == experimental::ServerRpcInfo::Type::BIDI_STREAMING));
  68. }
  69. void Intercept(experimental::InterceptorBatchMethods* methods) override {
  70. if (methods->QueryInterceptionHookPoint(
  71. experimental::InterceptionHookPoints::PRE_SEND_INITIAL_METADATA)) {
  72. auto* map = methods->GetSendInitialMetadata();
  73. // Got nothing better to do here for now
  74. EXPECT_EQ(map->size(), static_cast<unsigned>(0));
  75. }
  76. if (methods->QueryInterceptionHookPoint(
  77. experimental::InterceptionHookPoints::PRE_SEND_MESSAGE)) {
  78. EchoRequest req;
  79. auto* buffer = methods->GetSerializedSendMessage();
  80. auto copied_buffer = *buffer;
  81. EXPECT_TRUE(
  82. SerializationTraits<EchoRequest>::Deserialize(&copied_buffer, &req)
  83. .ok());
  84. EXPECT_TRUE(req.message().find("Hello") == 0);
  85. }
  86. if (methods->QueryInterceptionHookPoint(
  87. experimental::InterceptionHookPoints::PRE_SEND_STATUS)) {
  88. auto* map = methods->GetSendTrailingMetadata();
  89. bool found = false;
  90. // Check that we received the metadata as an echo
  91. for (const auto& pair : *map) {
  92. found = absl::StartsWith(pair.first, "testkey") &&
  93. absl::StartsWith(pair.second, "testvalue");
  94. if (found) break;
  95. }
  96. EXPECT_EQ(found, true);
  97. auto status = methods->GetSendStatus();
  98. EXPECT_EQ(status.ok(), true);
  99. }
  100. if (methods->QueryInterceptionHookPoint(
  101. experimental::InterceptionHookPoints::POST_RECV_INITIAL_METADATA)) {
  102. auto* map = methods->GetRecvInitialMetadata();
  103. bool found = false;
  104. // Check that we received the metadata as an echo
  105. for (const auto& pair : *map) {
  106. found = pair.first.find("testkey") == 0 &&
  107. pair.second.find("testvalue") == 0;
  108. if (found) break;
  109. }
  110. EXPECT_EQ(found, true);
  111. }
  112. if (methods->QueryInterceptionHookPoint(
  113. experimental::InterceptionHookPoints::POST_RECV_MESSAGE)) {
  114. EchoResponse* resp =
  115. static_cast<EchoResponse*>(methods->GetRecvMessage());
  116. if (resp != nullptr) {
  117. EXPECT_TRUE(resp->message().find("Hello") == 0);
  118. }
  119. }
  120. if (methods->QueryInterceptionHookPoint(
  121. experimental::InterceptionHookPoints::POST_RECV_CLOSE)) {
  122. // Got nothing interesting to do here
  123. }
  124. methods->Proceed();
  125. }
  126. private:
  127. experimental::ServerRpcInfo* info_;
  128. };
  129. class LoggingInterceptorFactory
  130. : public experimental::ServerInterceptorFactoryInterface {
  131. public:
  132. experimental::Interceptor* CreateServerInterceptor(
  133. experimental::ServerRpcInfo* info) override {
  134. return new LoggingInterceptor(info);
  135. }
  136. };
  137. // Test if SendMessage function family works as expected for sync/callback apis
  138. class SyncSendMessageTester : public experimental::Interceptor {
  139. public:
  140. explicit SyncSendMessageTester(experimental::ServerRpcInfo* /*info*/) {}
  141. void Intercept(experimental::InterceptorBatchMethods* methods) override {
  142. if (methods->QueryInterceptionHookPoint(
  143. experimental::InterceptionHookPoints::PRE_SEND_MESSAGE)) {
  144. string old_msg =
  145. static_cast<const EchoRequest*>(methods->GetSendMessage())->message();
  146. EXPECT_EQ(old_msg.find("Hello"), 0u);
  147. new_msg_.set_message("World" + old_msg);
  148. methods->ModifySendMessage(&new_msg_);
  149. }
  150. methods->Proceed();
  151. }
  152. private:
  153. EchoRequest new_msg_;
  154. };
  155. class SyncSendMessageTesterFactory
  156. : public experimental::ServerInterceptorFactoryInterface {
  157. public:
  158. experimental::Interceptor* CreateServerInterceptor(
  159. experimental::ServerRpcInfo* info) override {
  160. return new SyncSendMessageTester(info);
  161. }
  162. };
  163. // Test if SendMessage function family works as expected for sync/callback apis
  164. class SyncSendMessageVerifier : public experimental::Interceptor {
  165. public:
  166. explicit SyncSendMessageVerifier(experimental::ServerRpcInfo* /*info*/) {}
  167. void Intercept(experimental::InterceptorBatchMethods* methods) override {
  168. if (methods->QueryInterceptionHookPoint(
  169. experimental::InterceptionHookPoints::PRE_SEND_MESSAGE)) {
  170. // Make sure that the changes made in SyncSendMessageTester persisted
  171. string old_msg =
  172. static_cast<const EchoRequest*>(methods->GetSendMessage())->message();
  173. EXPECT_EQ(old_msg.find("World"), 0u);
  174. // Remove the "World" part of the string that we added earlier
  175. new_msg_.set_message(old_msg.erase(0, 5));
  176. methods->ModifySendMessage(&new_msg_);
  177. // LoggingInterceptor verifies that changes got reverted
  178. }
  179. methods->Proceed();
  180. }
  181. private:
  182. EchoRequest new_msg_;
  183. };
  184. class SyncSendMessageVerifierFactory
  185. : public experimental::ServerInterceptorFactoryInterface {
  186. public:
  187. experimental::Interceptor* CreateServerInterceptor(
  188. experimental::ServerRpcInfo* info) override {
  189. return new SyncSendMessageVerifier(info);
  190. }
  191. };
  192. void MakeBidiStreamingCall(const std::shared_ptr<Channel>& channel) {
  193. auto stub = grpc::testing::EchoTestService::NewStub(channel);
  194. ClientContext ctx;
  195. EchoRequest req;
  196. EchoResponse resp;
  197. ctx.AddMetadata("testkey", "testvalue");
  198. auto stream = stub->BidiStream(&ctx);
  199. for (auto i = 0; i < 10; i++) {
  200. req.set_message("Hello" + std::to_string(i));
  201. stream->Write(req);
  202. stream->Read(&resp);
  203. EXPECT_EQ(req.message(), resp.message());
  204. }
  205. ASSERT_TRUE(stream->WritesDone());
  206. Status s = stream->Finish();
  207. EXPECT_EQ(s.ok(), true);
  208. }
  209. class ServerInterceptorsEnd2endSyncUnaryTest : public ::testing::Test {
  210. protected:
  211. ServerInterceptorsEnd2endSyncUnaryTest() {
  212. int port = grpc_pick_unused_port_or_die();
  213. ServerBuilder builder;
  214. server_address_ = "localhost:" + std::to_string(port);
  215. builder.AddListeningPort(server_address_, InsecureServerCredentials());
  216. builder.RegisterService(&service_);
  217. std::vector<
  218. std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>
  219. creators;
  220. creators.push_back(
  221. std::unique_ptr<experimental::ServerInterceptorFactoryInterface>(
  222. new SyncSendMessageTesterFactory()));
  223. creators.push_back(
  224. std::unique_ptr<experimental::ServerInterceptorFactoryInterface>(
  225. new SyncSendMessageVerifierFactory()));
  226. creators.push_back(
  227. std::unique_ptr<experimental::ServerInterceptorFactoryInterface>(
  228. new LoggingInterceptorFactory()));
  229. // Add 20 phony interceptor factories and null interceptor factories
  230. for (auto i = 0; i < 20; i++) {
  231. creators.push_back(absl::make_unique<PhonyInterceptorFactory>());
  232. creators.push_back(absl::make_unique<NullInterceptorFactory>());
  233. }
  234. builder.experimental().SetInterceptorCreators(std::move(creators));
  235. server_ = builder.BuildAndStart();
  236. }
  237. std::string server_address_;
  238. TestServiceImpl service_;
  239. std::unique_ptr<Server> server_;
  240. };
  241. TEST_F(ServerInterceptorsEnd2endSyncUnaryTest, UnaryTest) {
  242. ChannelArguments args;
  243. PhonyInterceptor::Reset();
  244. auto channel =
  245. grpc::CreateChannel(server_address_, InsecureChannelCredentials());
  246. MakeCall(channel);
  247. // Make sure all 20 phony interceptors were run
  248. EXPECT_EQ(PhonyInterceptor::GetNumTimesRun(), 20);
  249. }
  250. class ServerInterceptorsEnd2endSyncStreamingTest : public ::testing::Test {
  251. protected:
  252. ServerInterceptorsEnd2endSyncStreamingTest() {
  253. int port = grpc_pick_unused_port_or_die();
  254. ServerBuilder builder;
  255. server_address_ = "localhost:" + std::to_string(port);
  256. builder.AddListeningPort(server_address_, InsecureServerCredentials());
  257. builder.RegisterService(&service_);
  258. std::vector<
  259. std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>
  260. creators;
  261. creators.push_back(
  262. std::unique_ptr<experimental::ServerInterceptorFactoryInterface>(
  263. new SyncSendMessageTesterFactory()));
  264. creators.push_back(
  265. std::unique_ptr<experimental::ServerInterceptorFactoryInterface>(
  266. new SyncSendMessageVerifierFactory()));
  267. creators.push_back(
  268. std::unique_ptr<experimental::ServerInterceptorFactoryInterface>(
  269. new LoggingInterceptorFactory()));
  270. for (auto i = 0; i < 20; i++) {
  271. creators.push_back(absl::make_unique<PhonyInterceptorFactory>());
  272. }
  273. builder.experimental().SetInterceptorCreators(std::move(creators));
  274. server_ = builder.BuildAndStart();
  275. }
  276. std::string server_address_;
  277. EchoTestServiceStreamingImpl service_;
  278. std::unique_ptr<Server> server_;
  279. };
  280. TEST_F(ServerInterceptorsEnd2endSyncStreamingTest, ClientStreamingTest) {
  281. ChannelArguments args;
  282. PhonyInterceptor::Reset();
  283. auto channel =
  284. grpc::CreateChannel(server_address_, InsecureChannelCredentials());
  285. MakeClientStreamingCall(channel);
  286. // Make sure all 20 phony interceptors were run
  287. EXPECT_EQ(PhonyInterceptor::GetNumTimesRun(), 20);
  288. }
  289. TEST_F(ServerInterceptorsEnd2endSyncStreamingTest, ServerStreamingTest) {
  290. ChannelArguments args;
  291. PhonyInterceptor::Reset();
  292. auto channel =
  293. grpc::CreateChannel(server_address_, InsecureChannelCredentials());
  294. MakeServerStreamingCall(channel);
  295. // Make sure all 20 phony interceptors were run
  296. EXPECT_EQ(PhonyInterceptor::GetNumTimesRun(), 20);
  297. }
  298. TEST_F(ServerInterceptorsEnd2endSyncStreamingTest, BidiStreamingTest) {
  299. ChannelArguments args;
  300. PhonyInterceptor::Reset();
  301. auto channel =
  302. grpc::CreateChannel(server_address_, InsecureChannelCredentials());
  303. MakeBidiStreamingCall(channel);
  304. // Make sure all 20 phony interceptors were run
  305. EXPECT_EQ(PhonyInterceptor::GetNumTimesRun(), 20);
  306. }
  307. class ServerInterceptorsAsyncEnd2endTest : public ::testing::Test {};
  308. TEST_F(ServerInterceptorsAsyncEnd2endTest, UnaryTest) {
  309. PhonyInterceptor::Reset();
  310. int port = grpc_pick_unused_port_or_die();
  311. string server_address = "localhost:" + std::to_string(port);
  312. ServerBuilder builder;
  313. EchoTestService::AsyncService service;
  314. builder.AddListeningPort(server_address, InsecureServerCredentials());
  315. builder.RegisterService(&service);
  316. std::vector<std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>
  317. creators;
  318. creators.push_back(
  319. std::unique_ptr<experimental::ServerInterceptorFactoryInterface>(
  320. new LoggingInterceptorFactory()));
  321. for (auto i = 0; i < 20; i++) {
  322. creators.push_back(absl::make_unique<PhonyInterceptorFactory>());
  323. }
  324. builder.experimental().SetInterceptorCreators(std::move(creators));
  325. auto cq = builder.AddCompletionQueue();
  326. auto server = builder.BuildAndStart();
  327. ChannelArguments args;
  328. auto channel =
  329. grpc::CreateChannel(server_address, InsecureChannelCredentials());
  330. auto stub = grpc::testing::EchoTestService::NewStub(channel);
  331. EchoRequest send_request;
  332. EchoRequest recv_request;
  333. EchoResponse send_response;
  334. EchoResponse recv_response;
  335. Status recv_status;
  336. ClientContext cli_ctx;
  337. ServerContext srv_ctx;
  338. grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
  339. send_request.set_message("Hello");
  340. cli_ctx.AddMetadata("testkey", "testvalue");
  341. std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
  342. stub->AsyncEcho(&cli_ctx, send_request, cq.get()));
  343. service.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq.get(),
  344. cq.get(), tag(2));
  345. response_reader->Finish(&recv_response, &recv_status, tag(4));
  346. Verifier().Expect(2, true).Verify(cq.get());
  347. EXPECT_EQ(send_request.message(), recv_request.message());
  348. EXPECT_TRUE(CheckMetadata(srv_ctx.client_metadata(), "testkey", "testvalue"));
  349. srv_ctx.AddTrailingMetadata("testkey", "testvalue");
  350. send_response.set_message(recv_request.message());
  351. response_writer.Finish(send_response, Status::OK, tag(3));
  352. Verifier().Expect(3, true).Expect(4, true).Verify(cq.get());
  353. EXPECT_EQ(send_response.message(), recv_response.message());
  354. EXPECT_TRUE(recv_status.ok());
  355. EXPECT_TRUE(CheckMetadata(cli_ctx.GetServerTrailingMetadata(), "testkey",
  356. "testvalue"));
  357. // Make sure all 20 phony interceptors were run
  358. EXPECT_EQ(PhonyInterceptor::GetNumTimesRun(), 20);
  359. server->Shutdown();
  360. cq->Shutdown();
  361. void* ignored_tag;
  362. bool ignored_ok;
  363. while (cq->Next(&ignored_tag, &ignored_ok)) {
  364. }
  365. grpc_recycle_unused_port(port);
  366. }
  367. TEST_F(ServerInterceptorsAsyncEnd2endTest, BidiStreamingTest) {
  368. PhonyInterceptor::Reset();
  369. int port = grpc_pick_unused_port_or_die();
  370. string server_address = "localhost:" + std::to_string(port);
  371. ServerBuilder builder;
  372. EchoTestService::AsyncService service;
  373. builder.AddListeningPort(server_address, InsecureServerCredentials());
  374. builder.RegisterService(&service);
  375. std::vector<std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>
  376. creators;
  377. creators.push_back(
  378. std::unique_ptr<experimental::ServerInterceptorFactoryInterface>(
  379. new LoggingInterceptorFactory()));
  380. for (auto i = 0; i < 20; i++) {
  381. creators.push_back(absl::make_unique<PhonyInterceptorFactory>());
  382. }
  383. builder.experimental().SetInterceptorCreators(std::move(creators));
  384. auto cq = builder.AddCompletionQueue();
  385. auto server = builder.BuildAndStart();
  386. ChannelArguments args;
  387. auto channel =
  388. grpc::CreateChannel(server_address, InsecureChannelCredentials());
  389. auto stub = grpc::testing::EchoTestService::NewStub(channel);
  390. EchoRequest send_request;
  391. EchoRequest recv_request;
  392. EchoResponse send_response;
  393. EchoResponse recv_response;
  394. Status recv_status;
  395. ClientContext cli_ctx;
  396. ServerContext srv_ctx;
  397. grpc::ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
  398. send_request.set_message("Hello");
  399. cli_ctx.AddMetadata("testkey", "testvalue");
  400. std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
  401. cli_stream(stub->AsyncBidiStream(&cli_ctx, cq.get(), tag(1)));
  402. service.RequestBidiStream(&srv_ctx, &srv_stream, cq.get(), cq.get(), tag(2));
  403. Verifier().Expect(1, true).Expect(2, true).Verify(cq.get());
  404. EXPECT_TRUE(CheckMetadata(srv_ctx.client_metadata(), "testkey", "testvalue"));
  405. srv_ctx.AddTrailingMetadata("testkey", "testvalue");
  406. cli_stream->Write(send_request, tag(3));
  407. srv_stream.Read(&recv_request, tag(4));
  408. Verifier().Expect(3, true).Expect(4, true).Verify(cq.get());
  409. EXPECT_EQ(send_request.message(), recv_request.message());
  410. send_response.set_message(recv_request.message());
  411. srv_stream.Write(send_response, tag(5));
  412. cli_stream->Read(&recv_response, tag(6));
  413. Verifier().Expect(5, true).Expect(6, true).Verify(cq.get());
  414. EXPECT_EQ(send_response.message(), recv_response.message());
  415. cli_stream->WritesDone(tag(7));
  416. srv_stream.Read(&recv_request, tag(8));
  417. Verifier().Expect(7, true).Expect(8, false).Verify(cq.get());
  418. srv_stream.Finish(Status::OK, tag(9));
  419. cli_stream->Finish(&recv_status, tag(10));
  420. Verifier().Expect(9, true).Expect(10, true).Verify(cq.get());
  421. EXPECT_TRUE(recv_status.ok());
  422. EXPECT_TRUE(CheckMetadata(cli_ctx.GetServerTrailingMetadata(), "testkey",
  423. "testvalue"));
  424. // Make sure all 20 phony interceptors were run
  425. EXPECT_EQ(PhonyInterceptor::GetNumTimesRun(), 20);
  426. server->Shutdown();
  427. cq->Shutdown();
  428. void* ignored_tag;
  429. bool ignored_ok;
  430. while (cq->Next(&ignored_tag, &ignored_ok)) {
  431. }
  432. grpc_recycle_unused_port(port);
  433. }
  434. TEST_F(ServerInterceptorsAsyncEnd2endTest, GenericRPCTest) {
  435. PhonyInterceptor::Reset();
  436. int port = grpc_pick_unused_port_or_die();
  437. string server_address = "localhost:" + std::to_string(port);
  438. ServerBuilder builder;
  439. AsyncGenericService service;
  440. builder.AddListeningPort(server_address, InsecureServerCredentials());
  441. builder.RegisterAsyncGenericService(&service);
  442. std::vector<std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>
  443. creators;
  444. creators.reserve(20);
  445. for (auto i = 0; i < 20; i++) {
  446. creators.push_back(absl::make_unique<PhonyInterceptorFactory>());
  447. }
  448. builder.experimental().SetInterceptorCreators(std::move(creators));
  449. auto srv_cq = builder.AddCompletionQueue();
  450. CompletionQueue cli_cq;
  451. auto server = builder.BuildAndStart();
  452. ChannelArguments args;
  453. auto channel =
  454. grpc::CreateChannel(server_address, InsecureChannelCredentials());
  455. GenericStub generic_stub(channel);
  456. const std::string kMethodName("/grpc.cpp.test.util.EchoTestService/Echo");
  457. EchoRequest send_request;
  458. EchoRequest recv_request;
  459. EchoResponse send_response;
  460. EchoResponse recv_response;
  461. Status recv_status;
  462. ClientContext cli_ctx;
  463. GenericServerContext srv_ctx;
  464. GenericServerAsyncReaderWriter stream(&srv_ctx);
  465. // The string needs to be long enough to test heap-based slice.
  466. send_request.set_message("Hello");
  467. cli_ctx.AddMetadata("testkey", "testvalue");
  468. CompletionQueue* cq = srv_cq.get();
  469. std::thread request_call([cq]() { Verifier().Expect(4, true).Verify(cq); });
  470. std::unique_ptr<GenericClientAsyncReaderWriter> call =
  471. generic_stub.PrepareCall(&cli_ctx, kMethodName, &cli_cq);
  472. call->StartCall(tag(1));
  473. Verifier().Expect(1, true).Verify(&cli_cq);
  474. std::unique_ptr<ByteBuffer> send_buffer =
  475. SerializeToByteBuffer(&send_request);
  476. call->Write(*send_buffer, tag(2));
  477. // Send ByteBuffer can be destroyed after calling Write.
  478. send_buffer.reset();
  479. Verifier().Expect(2, true).Verify(&cli_cq);
  480. call->WritesDone(tag(3));
  481. Verifier().Expect(3, true).Verify(&cli_cq);
  482. service.RequestCall(&srv_ctx, &stream, srv_cq.get(), srv_cq.get(), tag(4));
  483. request_call.join();
  484. EXPECT_EQ(kMethodName, srv_ctx.method());
  485. EXPECT_TRUE(CheckMetadata(srv_ctx.client_metadata(), "testkey", "testvalue"));
  486. srv_ctx.AddTrailingMetadata("testkey", "testvalue");
  487. ByteBuffer recv_buffer;
  488. stream.Read(&recv_buffer, tag(5));
  489. Verifier().Expect(5, true).Verify(srv_cq.get());
  490. EXPECT_TRUE(ParseFromByteBuffer(&recv_buffer, &recv_request));
  491. EXPECT_EQ(send_request.message(), recv_request.message());
  492. send_response.set_message(recv_request.message());
  493. send_buffer = SerializeToByteBuffer(&send_response);
  494. stream.Write(*send_buffer, tag(6));
  495. send_buffer.reset();
  496. Verifier().Expect(6, true).Verify(srv_cq.get());
  497. stream.Finish(Status::OK, tag(7));
  498. // Shutdown srv_cq before we try to get the tag back, to verify that the
  499. // interception API handles completion queue shutdowns that take place before
  500. // all the tags are returned
  501. srv_cq->Shutdown();
  502. Verifier().Expect(7, true).Verify(srv_cq.get());
  503. recv_buffer.Clear();
  504. call->Read(&recv_buffer, tag(8));
  505. Verifier().Expect(8, true).Verify(&cli_cq);
  506. EXPECT_TRUE(ParseFromByteBuffer(&recv_buffer, &recv_response));
  507. call->Finish(&recv_status, tag(9));
  508. cli_cq.Shutdown();
  509. Verifier().Expect(9, true).Verify(&cli_cq);
  510. EXPECT_EQ(send_response.message(), recv_response.message());
  511. EXPECT_TRUE(recv_status.ok());
  512. EXPECT_TRUE(CheckMetadata(cli_ctx.GetServerTrailingMetadata(), "testkey",
  513. "testvalue"));
  514. // Make sure all 20 phony interceptors were run
  515. EXPECT_EQ(PhonyInterceptor::GetNumTimesRun(), 20);
  516. server->Shutdown();
  517. void* ignored_tag;
  518. bool ignored_ok;
  519. while (cli_cq.Next(&ignored_tag, &ignored_ok)) {
  520. }
  521. while (srv_cq->Next(&ignored_tag, &ignored_ok)) {
  522. }
  523. grpc_recycle_unused_port(port);
  524. }
  525. TEST_F(ServerInterceptorsAsyncEnd2endTest, UnimplementedRpcTest) {
  526. PhonyInterceptor::Reset();
  527. int port = grpc_pick_unused_port_or_die();
  528. string server_address = "localhost:" + std::to_string(port);
  529. ServerBuilder builder;
  530. builder.AddListeningPort(server_address, InsecureServerCredentials());
  531. std::vector<std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>
  532. creators;
  533. creators.reserve(20);
  534. for (auto i = 0; i < 20; i++) {
  535. creators.push_back(absl::make_unique<PhonyInterceptorFactory>());
  536. }
  537. builder.experimental().SetInterceptorCreators(std::move(creators));
  538. auto cq = builder.AddCompletionQueue();
  539. auto server = builder.BuildAndStart();
  540. ChannelArguments args;
  541. std::shared_ptr<Channel> channel =
  542. grpc::CreateChannel(server_address, InsecureChannelCredentials());
  543. std::unique_ptr<grpc::testing::UnimplementedEchoService::Stub> stub;
  544. stub = grpc::testing::UnimplementedEchoService::NewStub(channel);
  545. EchoRequest send_request;
  546. EchoResponse recv_response;
  547. Status recv_status;
  548. ClientContext cli_ctx;
  549. send_request.set_message("Hello");
  550. std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
  551. stub->AsyncUnimplemented(&cli_ctx, send_request, cq.get()));
  552. response_reader->Finish(&recv_response, &recv_status, tag(4));
  553. Verifier().Expect(4, true).Verify(cq.get());
  554. EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
  555. EXPECT_EQ("", recv_status.error_message());
  556. // Make sure all 20 phony interceptors were run
  557. EXPECT_EQ(PhonyInterceptor::GetNumTimesRun(), 20);
  558. server->Shutdown();
  559. cq->Shutdown();
  560. void* ignored_tag;
  561. bool ignored_ok;
  562. while (cq->Next(&ignored_tag, &ignored_ok)) {
  563. }
  564. grpc_recycle_unused_port(port);
  565. }
  566. class ServerInterceptorsSyncUnimplementedEnd2endTest : public ::testing::Test {
  567. };
  568. TEST_F(ServerInterceptorsSyncUnimplementedEnd2endTest, UnimplementedRpcTest) {
  569. PhonyInterceptor::Reset();
  570. int port = grpc_pick_unused_port_or_die();
  571. string server_address = "localhost:" + std::to_string(port);
  572. ServerBuilder builder;
  573. TestServiceImpl service;
  574. builder.RegisterService(&service);
  575. builder.AddListeningPort(server_address, InsecureServerCredentials());
  576. std::vector<std::unique_ptr<experimental::ServerInterceptorFactoryInterface>>
  577. creators;
  578. creators.reserve(20);
  579. for (auto i = 0; i < 20; i++) {
  580. creators.push_back(absl::make_unique<PhonyInterceptorFactory>());
  581. }
  582. builder.experimental().SetInterceptorCreators(std::move(creators));
  583. auto server = builder.BuildAndStart();
  584. ChannelArguments args;
  585. std::shared_ptr<Channel> channel =
  586. grpc::CreateChannel(server_address, InsecureChannelCredentials());
  587. std::unique_ptr<grpc::testing::UnimplementedEchoService::Stub> stub;
  588. stub = grpc::testing::UnimplementedEchoService::NewStub(channel);
  589. EchoRequest send_request;
  590. EchoResponse recv_response;
  591. ClientContext cli_ctx;
  592. send_request.set_message("Hello");
  593. Status recv_status =
  594. stub->Unimplemented(&cli_ctx, send_request, &recv_response);
  595. EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
  596. EXPECT_EQ("", recv_status.error_message());
  597. // Make sure all 20 phony interceptors were run
  598. EXPECT_EQ(PhonyInterceptor::GetNumTimesRun(), 20);
  599. server->Shutdown();
  600. grpc_recycle_unused_port(port);
  601. }
  602. } // namespace
  603. } // namespace testing
  604. } // namespace grpc
  605. int main(int argc, char** argv) {
  606. grpc::testing::TestEnvironment env(argc, argv);
  607. ::testing::InitGoogleTest(&argc, argv);
  608. return RUN_ALL_TESTS();
  609. }