end2end_test.cc 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790
  1. /*
  2. *
  3. * Copyright 2015, Google Inc.
  4. * 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. #include <mutex>
  34. #include <thread>
  35. #include "src/core/security/credentials.h"
  36. #include "src/cpp/server/thread_pool.h"
  37. #include "test/core/util/port.h"
  38. #include "test/core/util/test_config.h"
  39. #include "test/cpp/util/echo_duplicate.grpc.pb.h"
  40. #include "test/cpp/util/echo.grpc.pb.h"
  41. #include "test/cpp/util/fake_credentials.h"
  42. #include <grpc++/channel_arguments.h>
  43. #include <grpc++/channel_interface.h>
  44. #include <grpc++/client_context.h>
  45. #include <grpc++/create_channel.h>
  46. #include <grpc++/credentials.h>
  47. #include <grpc++/server.h>
  48. #include <grpc++/server_builder.h>
  49. #include <grpc++/server_context.h>
  50. #include <grpc++/server_credentials.h>
  51. #include <grpc++/status.h>
  52. #include <grpc++/stream.h>
  53. #include <grpc++/time.h>
  54. #include <gtest/gtest.h>
  55. #include <grpc/grpc.h>
  56. #include <grpc/support/thd.h>
  57. #include <grpc/support/time.h>
  58. using grpc::cpp::test::util::EchoRequest;
  59. using grpc::cpp::test::util::EchoResponse;
  60. using std::chrono::system_clock;
  61. namespace grpc {
  62. namespace testing {
  63. namespace {
  64. const char* kServerCancelAfterReads = "cancel_after_reads";
  65. // When echo_deadline is requested, deadline seen in the ServerContext is set in
  66. // the response in seconds.
  67. void MaybeEchoDeadline(ServerContext* context, const EchoRequest* request,
  68. EchoResponse* response) {
  69. if (request->has_param() && request->param().echo_deadline()) {
  70. gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_REALTIME);
  71. if (context->deadline() != system_clock::time_point::max()) {
  72. Timepoint2Timespec(context->deadline(), &deadline);
  73. }
  74. response->mutable_param()->set_request_deadline(deadline.tv_sec);
  75. }
  76. }
  77. template <typename T>
  78. void CheckAuthContext(T* context) {
  79. std::shared_ptr<const AuthContext> auth_ctx = context->auth_context();
  80. std::vector<grpc::string> fake =
  81. auth_ctx->FindPropertyValues("transport_security_type");
  82. EXPECT_EQ(1u, fake.size());
  83. EXPECT_EQ("fake", fake[0]);
  84. EXPECT_TRUE(auth_ctx->GetPeerIdentityPropertyName().empty());
  85. EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty());
  86. }
  87. } // namespace
  88. class TestServiceImpl : public ::grpc::cpp::test::util::TestService::Service {
  89. public:
  90. TestServiceImpl() : signal_client_(false), host_(nullptr) {}
  91. explicit TestServiceImpl(const grpc::string& host) : signal_client_(false), host_(new grpc::string(host)) {}
  92. Status Echo(ServerContext* context, const EchoRequest* request,
  93. EchoResponse* response) GRPC_OVERRIDE {
  94. response->set_message(request->message());
  95. MaybeEchoDeadline(context, request, response);
  96. if (host_) {
  97. response->mutable_param()->set_host(*host_);
  98. }
  99. if (request->has_param() && request->param().client_cancel_after_us()) {
  100. {
  101. std::unique_lock<std::mutex> lock(mu_);
  102. signal_client_ = true;
  103. }
  104. while (!context->IsCancelled()) {
  105. gpr_sleep_until(gpr_time_add(
  106. gpr_now(GPR_CLOCK_REALTIME),
  107. gpr_time_from_micros(request->param().client_cancel_after_us())));
  108. }
  109. return Status::CANCELLED;
  110. } else if (request->has_param() &&
  111. request->param().server_cancel_after_us()) {
  112. gpr_sleep_until(gpr_time_add(
  113. gpr_now(GPR_CLOCK_REALTIME),
  114. gpr_time_from_micros(request->param().server_cancel_after_us())));
  115. return Status::CANCELLED;
  116. } else {
  117. EXPECT_FALSE(context->IsCancelled());
  118. }
  119. if (request->has_param() && request->param().echo_metadata()) {
  120. const std::multimap<grpc::string, grpc::string>& client_metadata =
  121. context->client_metadata();
  122. for (std::multimap<grpc::string, grpc::string>::const_iterator iter =
  123. client_metadata.begin();
  124. iter != client_metadata.end(); ++iter) {
  125. context->AddTrailingMetadata((*iter).first, (*iter).second);
  126. }
  127. }
  128. if (request->has_param() && request->param().check_auth_context()) {
  129. CheckAuthContext(context);
  130. }
  131. return Status::OK;
  132. }
  133. // Unimplemented is left unimplemented to test the returned error.
  134. Status RequestStream(ServerContext* context,
  135. ServerReader<EchoRequest>* reader,
  136. EchoResponse* response) GRPC_OVERRIDE {
  137. EchoRequest request;
  138. response->set_message("");
  139. int cancel_after_reads = 0;
  140. const std::multimap<grpc::string, grpc::string> client_initial_metadata =
  141. context->client_metadata();
  142. if (client_initial_metadata.find(kServerCancelAfterReads) !=
  143. client_initial_metadata.end()) {
  144. std::istringstream iss(
  145. client_initial_metadata.find(kServerCancelAfterReads)->second);
  146. iss >> cancel_after_reads;
  147. gpr_log(GPR_INFO, "cancel_after_reads %d", cancel_after_reads);
  148. }
  149. while (reader->Read(&request)) {
  150. if (cancel_after_reads == 1) {
  151. gpr_log(GPR_INFO, "return cancel status");
  152. return Status::CANCELLED;
  153. } else if (cancel_after_reads > 0) {
  154. cancel_after_reads--;
  155. }
  156. response->mutable_message()->append(request.message());
  157. }
  158. return Status::OK;
  159. }
  160. // Return 3 messages.
  161. // TODO(yangg) make it generic by adding a parameter into EchoRequest
  162. Status ResponseStream(ServerContext* context, const EchoRequest* request,
  163. ServerWriter<EchoResponse>* writer) GRPC_OVERRIDE {
  164. EchoResponse response;
  165. response.set_message(request->message() + "0");
  166. writer->Write(response);
  167. response.set_message(request->message() + "1");
  168. writer->Write(response);
  169. response.set_message(request->message() + "2");
  170. writer->Write(response);
  171. return Status::OK;
  172. }
  173. Status BidiStream(ServerContext* context,
  174. ServerReaderWriter<EchoResponse, EchoRequest>* stream)
  175. GRPC_OVERRIDE {
  176. EchoRequest request;
  177. EchoResponse response;
  178. while (stream->Read(&request)) {
  179. gpr_log(GPR_INFO, "recv msg %s", request.message().c_str());
  180. response.set_message(request.message());
  181. stream->Write(response);
  182. }
  183. return Status::OK;
  184. }
  185. bool signal_client() {
  186. std::unique_lock<std::mutex> lock(mu_);
  187. return signal_client_;
  188. }
  189. private:
  190. bool signal_client_;
  191. std::mutex mu_;
  192. std::unique_ptr<grpc::string> host_;
  193. };
  194. class TestServiceImplDupPkg
  195. : public ::grpc::cpp::test::util::duplicate::TestService::Service {
  196. public:
  197. Status Echo(ServerContext* context, const EchoRequest* request,
  198. EchoResponse* response) GRPC_OVERRIDE {
  199. response->set_message("no package");
  200. return Status::OK;
  201. }
  202. };
  203. class End2endTest : public ::testing::Test {
  204. protected:
  205. End2endTest() : kMaxMessageSize_(8192), special_service_("special"), thread_pool_(2) {}
  206. void SetUp() GRPC_OVERRIDE {
  207. int port = grpc_pick_unused_port_or_die();
  208. server_address_ << "localhost:" << port;
  209. // Setup server
  210. ServerBuilder builder;
  211. builder.AddListeningPort(server_address_.str(),
  212. FakeTransportSecurityServerCredentials());
  213. builder.RegisterService(&service_);
  214. builder.RegisterService("special", &special_service_);
  215. builder.SetMaxMessageSize(
  216. kMaxMessageSize_); // For testing max message size.
  217. builder.RegisterService(&dup_pkg_service_);
  218. builder.SetThreadPool(&thread_pool_);
  219. server_ = builder.BuildAndStart();
  220. }
  221. void TearDown() GRPC_OVERRIDE { server_->Shutdown(); }
  222. void ResetStub() {
  223. std::shared_ptr<ChannelInterface> channel =
  224. CreateChannel(server_address_.str(), FakeTransportSecurityCredentials(),
  225. ChannelArguments());
  226. stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel));
  227. }
  228. std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
  229. std::unique_ptr<Server> server_;
  230. std::ostringstream server_address_;
  231. const int kMaxMessageSize_;
  232. TestServiceImpl service_;
  233. TestServiceImpl special_service_;
  234. TestServiceImplDupPkg dup_pkg_service_;
  235. ThreadPool thread_pool_;
  236. };
  237. static void SendRpc(grpc::cpp::test::util::TestService::Stub* stub,
  238. int num_rpcs) {
  239. EchoRequest request;
  240. EchoResponse response;
  241. request.set_message("Hello");
  242. for (int i = 0; i < num_rpcs; ++i) {
  243. ClientContext context;
  244. Status s = stub->Echo(&context, request, &response);
  245. EXPECT_EQ(response.message(), request.message());
  246. EXPECT_TRUE(s.ok());
  247. }
  248. }
  249. TEST_F(End2endTest, SimpleRpcWithHost) {
  250. ResetStub();
  251. EchoRequest request;
  252. EchoResponse response;
  253. request.set_message("Hello");
  254. ClientContext context;
  255. context.set_authority("special");
  256. Status s = stub_->Echo(&context, request, &response);
  257. EXPECT_EQ(response.message(), request.message());
  258. EXPECT_TRUE(response.has_param());
  259. EXPECT_EQ(response.param().host(), "special");
  260. EXPECT_TRUE(s.ok());
  261. }
  262. TEST_F(End2endTest, SimpleRpc) {
  263. ResetStub();
  264. SendRpc(stub_.get(), 1);
  265. }
  266. TEST_F(End2endTest, MultipleRpcs) {
  267. ResetStub();
  268. std::vector<std::thread*> threads;
  269. for (int i = 0; i < 10; ++i) {
  270. threads.push_back(new std::thread(SendRpc, stub_.get(), 10));
  271. }
  272. for (int i = 0; i < 10; ++i) {
  273. threads[i]->join();
  274. delete threads[i];
  275. }
  276. }
  277. // Set a 10us deadline and make sure proper error is returned.
  278. TEST_F(End2endTest, RpcDeadlineExpires) {
  279. ResetStub();
  280. EchoRequest request;
  281. EchoResponse response;
  282. request.set_message("Hello");
  283. ClientContext context;
  284. std::chrono::system_clock::time_point deadline =
  285. std::chrono::system_clock::now() + std::chrono::microseconds(10);
  286. context.set_deadline(deadline);
  287. Status s = stub_->Echo(&context, request, &response);
  288. EXPECT_EQ(StatusCode::DEADLINE_EXCEEDED, s.error_code());
  289. }
  290. // Set a long but finite deadline.
  291. TEST_F(End2endTest, RpcLongDeadline) {
  292. ResetStub();
  293. EchoRequest request;
  294. EchoResponse response;
  295. request.set_message("Hello");
  296. ClientContext context;
  297. std::chrono::system_clock::time_point deadline =
  298. std::chrono::system_clock::now() + std::chrono::hours(1);
  299. context.set_deadline(deadline);
  300. Status s = stub_->Echo(&context, request, &response);
  301. EXPECT_EQ(response.message(), request.message());
  302. EXPECT_TRUE(s.ok());
  303. }
  304. // Ask server to echo back the deadline it sees.
  305. TEST_F(End2endTest, EchoDeadline) {
  306. ResetStub();
  307. EchoRequest request;
  308. EchoResponse response;
  309. request.set_message("Hello");
  310. request.mutable_param()->set_echo_deadline(true);
  311. ClientContext context;
  312. std::chrono::system_clock::time_point deadline =
  313. std::chrono::system_clock::now() + std::chrono::seconds(100);
  314. context.set_deadline(deadline);
  315. Status s = stub_->Echo(&context, request, &response);
  316. EXPECT_EQ(response.message(), request.message());
  317. EXPECT_TRUE(s.ok());
  318. gpr_timespec sent_deadline;
  319. Timepoint2Timespec(deadline, &sent_deadline);
  320. // Allow 1 second error.
  321. EXPECT_LE(response.param().request_deadline() - sent_deadline.tv_sec, 1);
  322. EXPECT_GE(response.param().request_deadline() - sent_deadline.tv_sec, -1);
  323. }
  324. // Ask server to echo back the deadline it sees. The rpc has no deadline.
  325. TEST_F(End2endTest, EchoDeadlineForNoDeadlineRpc) {
  326. ResetStub();
  327. EchoRequest request;
  328. EchoResponse response;
  329. request.set_message("Hello");
  330. request.mutable_param()->set_echo_deadline(true);
  331. ClientContext context;
  332. Status s = stub_->Echo(&context, request, &response);
  333. EXPECT_EQ(response.message(), request.message());
  334. EXPECT_TRUE(s.ok());
  335. EXPECT_EQ(response.param().request_deadline(),
  336. gpr_inf_future(GPR_CLOCK_REALTIME).tv_sec);
  337. }
  338. TEST_F(End2endTest, UnimplementedRpc) {
  339. ResetStub();
  340. EchoRequest request;
  341. EchoResponse response;
  342. request.set_message("Hello");
  343. ClientContext context;
  344. Status s = stub_->Unimplemented(&context, request, &response);
  345. EXPECT_FALSE(s.ok());
  346. EXPECT_EQ(s.error_code(), grpc::StatusCode::UNIMPLEMENTED);
  347. EXPECT_EQ(s.error_message(), "");
  348. EXPECT_EQ(response.message(), "");
  349. }
  350. TEST_F(End2endTest, RequestStreamOneRequest) {
  351. ResetStub();
  352. EchoRequest request;
  353. EchoResponse response;
  354. ClientContext context;
  355. auto stream = stub_->RequestStream(&context, &response);
  356. request.set_message("hello");
  357. EXPECT_TRUE(stream->Write(request));
  358. stream->WritesDone();
  359. Status s = stream->Finish();
  360. EXPECT_EQ(response.message(), request.message());
  361. EXPECT_TRUE(s.ok());
  362. }
  363. TEST_F(End2endTest, RequestStreamTwoRequests) {
  364. ResetStub();
  365. EchoRequest request;
  366. EchoResponse response;
  367. ClientContext context;
  368. auto stream = stub_->RequestStream(&context, &response);
  369. request.set_message("hello");
  370. EXPECT_TRUE(stream->Write(request));
  371. EXPECT_TRUE(stream->Write(request));
  372. stream->WritesDone();
  373. Status s = stream->Finish();
  374. EXPECT_EQ(response.message(), "hellohello");
  375. EXPECT_TRUE(s.ok());
  376. }
  377. TEST_F(End2endTest, ResponseStream) {
  378. ResetStub();
  379. EchoRequest request;
  380. EchoResponse response;
  381. ClientContext context;
  382. request.set_message("hello");
  383. auto stream = stub_->ResponseStream(&context, request);
  384. EXPECT_TRUE(stream->Read(&response));
  385. EXPECT_EQ(response.message(), request.message() + "0");
  386. EXPECT_TRUE(stream->Read(&response));
  387. EXPECT_EQ(response.message(), request.message() + "1");
  388. EXPECT_TRUE(stream->Read(&response));
  389. EXPECT_EQ(response.message(), request.message() + "2");
  390. EXPECT_FALSE(stream->Read(&response));
  391. Status s = stream->Finish();
  392. EXPECT_TRUE(s.ok());
  393. }
  394. TEST_F(End2endTest, BidiStream) {
  395. ResetStub();
  396. EchoRequest request;
  397. EchoResponse response;
  398. ClientContext context;
  399. grpc::string msg("hello");
  400. auto stream = stub_->BidiStream(&context);
  401. request.set_message(msg + "0");
  402. EXPECT_TRUE(stream->Write(request));
  403. EXPECT_TRUE(stream->Read(&response));
  404. EXPECT_EQ(response.message(), request.message());
  405. request.set_message(msg + "1");
  406. EXPECT_TRUE(stream->Write(request));
  407. EXPECT_TRUE(stream->Read(&response));
  408. EXPECT_EQ(response.message(), request.message());
  409. request.set_message(msg + "2");
  410. EXPECT_TRUE(stream->Write(request));
  411. EXPECT_TRUE(stream->Read(&response));
  412. EXPECT_EQ(response.message(), request.message());
  413. stream->WritesDone();
  414. EXPECT_FALSE(stream->Read(&response));
  415. Status s = stream->Finish();
  416. EXPECT_TRUE(s.ok());
  417. }
  418. // Talk to the two services with the same name but different package names.
  419. // The two stubs are created on the same channel.
  420. TEST_F(End2endTest, DiffPackageServices) {
  421. std::shared_ptr<ChannelInterface> channel =
  422. CreateChannel(server_address_.str(), FakeTransportSecurityCredentials(),
  423. ChannelArguments());
  424. EchoRequest request;
  425. EchoResponse response;
  426. request.set_message("Hello");
  427. std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub(
  428. grpc::cpp::test::util::TestService::NewStub(channel));
  429. ClientContext context;
  430. Status s = stub->Echo(&context, request, &response);
  431. EXPECT_EQ(response.message(), request.message());
  432. EXPECT_TRUE(s.ok());
  433. std::unique_ptr<grpc::cpp::test::util::duplicate::TestService::Stub>
  434. dup_pkg_stub(
  435. grpc::cpp::test::util::duplicate::TestService::NewStub(channel));
  436. ClientContext context2;
  437. s = dup_pkg_stub->Echo(&context2, request, &response);
  438. EXPECT_EQ("no package", response.message());
  439. EXPECT_TRUE(s.ok());
  440. }
  441. // rpc and stream should fail on bad credentials.
  442. TEST_F(End2endTest, BadCredentials) {
  443. std::shared_ptr<Credentials> bad_creds = ServiceAccountCredentials("", "", 1);
  444. EXPECT_EQ(nullptr, bad_creds.get());
  445. std::shared_ptr<ChannelInterface> channel =
  446. CreateChannel(server_address_.str(), bad_creds, ChannelArguments());
  447. std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub(
  448. grpc::cpp::test::util::TestService::NewStub(channel));
  449. EchoRequest request;
  450. EchoResponse response;
  451. ClientContext context;
  452. request.set_message("Hello");
  453. Status s = stub->Echo(&context, request, &response);
  454. EXPECT_EQ("", response.message());
  455. EXPECT_FALSE(s.ok());
  456. EXPECT_EQ(StatusCode::UNKNOWN, s.error_code());
  457. EXPECT_EQ("Rpc sent on a lame channel.", s.error_message());
  458. ClientContext context2;
  459. auto stream = stub->BidiStream(&context2);
  460. s = stream->Finish();
  461. EXPECT_FALSE(s.ok());
  462. EXPECT_EQ(StatusCode::UNKNOWN, s.error_code());
  463. EXPECT_EQ("Rpc sent on a lame channel.", s.error_message());
  464. }
  465. void CancelRpc(ClientContext* context, int delay_us, TestServiceImpl* service) {
  466. gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
  467. gpr_time_from_micros(delay_us)));
  468. while (!service->signal_client()) {
  469. }
  470. context->TryCancel();
  471. }
  472. // Client cancels rpc after 10ms
  473. TEST_F(End2endTest, ClientCancelsRpc) {
  474. ResetStub();
  475. EchoRequest request;
  476. EchoResponse response;
  477. request.set_message("Hello");
  478. const int kCancelDelayUs = 10 * 1000;
  479. request.mutable_param()->set_client_cancel_after_us(kCancelDelayUs);
  480. ClientContext context;
  481. std::thread cancel_thread(CancelRpc, &context, kCancelDelayUs, &service_);
  482. Status s = stub_->Echo(&context, request, &response);
  483. cancel_thread.join();
  484. EXPECT_EQ(StatusCode::CANCELLED, s.error_code());
  485. EXPECT_EQ(s.error_message(), "Cancelled");
  486. }
  487. // Server cancels rpc after 1ms
  488. TEST_F(End2endTest, ServerCancelsRpc) {
  489. ResetStub();
  490. EchoRequest request;
  491. EchoResponse response;
  492. request.set_message("Hello");
  493. request.mutable_param()->set_server_cancel_after_us(1000);
  494. ClientContext context;
  495. Status s = stub_->Echo(&context, request, &response);
  496. EXPECT_EQ(StatusCode::CANCELLED, s.error_code());
  497. EXPECT_TRUE(s.error_message().empty());
  498. }
  499. // Client cancels request stream after sending two messages
  500. TEST_F(End2endTest, ClientCancelsRequestStream) {
  501. ResetStub();
  502. EchoRequest request;
  503. EchoResponse response;
  504. ClientContext context;
  505. request.set_message("hello");
  506. auto stream = stub_->RequestStream(&context, &response);
  507. EXPECT_TRUE(stream->Write(request));
  508. EXPECT_TRUE(stream->Write(request));
  509. context.TryCancel();
  510. Status s = stream->Finish();
  511. EXPECT_EQ(grpc::StatusCode::CANCELLED, s.error_code());
  512. EXPECT_EQ(response.message(), "");
  513. }
  514. // Client cancels server stream after sending some messages
  515. TEST_F(End2endTest, ClientCancelsResponseStream) {
  516. ResetStub();
  517. EchoRequest request;
  518. EchoResponse response;
  519. ClientContext context;
  520. request.set_message("hello");
  521. auto stream = stub_->ResponseStream(&context, request);
  522. EXPECT_TRUE(stream->Read(&response));
  523. EXPECT_EQ(response.message(), request.message() + "0");
  524. EXPECT_TRUE(stream->Read(&response));
  525. EXPECT_EQ(response.message(), request.message() + "1");
  526. context.TryCancel();
  527. // The cancellation races with responses, so there might be zero or
  528. // one responses pending, read till failure
  529. if (stream->Read(&response)) {
  530. EXPECT_EQ(response.message(), request.message() + "2");
  531. // Since we have cancelled, we expect the next attempt to read to fail
  532. EXPECT_FALSE(stream->Read(&response));
  533. }
  534. Status s = stream->Finish();
  535. // The final status could be either of CANCELLED or OK depending on
  536. // who won the race.
  537. EXPECT_GE(grpc::StatusCode::CANCELLED, s.error_code());
  538. }
  539. // Client cancels bidi stream after sending some messages
  540. TEST_F(End2endTest, ClientCancelsBidi) {
  541. ResetStub();
  542. EchoRequest request;
  543. EchoResponse response;
  544. ClientContext context;
  545. grpc::string msg("hello");
  546. auto stream = stub_->BidiStream(&context);
  547. request.set_message(msg + "0");
  548. EXPECT_TRUE(stream->Write(request));
  549. EXPECT_TRUE(stream->Read(&response));
  550. EXPECT_EQ(response.message(), request.message());
  551. request.set_message(msg + "1");
  552. EXPECT_TRUE(stream->Write(request));
  553. context.TryCancel();
  554. // The cancellation races with responses, so there might be zero or
  555. // one responses pending, read till failure
  556. if (stream->Read(&response)) {
  557. EXPECT_EQ(response.message(), request.message());
  558. // Since we have cancelled, we expect the next attempt to read to fail
  559. EXPECT_FALSE(stream->Read(&response));
  560. }
  561. Status s = stream->Finish();
  562. EXPECT_EQ(grpc::StatusCode::CANCELLED, s.error_code());
  563. }
  564. TEST_F(End2endTest, RpcMaxMessageSize) {
  565. ResetStub();
  566. EchoRequest request;
  567. EchoResponse response;
  568. request.set_message(string(kMaxMessageSize_ * 2, 'a'));
  569. ClientContext context;
  570. Status s = stub_->Echo(&context, request, &response);
  571. EXPECT_FALSE(s.ok());
  572. }
  573. bool MetadataContains(const std::multimap<grpc::string, grpc::string>& metadata,
  574. const grpc::string& key, const grpc::string& value) {
  575. int count = 0;
  576. for (std::multimap<grpc::string, grpc::string>::const_iterator iter =
  577. metadata.begin();
  578. iter != metadata.end(); ++iter) {
  579. if ((*iter).first == key && (*iter).second == value) {
  580. count++;
  581. }
  582. }
  583. return count == 1;
  584. }
  585. TEST_F(End2endTest, SetPerCallCredentials) {
  586. ResetStub();
  587. EchoRequest request;
  588. EchoResponse response;
  589. ClientContext context;
  590. std::shared_ptr<Credentials> creds =
  591. IAMCredentials("fake_token", "fake_selector");
  592. context.set_credentials(creds);
  593. request.set_message("Hello");
  594. request.mutable_param()->set_echo_metadata(true);
  595. Status s = stub_->Echo(&context, request, &response);
  596. EXPECT_EQ(request.message(), response.message());
  597. EXPECT_TRUE(s.ok());
  598. EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
  599. GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
  600. "fake_token"));
  601. EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
  602. GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
  603. "fake_selector"));
  604. }
  605. TEST_F(End2endTest, InsecurePerCallCredentials) {
  606. ResetStub();
  607. EchoRequest request;
  608. EchoResponse response;
  609. ClientContext context;
  610. std::shared_ptr<Credentials> creds = InsecureCredentials();
  611. context.set_credentials(creds);
  612. request.set_message("Hello");
  613. request.mutable_param()->set_echo_metadata(true);
  614. Status s = stub_->Echo(&context, request, &response);
  615. EXPECT_EQ(StatusCode::CANCELLED, s.error_code());
  616. EXPECT_EQ("Failed to set credentials to rpc.", s.error_message());
  617. }
  618. TEST_F(End2endTest, OverridePerCallCredentials) {
  619. ResetStub();
  620. EchoRequest request;
  621. EchoResponse response;
  622. ClientContext context;
  623. std::shared_ptr<Credentials> creds1 =
  624. IAMCredentials("fake_token1", "fake_selector1");
  625. context.set_credentials(creds1);
  626. std::shared_ptr<Credentials> creds2 =
  627. IAMCredentials("fake_token2", "fake_selector2");
  628. context.set_credentials(creds2);
  629. request.set_message("Hello");
  630. request.mutable_param()->set_echo_metadata(true);
  631. Status s = stub_->Echo(&context, request, &response);
  632. EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
  633. GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
  634. "fake_token2"));
  635. EXPECT_TRUE(MetadataContains(context.GetServerTrailingMetadata(),
  636. GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
  637. "fake_selector2"));
  638. EXPECT_FALSE(MetadataContains(context.GetServerTrailingMetadata(),
  639. GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
  640. "fake_token1"));
  641. EXPECT_FALSE(MetadataContains(context.GetServerTrailingMetadata(),
  642. GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
  643. "fake_selector1"));
  644. EXPECT_EQ(request.message(), response.message());
  645. EXPECT_TRUE(s.ok());
  646. }
  647. // Client sends 20 requests and the server returns CANCELLED status after
  648. // reading 10 requests.
  649. TEST_F(End2endTest, RequestStreamServerEarlyCancelTest) {
  650. ResetStub();
  651. EchoRequest request;
  652. EchoResponse response;
  653. ClientContext context;
  654. context.AddMetadata(kServerCancelAfterReads, "10");
  655. auto stream = stub_->RequestStream(&context, &response);
  656. request.set_message("hello");
  657. int send_messages = 20;
  658. while (send_messages > 0) {
  659. EXPECT_TRUE(stream->Write(request));
  660. send_messages--;
  661. }
  662. stream->WritesDone();
  663. Status s = stream->Finish();
  664. EXPECT_EQ(s.error_code(), StatusCode::CANCELLED);
  665. }
  666. TEST_F(End2endTest, ClientAuthContext) {
  667. ResetStub();
  668. EchoRequest request;
  669. EchoResponse response;
  670. request.set_message("Hello");
  671. request.mutable_param()->set_check_auth_context(true);
  672. ClientContext context;
  673. Status s = stub_->Echo(&context, request, &response);
  674. EXPECT_EQ(response.message(), request.message());
  675. EXPECT_TRUE(s.ok());
  676. CheckAuthContext(&context);
  677. }
  678. } // namespace testing
  679. } // namespace grpc
  680. int main(int argc, char** argv) {
  681. grpc_test_init(argc, argv);
  682. ::testing::InitGoogleTest(&argc, argv);
  683. return RUN_ALL_TESTS();
  684. }