call_creds.cc 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  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/grpc_security.h>
  22. #include <grpc/support/alloc.h>
  23. #include <grpc/support/log.h>
  24. #include <grpc/support/time.h>
  25. #include "src/core/lib/gpr/string.h"
  26. #include "src/core/lib/security/credentials/credentials.h"
  27. #include "test/core/end2end/cq_verifier.h"
  28. #include "test/core/end2end/end2end_tests.h"
  29. static const char iam_token[] = "token";
  30. static const char iam_selector[] = "selector";
  31. static const char overridden_iam_token[] = "overridden_token";
  32. static const char overridden_iam_selector[] = "overridden_selector";
  33. static const char fake_md_key[] = "fake_key";
  34. static const char fake_md_value[] = "fake_value";
  35. static const char overridden_fake_md_key[] = "overridden_fake_key";
  36. static const char overridden_fake_md_value[] = "overridden_fake_value";
  37. typedef enum { NONE, OVERRIDE, DESTROY, FAIL } override_mode;
  38. static void* tag(intptr_t t) { return reinterpret_cast<void*>(t); }
  39. static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
  40. const char* test_name,
  41. bool use_secure_call_creds,
  42. int fail_server_auth_check) {
  43. grpc_end2end_test_fixture f;
  44. gpr_log(GPR_INFO, "Running test: %s%s/%s", test_name,
  45. use_secure_call_creds ? "_with_secure_call_creds"
  46. : "_with_insecure_call_creds",
  47. config.name);
  48. f = config.create_fixture(nullptr, nullptr);
  49. config.init_client(&f, nullptr);
  50. if (fail_server_auth_check) {
  51. grpc_arg fail_auth_arg = {
  52. GRPC_ARG_STRING,
  53. const_cast<char*>(FAIL_AUTH_CHECK_SERVER_ARG_NAME),
  54. {nullptr}};
  55. grpc_channel_args args;
  56. args.num_args = 1;
  57. args.args = &fail_auth_arg;
  58. config.init_server(&f, &args);
  59. } else {
  60. config.init_server(&f, nullptr);
  61. }
  62. return f;
  63. }
  64. static gpr_timespec n_seconds_from_now(int n) {
  65. return grpc_timeout_seconds_to_deadline(n);
  66. }
  67. static gpr_timespec five_seconds_from_now(void) {
  68. return n_seconds_from_now(5);
  69. }
  70. static void drain_cq(grpc_completion_queue* cq) {
  71. grpc_event ev;
  72. do {
  73. ev = grpc_completion_queue_next(cq, five_seconds_from_now(), nullptr);
  74. } while (ev.type != GRPC_QUEUE_SHUTDOWN);
  75. }
  76. static void shutdown_server(grpc_end2end_test_fixture* f) {
  77. if (!f->server) return;
  78. grpc_server_shutdown_and_notify(f->server, f->shutdown_cq, tag(1000));
  79. GPR_ASSERT(grpc_completion_queue_pluck(f->shutdown_cq, tag(1000),
  80. grpc_timeout_seconds_to_deadline(5),
  81. nullptr)
  82. .type == GRPC_OP_COMPLETE);
  83. grpc_server_destroy(f->server);
  84. f->server = nullptr;
  85. }
  86. static void shutdown_client(grpc_end2end_test_fixture* f) {
  87. if (!f->client) return;
  88. grpc_channel_destroy(f->client);
  89. f->client = nullptr;
  90. }
  91. static void end_test(grpc_end2end_test_fixture* f) {
  92. shutdown_server(f);
  93. shutdown_client(f);
  94. grpc_completion_queue_shutdown(f->cq);
  95. drain_cq(f->cq);
  96. grpc_completion_queue_destroy(f->cq);
  97. grpc_completion_queue_destroy(f->shutdown_cq);
  98. }
  99. static void print_auth_context(int is_client, const grpc_auth_context* ctx) {
  100. const grpc_auth_property* p;
  101. grpc_auth_property_iterator it;
  102. gpr_log(GPR_INFO, "%s peer:", is_client ? "client" : "server");
  103. gpr_log(GPR_INFO, "\tauthenticated: %s",
  104. grpc_auth_context_peer_is_authenticated(ctx) ? "YES" : "NO");
  105. it = grpc_auth_context_peer_identity(ctx);
  106. while ((p = grpc_auth_property_iterator_next(&it)) != nullptr) {
  107. gpr_log(GPR_INFO, "\t\t%s: %s", p->name, p->value);
  108. }
  109. gpr_log(GPR_INFO, "\tall properties:");
  110. it = grpc_auth_context_property_iterator(ctx);
  111. while ((p = grpc_auth_property_iterator_next(&it)) != nullptr) {
  112. gpr_log(GPR_INFO, "\t\t%s: %s", p->name, p->value);
  113. }
  114. }
  115. static void request_response_with_payload_and_call_creds(
  116. const char* test_name, grpc_end2end_test_config config, override_mode mode,
  117. bool use_secure_call_creds) {
  118. grpc_call* c = nullptr;
  119. grpc_call* s = nullptr;
  120. grpc_slice request_payload_slice =
  121. grpc_slice_from_copied_string("hello world");
  122. grpc_slice response_payload_slice =
  123. grpc_slice_from_copied_string("hello you");
  124. grpc_byte_buffer* request_payload =
  125. grpc_raw_byte_buffer_create(&request_payload_slice, 1);
  126. grpc_byte_buffer* response_payload =
  127. grpc_raw_byte_buffer_create(&response_payload_slice, 1);
  128. grpc_end2end_test_fixture f;
  129. cq_verifier* cqv;
  130. grpc_op ops[6];
  131. grpc_op* op;
  132. grpc_metadata_array initial_metadata_recv;
  133. grpc_metadata_array trailing_metadata_recv;
  134. grpc_metadata_array request_metadata_recv;
  135. grpc_byte_buffer* request_payload_recv = nullptr;
  136. grpc_byte_buffer* response_payload_recv = nullptr;
  137. grpc_call_details call_details;
  138. grpc_status_code status;
  139. grpc_call_error error;
  140. grpc_slice details;
  141. int was_cancelled = 2;
  142. grpc_call_credentials* creds = nullptr;
  143. grpc_auth_context* server_auth_context = nullptr;
  144. grpc_auth_context* client_auth_context = nullptr;
  145. f = begin_test(config, test_name, use_secure_call_creds, 0);
  146. cqv = cq_verifier_create(f.cq);
  147. gpr_timespec deadline = five_seconds_from_now();
  148. c = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS, f.cq,
  149. grpc_slice_from_static_string("/foo"), nullptr,
  150. deadline, nullptr);
  151. GPR_ASSERT(c);
  152. if (use_secure_call_creds) {
  153. creds =
  154. grpc_google_iam_credentials_create(iam_token, iam_selector, nullptr);
  155. } else {
  156. creds = grpc_md_only_test_credentials_create(fake_md_key, fake_md_value);
  157. }
  158. GPR_ASSERT(creds != nullptr);
  159. GPR_ASSERT(grpc_call_set_credentials(c, creds) == GRPC_CALL_OK);
  160. switch (mode) {
  161. case NONE:
  162. break;
  163. case OVERRIDE:
  164. grpc_call_credentials_release(creds);
  165. if (use_secure_call_creds) {
  166. creds = grpc_google_iam_credentials_create(
  167. overridden_iam_token, overridden_iam_selector, nullptr);
  168. } else {
  169. creds = grpc_md_only_test_credentials_create(overridden_fake_md_key,
  170. overridden_fake_md_value);
  171. }
  172. GPR_ASSERT(creds != nullptr);
  173. GPR_ASSERT(grpc_call_set_credentials(c, creds) == GRPC_CALL_OK);
  174. break;
  175. case DESTROY:
  176. GPR_ASSERT(grpc_call_set_credentials(c, nullptr) == GRPC_CALL_OK);
  177. break;
  178. case FAIL:
  179. // Do nothing
  180. break;
  181. }
  182. grpc_call_credentials_release(creds);
  183. grpc_metadata_array_init(&initial_metadata_recv);
  184. grpc_metadata_array_init(&trailing_metadata_recv);
  185. grpc_metadata_array_init(&request_metadata_recv);
  186. grpc_call_details_init(&call_details);
  187. memset(ops, 0, sizeof(ops));
  188. op = ops;
  189. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  190. op->data.send_initial_metadata.count = 0;
  191. op->flags = 0;
  192. op->reserved = nullptr;
  193. op++;
  194. op->op = GRPC_OP_SEND_MESSAGE;
  195. op->data.send_message.send_message = request_payload;
  196. op->flags = 0;
  197. op->reserved = nullptr;
  198. op++;
  199. op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
  200. op->flags = 0;
  201. op->reserved = nullptr;
  202. op++;
  203. op->op = GRPC_OP_RECV_INITIAL_METADATA;
  204. op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv;
  205. op->flags = 0;
  206. op->reserved = nullptr;
  207. op++;
  208. op->op = GRPC_OP_RECV_MESSAGE;
  209. op->data.recv_message.recv_message = &response_payload_recv;
  210. op->flags = 0;
  211. op->reserved = nullptr;
  212. op++;
  213. op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
  214. op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
  215. op->data.recv_status_on_client.status = &status;
  216. op->data.recv_status_on_client.status_details = &details;
  217. op->flags = 0;
  218. op->reserved = nullptr;
  219. op++;
  220. error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(1),
  221. nullptr);
  222. GPR_ASSERT(GRPC_CALL_OK == error);
  223. if (mode == FAIL) {
  224. // Expect the call to fail since the channel credentials did not satisfy the
  225. // minimum security level requirements.
  226. CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
  227. cq_verify(cqv);
  228. GPR_ASSERT(status == GRPC_STATUS_UNAUTHENTICATED);
  229. } else {
  230. error =
  231. grpc_server_request_call(f.server, &s, &call_details,
  232. &request_metadata_recv, f.cq, f.cq, tag(101));
  233. GPR_ASSERT(GRPC_CALL_OK == error);
  234. CQ_EXPECT_COMPLETION(cqv, tag(101), 1);
  235. cq_verify(cqv);
  236. server_auth_context = grpc_call_auth_context(s);
  237. GPR_ASSERT(server_auth_context != nullptr);
  238. print_auth_context(0, server_auth_context);
  239. grpc_auth_context_release(server_auth_context);
  240. client_auth_context = grpc_call_auth_context(c);
  241. GPR_ASSERT(client_auth_context != nullptr);
  242. print_auth_context(1, client_auth_context);
  243. grpc_auth_context_release(client_auth_context);
  244. /* Cannot set creds on the server call object. */
  245. GPR_ASSERT(grpc_call_set_credentials(s, nullptr) != GRPC_CALL_OK);
  246. memset(ops, 0, sizeof(ops));
  247. op = ops;
  248. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  249. op->data.send_initial_metadata.count = 0;
  250. op->flags = 0;
  251. op->reserved = nullptr;
  252. op++;
  253. op->op = GRPC_OP_RECV_MESSAGE;
  254. op->data.recv_message.recv_message = &request_payload_recv;
  255. op->flags = 0;
  256. op->reserved = nullptr;
  257. op++;
  258. error = grpc_call_start_batch(s, ops, static_cast<size_t>(op - ops),
  259. tag(102), nullptr);
  260. GPR_ASSERT(GRPC_CALL_OK == error);
  261. CQ_EXPECT_COMPLETION(cqv, tag(102), 1);
  262. cq_verify(cqv);
  263. memset(ops, 0, sizeof(ops));
  264. op = ops;
  265. op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
  266. op->data.recv_close_on_server.cancelled = &was_cancelled;
  267. op->flags = 0;
  268. op->reserved = nullptr;
  269. op++;
  270. op->op = GRPC_OP_SEND_MESSAGE;
  271. op->data.send_message.send_message = response_payload;
  272. op->flags = 0;
  273. op->reserved = nullptr;
  274. op++;
  275. op->op = GRPC_OP_SEND_STATUS_FROM_SERVER;
  276. op->data.send_status_from_server.trailing_metadata_count = 0;
  277. op->data.send_status_from_server.status = GRPC_STATUS_OK;
  278. grpc_slice status_details = grpc_slice_from_static_string("xyz");
  279. op->data.send_status_from_server.status_details = &status_details;
  280. op->flags = 0;
  281. op->reserved = nullptr;
  282. op++;
  283. error = grpc_call_start_batch(s, ops, static_cast<size_t>(op - ops),
  284. tag(103), nullptr);
  285. GPR_ASSERT(GRPC_CALL_OK == error);
  286. CQ_EXPECT_COMPLETION(cqv, tag(103), 1);
  287. CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
  288. cq_verify(cqv);
  289. GPR_ASSERT(status == GRPC_STATUS_OK);
  290. GPR_ASSERT(0 == grpc_slice_str_cmp(details, "xyz"));
  291. GPR_ASSERT(0 == grpc_slice_str_cmp(call_details.method, "/foo"));
  292. GPR_ASSERT(was_cancelled == 0);
  293. GPR_ASSERT(byte_buffer_eq_string(request_payload_recv, "hello world"));
  294. GPR_ASSERT(byte_buffer_eq_string(response_payload_recv, "hello you"));
  295. switch (mode) {
  296. case NONE:
  297. if (use_secure_call_creds) {
  298. GPR_ASSERT(contains_metadata(
  299. &request_metadata_recv, GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
  300. iam_token));
  301. GPR_ASSERT(contains_metadata(&request_metadata_recv,
  302. GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
  303. iam_selector));
  304. } else {
  305. GPR_ASSERT(contains_metadata(&request_metadata_recv, fake_md_key,
  306. fake_md_value));
  307. }
  308. break;
  309. case OVERRIDE:
  310. if (use_secure_call_creds) {
  311. GPR_ASSERT(contains_metadata(
  312. &request_metadata_recv, GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
  313. overridden_iam_token));
  314. GPR_ASSERT(contains_metadata(&request_metadata_recv,
  315. GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
  316. overridden_iam_selector));
  317. } else {
  318. GPR_ASSERT(contains_metadata(&request_metadata_recv,
  319. overridden_fake_md_key,
  320. overridden_fake_md_value));
  321. }
  322. break;
  323. case DESTROY:
  324. GPR_ASSERT(!contains_metadata(&request_metadata_recv,
  325. GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
  326. iam_token));
  327. GPR_ASSERT(!contains_metadata(&request_metadata_recv,
  328. GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
  329. iam_selector));
  330. GPR_ASSERT(!contains_metadata(&request_metadata_recv,
  331. GRPC_IAM_AUTHORIZATION_TOKEN_METADATA_KEY,
  332. overridden_iam_token));
  333. GPR_ASSERT(!contains_metadata(&request_metadata_recv,
  334. GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY,
  335. overridden_iam_selector));
  336. GPR_ASSERT(!contains_metadata(&request_metadata_recv, fake_md_key,
  337. fake_md_value));
  338. GPR_ASSERT(!contains_metadata(&request_metadata_recv,
  339. overridden_fake_md_key,
  340. overridden_fake_md_value));
  341. break;
  342. case FAIL:
  343. GPR_ASSERT(0);
  344. }
  345. grpc_call_unref(s);
  346. }
  347. grpc_slice_unref(details);
  348. grpc_metadata_array_destroy(&initial_metadata_recv);
  349. grpc_metadata_array_destroy(&trailing_metadata_recv);
  350. grpc_metadata_array_destroy(&request_metadata_recv);
  351. grpc_call_details_destroy(&call_details);
  352. grpc_call_unref(c);
  353. cq_verifier_destroy(cqv);
  354. grpc_byte_buffer_destroy(request_payload);
  355. grpc_byte_buffer_destroy(response_payload);
  356. grpc_byte_buffer_destroy(request_payload_recv);
  357. grpc_byte_buffer_destroy(response_payload_recv);
  358. end_test(&f);
  359. config.tear_down_data(&f);
  360. }
  361. static void test_request_response_with_payload_and_call_creds(
  362. grpc_end2end_test_config config, bool use_secure_call_creds) {
  363. request_response_with_payload_and_call_creds(
  364. "test_request_response_with_payload_and_call_creds", config, NONE,
  365. use_secure_call_creds);
  366. }
  367. static void test_request_response_with_payload_and_overridden_call_creds(
  368. grpc_end2end_test_config config, bool use_secure_call_creds) {
  369. request_response_with_payload_and_call_creds(
  370. "test_request_response_with_payload_and_overridden_call_creds", config,
  371. OVERRIDE, use_secure_call_creds);
  372. }
  373. static void test_request_response_with_payload_and_deleted_call_creds(
  374. grpc_end2end_test_config config, bool use_secure_call_creds) {
  375. request_response_with_payload_and_call_creds(
  376. "test_request_response_with_payload_and_deleted_call_creds", config,
  377. DESTROY, use_secure_call_creds);
  378. }
  379. static void test_request_response_with_payload_fail_to_send_call_creds(
  380. grpc_end2end_test_config config, bool use_secure_call_creds) {
  381. request_response_with_payload_and_call_creds(
  382. "test_request_response_with_payload_fail_to_send_call_creds", config,
  383. FAIL, use_secure_call_creds);
  384. }
  385. static void test_request_with_server_rejecting_client_creds(
  386. grpc_end2end_test_config config) {
  387. grpc_op ops[6];
  388. grpc_op* op;
  389. grpc_call* c;
  390. grpc_end2end_test_fixture f;
  391. gpr_timespec deadline = five_seconds_from_now();
  392. cq_verifier* cqv;
  393. grpc_metadata_array initial_metadata_recv;
  394. grpc_metadata_array trailing_metadata_recv;
  395. grpc_metadata_array request_metadata_recv;
  396. grpc_call_details call_details;
  397. grpc_status_code status;
  398. grpc_call_error error;
  399. grpc_slice details;
  400. grpc_byte_buffer* response_payload_recv = nullptr;
  401. grpc_slice request_payload_slice =
  402. grpc_slice_from_copied_string("hello world");
  403. grpc_byte_buffer* request_payload =
  404. grpc_raw_byte_buffer_create(&request_payload_slice, 1);
  405. grpc_call_credentials* creds;
  406. f = begin_test(config, "test_request_with_server_rejecting_client_creds",
  407. false, 1);
  408. cqv = cq_verifier_create(f.cq);
  409. c = grpc_channel_create_call(f.client, nullptr, GRPC_PROPAGATE_DEFAULTS, f.cq,
  410. grpc_slice_from_static_string("/foo"), nullptr,
  411. deadline, nullptr);
  412. GPR_ASSERT(c);
  413. creds = grpc_md_only_test_credentials_create(fake_md_key, fake_md_value);
  414. GPR_ASSERT(creds != nullptr);
  415. GPR_ASSERT(grpc_call_set_credentials(c, creds) == GRPC_CALL_OK);
  416. grpc_call_credentials_release(creds);
  417. grpc_metadata_array_init(&initial_metadata_recv);
  418. grpc_metadata_array_init(&trailing_metadata_recv);
  419. grpc_metadata_array_init(&request_metadata_recv);
  420. grpc_call_details_init(&call_details);
  421. memset(ops, 0, sizeof(ops));
  422. op = ops;
  423. op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
  424. op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv;
  425. op->data.recv_status_on_client.status = &status;
  426. op->data.recv_status_on_client.status_details = &details;
  427. op->flags = 0;
  428. op->reserved = nullptr;
  429. op++;
  430. op->op = GRPC_OP_SEND_INITIAL_METADATA;
  431. op->data.send_initial_metadata.count = 0;
  432. op->flags = 0;
  433. op->reserved = nullptr;
  434. op++;
  435. op->op = GRPC_OP_SEND_MESSAGE;
  436. op->data.send_message.send_message = request_payload;
  437. op->flags = 0;
  438. op->reserved = nullptr;
  439. op++;
  440. op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
  441. op->flags = 0;
  442. op->reserved = nullptr;
  443. op++;
  444. op->op = GRPC_OP_RECV_INITIAL_METADATA;
  445. op->data.recv_initial_metadata.recv_initial_metadata = &initial_metadata_recv;
  446. op->flags = 0;
  447. op->reserved = nullptr;
  448. op++;
  449. op->op = GRPC_OP_RECV_MESSAGE;
  450. op->data.recv_message.recv_message = &response_payload_recv;
  451. op->flags = 0;
  452. op->reserved = nullptr;
  453. op++;
  454. error = grpc_call_start_batch(c, ops, static_cast<size_t>(op - ops), tag(1),
  455. nullptr);
  456. GPR_ASSERT(error == GRPC_CALL_OK);
  457. CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
  458. cq_verify(cqv);
  459. GPR_ASSERT(status == GRPC_STATUS_UNAUTHENTICATED);
  460. grpc_metadata_array_destroy(&initial_metadata_recv);
  461. grpc_metadata_array_destroy(&trailing_metadata_recv);
  462. grpc_metadata_array_destroy(&request_metadata_recv);
  463. grpc_call_details_destroy(&call_details);
  464. grpc_byte_buffer_destroy(request_payload);
  465. grpc_byte_buffer_destroy(response_payload_recv);
  466. grpc_slice_unref(details);
  467. grpc_call_unref(c);
  468. cq_verifier_destroy(cqv);
  469. end_test(&f);
  470. config.tear_down_data(&f);
  471. }
  472. void call_creds(grpc_end2end_test_config config) {
  473. // Test fixtures that support call credentials with a minimum security level
  474. // of GRPC_PRIVACY_AND_INTEGRITY
  475. if (config.feature_mask & FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS) {
  476. test_request_response_with_payload_and_call_creds(config, true);
  477. test_request_response_with_payload_and_overridden_call_creds(config, true);
  478. test_request_response_with_payload_and_deleted_call_creds(config, true);
  479. }
  480. // Test that fixtures that support call credentials with a minimum security
  481. // level of GRPC_SECURITY_NONE cannot send call credentials that require
  482. // higher security level
  483. if (config.feature_mask &
  484. FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS_LEVEL_INSECURE) {
  485. test_request_response_with_payload_fail_to_send_call_creds(config, true);
  486. }
  487. // Fixtures that support sending call credentials should be able to send call
  488. // credentials of security level GRPC_SECURITY_NONE.
  489. if (config.feature_mask & FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS ||
  490. config.feature_mask &
  491. FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS_LEVEL_INSECURE) {
  492. test_request_response_with_payload_and_call_creds(config, false);
  493. test_request_response_with_payload_and_overridden_call_creds(config, false);
  494. test_request_response_with_payload_and_deleted_call_creds(config, false);
  495. test_request_with_server_rejecting_client_creds(config);
  496. }
  497. }
  498. void call_creds_pre_init(void) {}