async_end2end_test.cc 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430
  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 <memory>
  34. #include <thread>
  35. #include <grpc++/channel.h>
  36. #include <grpc++/client_context.h>
  37. #include <grpc++/create_channel.h>
  38. #include <grpc++/server.h>
  39. #include <grpc++/server_builder.h>
  40. #include <grpc++/server_context.h>
  41. #include <grpc/grpc.h>
  42. #include <grpc/support/thd.h>
  43. #include <grpc/support/time.h>
  44. #include <grpc/support/tls.h>
  45. #include <gtest/gtest.h>
  46. #include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h"
  47. #include "src/proto/grpc/testing/echo.grpc.pb.h"
  48. #include "test/core/util/port.h"
  49. #include "test/core/util/test_config.h"
  50. #include "test/cpp/util/string_ref_helper.h"
  51. #include "test/cpp/util/test_credentials_provider.h"
  52. #ifdef GPR_POSIX_SOCKET
  53. #include "src/core/lib/iomgr/ev_posix.h"
  54. #endif
  55. using grpc::testing::EchoRequest;
  56. using grpc::testing::EchoResponse;
  57. using grpc::testing::kTlsCredentialsType;
  58. using std::chrono::system_clock;
  59. GPR_TLS_DECL(g_is_async_end2end_test);
  60. namespace grpc {
  61. namespace testing {
  62. namespace {
  63. void* tag(int i) { return (void*)(intptr_t)i; }
  64. int detag(void* p) { return static_cast<int>(reinterpret_cast<intptr_t>(p)); }
  65. #ifdef GPR_POSIX_SOCKET
  66. static int maybe_assert_non_blocking_poll(struct pollfd* pfds, nfds_t nfds,
  67. int timeout) {
  68. if (gpr_tls_get(&g_is_async_end2end_test)) {
  69. GPR_ASSERT(timeout == 0);
  70. }
  71. return poll(pfds, nfds, timeout);
  72. }
  73. class PollOverride {
  74. public:
  75. PollOverride(grpc_poll_function_type f) {
  76. prev_ = grpc_poll_function;
  77. grpc_poll_function = f;
  78. }
  79. ~PollOverride() { grpc_poll_function = prev_; }
  80. private:
  81. grpc_poll_function_type prev_;
  82. };
  83. class PollingOverrider : public PollOverride {
  84. public:
  85. explicit PollingOverrider(bool allow_blocking)
  86. : PollOverride(allow_blocking ? poll : maybe_assert_non_blocking_poll) {}
  87. };
  88. #else
  89. class PollingOverrider {
  90. public:
  91. explicit PollingOverrider(bool allow_blocking) {}
  92. };
  93. #endif
  94. class Verifier {
  95. public:
  96. explicit Verifier(bool spin) : spin_(spin) {}
  97. // Expect sets the expected ok value for a specific tag
  98. Verifier& Expect(int i, bool expect_ok) {
  99. expectations_[tag(i)] = expect_ok;
  100. return *this;
  101. }
  102. // Next waits for 1 async tag to complete, checks its
  103. // expectations, and returns the tag
  104. int Next(CompletionQueue* cq, bool ignore_ok) {
  105. bool ok;
  106. void* got_tag;
  107. if (spin_) {
  108. for (;;) {
  109. auto r = cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
  110. if (r == CompletionQueue::TIMEOUT) continue;
  111. if (r == CompletionQueue::GOT_EVENT) break;
  112. gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
  113. abort();
  114. }
  115. } else {
  116. EXPECT_TRUE(cq->Next(&got_tag, &ok));
  117. }
  118. auto it = expectations_.find(got_tag);
  119. EXPECT_TRUE(it != expectations_.end());
  120. if (!ignore_ok) {
  121. EXPECT_EQ(it->second, ok);
  122. }
  123. expectations_.erase(it);
  124. return detag(got_tag);
  125. }
  126. // Verify keeps calling Next until all currently set
  127. // expected tags are complete
  128. void Verify(CompletionQueue* cq) { Verify(cq, false); }
  129. // This version of Verify allows optionally ignoring the
  130. // outcome of the expectation
  131. void Verify(CompletionQueue* cq, bool ignore_ok) {
  132. GPR_ASSERT(!expectations_.empty());
  133. while (!expectations_.empty()) {
  134. Next(cq, ignore_ok);
  135. }
  136. }
  137. // This version of Verify stops after a certain deadline
  138. void Verify(CompletionQueue* cq,
  139. std::chrono::system_clock::time_point deadline) {
  140. if (expectations_.empty()) {
  141. bool ok;
  142. void* got_tag;
  143. if (spin_) {
  144. while (std::chrono::system_clock::now() < deadline) {
  145. EXPECT_EQ(
  146. cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME)),
  147. CompletionQueue::TIMEOUT);
  148. }
  149. } else {
  150. EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
  151. CompletionQueue::TIMEOUT);
  152. }
  153. } else {
  154. while (!expectations_.empty()) {
  155. bool ok;
  156. void* got_tag;
  157. if (spin_) {
  158. for (;;) {
  159. GPR_ASSERT(std::chrono::system_clock::now() < deadline);
  160. auto r =
  161. cq->AsyncNext(&got_tag, &ok, gpr_time_0(GPR_CLOCK_REALTIME));
  162. if (r == CompletionQueue::TIMEOUT) continue;
  163. if (r == CompletionQueue::GOT_EVENT) break;
  164. gpr_log(GPR_ERROR, "unexpected result from AsyncNext");
  165. abort();
  166. }
  167. } else {
  168. EXPECT_EQ(cq->AsyncNext(&got_tag, &ok, deadline),
  169. CompletionQueue::GOT_EVENT);
  170. }
  171. auto it = expectations_.find(got_tag);
  172. EXPECT_TRUE(it != expectations_.end());
  173. EXPECT_EQ(it->second, ok);
  174. expectations_.erase(it);
  175. }
  176. }
  177. }
  178. private:
  179. std::map<void*, bool> expectations_;
  180. bool spin_;
  181. };
  182. // This class disables the server builder plugins that may add sync services to
  183. // the server. If there are sync services, UnimplementedRpc test will triger
  184. // the sync unkown rpc routine on the server side, rather than the async one
  185. // that needs to be tested here.
  186. class ServerBuilderSyncPluginDisabler : public ::grpc::ServerBuilderOption {
  187. public:
  188. void UpdateArguments(ChannelArguments* arg) GRPC_OVERRIDE {}
  189. void UpdatePlugins(std::vector<std::unique_ptr<ServerBuilderPlugin>>* plugins)
  190. GRPC_OVERRIDE {
  191. auto plugin = plugins->begin();
  192. while (plugin != plugins->end()) {
  193. if ((*plugin)->has_sync_methods()) {
  194. plugins->erase(plugin++);
  195. } else {
  196. plugin++;
  197. }
  198. }
  199. }
  200. };
  201. class TestScenario {
  202. public:
  203. TestScenario(bool non_block, const grpc::string& creds_type,
  204. const grpc::string& content)
  205. : disable_blocking(non_block),
  206. credentials_type(creds_type),
  207. message_content(content) {}
  208. void Log() const {
  209. gpr_log(
  210. GPR_INFO,
  211. "Scenario: disable_blocking %d, credentials %s, message size %" PRIuPTR,
  212. disable_blocking, credentials_type.c_str(), message_content.size());
  213. }
  214. bool disable_blocking;
  215. // Although the below grpc::string's are logically const, we can't declare
  216. // them const because of a limitation in the way old compilers (e.g., gcc-4.4)
  217. // manage vector insertion using a copy constructor
  218. grpc::string credentials_type;
  219. grpc::string message_content;
  220. };
  221. class AsyncEnd2endTest : public ::testing::TestWithParam<TestScenario> {
  222. protected:
  223. AsyncEnd2endTest() { GetParam().Log(); }
  224. void SetUp() GRPC_OVERRIDE {
  225. poll_overrider_.reset(new PollingOverrider(!GetParam().disable_blocking));
  226. port_ = grpc_pick_unused_port_or_die();
  227. server_address_ << "localhost:" << port_;
  228. // Setup server
  229. ServerBuilder builder;
  230. auto server_creds = GetServerCredentials(GetParam().credentials_type);
  231. builder.AddListeningPort(server_address_.str(), server_creds);
  232. builder.RegisterService(&service_);
  233. cq_ = builder.AddCompletionQueue();
  234. // TODO(zyc): make a test option to choose wheather sync plugins should be
  235. // deleted
  236. std::unique_ptr<ServerBuilderOption> sync_plugin_disabler(
  237. new ServerBuilderSyncPluginDisabler());
  238. builder.SetOption(move(sync_plugin_disabler));
  239. server_ = builder.BuildAndStart();
  240. gpr_tls_set(&g_is_async_end2end_test, 1);
  241. }
  242. void TearDown() GRPC_OVERRIDE {
  243. server_->Shutdown();
  244. void* ignored_tag;
  245. bool ignored_ok;
  246. cq_->Shutdown();
  247. while (cq_->Next(&ignored_tag, &ignored_ok))
  248. ;
  249. poll_overrider_.reset();
  250. gpr_tls_set(&g_is_async_end2end_test, 0);
  251. grpc_recycle_unused_port(port_);
  252. }
  253. void ResetStub() {
  254. ChannelArguments args;
  255. auto channel_creds =
  256. GetChannelCredentials(GetParam().credentials_type, &args);
  257. std::shared_ptr<Channel> channel =
  258. CreateCustomChannel(server_address_.str(), channel_creds, args);
  259. stub_ = grpc::testing::EchoTestService::NewStub(channel);
  260. }
  261. void SendRpc(int num_rpcs) {
  262. for (int i = 0; i < num_rpcs; i++) {
  263. EchoRequest send_request;
  264. EchoRequest recv_request;
  265. EchoResponse send_response;
  266. EchoResponse recv_response;
  267. Status recv_status;
  268. ClientContext cli_ctx;
  269. ServerContext srv_ctx;
  270. grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
  271. send_request.set_message(GetParam().message_content);
  272. std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
  273. stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
  274. service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
  275. cq_.get(), tag(2));
  276. Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
  277. EXPECT_EQ(send_request.message(), recv_request.message());
  278. send_response.set_message(recv_request.message());
  279. response_writer.Finish(send_response, Status::OK, tag(3));
  280. response_reader->Finish(&recv_response, &recv_status, tag(4));
  281. Verifier(GetParam().disable_blocking)
  282. .Expect(3, true)
  283. .Expect(4, true)
  284. .Verify(cq_.get());
  285. EXPECT_EQ(send_response.message(), recv_response.message());
  286. EXPECT_TRUE(recv_status.ok());
  287. }
  288. }
  289. std::unique_ptr<ServerCompletionQueue> cq_;
  290. std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
  291. std::unique_ptr<Server> server_;
  292. grpc::testing::EchoTestService::AsyncService service_;
  293. std::ostringstream server_address_;
  294. int port_;
  295. std::unique_ptr<PollingOverrider> poll_overrider_;
  296. };
  297. TEST_P(AsyncEnd2endTest, SimpleRpc) {
  298. ResetStub();
  299. SendRpc(1);
  300. }
  301. TEST_P(AsyncEnd2endTest, SequentialRpcs) {
  302. ResetStub();
  303. SendRpc(10);
  304. }
  305. // Test a simple RPC using the async version of Next
  306. TEST_P(AsyncEnd2endTest, AsyncNextRpc) {
  307. ResetStub();
  308. EchoRequest send_request;
  309. EchoRequest recv_request;
  310. EchoResponse send_response;
  311. EchoResponse recv_response;
  312. Status recv_status;
  313. ClientContext cli_ctx;
  314. ServerContext srv_ctx;
  315. grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
  316. send_request.set_message(GetParam().message_content);
  317. std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
  318. stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
  319. std::chrono::system_clock::time_point time_now(
  320. std::chrono::system_clock::now());
  321. std::chrono::system_clock::time_point time_limit(
  322. std::chrono::system_clock::now() + std::chrono::seconds(10));
  323. Verifier(GetParam().disable_blocking).Verify(cq_.get(), time_now);
  324. Verifier(GetParam().disable_blocking).Verify(cq_.get(), time_now);
  325. service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
  326. cq_.get(), tag(2));
  327. Verifier(GetParam().disable_blocking)
  328. .Expect(2, true)
  329. .Verify(cq_.get(), time_limit);
  330. EXPECT_EQ(send_request.message(), recv_request.message());
  331. send_response.set_message(recv_request.message());
  332. response_writer.Finish(send_response, Status::OK, tag(3));
  333. response_reader->Finish(&recv_response, &recv_status, tag(4));
  334. Verifier(GetParam().disable_blocking)
  335. .Expect(3, true)
  336. .Expect(4, true)
  337. .Verify(cq_.get(), std::chrono::system_clock::time_point::max());
  338. EXPECT_EQ(send_response.message(), recv_response.message());
  339. EXPECT_TRUE(recv_status.ok());
  340. }
  341. // Two pings and a final pong.
  342. TEST_P(AsyncEnd2endTest, SimpleClientStreaming) {
  343. ResetStub();
  344. EchoRequest send_request;
  345. EchoRequest recv_request;
  346. EchoResponse send_response;
  347. EchoResponse recv_response;
  348. Status recv_status;
  349. ClientContext cli_ctx;
  350. ServerContext srv_ctx;
  351. ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
  352. send_request.set_message(GetParam().message_content);
  353. std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
  354. stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
  355. service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
  356. tag(2));
  357. Verifier(GetParam().disable_blocking)
  358. .Expect(2, true)
  359. .Expect(1, true)
  360. .Verify(cq_.get());
  361. cli_stream->Write(send_request, tag(3));
  362. srv_stream.Read(&recv_request, tag(4));
  363. Verifier(GetParam().disable_blocking)
  364. .Expect(3, true)
  365. .Expect(4, true)
  366. .Verify(cq_.get());
  367. EXPECT_EQ(send_request.message(), recv_request.message());
  368. cli_stream->Write(send_request, tag(5));
  369. srv_stream.Read(&recv_request, tag(6));
  370. Verifier(GetParam().disable_blocking)
  371. .Expect(5, true)
  372. .Expect(6, true)
  373. .Verify(cq_.get());
  374. EXPECT_EQ(send_request.message(), recv_request.message());
  375. cli_stream->WritesDone(tag(7));
  376. srv_stream.Read(&recv_request, tag(8));
  377. Verifier(GetParam().disable_blocking)
  378. .Expect(7, true)
  379. .Expect(8, false)
  380. .Verify(cq_.get());
  381. send_response.set_message(recv_request.message());
  382. srv_stream.Finish(send_response, Status::OK, tag(9));
  383. cli_stream->Finish(&recv_status, tag(10));
  384. Verifier(GetParam().disable_blocking)
  385. .Expect(9, true)
  386. .Expect(10, true)
  387. .Verify(cq_.get());
  388. EXPECT_EQ(send_response.message(), recv_response.message());
  389. EXPECT_TRUE(recv_status.ok());
  390. }
  391. // One ping, two pongs.
  392. TEST_P(AsyncEnd2endTest, SimpleServerStreaming) {
  393. ResetStub();
  394. EchoRequest send_request;
  395. EchoRequest recv_request;
  396. EchoResponse send_response;
  397. EchoResponse recv_response;
  398. Status recv_status;
  399. ClientContext cli_ctx;
  400. ServerContext srv_ctx;
  401. ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
  402. send_request.set_message(GetParam().message_content);
  403. std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
  404. stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
  405. service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
  406. cq_.get(), cq_.get(), tag(2));
  407. Verifier(GetParam().disable_blocking)
  408. .Expect(1, true)
  409. .Expect(2, true)
  410. .Verify(cq_.get());
  411. EXPECT_EQ(send_request.message(), recv_request.message());
  412. send_response.set_message(recv_request.message());
  413. srv_stream.Write(send_response, tag(3));
  414. cli_stream->Read(&recv_response, tag(4));
  415. Verifier(GetParam().disable_blocking)
  416. .Expect(3, true)
  417. .Expect(4, true)
  418. .Verify(cq_.get());
  419. EXPECT_EQ(send_response.message(), recv_response.message());
  420. srv_stream.Write(send_response, tag(5));
  421. cli_stream->Read(&recv_response, tag(6));
  422. Verifier(GetParam().disable_blocking)
  423. .Expect(5, true)
  424. .Expect(6, true)
  425. .Verify(cq_.get());
  426. EXPECT_EQ(send_response.message(), recv_response.message());
  427. srv_stream.Finish(Status::OK, tag(7));
  428. cli_stream->Read(&recv_response, tag(8));
  429. Verifier(GetParam().disable_blocking)
  430. .Expect(7, true)
  431. .Expect(8, false)
  432. .Verify(cq_.get());
  433. cli_stream->Finish(&recv_status, tag(9));
  434. Verifier(GetParam().disable_blocking).Expect(9, true).Verify(cq_.get());
  435. EXPECT_TRUE(recv_status.ok());
  436. }
  437. // One ping, one pong.
  438. TEST_P(AsyncEnd2endTest, SimpleBidiStreaming) {
  439. ResetStub();
  440. EchoRequest send_request;
  441. EchoRequest recv_request;
  442. EchoResponse send_response;
  443. EchoResponse recv_response;
  444. Status recv_status;
  445. ClientContext cli_ctx;
  446. ServerContext srv_ctx;
  447. ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
  448. send_request.set_message(GetParam().message_content);
  449. std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
  450. cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
  451. service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
  452. tag(2));
  453. Verifier(GetParam().disable_blocking)
  454. .Expect(1, true)
  455. .Expect(2, true)
  456. .Verify(cq_.get());
  457. cli_stream->Write(send_request, tag(3));
  458. srv_stream.Read(&recv_request, tag(4));
  459. Verifier(GetParam().disable_blocking)
  460. .Expect(3, true)
  461. .Expect(4, true)
  462. .Verify(cq_.get());
  463. EXPECT_EQ(send_request.message(), recv_request.message());
  464. send_response.set_message(recv_request.message());
  465. srv_stream.Write(send_response, tag(5));
  466. cli_stream->Read(&recv_response, tag(6));
  467. Verifier(GetParam().disable_blocking)
  468. .Expect(5, true)
  469. .Expect(6, true)
  470. .Verify(cq_.get());
  471. EXPECT_EQ(send_response.message(), recv_response.message());
  472. cli_stream->WritesDone(tag(7));
  473. srv_stream.Read(&recv_request, tag(8));
  474. Verifier(GetParam().disable_blocking)
  475. .Expect(7, true)
  476. .Expect(8, false)
  477. .Verify(cq_.get());
  478. srv_stream.Finish(Status::OK, tag(9));
  479. cli_stream->Finish(&recv_status, tag(10));
  480. Verifier(GetParam().disable_blocking)
  481. .Expect(9, true)
  482. .Expect(10, true)
  483. .Verify(cq_.get());
  484. EXPECT_TRUE(recv_status.ok());
  485. }
  486. // Metadata tests
  487. TEST_P(AsyncEnd2endTest, ClientInitialMetadataRpc) {
  488. ResetStub();
  489. EchoRequest send_request;
  490. EchoRequest recv_request;
  491. EchoResponse send_response;
  492. EchoResponse recv_response;
  493. Status recv_status;
  494. ClientContext cli_ctx;
  495. ServerContext srv_ctx;
  496. grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
  497. send_request.set_message(GetParam().message_content);
  498. std::pair<grpc::string, grpc::string> meta1("key1", "val1");
  499. std::pair<grpc::string, grpc::string> meta2("key2", "val2");
  500. std::pair<grpc::string, grpc::string> meta3("g.r.d-bin", "xyz");
  501. cli_ctx.AddMetadata(meta1.first, meta1.second);
  502. cli_ctx.AddMetadata(meta2.first, meta2.second);
  503. cli_ctx.AddMetadata(meta3.first, meta3.second);
  504. std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
  505. stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
  506. service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
  507. cq_.get(), tag(2));
  508. Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
  509. EXPECT_EQ(send_request.message(), recv_request.message());
  510. auto client_initial_metadata = srv_ctx.client_metadata();
  511. EXPECT_EQ(meta1.second,
  512. ToString(client_initial_metadata.find(meta1.first)->second));
  513. EXPECT_EQ(meta2.second,
  514. ToString(client_initial_metadata.find(meta2.first)->second));
  515. EXPECT_EQ(meta3.second,
  516. ToString(client_initial_metadata.find(meta3.first)->second));
  517. EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
  518. send_response.set_message(recv_request.message());
  519. response_writer.Finish(send_response, Status::OK, tag(3));
  520. response_reader->Finish(&recv_response, &recv_status, tag(4));
  521. Verifier(GetParam().disable_blocking)
  522. .Expect(3, true)
  523. .Expect(4, true)
  524. .Verify(cq_.get());
  525. EXPECT_EQ(send_response.message(), recv_response.message());
  526. EXPECT_TRUE(recv_status.ok());
  527. }
  528. TEST_P(AsyncEnd2endTest, ServerInitialMetadataRpc) {
  529. ResetStub();
  530. EchoRequest send_request;
  531. EchoRequest recv_request;
  532. EchoResponse send_response;
  533. EchoResponse recv_response;
  534. Status recv_status;
  535. ClientContext cli_ctx;
  536. ServerContext srv_ctx;
  537. grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
  538. send_request.set_message(GetParam().message_content);
  539. std::pair<grpc::string, grpc::string> meta1("key1", "val1");
  540. std::pair<grpc::string, grpc::string> meta2("key2", "val2");
  541. std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
  542. stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
  543. service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
  544. cq_.get(), tag(2));
  545. Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
  546. EXPECT_EQ(send_request.message(), recv_request.message());
  547. srv_ctx.AddInitialMetadata(meta1.first, meta1.second);
  548. srv_ctx.AddInitialMetadata(meta2.first, meta2.second);
  549. response_writer.SendInitialMetadata(tag(3));
  550. Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
  551. response_reader->ReadInitialMetadata(tag(4));
  552. Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
  553. auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
  554. EXPECT_EQ(meta1.second,
  555. ToString(server_initial_metadata.find(meta1.first)->second));
  556. EXPECT_EQ(meta2.second,
  557. ToString(server_initial_metadata.find(meta2.first)->second));
  558. EXPECT_EQ(static_cast<size_t>(2), server_initial_metadata.size());
  559. send_response.set_message(recv_request.message());
  560. response_writer.Finish(send_response, Status::OK, tag(5));
  561. response_reader->Finish(&recv_response, &recv_status, tag(6));
  562. Verifier(GetParam().disable_blocking)
  563. .Expect(5, true)
  564. .Expect(6, true)
  565. .Verify(cq_.get());
  566. EXPECT_EQ(send_response.message(), recv_response.message());
  567. EXPECT_TRUE(recv_status.ok());
  568. }
  569. TEST_P(AsyncEnd2endTest, ServerTrailingMetadataRpc) {
  570. ResetStub();
  571. EchoRequest send_request;
  572. EchoRequest recv_request;
  573. EchoResponse send_response;
  574. EchoResponse recv_response;
  575. Status recv_status;
  576. ClientContext cli_ctx;
  577. ServerContext srv_ctx;
  578. grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
  579. send_request.set_message(GetParam().message_content);
  580. std::pair<grpc::string, grpc::string> meta1("key1", "val1");
  581. std::pair<grpc::string, grpc::string> meta2("key2", "val2");
  582. std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
  583. stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
  584. service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
  585. cq_.get(), tag(2));
  586. Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
  587. EXPECT_EQ(send_request.message(), recv_request.message());
  588. response_writer.SendInitialMetadata(tag(3));
  589. Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
  590. send_response.set_message(recv_request.message());
  591. srv_ctx.AddTrailingMetadata(meta1.first, meta1.second);
  592. srv_ctx.AddTrailingMetadata(meta2.first, meta2.second);
  593. response_writer.Finish(send_response, Status::OK, tag(4));
  594. response_reader->Finish(&recv_response, &recv_status, tag(5));
  595. Verifier(GetParam().disable_blocking)
  596. .Expect(4, true)
  597. .Expect(5, true)
  598. .Verify(cq_.get());
  599. EXPECT_EQ(send_response.message(), recv_response.message());
  600. EXPECT_TRUE(recv_status.ok());
  601. auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
  602. EXPECT_EQ(meta1.second,
  603. ToString(server_trailing_metadata.find(meta1.first)->second));
  604. EXPECT_EQ(meta2.second,
  605. ToString(server_trailing_metadata.find(meta2.first)->second));
  606. EXPECT_EQ(static_cast<size_t>(2), server_trailing_metadata.size());
  607. }
  608. TEST_P(AsyncEnd2endTest, MetadataRpc) {
  609. ResetStub();
  610. EchoRequest send_request;
  611. EchoRequest recv_request;
  612. EchoResponse send_response;
  613. EchoResponse recv_response;
  614. Status recv_status;
  615. ClientContext cli_ctx;
  616. ServerContext srv_ctx;
  617. grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
  618. send_request.set_message(GetParam().message_content);
  619. std::pair<grpc::string, grpc::string> meta1("key1", "val1");
  620. std::pair<grpc::string, grpc::string> meta2(
  621. "key2-bin",
  622. grpc::string("\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc", 13));
  623. std::pair<grpc::string, grpc::string> meta3("key3", "val3");
  624. std::pair<grpc::string, grpc::string> meta6(
  625. "key4-bin",
  626. grpc::string("\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d",
  627. 14));
  628. std::pair<grpc::string, grpc::string> meta5("key5", "val5");
  629. std::pair<grpc::string, grpc::string> meta4(
  630. "key6-bin",
  631. grpc::string(
  632. "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee", 15));
  633. cli_ctx.AddMetadata(meta1.first, meta1.second);
  634. cli_ctx.AddMetadata(meta2.first, meta2.second);
  635. std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
  636. stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
  637. service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
  638. cq_.get(), tag(2));
  639. Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
  640. EXPECT_EQ(send_request.message(), recv_request.message());
  641. auto client_initial_metadata = srv_ctx.client_metadata();
  642. EXPECT_EQ(meta1.second,
  643. ToString(client_initial_metadata.find(meta1.first)->second));
  644. EXPECT_EQ(meta2.second,
  645. ToString(client_initial_metadata.find(meta2.first)->second));
  646. EXPECT_GE(client_initial_metadata.size(), static_cast<size_t>(2));
  647. srv_ctx.AddInitialMetadata(meta3.first, meta3.second);
  648. srv_ctx.AddInitialMetadata(meta4.first, meta4.second);
  649. response_writer.SendInitialMetadata(tag(3));
  650. Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
  651. response_reader->ReadInitialMetadata(tag(4));
  652. Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
  653. auto server_initial_metadata = cli_ctx.GetServerInitialMetadata();
  654. EXPECT_EQ(meta3.second,
  655. ToString(server_initial_metadata.find(meta3.first)->second));
  656. EXPECT_EQ(meta4.second,
  657. ToString(server_initial_metadata.find(meta4.first)->second));
  658. EXPECT_GE(server_initial_metadata.size(), static_cast<size_t>(2));
  659. send_response.set_message(recv_request.message());
  660. srv_ctx.AddTrailingMetadata(meta5.first, meta5.second);
  661. srv_ctx.AddTrailingMetadata(meta6.first, meta6.second);
  662. response_writer.Finish(send_response, Status::OK, tag(5));
  663. response_reader->Finish(&recv_response, &recv_status, tag(6));
  664. Verifier(GetParam().disable_blocking)
  665. .Expect(5, true)
  666. .Expect(6, true)
  667. .Verify(cq_.get());
  668. EXPECT_EQ(send_response.message(), recv_response.message());
  669. EXPECT_TRUE(recv_status.ok());
  670. auto server_trailing_metadata = cli_ctx.GetServerTrailingMetadata();
  671. EXPECT_EQ(meta5.second,
  672. ToString(server_trailing_metadata.find(meta5.first)->second));
  673. EXPECT_EQ(meta6.second,
  674. ToString(server_trailing_metadata.find(meta6.first)->second));
  675. EXPECT_GE(server_trailing_metadata.size(), static_cast<size_t>(2));
  676. }
  677. // Server uses AsyncNotifyWhenDone API to check for cancellation
  678. TEST_P(AsyncEnd2endTest, ServerCheckCancellation) {
  679. ResetStub();
  680. EchoRequest send_request;
  681. EchoRequest recv_request;
  682. EchoResponse send_response;
  683. EchoResponse recv_response;
  684. Status recv_status;
  685. ClientContext cli_ctx;
  686. ServerContext srv_ctx;
  687. grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
  688. send_request.set_message(GetParam().message_content);
  689. std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
  690. stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
  691. srv_ctx.AsyncNotifyWhenDone(tag(5));
  692. service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
  693. cq_.get(), tag(2));
  694. Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
  695. EXPECT_EQ(send_request.message(), recv_request.message());
  696. cli_ctx.TryCancel();
  697. Verifier(GetParam().disable_blocking).Expect(5, true).Verify(cq_.get());
  698. EXPECT_TRUE(srv_ctx.IsCancelled());
  699. response_reader->Finish(&recv_response, &recv_status, tag(4));
  700. Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
  701. EXPECT_EQ(StatusCode::CANCELLED, recv_status.error_code());
  702. }
  703. // Server uses AsyncNotifyWhenDone API to check for normal finish
  704. TEST_P(AsyncEnd2endTest, ServerCheckDone) {
  705. ResetStub();
  706. EchoRequest send_request;
  707. EchoRequest recv_request;
  708. EchoResponse send_response;
  709. EchoResponse recv_response;
  710. Status recv_status;
  711. ClientContext cli_ctx;
  712. ServerContext srv_ctx;
  713. grpc::ServerAsyncResponseWriter<EchoResponse> response_writer(&srv_ctx);
  714. send_request.set_message(GetParam().message_content);
  715. std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
  716. stub_->AsyncEcho(&cli_ctx, send_request, cq_.get()));
  717. srv_ctx.AsyncNotifyWhenDone(tag(5));
  718. service_.RequestEcho(&srv_ctx, &recv_request, &response_writer, cq_.get(),
  719. cq_.get(), tag(2));
  720. Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
  721. EXPECT_EQ(send_request.message(), recv_request.message());
  722. send_response.set_message(recv_request.message());
  723. response_writer.Finish(send_response, Status::OK, tag(3));
  724. response_reader->Finish(&recv_response, &recv_status, tag(4));
  725. Verifier(GetParam().disable_blocking)
  726. .Expect(3, true)
  727. .Expect(4, true)
  728. .Expect(5, true)
  729. .Verify(cq_.get());
  730. EXPECT_FALSE(srv_ctx.IsCancelled());
  731. EXPECT_EQ(send_response.message(), recv_response.message());
  732. EXPECT_TRUE(recv_status.ok());
  733. }
  734. TEST_P(AsyncEnd2endTest, UnimplementedRpc) {
  735. ChannelArguments args;
  736. auto channel_creds =
  737. GetChannelCredentials(GetParam().credentials_type, &args);
  738. std::shared_ptr<Channel> channel =
  739. CreateCustomChannel(server_address_.str(), channel_creds, args);
  740. std::unique_ptr<grpc::testing::UnimplementedService::Stub> stub;
  741. stub = grpc::testing::UnimplementedService::NewStub(channel);
  742. EchoRequest send_request;
  743. EchoResponse recv_response;
  744. Status recv_status;
  745. ClientContext cli_ctx;
  746. send_request.set_message(GetParam().message_content);
  747. std::unique_ptr<ClientAsyncResponseReader<EchoResponse>> response_reader(
  748. stub->AsyncUnimplemented(&cli_ctx, send_request, cq_.get()));
  749. response_reader->Finish(&recv_response, &recv_status, tag(4));
  750. Verifier(GetParam().disable_blocking).Expect(4, true).Verify(cq_.get());
  751. EXPECT_EQ(StatusCode::UNIMPLEMENTED, recv_status.error_code());
  752. EXPECT_EQ("", recv_status.error_message());
  753. }
  754. // This class is for testing scenarios where RPCs are cancelled on the server
  755. // by calling ServerContext::TryCancel(). Server uses AsyncNotifyWhenDone
  756. // API to check for cancellation
  757. class AsyncEnd2endServerTryCancelTest : public AsyncEnd2endTest {
  758. protected:
  759. typedef enum {
  760. DO_NOT_CANCEL = 0,
  761. CANCEL_BEFORE_PROCESSING,
  762. CANCEL_DURING_PROCESSING,
  763. CANCEL_AFTER_PROCESSING
  764. } ServerTryCancelRequestPhase;
  765. // Helper for testing client-streaming RPCs which are cancelled on the server.
  766. // Depending on the value of server_try_cancel parameter, this will test one
  767. // of the following three scenarios:
  768. // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading
  769. // any messages from the client
  770. //
  771. // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
  772. // messages from the client
  773. //
  774. // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
  775. // messages from the client (but before sending any status back to the
  776. // client)
  777. void TestClientStreamingServerCancel(
  778. ServerTryCancelRequestPhase server_try_cancel) {
  779. ResetStub();
  780. EchoRequest send_request;
  781. EchoRequest recv_request;
  782. EchoResponse send_response;
  783. EchoResponse recv_response;
  784. Status recv_status;
  785. ClientContext cli_ctx;
  786. ServerContext srv_ctx;
  787. ServerAsyncReader<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
  788. // Initiate the 'RequestStream' call on client
  789. std::unique_ptr<ClientAsyncWriter<EchoRequest>> cli_stream(
  790. stub_->AsyncRequestStream(&cli_ctx, &recv_response, cq_.get(), tag(1)));
  791. Verifier(GetParam().disable_blocking).Expect(1, true).Verify(cq_.get());
  792. // On the server, request to be notified of 'RequestStream' calls
  793. // and receive the 'RequestStream' call just made by the client
  794. srv_ctx.AsyncNotifyWhenDone(tag(11));
  795. service_.RequestRequestStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
  796. tag(2));
  797. Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
  798. // Client sends 3 messages (tags 3, 4 and 5)
  799. for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
  800. send_request.set_message("Ping " + grpc::to_string(tag_idx));
  801. cli_stream->Write(send_request, tag(tag_idx));
  802. Verifier(GetParam().disable_blocking)
  803. .Expect(tag_idx, true)
  804. .Verify(cq_.get());
  805. }
  806. cli_stream->WritesDone(tag(6));
  807. Verifier(GetParam().disable_blocking).Expect(6, true).Verify(cq_.get());
  808. bool expected_server_cq_result = true;
  809. bool ignore_cq_result = false;
  810. bool want_done_tag = false;
  811. if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
  812. srv_ctx.TryCancel();
  813. Verifier(GetParam().disable_blocking).Expect(11, true).Verify(cq_.get());
  814. EXPECT_TRUE(srv_ctx.IsCancelled());
  815. // Since cancellation is done before server reads any results, we know
  816. // for sure that all cq results will return false from this point forward
  817. expected_server_cq_result = false;
  818. }
  819. std::thread* server_try_cancel_thd = NULL;
  820. auto verif = Verifier(GetParam().disable_blocking);
  821. if (server_try_cancel == CANCEL_DURING_PROCESSING) {
  822. server_try_cancel_thd =
  823. new std::thread(&ServerContext::TryCancel, &srv_ctx);
  824. // Server will cancel the RPC in a parallel thread while reading the
  825. // requests from the client. Since the cancellation can happen at anytime,
  826. // some of the cq results (i.e those until cancellation) might be true but
  827. // its non deterministic. So better to ignore the cq results
  828. ignore_cq_result = true;
  829. // Expect that we might possibly see the done tag that
  830. // indicates cancellation completion in this case
  831. want_done_tag = true;
  832. verif.Expect(11, true);
  833. }
  834. // Server reads 3 messages (tags 6, 7 and 8)
  835. // But if want_done_tag is true, we might also see tag 11
  836. for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
  837. srv_stream.Read(&recv_request, tag(tag_idx));
  838. // Note that we'll add something to the verifier and verify that
  839. // something was seen, but it might be tag 11 and not what we
  840. // just added
  841. int got_tag = verif.Expect(tag_idx, expected_server_cq_result)
  842. .Next(cq_.get(), ignore_cq_result);
  843. GPR_ASSERT((got_tag == tag_idx) || (got_tag == 11 && want_done_tag));
  844. if (got_tag == 11) {
  845. EXPECT_TRUE(srv_ctx.IsCancelled());
  846. want_done_tag = false;
  847. // Now get the other entry that we were waiting on
  848. EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), tag_idx);
  849. }
  850. }
  851. if (server_try_cancel_thd != NULL) {
  852. server_try_cancel_thd->join();
  853. delete server_try_cancel_thd;
  854. }
  855. if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
  856. srv_ctx.TryCancel();
  857. want_done_tag = true;
  858. verif.Expect(11, true);
  859. }
  860. if (want_done_tag) {
  861. verif.Verify(cq_.get());
  862. EXPECT_TRUE(srv_ctx.IsCancelled());
  863. want_done_tag = false;
  864. }
  865. // The RPC has been cancelled at this point for sure (i.e irrespective of
  866. // the value of `server_try_cancel` is). So, from this point forward, we
  867. // know that cq results are supposed to return false on server.
  868. // Server sends the final message and cancelled status (but the RPC is
  869. // already cancelled at this point. So we expect the operation to fail)
  870. srv_stream.Finish(send_response, Status::CANCELLED, tag(9));
  871. Verifier(GetParam().disable_blocking).Expect(9, false).Verify(cq_.get());
  872. // Client will see the cancellation
  873. cli_stream->Finish(&recv_status, tag(10));
  874. Verifier(GetParam().disable_blocking).Expect(10, true).Verify(cq_.get());
  875. EXPECT_FALSE(recv_status.ok());
  876. EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
  877. }
  878. // Helper for testing server-streaming RPCs which are cancelled on the server.
  879. // Depending on the value of server_try_cancel parameter, this will test one
  880. // of the following three scenarios:
  881. // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before sending
  882. // any messages to the client
  883. //
  884. // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while sending
  885. // messages to the client
  886. //
  887. // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after sending all
  888. // messages to the client (but before sending any status back to the
  889. // client)
  890. void TestServerStreamingServerCancel(
  891. ServerTryCancelRequestPhase server_try_cancel) {
  892. ResetStub();
  893. EchoRequest send_request;
  894. EchoRequest recv_request;
  895. EchoResponse send_response;
  896. EchoResponse recv_response;
  897. Status recv_status;
  898. ClientContext cli_ctx;
  899. ServerContext srv_ctx;
  900. ServerAsyncWriter<EchoResponse> srv_stream(&srv_ctx);
  901. send_request.set_message("Ping");
  902. // Initiate the 'ResponseStream' call on the client
  903. std::unique_ptr<ClientAsyncReader<EchoResponse>> cli_stream(
  904. stub_->AsyncResponseStream(&cli_ctx, send_request, cq_.get(), tag(1)));
  905. Verifier(GetParam().disable_blocking).Expect(1, true).Verify(cq_.get());
  906. // On the server, request to be notified of 'ResponseStream' calls and
  907. // receive the call just made by the client
  908. srv_ctx.AsyncNotifyWhenDone(tag(11));
  909. service_.RequestResponseStream(&srv_ctx, &recv_request, &srv_stream,
  910. cq_.get(), cq_.get(), tag(2));
  911. Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
  912. EXPECT_EQ(send_request.message(), recv_request.message());
  913. bool expected_cq_result = true;
  914. bool ignore_cq_result = false;
  915. bool want_done_tag = false;
  916. if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
  917. srv_ctx.TryCancel();
  918. Verifier(GetParam().disable_blocking).Expect(11, true).Verify(cq_.get());
  919. EXPECT_TRUE(srv_ctx.IsCancelled());
  920. // We know for sure that all cq results will be false from this point
  921. // since the server cancelled the RPC
  922. expected_cq_result = false;
  923. }
  924. std::thread* server_try_cancel_thd = NULL;
  925. auto verif = Verifier(GetParam().disable_blocking);
  926. if (server_try_cancel == CANCEL_DURING_PROCESSING) {
  927. server_try_cancel_thd =
  928. new std::thread(&ServerContext::TryCancel, &srv_ctx);
  929. // Server will cancel the RPC in a parallel thread while writing responses
  930. // to the client. Since the cancellation can happen at anytime, some of
  931. // the cq results (i.e those until cancellation) might be true but it is
  932. // non deterministic. So better to ignore the cq results
  933. ignore_cq_result = true;
  934. // Expect that we might possibly see the done tag that
  935. // indicates cancellation completion in this case
  936. want_done_tag = true;
  937. verif.Expect(11, true);
  938. }
  939. // Server sends three messages (tags 3, 4 and 5)
  940. // But if want_done tag is true, we might also see tag 11
  941. for (int tag_idx = 3; tag_idx <= 5; tag_idx++) {
  942. send_response.set_message("Pong " + grpc::to_string(tag_idx));
  943. srv_stream.Write(send_response, tag(tag_idx));
  944. // Note that we'll add something to the verifier and verify that
  945. // something was seen, but it might be tag 11 and not what we
  946. // just added
  947. int got_tag = verif.Expect(tag_idx, expected_cq_result)
  948. .Next(cq_.get(), ignore_cq_result);
  949. GPR_ASSERT((got_tag == tag_idx) || (got_tag == 11 && want_done_tag));
  950. if (got_tag == 11) {
  951. EXPECT_TRUE(srv_ctx.IsCancelled());
  952. want_done_tag = false;
  953. // Now get the other entry that we were waiting on
  954. EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), tag_idx);
  955. }
  956. }
  957. if (server_try_cancel_thd != NULL) {
  958. server_try_cancel_thd->join();
  959. delete server_try_cancel_thd;
  960. }
  961. if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
  962. srv_ctx.TryCancel();
  963. want_done_tag = true;
  964. verif.Expect(11, true);
  965. // Client reads may fail bacause it is notified that the stream is
  966. // cancelled.
  967. ignore_cq_result = true;
  968. }
  969. if (want_done_tag) {
  970. verif.Verify(cq_.get());
  971. EXPECT_TRUE(srv_ctx.IsCancelled());
  972. want_done_tag = false;
  973. }
  974. // Client attemts to read the three messages from the server
  975. for (int tag_idx = 6; tag_idx <= 8; tag_idx++) {
  976. cli_stream->Read(&recv_response, tag(tag_idx));
  977. Verifier(GetParam().disable_blocking)
  978. .Expect(tag_idx, expected_cq_result)
  979. .Verify(cq_.get(), ignore_cq_result);
  980. }
  981. // The RPC has been cancelled at this point for sure (i.e irrespective of
  982. // the value of `server_try_cancel` is). So, from this point forward, we
  983. // know that cq results are supposed to return false on server.
  984. // Server finishes the stream (but the RPC is already cancelled)
  985. srv_stream.Finish(Status::CANCELLED, tag(9));
  986. Verifier(GetParam().disable_blocking).Expect(9, false).Verify(cq_.get());
  987. // Client will see the cancellation
  988. cli_stream->Finish(&recv_status, tag(10));
  989. Verifier(GetParam().disable_blocking).Expect(10, true).Verify(cq_.get());
  990. EXPECT_FALSE(recv_status.ok());
  991. EXPECT_EQ(::grpc::StatusCode::CANCELLED, recv_status.error_code());
  992. }
  993. // Helper for testing bidirectinal-streaming RPCs which are cancelled on the
  994. // server.
  995. //
  996. // Depending on the value of server_try_cancel parameter, this will
  997. // test one of the following three scenarios:
  998. // CANCEL_BEFORE_PROCESSING: Rpc is cancelled by the server before reading/
  999. // writing any messages from/to the client
  1000. //
  1001. // CANCEL_DURING_PROCESSING: Rpc is cancelled by the server while reading
  1002. // messages from the client
  1003. //
  1004. // CANCEL_AFTER PROCESSING: Rpc is cancelled by server after reading all
  1005. // messages from the client (but before sending any status back to the
  1006. // client)
  1007. void TestBidiStreamingServerCancel(
  1008. ServerTryCancelRequestPhase server_try_cancel) {
  1009. ResetStub();
  1010. EchoRequest send_request;
  1011. EchoRequest recv_request;
  1012. EchoResponse send_response;
  1013. EchoResponse recv_response;
  1014. Status recv_status;
  1015. ClientContext cli_ctx;
  1016. ServerContext srv_ctx;
  1017. ServerAsyncReaderWriter<EchoResponse, EchoRequest> srv_stream(&srv_ctx);
  1018. // Initiate the call from the client side
  1019. std::unique_ptr<ClientAsyncReaderWriter<EchoRequest, EchoResponse>>
  1020. cli_stream(stub_->AsyncBidiStream(&cli_ctx, cq_.get(), tag(1)));
  1021. Verifier(GetParam().disable_blocking).Expect(1, true).Verify(cq_.get());
  1022. // On the server, request to be notified of the 'BidiStream' call and
  1023. // receive the call just made by the client
  1024. srv_ctx.AsyncNotifyWhenDone(tag(11));
  1025. service_.RequestBidiStream(&srv_ctx, &srv_stream, cq_.get(), cq_.get(),
  1026. tag(2));
  1027. Verifier(GetParam().disable_blocking).Expect(2, true).Verify(cq_.get());
  1028. // Client sends the first and the only message
  1029. send_request.set_message("Ping");
  1030. cli_stream->Write(send_request, tag(3));
  1031. Verifier(GetParam().disable_blocking).Expect(3, true).Verify(cq_.get());
  1032. bool expected_cq_result = true;
  1033. bool ignore_cq_result = false;
  1034. bool want_done_tag = false;
  1035. if (server_try_cancel == CANCEL_BEFORE_PROCESSING) {
  1036. srv_ctx.TryCancel();
  1037. Verifier(GetParam().disable_blocking).Expect(11, true).Verify(cq_.get());
  1038. EXPECT_TRUE(srv_ctx.IsCancelled());
  1039. // We know for sure that all cq results will be false from this point
  1040. // since the server cancelled the RPC
  1041. expected_cq_result = false;
  1042. }
  1043. std::thread* server_try_cancel_thd = NULL;
  1044. auto verif = Verifier(GetParam().disable_blocking);
  1045. if (server_try_cancel == CANCEL_DURING_PROCESSING) {
  1046. server_try_cancel_thd =
  1047. new std::thread(&ServerContext::TryCancel, &srv_ctx);
  1048. // Since server is going to cancel the RPC in a parallel thread, some of
  1049. // the cq results (i.e those until the cancellation) might be true. Since
  1050. // that number is non-deterministic, it is better to ignore the cq results
  1051. ignore_cq_result = true;
  1052. // Expect that we might possibly see the done tag that
  1053. // indicates cancellation completion in this case
  1054. want_done_tag = true;
  1055. verif.Expect(11, true);
  1056. }
  1057. int got_tag;
  1058. srv_stream.Read(&recv_request, tag(4));
  1059. verif.Expect(4, expected_cq_result);
  1060. got_tag = verif.Next(cq_.get(), ignore_cq_result);
  1061. GPR_ASSERT((got_tag == 4) || (got_tag == 11 && want_done_tag));
  1062. if (got_tag == 11) {
  1063. EXPECT_TRUE(srv_ctx.IsCancelled());
  1064. want_done_tag = false;
  1065. // Now get the other entry that we were waiting on
  1066. EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 4);
  1067. }
  1068. send_response.set_message("Pong");
  1069. srv_stream.Write(send_response, tag(5));
  1070. verif.Expect(5, expected_cq_result);
  1071. got_tag = verif.Next(cq_.get(), ignore_cq_result);
  1072. GPR_ASSERT((got_tag == 5) || (got_tag == 11 && want_done_tag));
  1073. if (got_tag == 11) {
  1074. EXPECT_TRUE(srv_ctx.IsCancelled());
  1075. want_done_tag = false;
  1076. // Now get the other entry that we were waiting on
  1077. EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 5);
  1078. }
  1079. cli_stream->Read(&recv_response, tag(6));
  1080. verif.Expect(6, expected_cq_result);
  1081. got_tag = verif.Next(cq_.get(), ignore_cq_result);
  1082. GPR_ASSERT((got_tag == 6) || (got_tag == 11 && want_done_tag));
  1083. if (got_tag == 11) {
  1084. EXPECT_TRUE(srv_ctx.IsCancelled());
  1085. want_done_tag = false;
  1086. // Now get the other entry that we were waiting on
  1087. EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 6);
  1088. }
  1089. // This is expected to succeed in all cases
  1090. cli_stream->WritesDone(tag(7));
  1091. verif.Expect(7, true);
  1092. got_tag = verif.Next(cq_.get(), ignore_cq_result);
  1093. GPR_ASSERT((got_tag == 7) || (got_tag == 11 && want_done_tag));
  1094. if (got_tag == 11) {
  1095. EXPECT_TRUE(srv_ctx.IsCancelled());
  1096. want_done_tag = false;
  1097. // Now get the other entry that we were waiting on
  1098. EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 7);
  1099. }
  1100. // This is expected to fail in all cases i.e for all values of
  1101. // server_try_cancel. This is because at this point, either there are no
  1102. // more msgs from the client (because client called WritesDone) or the RPC
  1103. // is cancelled on the server
  1104. srv_stream.Read(&recv_request, tag(8));
  1105. verif.Expect(8, false);
  1106. got_tag = verif.Next(cq_.get(), ignore_cq_result);
  1107. GPR_ASSERT((got_tag == 8) || (got_tag == 11 && want_done_tag));
  1108. if (got_tag == 11) {
  1109. EXPECT_TRUE(srv_ctx.IsCancelled());
  1110. want_done_tag = false;
  1111. // Now get the other entry that we were waiting on
  1112. EXPECT_EQ(verif.Next(cq_.get(), ignore_cq_result), 8);
  1113. }
  1114. if (server_try_cancel_thd != NULL) {
  1115. server_try_cancel_thd->join();
  1116. delete server_try_cancel_thd;
  1117. }
  1118. if (server_try_cancel == CANCEL_AFTER_PROCESSING) {
  1119. srv_ctx.TryCancel();
  1120. want_done_tag = true;
  1121. verif.Expect(11, true);
  1122. }
  1123. if (want_done_tag) {
  1124. verif.Verify(cq_.get());
  1125. EXPECT_TRUE(srv_ctx.IsCancelled());
  1126. want_done_tag = false;
  1127. }
  1128. // The RPC has been cancelled at this point for sure (i.e irrespective of
  1129. // the value of `server_try_cancel` is). So, from this point forward, we
  1130. // know that cq results are supposed to return false on server.
  1131. srv_stream.Finish(Status::CANCELLED, tag(9));
  1132. Verifier(GetParam().disable_blocking).Expect(9, false).Verify(cq_.get());
  1133. cli_stream->Finish(&recv_status, tag(10));
  1134. Verifier(GetParam().disable_blocking).Expect(10, true).Verify(cq_.get());
  1135. EXPECT_FALSE(recv_status.ok());
  1136. EXPECT_EQ(grpc::StatusCode::CANCELLED, recv_status.error_code());
  1137. }
  1138. };
  1139. TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelBefore) {
  1140. TestClientStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
  1141. }
  1142. TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelDuring) {
  1143. TestClientStreamingServerCancel(CANCEL_DURING_PROCESSING);
  1144. }
  1145. TEST_P(AsyncEnd2endServerTryCancelTest, ClientStreamingServerTryCancelAfter) {
  1146. TestClientStreamingServerCancel(CANCEL_AFTER_PROCESSING);
  1147. }
  1148. TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelBefore) {
  1149. TestServerStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
  1150. }
  1151. TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelDuring) {
  1152. TestServerStreamingServerCancel(CANCEL_DURING_PROCESSING);
  1153. }
  1154. TEST_P(AsyncEnd2endServerTryCancelTest, ServerStreamingServerTryCancelAfter) {
  1155. TestServerStreamingServerCancel(CANCEL_AFTER_PROCESSING);
  1156. }
  1157. TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelBefore) {
  1158. TestBidiStreamingServerCancel(CANCEL_BEFORE_PROCESSING);
  1159. }
  1160. TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelDuring) {
  1161. TestBidiStreamingServerCancel(CANCEL_DURING_PROCESSING);
  1162. }
  1163. TEST_P(AsyncEnd2endServerTryCancelTest, ServerBidiStreamingTryCancelAfter) {
  1164. TestBidiStreamingServerCancel(CANCEL_AFTER_PROCESSING);
  1165. }
  1166. std::vector<TestScenario> CreateTestScenarios(bool test_disable_blocking,
  1167. bool test_secure,
  1168. int test_big_limit) {
  1169. std::vector<TestScenario> scenarios;
  1170. std::vector<grpc::string> credentials_types;
  1171. std::vector<grpc::string> messages;
  1172. credentials_types.push_back(kInsecureCredentialsType);
  1173. auto sec_list = GetSecureCredentialsTypeList();
  1174. for (auto sec = sec_list.begin(); sec != sec_list.end(); sec++) {
  1175. credentials_types.push_back(*sec);
  1176. }
  1177. messages.push_back("Hello");
  1178. for (int sz = 1; sz < test_big_limit; sz *= 2) {
  1179. grpc::string big_msg;
  1180. for (int i = 0; i < sz * 1024; i++) {
  1181. char c = 'a' + (i % 26);
  1182. big_msg += c;
  1183. }
  1184. messages.push_back(big_msg);
  1185. }
  1186. for (auto cred = credentials_types.begin(); cred != credentials_types.end();
  1187. ++cred) {
  1188. for (auto msg = messages.begin(); msg != messages.end(); msg++) {
  1189. scenarios.emplace_back(false, *cred, *msg);
  1190. if (test_disable_blocking) {
  1191. scenarios.emplace_back(true, *cred, *msg);
  1192. }
  1193. }
  1194. }
  1195. return scenarios;
  1196. }
  1197. INSTANTIATE_TEST_CASE_P(AsyncEnd2end, AsyncEnd2endTest,
  1198. ::testing::ValuesIn(CreateTestScenarios(true, true,
  1199. 1024)));
  1200. INSTANTIATE_TEST_CASE_P(AsyncEnd2endServerTryCancel,
  1201. AsyncEnd2endServerTryCancelTest,
  1202. ::testing::ValuesIn(CreateTestScenarios(false, false,
  1203. 0)));
  1204. } // namespace
  1205. } // namespace testing
  1206. } // namespace grpc
  1207. int main(int argc, char** argv) {
  1208. grpc_test_init(argc, argv);
  1209. gpr_tls_init(&g_is_async_end2end_test);
  1210. ::testing::InitGoogleTest(&argc, argv);
  1211. int ret = RUN_ALL_TESTS();
  1212. gpr_tls_destroy(&g_is_async_end2end_test);
  1213. return ret;
  1214. }