max_concurrent_streams.cc 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832
  1. /*
  2. *
  3. * Copyright 2015 gRPC authors.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. */
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <grpc/byte_buffer.h>
  21. #include <grpc/support/alloc.h>
  22. #include <grpc/support/log.h>
  23. #include <grpc/support/time.h>
  24. #include "test/core/end2end/cq_verifier.h"
  25. #include "test/core/end2end/end2end_tests.h"
  26. static void* tag(intptr_t t) { return reinterpret_cast<void*>(t); }
  27. static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
  28. const char* test_name,
  29. grpc_channel_args* client_args,
  30. grpc_channel_args* server_args) {
  31. grpc_end2end_test_fixture f;
  32. gpr_log(GPR_INFO, "Running test: %s/%s", test_name, config.name);
  33. f = config.create_fixture(client_args, server_args);
  34. config.init_server(&f, server_args);
  35. config.init_client(&f, client_args);
  36. return f;
  37. }
  38. static gpr_timespec n_seconds_from_now(int n) {
  39. return grpc_timeout_seconds_to_deadline(n);
  40. }
  41. static gpr_timespec five_seconds_from_now(void) {
  42. return n_seconds_from_now(5);
  43. }
  44. static void drain_cq(grpc_completion_queue* cq) {
  45. grpc_event ev;
  46. do {
  47. ev = grpc_completion_queue_next(cq, five_seconds_from_now(), nullptr);
  48. } while (ev.type != GRPC_QUEUE_SHUTDOWN);
  49. }
  50. static void shutdown_server(grpc_end2end_test_fixture* f) {
  51. if (!f->server) return;
  52. grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
  53. GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
  54. grpc_timeout_seconds_to_deadline(5),
  55. nullptr)
  56. .type == GRPC_OP_COMPLETE);
  57. grpc_server_destroy(f->server);
  58. f->server = nullptr;
  59. }
  60. static void shutdown_client(grpc_end2end_test_fixture* f) {
  61. if (!f->client) return;
  62. grpc_channel_destroy(f->client);
  63. f->client = nullptr;
  64. }
  65. static void end_test(grpc_end2end_test_fixture* f) {
  66. shutdown_server(f);
  67. shutdown_client(f);
  68. grpc_completion_queue_shutdown(f->cq);
  69. drain_cq(f->cq);
  70. grpc_completion_queue_destroy(f->cq);
  71. grpc_completion_queue_destroy(f->shutdown_cq);
  72. }
  73. static void simple_request_body(grpc_end2end_test_config /*config*/,
  74. grpc_end2end_test_fixture f) {
  75. grpc_call* c;
  76. grpc_call* s;
  77. cq_verifier* cqv = cq_verifier_create(f.cq);
  78. grpc_op ops[6];
  79. grpc_op* op;
  80. grpc_metadata_array initial_metadata_recv;
  81. grpc_metadata_array trailing_metadata_recv;
  82. grpc_metadata_array request_metadata_recv;
  83. grpc_call_details call_details;
  84. grpc_status_code status;
  85. grpc_call_error error;
  86. grpc_slice details;
  87. int was_cancelled = 2;
  88. gpr_timespec deadline = five_seconds_from_now();
  89. c = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS, f.cq,
  90. grpc_slice_from_static_string("/foo"), nullptr,
  91. deadline, nullptr);
  92. GPR_ASSERT(c);
  93. grpc_metadata_array_init(&initial_metadata_recv);
  94. grpc_metadata_array_init(&trailing_metadata_recv);
  95. grpc_metadata_array_init(&request_metadata_recv);
  96. grpc_call_details_init(&call_details);
  97. memset(ops, 0, sizeof(ops));
  98. op = ops;
  99. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  100. op->data.send_initial_metadata.count = 0;
  101. op->flags = 0;
  102. op->reserved = nullptr;
  103. op++;
  104. op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
  105. op->flags = 0;
  106. op->reserved = nullptr;
  107. op++;
  108. op->op = GRPC_OP_RECV_INITIAL_METADATA;
  109. op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv;
  110. op->flags = 0;
  111. op->reserved = nullptr;
  112. op++;
  113. op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
  114. op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
  115. op->data.recv_status_on_client.status = &status;
  116. op->data.recv_status_on_client.status_details = &details;
  117. op->flags = 0;
  118. op->reserved = nullptr;
  119. op++;
  120. error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(1),
  121. nullptr);
  122. GPR_ASSERT(GRPC_CALL_OK == error);
  123. error =
  124. grpc_server_request_call(f.server, &s, &call_details,
  125. &request_metadata_recv, f.cq, f.cq, tag(101));
  126. GPR_ASSERT(GRPC_CALL_OK == error);
  127. CQ_EXPECT_COMPLETION(cqv, tag(101), 1);
  128. cq_verify(cqv);
  129. memset(ops, 0, sizeof(ops));
  130. op = ops;
  131. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  132. op->data.send_initial_metadata.count = 0;
  133. op->flags = 0;
  134. op->reserved = nullptr;
  135. op++;
  136. op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
  137. op->data.send_status_from_server.trailing_metadata_count = 0;
  138. op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED;
  139. grpc_slice status_details = grpc_slice_from_static_string("xyz");
  140. op->data.send_status_from_server.status_details = &status_details;
  141. op->flags = 0;
  142. op->reserved = nullptr;
  143. op++;
  144. op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
  145. op->data.recv_close_on_server.cancelled = &was_cancelled;
  146. op->flags = 0;
  147. op->reserved = nullptr;
  148. op++;
  149. error = grpc_call_start_batch(s, ops, static_cast<size_t>(op - ops), tag(102),
  150. nullptr);
  151. GPR_ASSERT(GRPC_CALL_OK == error);
  152. CQ_EXPECT_COMPLETION(cqv, tag(102), 1);
  153. CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
  154. cq_verify(cqv);
  155. GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
  156. GPR_ASSERT(0 == grpc_slice_str_cmp(details, "xyz"));
  157. GPR_ASSERT(0 == grpc_slice_str_cmp(call_details.method, "/foo"));
  158. GPR_ASSERT(was_cancelled == 0);
  159. grpc_slice_unref(details);
  160. grpc_metadata_array_destroy(&initial_metadata_recv);
  161. grpc_metadata_array_destroy(&trailing_metadata_recv);
  162. grpc_metadata_array_destroy(&request_metadata_recv);
  163. grpc_call_details_destroy(&call_details);
  164. grpc_call_unref(c);
  165. grpc_call_unref(s);
  166. cq_verifier_destroy(cqv);
  167. }
  168. static void test_max_concurrent_streams(grpc_end2end_test_config config) {
  169. grpc_end2end_test_fixture f;
  170. grpc_arg server_arg;
  171. grpc_channel_args server_args;
  172. grpc_call* c1;
  173. grpc_call* c2;
  174. grpc_call* s1;
  175. grpc_call* s2;
  176. int live_call;
  177. gpr_timespec deadline;
  178. cq_verifier* cqv;
  179. grpc_event ev;
  180. grpc_call_details call_details;
  181. grpc_metadata_array request_metadata_recv;
  182. grpc_metadata_array initial_metadata_recv1;
  183. grpc_metadata_array trailing_metadata_recv1;
  184. grpc_metadata_array initial_metadata_recv2;
  185. grpc_metadata_array trailing_metadata_recv2;
  186. grpc_status_code status1;
  187. grpc_call_error error;
  188. grpc_slice details1;
  189. grpc_status_code status2;
  190. grpc_slice details2;
  191. grpc_op ops[6];
  192. grpc_op* op;
  193. int was_cancelled;
  194. int got_client_start;
  195. int got_server_start;
  196. server_arg.key = const_cast<char*>(GRPC_ARG_MAX_CONCURRENT_STREAMS);
  197. server_arg.type = GRPC_ARG_INTEGER;
  198. server_arg.value.integer = 1;
  199. server_args.num_args = 1;
  200. server_args.args = &server_arg;
  201. f = begin_test(config, "test_max_concurrent_streams", nullptr, &server_args);
  202. cqv = cq_verifier_create(f.cq);
  203. grpc_metadata_array_init(&request_metadata_recv);
  204. grpc_metadata_array_init(&initial_metadata_recv1);
  205. grpc_metadata_array_init(&trailing_metadata_recv1);
  206. grpc_metadata_array_init(&initial_metadata_recv2);
  207. grpc_metadata_array_init(&trailing_metadata_recv2);
  208. grpc_call_details_init(&call_details);
  209. /* perform a ping-pong to ensure that settings have had a chance to round
  210. trip */
  211. simple_request_body(config, f);
  212. /* perform another one to make sure that the one stream case still works */
  213. simple_request_body(config, f);
  214. /* start two requests - ensuring that the second is not accepted until
  215. the first completes */
  216. deadline = n_seconds_from_now(1000);
  217. c1 = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS,
  218. f.cq, grpc_slice_from_static_string("/alpha"),
  219. nullptr, deadline, nullptr);
  220. GPR_ASSERT(c1);
  221. c2 = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS,
  222. f.cq, grpc_slice_from_static_string("/beta"),
  223. nullptr, deadline, nullptr);
  224. GPR_ASSERT(c2);
  225. GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(
  226. f.server, &s1, &call_details,
  227. &request_metadata_recv, f.cq, f.cq, tag(101)));
  228. memset(ops, 0, sizeof(ops));
  229. op = ops;
  230. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  231. op->data.send_initial_metadata.count = 0;
  232. op->flags = 0;
  233. op->reserved = nullptr;
  234. op++;
  235. op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
  236. op->flags = 0;
  237. op->reserved = nullptr;
  238. op++;
  239. error = grpc_call_start_batch(c1, ops, static_cast<size_t>(op - ops),
  240. tag(301), nullptr);
  241. GPR_ASSERT(GRPC_CALL_OK == error);
  242. memset(ops, 0, sizeof(ops));
  243. op = ops;
  244. op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
  245. op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv1;
  246. op->data.recv_status_on_client.status = &status1;
  247. op->data.recv_status_on_client.status_details = &details1;
  248. op->flags = 0;
  249. op->reserved = nullptr;
  250. op++;
  251. op->op = GRPC_OP_RECV_INITIAL_METADATA;
  252. op->data.recv_initial_metadata.recv_initial_metadata =
  253. &initial_metadata_recv1;
  254. op->flags = 0;
  255. op->reserved = nullptr;
  256. op++;
  257. error = grpc_call_start_batch(c1, ops, static_cast<size_t>(op - ops),
  258. tag(302), nullptr);
  259. GPR_ASSERT(GRPC_CALL_OK == error);
  260. memset(ops, 0, sizeof(ops));
  261. op = ops;
  262. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  263. op->data.send_initial_metadata.count = 0;
  264. op->flags = 0;
  265. op->reserved = nullptr;
  266. op++;
  267. op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
  268. op->flags = 0;
  269. op->reserved = nullptr;
  270. op++;
  271. error = grpc_call_start_batch(c2, ops, static_cast<size_t>(op - ops),
  272. tag(401), nullptr);
  273. GPR_ASSERT(GRPC_CALL_OK == error);
  274. memset(ops, 0, sizeof(ops));
  275. op = ops;
  276. op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
  277. op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv2;
  278. op->data.recv_status_on_client.status = &status2;
  279. op->data.recv_status_on_client.status_details = &details2;
  280. op->flags = 0;
  281. op->reserved = nullptr;
  282. op++;
  283. op->op = GRPC_OP_RECV_INITIAL_METADATA;
  284. op->data.recv_initial_metadata.recv_initial_metadata =
  285. &initial_metadata_recv1;
  286. op->flags = 0;
  287. op->reserved = nullptr;
  288. op++;
  289. error = grpc_call_start_batch(c2, ops, static_cast<size_t>(op - ops),
  290. tag(402), nullptr);
  291. GPR_ASSERT(GRPC_CALL_OK == error);
  292. got_client_start = 0;
  293. got_server_start = 0;
  294. live_call = -1;
  295. while (!got_client_start || !got_server_start) {
  296. ev = grpc_completion_queue_next(f.cq, grpc_timeout_seconds_to_deadline(3),
  297. nullptr);
  298. GPR_ASSERT(ev.type == GRPC_OP_COMPLETE);
  299. GPR_ASSERT(ev.success);
  300. if (ev.tag == tag(101)) {
  301. GPR_ASSERT(!got_server_start);
  302. got_server_start = 1;
  303. } else {
  304. GPR_ASSERT(!got_client_start);
  305. GPR_ASSERT(ev.tag == tag(301) || ev.tag == tag(401));
  306. /* The /alpha or /beta calls started above could be invoked (but NOT
  307. * both);
  308. * check this here */
  309. /* We'll get tag 303 or 403, we want 300, 400 */
  310. live_call = (static_cast<int>(reinterpret_cast<intptr_t>(ev.tag))) - 1;
  311. got_client_start = 1;
  312. }
  313. }
  314. GPR_ASSERT(live_call == 300 || live_call == 400);
  315. memset(ops, 0, sizeof(ops));
  316. op = ops;
  317. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  318. op->data.send_initial_metadata.count = 0;
  319. op->flags = 0;
  320. op->reserved = nullptr;
  321. op++;
  322. op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
  323. op->data.recv_close_on_server.cancelled = &was_cancelled;
  324. op->flags = 0;
  325. op->reserved = nullptr;
  326. op++;
  327. op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
  328. op->data.send_status_from_server.trailing_metadata_count = 0;
  329. op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED;
  330. grpc_slice status_details = grpc_slice_from_static_string("xyz");
  331. op->data.send_status_from_server.status_details = &status_details;
  332. op->flags = 0;
  333. op->reserved = nullptr;
  334. op++;
  335. error = grpc_call_start_batch(s1, ops, static_cast<size_t>(op - ops),
  336. tag(102), nullptr);
  337. GPR_ASSERT(GRPC_CALL_OK == error);
  338. CQ_EXPECT_COMPLETION(cqv, tag(102), 1);
  339. CQ_EXPECT_COMPLETION(cqv, tag(live_call + 2), 1);
  340. /* first request is finished, we should be able to start the second */
  341. live_call = (live_call == 300) ? 400 : 300;
  342. CQ_EXPECT_COMPLETION(cqv, tag(live_call + 1), 1);
  343. cq_verify(cqv);
  344. grpc_call_details_destroy(&call_details);
  345. GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(
  346. f.server, &s2, &call_details,
  347. &request_metadata_recv, f.cq, f.cq, tag(201)));
  348. CQ_EXPECT_COMPLETION(cqv, tag(201), 1);
  349. cq_verify(cqv);
  350. memset(ops, 0, sizeof(ops));
  351. op = ops;
  352. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  353. op->data.send_initial_metadata.count = 0;
  354. op->flags = 0;
  355. op->reserved = nullptr;
  356. op++;
  357. op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
  358. op->data.recv_close_on_server.cancelled = &was_cancelled;
  359. op->flags = 0;
  360. op->reserved = nullptr;
  361. op++;
  362. op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
  363. op->data.send_status_from_server.trailing_metadata_count = 0;
  364. op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED;
  365. op->data.send_status_from_server.status_details = &status_details;
  366. op->flags = 0;
  367. op->reserved = nullptr;
  368. op++;
  369. error = grpc_call_start_batch(s2, ops, static_cast<size_t>(op - ops),
  370. tag(202), nullptr);
  371. GPR_ASSERT(GRPC_CALL_OK == error);
  372. CQ_EXPECT_COMPLETION(cqv, tag(live_call + 2), 1);
  373. CQ_EXPECT_COMPLETION(cqv, tag(202), 1);
  374. cq_verify(cqv);
  375. cq_verifier_destroy(cqv);
  376. grpc_call_unref(c1);
  377. grpc_call_unref(s1);
  378. grpc_call_unref(c2);
  379. grpc_call_unref(s2);
  380. grpc_slice_unref(details1);
  381. grpc_slice_unref(details2);
  382. grpc_metadata_array_destroy(&initial_metadata_recv1);
  383. grpc_metadata_array_destroy(&trailing_metadata_recv1);
  384. grpc_metadata_array_destroy(&initial_metadata_recv2);
  385. grpc_metadata_array_destroy(&trailing_metadata_recv2);
  386. grpc_metadata_array_destroy(&request_metadata_recv);
  387. grpc_call_details_destroy(&call_details);
  388. end_test(&f);
  389. config.tear_down_data(&f);
  390. }
  391. static void test_max_concurrent_streams_with_timeout_on_first(
  392. grpc_end2end_test_config config) {
  393. grpc_end2end_test_fixture f;
  394. grpc_arg server_arg;
  395. grpc_channel_args server_args;
  396. grpc_call* c1;
  397. grpc_call* c2;
  398. grpc_call* s1;
  399. grpc_call* s2;
  400. cq_verifier* cqv;
  401. grpc_call_details call_details;
  402. grpc_metadata_array request_metadata_recv;
  403. grpc_metadata_array initial_metadata_recv1;
  404. grpc_metadata_array trailing_metadata_recv1;
  405. grpc_metadata_array initial_metadata_recv2;
  406. grpc_metadata_array trailing_metadata_recv2;
  407. grpc_status_code status1;
  408. grpc_call_error error;
  409. grpc_slice details1 = grpc_empty_slice();
  410. grpc_status_code status2;
  411. grpc_slice details2 = grpc_empty_slice();
  412. grpc_op ops[6];
  413. grpc_op* op;
  414. int was_cancelled;
  415. server_arg.key = const_cast<char*>(GRPC_ARG_MAX_CONCURRENT_STREAMS);
  416. server_arg.type = GRPC_ARG_INTEGER;
  417. server_arg.value.integer = 1;
  418. server_args.num_args = 1;
  419. server_args.args = &server_arg;
  420. f = begin_test(config, "test_max_concurrent_streams_with_timeout_on_first",
  421. nullptr, &server_args);
  422. cqv = cq_verifier_create(f.cq);
  423. grpc_metadata_array_init(&request_metadata_recv);
  424. grpc_metadata_array_init(&initial_metadata_recv1);
  425. grpc_metadata_array_init(&trailing_metadata_recv1);
  426. grpc_metadata_array_init(&initial_metadata_recv2);
  427. grpc_metadata_array_init(&trailing_metadata_recv2);
  428. grpc_call_details_init(&call_details);
  429. /* perform a ping-pong to ensure that settings have had a chance to round
  430. trip */
  431. simple_request_body(config, f);
  432. /* perform another one to make sure that the one stream case still works */
  433. simple_request_body(config, f);
  434. /* start two requests - ensuring that the second is not accepted until
  435. the first completes */
  436. c1 = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS,
  437. f.cq, grpc_slice_from_static_string("/alpha"),
  438. nullptr, n_seconds_from_now(3), nullptr);
  439. GPR_ASSERT(c1);
  440. c2 = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS,
  441. f.cq, grpc_slice_from_static_string("/beta"),
  442. nullptr, n_seconds_from_now(1000), nullptr);
  443. GPR_ASSERT(c2);
  444. GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(
  445. f.server, &s1, &call_details,
  446. &request_metadata_recv, f.cq, f.cq, tag(101)));
  447. memset(ops, 0, sizeof(ops));
  448. op = ops;
  449. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  450. op->data.send_initial_metadata.count = 0;
  451. op->flags = 0;
  452. op->reserved = nullptr;
  453. op++;
  454. op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
  455. op->flags = 0;
  456. op->reserved = nullptr;
  457. op++;
  458. error = grpc_call_start_batch(c1, ops, static_cast<size_t>(op - ops),
  459. tag(301), nullptr);
  460. GPR_ASSERT(GRPC_CALL_OK == error);
  461. memset(ops, 0, sizeof(ops));
  462. op = ops;
  463. op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
  464. op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv1;
  465. op->data.recv_status_on_client.status = &status1;
  466. op->data.recv_status_on_client.status_details = &details1;
  467. op->flags = 0;
  468. op->reserved = nullptr;
  469. op++;
  470. op->op = GRPC_OP_RECV_INITIAL_METADATA;
  471. op->data.recv_initial_metadata.recv_initial_metadata =
  472. &initial_metadata_recv1;
  473. op->flags = 0;
  474. op->reserved = nullptr;
  475. op++;
  476. error = grpc_call_start_batch(c1, ops, static_cast<size_t>(op - ops),
  477. tag(302), nullptr);
  478. GPR_ASSERT(GRPC_CALL_OK == error);
  479. CQ_EXPECT_COMPLETION(cqv, tag(101), 1);
  480. CQ_EXPECT_COMPLETION(cqv, tag(301), 1);
  481. cq_verify(cqv);
  482. memset(ops, 0, sizeof(ops));
  483. op = ops;
  484. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  485. op->data.send_initial_metadata.count = 0;
  486. op->flags = 0;
  487. op->reserved = nullptr;
  488. op++;
  489. op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
  490. op->flags = 0;
  491. op->reserved = nullptr;
  492. op++;
  493. error = grpc_call_start_batch(c2, ops, static_cast<size_t>(op - ops),
  494. tag(401), nullptr);
  495. GPR_ASSERT(GRPC_CALL_OK == error);
  496. memset(ops, 0, sizeof(ops));
  497. op = ops;
  498. op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
  499. op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv2;
  500. op->data.recv_status_on_client.status = &status2;
  501. op->data.recv_status_on_client.status_details = &details2;
  502. op->flags = 0;
  503. op->reserved = nullptr;
  504. op++;
  505. op->op = GRPC_OP_RECV_INITIAL_METADATA;
  506. op->data.recv_initial_metadata.recv_initial_metadata =
  507. &initial_metadata_recv2;
  508. op->flags = 0;
  509. op->reserved = nullptr;
  510. op++;
  511. error = grpc_call_start_batch(c2, ops, static_cast<size_t>(op - ops),
  512. tag(402), nullptr);
  513. GPR_ASSERT(GRPC_CALL_OK == error);
  514. grpc_call_details_destroy(&call_details);
  515. grpc_call_details_init(&call_details);
  516. GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(
  517. f.server, &s2, &call_details,
  518. &request_metadata_recv, f.cq, f.cq, tag(201)));
  519. CQ_EXPECT_COMPLETION(cqv, tag(302), 1);
  520. /* first request is finished, we should be able to start the second */
  521. CQ_EXPECT_COMPLETION(cqv, tag(401), 1);
  522. CQ_EXPECT_COMPLETION(cqv, tag(201), 1);
  523. cq_verify(cqv);
  524. memset(ops, 0, sizeof(ops));
  525. op = ops;
  526. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  527. op->data.send_initial_metadata.count = 0;
  528. op->flags = 0;
  529. op->reserved = nullptr;
  530. op++;
  531. op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
  532. op->data.recv_close_on_server.cancelled = &was_cancelled;
  533. op->flags = 0;
  534. op->reserved = nullptr;
  535. op++;
  536. op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
  537. op->data.send_status_from_server.trailing_metadata_count = 0;
  538. op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED;
  539. grpc_slice status_details = grpc_slice_from_static_string("xyz");
  540. op->data.send_status_from_server.status_details = &status_details;
  541. op->flags = 0;
  542. op->reserved = nullptr;
  543. op++;
  544. error = grpc_call_start_batch(s2, ops, static_cast<size_t>(op - ops),
  545. tag(202), nullptr);
  546. GPR_ASSERT(GRPC_CALL_OK == error);
  547. CQ_EXPECT_COMPLETION(cqv, tag(402), 1);
  548. CQ_EXPECT_COMPLETION(cqv, tag(202), 1);
  549. cq_verify(cqv);
  550. cq_verifier_destroy(cqv);
  551. grpc_call_unref(c1);
  552. grpc_call_unref(s1);
  553. grpc_call_unref(c2);
  554. grpc_call_unref(s2);
  555. grpc_slice_unref(details1);
  556. grpc_slice_unref(details2);
  557. grpc_metadata_array_destroy(&initial_metadata_recv1);
  558. grpc_metadata_array_destroy(&trailing_metadata_recv1);
  559. grpc_metadata_array_destroy(&initial_metadata_recv2);
  560. grpc_metadata_array_destroy(&trailing_metadata_recv2);
  561. grpc_metadata_array_destroy(&request_metadata_recv);
  562. grpc_call_details_destroy(&call_details);
  563. end_test(&f);
  564. config.tear_down_data(&f);
  565. }
  566. static void test_max_concurrent_streams_with_timeout_on_second(
  567. grpc_end2end_test_config config) {
  568. grpc_end2end_test_fixture f;
  569. grpc_arg server_arg;
  570. grpc_channel_args server_args;
  571. grpc_call* c1;
  572. grpc_call* c2;
  573. grpc_call* s1;
  574. cq_verifier* cqv;
  575. grpc_call_details call_details;
  576. grpc_metadata_array request_metadata_recv;
  577. grpc_metadata_array initial_metadata_recv1;
  578. grpc_metadata_array trailing_metadata_recv1;
  579. grpc_metadata_array initial_metadata_recv2;
  580. grpc_metadata_array trailing_metadata_recv2;
  581. grpc_status_code status1;
  582. grpc_call_error error;
  583. grpc_slice details1 = grpc_empty_slice();
  584. grpc_status_code status2;
  585. grpc_slice details2 = grpc_empty_slice();
  586. grpc_op ops[6];
  587. grpc_op* op;
  588. int was_cancelled;
  589. server_arg.key = const_cast<char*>(GRPC_ARG_MAX_CONCURRENT_STREAMS);
  590. server_arg.type = GRPC_ARG_INTEGER;
  591. server_arg.value.integer = 1;
  592. server_args.num_args = 1;
  593. server_args.args = &server_arg;
  594. f = begin_test(config, "test_max_concurrent_streams_with_timeout_on_second",
  595. nullptr, &server_args);
  596. cqv = cq_verifier_create(f.cq);
  597. grpc_metadata_array_init(&request_metadata_recv);
  598. grpc_metadata_array_init(&initial_metadata_recv1);
  599. grpc_metadata_array_init(&trailing_metadata_recv1);
  600. grpc_metadata_array_init(&initial_metadata_recv2);
  601. grpc_metadata_array_init(&trailing_metadata_recv2);
  602. grpc_call_details_init(&call_details);
  603. /* perform a ping-pong to ensure that settings have had a chance to round
  604. trip */
  605. simple_request_body(config, f);
  606. /* perform another one to make sure that the one stream case still works */
  607. simple_request_body(config, f);
  608. /* start two requests - ensuring that the second is not accepted until
  609. the first completes , and the second request will timeout in the
  610. concurrent_list */
  611. c1 = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS,
  612. f.cq, grpc_slice_from_static_string("/alpha"),
  613. nullptr, n_seconds_from_now(1000), nullptr);
  614. GPR_ASSERT(c1);
  615. c2 = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS,
  616. f.cq, grpc_slice_from_static_string("/beta"),
  617. nullptr, n_seconds_from_now(3), nullptr);
  618. GPR_ASSERT(c2);
  619. GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(
  620. f.server, &s1, &call_details,
  621. &request_metadata_recv, f.cq, f.cq, tag(101)));
  622. memset(ops, 0, sizeof(ops));
  623. op = ops;
  624. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  625. op->data.send_initial_metadata.count = 0;
  626. op->flags = 0;
  627. op->reserved = nullptr;
  628. op++;
  629. op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
  630. op->flags = 0;
  631. op->reserved = nullptr;
  632. op++;
  633. error = grpc_call_start_batch(c1, ops, static_cast<size_t>(op - ops),
  634. tag(301), nullptr);
  635. GPR_ASSERT(GRPC_CALL_OK == error);
  636. memset(ops, 0, sizeof(ops));
  637. op = ops;
  638. op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
  639. op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv1;
  640. op->data.recv_status_on_client.status = &status1;
  641. op->data.recv_status_on_client.status_details = &details1;
  642. op->flags = 0;
  643. op->reserved = nullptr;
  644. op++;
  645. op->op = GRPC_OP_RECV_INITIAL_METADATA;
  646. op->data.recv_initial_metadata.recv_initial_metadata =
  647. &initial_metadata_recv1;
  648. op->flags = 0;
  649. op->reserved = nullptr;
  650. op++;
  651. error = grpc_call_start_batch(c1, ops, static_cast<size_t>(op - ops),
  652. tag(302), nullptr);
  653. GPR_ASSERT(GRPC_CALL_OK == error);
  654. CQ_EXPECT_COMPLETION(cqv, tag(101), 1);
  655. CQ_EXPECT_COMPLETION(cqv, tag(301), 1);
  656. cq_verify(cqv);
  657. memset(ops, 0, sizeof(ops));
  658. op = ops;
  659. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  660. op->data.send_initial_metadata.count = 0;
  661. op->flags = 0;
  662. op->reserved = nullptr;
  663. op++;
  664. op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
  665. op->flags = 0;
  666. op->reserved = nullptr;
  667. op++;
  668. error = grpc_call_start_batch(c2, ops, static_cast<size_t>(op - ops),
  669. tag(401), nullptr);
  670. GPR_ASSERT(GRPC_CALL_OK == error);
  671. memset(ops, 0, sizeof(ops));
  672. op = ops;
  673. op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
  674. op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv2;
  675. op->data.recv_status_on_client.status = &status2;
  676. op->data.recv_status_on_client.status_details = &details2;
  677. op->flags = 0;
  678. op->reserved = nullptr;
  679. op++;
  680. op->op = GRPC_OP_RECV_INITIAL_METADATA;
  681. op->data.recv_initial_metadata.recv_initial_metadata =
  682. &initial_metadata_recv2;
  683. op->flags = 0;
  684. op->reserved = nullptr;
  685. op++;
  686. error = grpc_call_start_batch(c2, ops, static_cast<size_t>(op - ops),
  687. tag(402), nullptr);
  688. GPR_ASSERT(GRPC_CALL_OK == error);
  689. /* the second request is time out*/
  690. CQ_EXPECT_COMPLETION(cqv, tag(401), 0);
  691. CQ_EXPECT_COMPLETION(cqv, tag(402), 1);
  692. cq_verify(cqv);
  693. /* second request is finished because of time out, so destroy the second call
  694. */
  695. grpc_call_unref(c2);
  696. /* now reply the first call */
  697. memset(ops, 0, sizeof(ops));
  698. op = ops;
  699. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  700. op->data.send_initial_metadata.count = 0;
  701. op->flags = 0;
  702. op->reserved = nullptr;
  703. op++;
  704. op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
  705. op->data.recv_close_on_server.cancelled = &was_cancelled;
  706. op->flags = 0;
  707. op->reserved = nullptr;
  708. op++;
  709. op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
  710. op->data.send_status_from_server.trailing_metadata_count = 0;
  711. op->data.send_status_from_server.status = GRPC_STATUS_UNIMPLEMENTED;
  712. grpc_slice status_details = grpc_slice_from_static_string("xyz");
  713. op->data.send_status_from_server.status_details = &status_details;
  714. op->flags = 0;
  715. op->reserved = nullptr;
  716. op++;
  717. error = grpc_call_start_batch(s1, ops, static_cast<size_t>(op - ops),
  718. tag(102), nullptr);
  719. GPR_ASSERT(GRPC_CALL_OK == error);
  720. CQ_EXPECT_COMPLETION(cqv, tag(302), 1);
  721. CQ_EXPECT_COMPLETION(cqv, tag(102), 1);
  722. cq_verify(cqv);
  723. cq_verifier_destroy(cqv);
  724. grpc_call_unref(c1);
  725. grpc_call_unref(s1);
  726. grpc_slice_unref(details1);
  727. grpc_slice_unref(details2);
  728. grpc_metadata_array_destroy(&initial_metadata_recv1);
  729. grpc_metadata_array_destroy(&trailing_metadata_recv1);
  730. grpc_metadata_array_destroy(&initial_metadata_recv2);
  731. grpc_metadata_array_destroy(&trailing_metadata_recv2);
  732. grpc_metadata_array_destroy(&request_metadata_recv);
  733. grpc_call_details_destroy(&call_details);
  734. end_test(&f);
  735. config.tear_down_data(&f);
  736. }
  737. void max_concurrent_streams(grpc_end2end_test_config config) {
  738. test_max_concurrent_streams_with_timeout_on_first(config);
  739. test_max_concurrent_streams_with_timeout_on_second(config);
  740. test_max_concurrent_streams(config);
  741. }
  742. void max_concurrent_streams_pre_init(void) {}