17 #include <gmock/gmock-matchers.h>
18 #include <gmock/gmock.h>
19 #include <gtest/gtest.h>
25 #ifdef GRPC_ERROR_IS_ABSEIL_STATUS
26 #define CHILD_ERROR_TAG ".*children.*"
28 #define CHILD_ERROR_TAG ".*referenced_errors.*"
36 TEST(RbacServiceConfigParsingTest, EmptyRbacPolicy) {
37 const char* test_json =
39 " \"methodConfig\": [ {\n"
43 " \"rbacPolicy\": [ {\n"
53 const auto* vector_ptr =
56 auto* parsed_rbac_config =
static_cast<RbacMethodParsedConfig*
>(
59 ASSERT_NE(parsed_rbac_config->authorization_engine(0),
nullptr);
60 EXPECT_EQ(parsed_rbac_config->authorization_engine(0)->action(),
62 EXPECT_EQ(parsed_rbac_config->authorization_engine(0)->num_policies(), 0);
67 TEST(RbacServiceConfigParsingTest, MissingChannelArg) {
68 const char* test_json =
70 " \"methodConfig\": [ {\n"
74 " \"rbacPolicy\": [ {\n"
81 const auto* vector_ptr =
84 auto* parsed_rbac_config =
static_cast<RbacMethodParsedConfig*
>(
90 TEST(RbacServiceConfigParsingTest, EmptyRbacPolicyArray) {
91 const char* test_json =
93 " \"methodConfig\": [ {\n"
106 const auto* vector_ptr =
109 auto* parsed_rbac_config =
static_cast<RbacMethodParsedConfig*
>(
115 TEST(RbacServiceConfigParsingTest, MultipleRbacPolicies) {
116 const char* test_json =
118 " \"methodConfig\": [ {\n"
122 " \"rbacPolicy\": [ {}, {}, {} ]"
131 const auto* vector_ptr =
134 auto* parsed_rbac_config =
static_cast<RbacMethodParsedConfig*
>(
137 for (
auto i = 0;
i < 3; ++
i) {
138 ASSERT_NE(parsed_rbac_config->authorization_engine(
i),
nullptr);
139 EXPECT_EQ(parsed_rbac_config->authorization_engine(
i)->action(),
141 EXPECT_EQ(parsed_rbac_config->authorization_engine(
i)->num_policies(), 0);
145 TEST(RbacServiceConfigParsingTest, BadRbacPolicyType) {
146 const char* test_json =
148 " \"methodConfig\": [ {\n"
152 " \"rbacPolicy\": 1234"
163 "field:rbacPolicy error:type should be ARRAY"));
167 TEST(RbacServiceConfigParsingTest, BadRulesType) {
168 const char* test_json =
170 " \"methodConfig\": [ {\n"
174 " \"rbacPolicy\": [{\"rules\":1}]"
186 "field:rules error:type should be OBJECT"));
190 TEST(RbacServiceConfigParsingTest, BadActionAndPolicyType) {
191 const char* test_json =
193 " \"methodConfig\": [ {\n"
197 " \"rbacPolicy\": [{\n"
200 " \"policies\":123\n"
214 "field:action error:type should be NUMBER.*"
215 "field:policies error:type should be OBJECT"));
219 TEST(RbacServiceConfigParsingTest, MissingPermissionAndPrincipals) {
220 const char* test_json =
222 " \"methodConfig\": [ {\n"
226 " \"rbacPolicy\": [{\n"
247 "field:permissions error:does not exist.*"
248 "field:principals error:does not exist"));
252 TEST(RbacServiceConfigParsingTest, EmptyPrincipalAndPermission) {
253 const char* test_json =
255 " \"methodConfig\": [ {\n"
259 " \"rbacPolicy\": [{\n"
264 " \"permissions\":[{}],\n"
265 " \"principals\":[{}]\n"
287 TEST(RbacServiceConfigParsingTest, VariousPermissionsAndPrincipalsTypes) {
288 const char* test_json =
290 " \"methodConfig\": [ {\n"
294 " \"rbacPolicy\": [{\n"
299 " \"permissions\":[\n"
300 " {\"andRules\":{\"rules\":[{\"any\":true}]}},\n"
301 " {\"orRules\":{\"rules\":[{\"any\":true}]}},\n"
303 " {\"header\":{\"name\":\"name\", \"exactMatch\":\"\"}},\n"
304 " {\"urlPath\":{\"path\":{\"exact\":\"\"}}},\n"
305 " {\"destinationIp\":{\"addressPrefix\":\"::1\"}},\n"
306 " {\"destinationPort\":1234},\n"
307 " {\"metadata\":{\"invert\":true}},\n"
308 " {\"notRule\":{\"any\":true}},\n"
309 " {\"requestedServerName\":{\"exact\":\"\"}}\n"
311 " \"principals\":[\n"
312 " {\"andIds\":{\"ids\":[{\"any\":true}]}},\n"
313 " {\"orIds\":{\"ids\":[{\"any\":true}]}},\n"
315 " {\"authenticated\":{\n"
316 " \"principalName\":{\"exact\":\"\"}}},\n"
317 " {\"sourceIp\":{\"addressPrefix\":\"::1\"}},\n"
318 " {\"directRemoteIp\":{\"addressPrefix\":\"::1\"}},\n"
319 " {\"remoteIp\":{\"addressPrefix\":\"::1\"}},\n"
320 " {\"header\":{\"name\":\"name\", \"exactMatch\":\"\"}},\n"
321 " {\"urlPath\":{\"path\":{\"exact\":\"\"}}},\n"
322 " {\"metadata\":{\"invert\":true}},\n"
323 " {\"notId\":{\"any\":true}}\n"
337 const auto* vector_ptr =
340 auto* parsed_rbac_config =
static_cast<RbacMethodParsedConfig*
>(
343 ASSERT_NE(parsed_rbac_config->authorization_engine(0),
nullptr);
344 EXPECT_EQ(parsed_rbac_config->authorization_engine(0)->num_policies(), 1);
347 TEST(RbacServiceConfigParsingTest, VariousPermissionsAndPrincipalsBadTypes) {
348 const char* test_json =
350 " \"methodConfig\": [ {\n"
354 " \"rbacPolicy\": [{\n"
359 " \"permissions\":[\n"
360 " {\"andRules\":1234},\n"
361 " {\"orRules\":1234},\n"
363 " {\"header\":1234},\n"
364 " {\"urlPath\":1234},\n"
365 " {\"destinationIp\":1234},\n"
366 " {\"destinationPort\":\"port\"},\n"
367 " {\"metadata\":1234},\n"
368 " {\"notRule\":1234},\n"
369 " {\"requestedServerName\":1234}\n"
371 " \"principals\":[\n"
372 " {\"andIds\":1234},\n"
373 " {\"orIds\":1234},\n"
375 " {\"authenticated\":1234},\n"
376 " {\"sourceIp\":1234},\n"
377 " {\"directRemoteIp\":1234},\n"
378 " {\"remoteIp\":1234},\n"
379 " {\"header\":1234},\n"
380 " {\"urlPath\":1234},\n"
381 " {\"metadata\":1234},\n"
382 " {\"notId\":1234}\n"
401 "field:andRules error:type should be OBJECT.*"
403 "field:orRules error:type should be OBJECT.*"
405 "field:any error:type should be BOOLEAN.*"
407 "field:header error:type should be OBJECT.*"
409 "field:urlPath error:type should be OBJECT.*"
411 "field:destinationIp error:type should be OBJECT.*"
413 "field:destinationPort error:failed to parse.*"
415 "field:metadata error:type should be OBJECT.*"
417 "field:notRule error:type should be OBJECT.*"
419 "field:requestedServerName error:type should be OBJECT.*"
421 "field:andIds error:type should be OBJECT.*"
423 "field:orIds error:type should be OBJECT.*"
425 "field:any error:type should be BOOLEAN.*"
427 "field:authenticated error:type should be OBJECT.*"
429 "field:sourceIp error:type should be OBJECT.*"
431 "field:directRemoteIp error:type should be OBJECT.*"
433 "field:remoteIp error:type should be OBJECT.*"
435 "field:header error:type should be OBJECT.*"
437 "field:urlPath error:type should be OBJECT.*"
439 "field:metadata error:type should be OBJECT.*"
441 "field:notId error:type should be OBJECT.*"));
445 TEST(RbacServiceConfigParsingTest, HeaderMatcherVariousTypes) {
446 const char* test_json =
448 " \"methodConfig\": [ {\n"
452 " \"rbacPolicy\": [{\n"
457 " \"permissions\":[\n"
458 " {\"header\":{\"name\":\"name\", \"exactMatch\":\"\", \n"
459 " \"invertMatch\":true}},\n"
460 " {\"header\":{\"name\":\"name\", \"safeRegexMatch\":{\n"
461 " \"regex\":\"\"}}},\n"
462 " {\"header\":{\"name\":\"name\", \"rangeMatch\":{\n"
463 " \"start\":0, \"end\":1}}},\n"
464 " {\"header\":{\"name\":\"name\", \"presentMatch\":true}},\n"
465 " {\"header\":{\"name\":\"name\", \"prefixMatch\":\"\"}},\n"
466 " {\"header\":{\"name\":\"name\", \"suffixMatch\":\"\"}},\n"
467 " {\"header\":{\"name\":\"name\", \"containsMatch\":\"\"}}\n"
469 " \"principals\":[]\n"
482 const auto* vector_ptr =
485 auto* parsed_rbac_config =
static_cast<RbacMethodParsedConfig*
>(
488 ASSERT_NE(parsed_rbac_config->authorization_engine(0),
nullptr);
489 EXPECT_EQ(parsed_rbac_config->authorization_engine(0)->num_policies(), 1);
492 TEST(RbacServiceConfigParsingTest, HeaderMatcherBadTypes) {
493 const char* test_json =
495 " \"methodConfig\": [ {\n"
499 " \"rbacPolicy\": [{\n"
504 " \"permissions\":[\n"
505 " {\"header\":{\"name\":\"name\", \"exactMatch\":1, \n"
506 " \"invertMatch\":1}},\n"
507 " {\"header\":{\"name\":\"name\", \"safeRegexMatch\":1}},\n"
508 " {\"header\":{\"name\":\"name\", \"rangeMatch\":1}},\n"
509 " {\"header\":{\"name\":\"name\", \"presentMatch\":1}},\n"
510 " {\"header\":{\"name\":\"name\", \"prefixMatch\":1}},\n"
511 " {\"header\":{\"name\":\"name\", \"suffixMatch\":1}},\n"
512 " {\"header\":{\"name\":\"name\", \"containsMatch\":1}}\n"
514 " \"principals\":[]\n"
532 "field:invertMatch error:type should be BOOLEAN.*"
533 "field:exactMatch error:type should be STRING.*"
535 "field:safeRegexMatch error:type should be OBJECT.*"
537 "field:rangeMatch error:type should be OBJECT.*"
539 "field:presentMatch error:type should be BOOLEAN.*"
541 "field:prefixMatch error:type should be STRING.*"
543 "field:suffixMatch error:type should be STRING.*"
545 "field:containsMatch error:type should be STRING.*"));
549 TEST(RbacServiceConfigParsingTest, StringMatcherVariousTypes) {
550 const char* test_json =
552 " \"methodConfig\": [ {\n"
556 " \"rbacPolicy\": [{\n"
561 " \"permissions\":[\n"
562 " {\"requestedServerName\":{\"exact\":\"\", \n"
563 " \"ignoreCase\":true}},\n"
564 " {\"requestedServerName\":{\"prefix\":\"\"}},\n"
565 " {\"requestedServerName\":{\"suffix\":\"\"}},\n"
566 " {\"requestedServerName\":{\"safeRegex\":{\n"
567 " \"regex\":\"\"}}},\n"
568 " {\"requestedServerName\":{\"contains\":\"\"}}\n"
570 " \"principals\":[]\n"
583 const auto* vector_ptr =
586 auto* parsed_rbac_config =
static_cast<RbacMethodParsedConfig*
>(
589 ASSERT_NE(parsed_rbac_config->authorization_engine(0),
nullptr);
590 EXPECT_EQ(parsed_rbac_config->authorization_engine(0)->num_policies(), 1);
593 TEST(RbacServiceConfigParsingTest, StringMatcherBadTypes) {
594 const char* test_json =
596 " \"methodConfig\": [ {\n"
600 " \"rbacPolicy\": [{\n"
605 " \"permissions\":[\n"
606 " {\"requestedServerName\":{\"exact\":1, \n"
607 " \"ignoreCase\":1}},\n"
608 " {\"requestedServerName\":{\"prefix\":1}},\n"
609 " {\"requestedServerName\":{\"suffix\":1}},\n"
610 " {\"requestedServerName\":{\"safeRegex\":1}},\n"
611 " {\"requestedServerName\":{\"contains\":1}}\n"
613 " \"principals\":[]\n"
632 "field:ignoreCase error:type should be BOOLEAN.*"
633 "field:exact error:type should be STRING.*"
636 "field:prefix error:type should be STRING.*"
639 "field:suffix error:type should be STRING.*"
642 "field:safeRegex error:type should be OBJECT.*"
645 "field:contains error:type should be STRING.*"));
653 int main(
int argc,
char** argv) {