end2end_test.cc 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446
  1. /*
  2. *
  3. * Copyright 2014, 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 <chrono>
  34. #include <thread>
  35. #include "net/grpc/cpp/echo_duplicate_proto_cc.pb.h"
  36. #include "test/cpp/util/echo.pb.h"
  37. #include "src/cpp/server/rpc_service_method.h"
  38. #include "src/cpp/util/time.h"
  39. #include <grpc++/channel_arguments.h>
  40. #include <grpc++/channel_interface.h>
  41. #include <grpc++/client_context.h>
  42. #include <grpc++/create_channel.h>
  43. #include <grpc++/credentials.h>
  44. #include <grpc++/server.h>
  45. #include <grpc++/server_builder.h>
  46. #include <grpc++/server_context.h>
  47. #include <grpc++/status.h>
  48. #include <grpc++/stream.h>
  49. #include "net/util/netutil.h"
  50. #include <gtest/gtest.h>
  51. #include <grpc/grpc.h>
  52. #include <grpc/support/thd.h>
  53. #include <grpc/support/time.h>
  54. using grpc::cpp::test::util::EchoRequest;
  55. using grpc::cpp::test::util::EchoResponse;
  56. using std::chrono::system_clock;
  57. namespace grpc {
  58. namespace testing {
  59. namespace {
  60. // When echo_deadline is requested, deadline seen in the ServerContext is set in
  61. // the response in seconds.
  62. void MaybeEchoDeadline(ServerContext* context, const EchoRequest* request,
  63. EchoResponse* response) {
  64. if (request->has_param() && request->param().echo_deadline()) {
  65. gpr_timespec deadline = gpr_inf_future;
  66. if (context->absolute_deadline() != system_clock::time_point::max()) {
  67. Timepoint2Timespec(context->absolute_deadline(), &deadline);
  68. }
  69. response->mutable_param()->set_request_deadline(deadline.tv_sec);
  70. }
  71. }
  72. } // namespace
  73. class TestServiceImpl : public ::grpc::cpp::test::util::TestService::Service {
  74. public:
  75. Status Echo(ServerContext* context, const EchoRequest* request,
  76. EchoResponse* response) override {
  77. response->set_message(request->message());
  78. MaybeEchoDeadline(context, request, response);
  79. return Status::OK;
  80. }
  81. // Unimplemented is left unimplemented to test the returned error.
  82. Status RequestStream(ServerContext* context,
  83. ServerReader<EchoRequest>* reader,
  84. EchoResponse* response) override {
  85. EchoRequest request;
  86. response->set_message("");
  87. while (reader->Read(&request)) {
  88. response->mutable_message()->append(request.message());
  89. }
  90. return Status::OK;
  91. }
  92. // Return 3 messages.
  93. // TODO(yangg) make it generic by adding a parameter into EchoRequest
  94. Status ResponseStream(ServerContext* context, const EchoRequest* request,
  95. ServerWriter<EchoResponse>* writer) override {
  96. EchoResponse response;
  97. response.set_message(request->message() + "0");
  98. writer->Write(response);
  99. response.set_message(request->message() + "1");
  100. writer->Write(response);
  101. response.set_message(request->message() + "2");
  102. writer->Write(response);
  103. return Status::OK;
  104. }
  105. Status BidiStream(
  106. ServerContext* context,
  107. ServerReaderWriter<EchoResponse, EchoRequest>* stream) override {
  108. EchoRequest request;
  109. EchoResponse response;
  110. while (stream->Read(&request)) {
  111. gpr_log(GPR_INFO, "recv msg %s", request.message().c_str());
  112. response.set_message(request.message());
  113. stream->Write(response);
  114. }
  115. return Status::OK;
  116. }
  117. };
  118. class TestServiceImplDupPkg
  119. : public ::grpc::cpp::test::util::duplicate::TestService::Service {
  120. public:
  121. Status Echo(ServerContext* context, const EchoRequest* request,
  122. EchoResponse* response) override {
  123. response->set_message("no package");
  124. return Status::OK;
  125. }
  126. };
  127. class End2endTest : public ::testing::Test {
  128. protected:
  129. void SetUp() override {
  130. int port = PickUnusedPortOrDie();
  131. server_address_ << "localhost:" << port;
  132. // Setup server
  133. ServerBuilder builder;
  134. builder.AddPort(server_address_.str());
  135. builder.RegisterService(service_.service());
  136. builder.RegisterService(dup_pkg_service_.service());
  137. server_ = builder.BuildAndStart();
  138. }
  139. void TearDown() override {
  140. server_->Shutdown();
  141. }
  142. void ResetStub() {
  143. std::shared_ptr<ChannelInterface> channel =
  144. CreateChannel(server_address_.str(), ChannelArguments());
  145. stub_.reset(grpc::cpp::test::util::TestService::NewStub(channel));
  146. }
  147. std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
  148. std::unique_ptr<Server> server_;
  149. std::ostringstream server_address_;
  150. TestServiceImpl service_;
  151. TestServiceImplDupPkg dup_pkg_service_;
  152. };
  153. static void SendRpc(grpc::cpp::test::util::TestService::Stub* stub,
  154. int num_rpcs) {
  155. EchoRequest request;
  156. EchoResponse response;
  157. request.set_message("Hello");
  158. for (int i = 0; i < num_rpcs; ++i) {
  159. ClientContext context;
  160. Status s = stub->Echo(&context, request, &response);
  161. EXPECT_EQ(response.message(), request.message());
  162. EXPECT_TRUE(s.IsOk());
  163. }
  164. }
  165. TEST_F(End2endTest, SimpleRpc) {
  166. ResetStub();
  167. SendRpc(stub_.get(), 1);
  168. }
  169. TEST_F(End2endTest, MultipleRpcs) {
  170. ResetStub();
  171. vector<std::thread*> threads;
  172. for (int i = 0; i < 10; ++i) {
  173. threads.push_back(new std::thread(SendRpc, stub_.get(), 10));
  174. }
  175. for (int i = 0; i < 10; ++i) {
  176. threads[i]->join();
  177. delete threads[i];
  178. }
  179. }
  180. // Set a 10us deadline and make sure proper error is returned.
  181. TEST_F(End2endTest, RpcDeadlineExpires) {
  182. ResetStub();
  183. EchoRequest request;
  184. EchoResponse response;
  185. request.set_message("Hello");
  186. ClientContext context;
  187. std::chrono::system_clock::time_point deadline =
  188. std::chrono::system_clock::now() + std::chrono::microseconds(10);
  189. context.set_absolute_deadline(deadline);
  190. Status s = stub_->Echo(&context, request, &response);
  191. // TODO(yangg) use correct error code when b/18793983 is fixed.
  192. // EXPECT_EQ(StatusCode::DEADLINE_EXCEEDED, s.code());
  193. EXPECT_EQ(StatusCode::CANCELLED, s.code());
  194. }
  195. // Set a long but finite deadline.
  196. TEST_F(End2endTest, RpcLongDeadline) {
  197. ResetStub();
  198. EchoRequest request;
  199. EchoResponse response;
  200. request.set_message("Hello");
  201. ClientContext context;
  202. std::chrono::system_clock::time_point deadline =
  203. std::chrono::system_clock::now() + std::chrono::hours(1);
  204. context.set_absolute_deadline(deadline);
  205. Status s = stub_->Echo(&context, request, &response);
  206. EXPECT_EQ(response.message(), request.message());
  207. EXPECT_TRUE(s.IsOk());
  208. }
  209. // Ask server to echo back the deadline it sees.
  210. TEST_F(End2endTest, EchoDeadline) {
  211. ResetStub();
  212. EchoRequest request;
  213. EchoResponse response;
  214. request.set_message("Hello");
  215. request.mutable_param()->set_echo_deadline(true);
  216. ClientContext context;
  217. std::chrono::system_clock::time_point deadline =
  218. std::chrono::system_clock::now() + std::chrono::seconds(100);
  219. context.set_absolute_deadline(deadline);
  220. Status s = stub_->Echo(&context, request, &response);
  221. EXPECT_EQ(response.message(), request.message());
  222. EXPECT_TRUE(s.IsOk());
  223. gpr_timespec sent_deadline;
  224. Timepoint2Timespec(deadline, &sent_deadline);
  225. // Allow 1 second error.
  226. EXPECT_LE(response.param().request_deadline() - sent_deadline.tv_sec, 1);
  227. EXPECT_GE(response.param().request_deadline() - sent_deadline.tv_sec, -1);
  228. }
  229. // Ask server to echo back the deadline it sees. The rpc has no deadline.
  230. TEST_F(End2endTest, EchoDeadlineForNoDeadlineRpc) {
  231. ResetStub();
  232. EchoRequest request;
  233. EchoResponse response;
  234. request.set_message("Hello");
  235. request.mutable_param()->set_echo_deadline(true);
  236. ClientContext context;
  237. Status s = stub_->Echo(&context, request, &response);
  238. EXPECT_EQ(response.message(), request.message());
  239. EXPECT_TRUE(s.IsOk());
  240. EXPECT_EQ(response.param().request_deadline(), gpr_inf_future.tv_sec);
  241. }
  242. TEST_F(End2endTest, UnimplementedRpc) {
  243. ResetStub();
  244. EchoRequest request;
  245. EchoResponse response;
  246. request.set_message("Hello");
  247. ClientContext context;
  248. Status s = stub_->Unimplemented(&context, request, &response);
  249. EXPECT_FALSE(s.IsOk());
  250. EXPECT_EQ(s.code(), grpc::StatusCode::UNIMPLEMENTED);
  251. EXPECT_EQ(s.details(), "");
  252. EXPECT_EQ(response.message(), "");
  253. }
  254. TEST_F(End2endTest, RequestStreamOneRequest) {
  255. ResetStub();
  256. EchoRequest request;
  257. EchoResponse response;
  258. ClientContext context;
  259. ClientWriter<EchoRequest>* stream = stub_->RequestStream(&context, &response);
  260. request.set_message("hello");
  261. EXPECT_TRUE(stream->Write(request));
  262. stream->WritesDone();
  263. Status s = stream->Wait();
  264. EXPECT_EQ(response.message(), request.message());
  265. EXPECT_TRUE(s.IsOk());
  266. delete stream;
  267. }
  268. TEST_F(End2endTest, RequestStreamTwoRequests) {
  269. ResetStub();
  270. EchoRequest request;
  271. EchoResponse response;
  272. ClientContext context;
  273. ClientWriter<EchoRequest>* stream = stub_->RequestStream(&context, &response);
  274. request.set_message("hello");
  275. EXPECT_TRUE(stream->Write(request));
  276. EXPECT_TRUE(stream->Write(request));
  277. stream->WritesDone();
  278. Status s = stream->Wait();
  279. EXPECT_EQ(response.message(), "hellohello");
  280. EXPECT_TRUE(s.IsOk());
  281. delete stream;
  282. }
  283. TEST_F(End2endTest, ResponseStream) {
  284. ResetStub();
  285. EchoRequest request;
  286. EchoResponse response;
  287. ClientContext context;
  288. request.set_message("hello");
  289. ClientReader<EchoResponse>* stream =
  290. stub_->ResponseStream(&context, &request);
  291. EXPECT_TRUE(stream->Read(&response));
  292. EXPECT_EQ(response.message(), request.message() + "0");
  293. EXPECT_TRUE(stream->Read(&response));
  294. EXPECT_EQ(response.message(), request.message() + "1");
  295. EXPECT_TRUE(stream->Read(&response));
  296. EXPECT_EQ(response.message(), request.message() + "2");
  297. EXPECT_FALSE(stream->Read(&response));
  298. Status s = stream->Wait();
  299. EXPECT_TRUE(s.IsOk());
  300. delete stream;
  301. }
  302. TEST_F(End2endTest, BidiStream) {
  303. ResetStub();
  304. EchoRequest request;
  305. EchoResponse response;
  306. ClientContext context;
  307. grpc::string msg("hello");
  308. ClientReaderWriter<EchoRequest, EchoResponse>* stream =
  309. stub_->BidiStream(&context);
  310. request.set_message(msg + "0");
  311. EXPECT_TRUE(stream->Write(request));
  312. EXPECT_TRUE(stream->Read(&response));
  313. EXPECT_EQ(response.message(), request.message());
  314. request.set_message(msg + "1");
  315. EXPECT_TRUE(stream->Write(request));
  316. EXPECT_TRUE(stream->Read(&response));
  317. EXPECT_EQ(response.message(), request.message());
  318. request.set_message(msg + "2");
  319. EXPECT_TRUE(stream->Write(request));
  320. EXPECT_TRUE(stream->Read(&response));
  321. EXPECT_EQ(response.message(), request.message());
  322. stream->WritesDone();
  323. EXPECT_FALSE(stream->Read(&response));
  324. Status s = stream->Wait();
  325. EXPECT_TRUE(s.IsOk());
  326. delete stream;
  327. }
  328. // Talk to the two services with the same name but different package names.
  329. // The two stubs are created on the same channel.
  330. TEST_F(End2endTest, DiffPackageServices) {
  331. std::shared_ptr<ChannelInterface> channel =
  332. CreateChannel(server_address_.str(), ChannelArguments());
  333. EchoRequest request;
  334. EchoResponse response;
  335. request.set_message("Hello");
  336. std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub(
  337. grpc::cpp::test::util::TestService::NewStub(channel));
  338. ClientContext context;
  339. Status s = stub->Echo(&context, request, &response);
  340. EXPECT_EQ(response.message(), request.message());
  341. EXPECT_TRUE(s.IsOk());
  342. std::unique_ptr<grpc::cpp::test::util::duplicate::TestService::Stub>
  343. dup_pkg_stub(
  344. grpc::cpp::test::util::duplicate::TestService::NewStub(channel));
  345. ClientContext context2;
  346. s = dup_pkg_stub->Echo(&context2, request, &response);
  347. EXPECT_EQ("no package", response.message());
  348. EXPECT_TRUE(s.IsOk());
  349. }
  350. // rpc and stream should fail on bad credentials.
  351. TEST_F(End2endTest, BadCredentials) {
  352. std::unique_ptr<Credentials> bad_creds =
  353. CredentialsFactory::ServiceAccountCredentials("", "",
  354. std::chrono::seconds(1));
  355. EXPECT_EQ(nullptr, bad_creds.get());
  356. std::shared_ptr<ChannelInterface> channel =
  357. CreateChannel(server_address_.str(), bad_creds, ChannelArguments());
  358. std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub(
  359. grpc::cpp::test::util::TestService::NewStub(channel));
  360. EchoRequest request;
  361. EchoResponse response;
  362. ClientContext context;
  363. grpc::string msg("hello");
  364. Status s = stub->Echo(&context, request, &response);
  365. EXPECT_EQ("", response.message());
  366. EXPECT_FALSE(s.IsOk());
  367. EXPECT_EQ(StatusCode::UNKNOWN, s.code());
  368. EXPECT_EQ("Rpc sent on a lame channel.", s.details());
  369. ClientContext context2;
  370. ClientReaderWriter<EchoRequest, EchoResponse>* stream =
  371. stub->BidiStream(&context2);
  372. s = stream->Wait();
  373. EXPECT_FALSE(s.IsOk());
  374. EXPECT_EQ(StatusCode::UNKNOWN, s.code());
  375. EXPECT_EQ("Rpc sent on a lame channel.", s.details());
  376. delete stream;
  377. }
  378. } // namespace testing
  379. } // namespace grpc
  380. int main(int argc, char** argv) {
  381. grpc_init();
  382. ::testing::InitGoogleTest(&argc, argv);
  383. int result = RUN_ALL_TESTS();
  384. grpc_shutdown();
  385. return result;
  386. }