17 #include <gmock/gmock.h>
18 #include <gtest/gtest.h>
24 MATCHER_P3(EqualsPrincipalName, expected_matcher_type, expected_matcher_value,
27 arg->string_matcher.
value().type() == expected_matcher_type &&
29 ?
arg->string_matcher.
value().regex_matcher()->pattern() ==
30 expected_matcher_value
31 :
arg->string_matcher.
value().string_matcher() ==
32 expected_matcher_value;
35 MATCHER_P3(EqualsPath, expected_matcher_type, expected_matcher_value, is_regex,
38 arg->string_matcher.
type() == expected_matcher_type && is_regex
39 ?
arg->string_matcher.regex_matcher()->pattern() ==
40 expected_matcher_value
41 :
arg->string_matcher.string_matcher() == expected_matcher_value;
45 expected_matcher_value, is_regex,
"") {
48 arg->header_matcher.
type() == expected_matcher_type && is_regex
49 ?
arg->header_matcher.regex_matcher()->pattern() ==
50 expected_matcher_value
51 :
arg->header_matcher.string_matcher() == expected_matcher_value;
56 TEST(GenerateRbacPoliciesTest, InvalidPolicy) {
57 const char* authz_policy =
59 " \"name\": \"authz-policy\",,"
68 TEST(GenerateRbacPoliciesTest, MissingAuthorizationPolicyName) {
69 const char* authz_policy =
"{}";
72 EXPECT_EQ(rbac_policies.status().message(),
"\"name\" field is not present.");
75 TEST(GenerateRbacPoliciesTest, IncorrectAuthorizationPolicyNameType) {
76 const char* authz_policy =
78 " \"name\": [\"authz_policy\"]"
82 EXPECT_EQ(rbac_policies.status().message(),
"\"name\" is not a string.");
85 TEST(GenerateRbacPoliciesTest, MissingAllowRules) {
86 const char* authz_policy =
88 " \"name\": \"authz_policy\""
92 EXPECT_EQ(rbac_policies.status().message(),
93 "\"allow_rules\" is not present.");
96 TEST(GenerateRbacPoliciesTest, MissingDenyRules) {
97 const char* authz_policy =
99 " \"name\": \"authz\","
100 " \"allow_rules\": ["
102 " \"name\": \"allow_policy\""
109 EXPECT_TRUE(rbac_policies.value().deny_policy.policies.empty());
112 TEST(GenerateRbacPoliciesTest, IncorrectAllowRulesType) {
113 const char* authz_policy =
115 " \"name\": \"authz\","
116 " \"allow_rules\": {}"
120 EXPECT_EQ(rbac_policies.status().message(),
121 "\"allow_rules\" is not an array.");
124 TEST(GenerateRbacPoliciesTest, IncorrectDenyRulesType) {
125 const char* authz_policy =
127 " \"name\": \"authz\","
128 " \"deny_rules\": 123"
132 EXPECT_EQ(rbac_policies.status().message(),
133 "\"deny_rules\" is not an array.");
136 TEST(GenerateRbacPoliciesTest, IncorrectRuleType) {
137 const char* authz_policy =
139 " \"name\": \"authz\","
140 " \"allow_rules\": [\"rule-a\"]"
144 EXPECT_EQ(rbac_policies.status().message(),
145 "allow_rules 0: is not an object.");
148 TEST(GenerateRbacPoliciesTest, MissingRuleNameField) {
149 const char* authz_policy =
151 " \"name\": \"authz\","
152 " \"allow_rules\": [{}]"
156 EXPECT_EQ(rbac_policies.status().message(),
157 "allow_rules 0: \"name\" is not present.");
160 TEST(GenerateRbacPoliciesTest, IncorrectRuleNameType) {
161 const char* authz_policy =
163 " \"name\": \"authz\","
164 " \"allow_rules\": ["
172 EXPECT_EQ(rbac_policies.status().message(),
173 "allow_rules 0: \"name\" is not a string.");
176 TEST(GenerateRbacPoliciesTest, MissingSourceAndRequest) {
177 const char* authz_policy =
179 " \"name\": \"authz\","
180 " \"allow_rules\": ["
182 " \"name\": \"allow_policy\""
190 rbac_policies.value().allow_policy.policies,
192 "authz_allow_policy",
204 TEST(GenerateRbacPoliciesTest, EmptySourceAndRequest) {
205 const char* authz_policy =
207 " \"name\": \"authz\","
208 " \"allow_rules\": ["
210 " \"name\": \"allow_policy\","
220 rbac_policies.value().allow_policy.policies,
222 "authz_allow_policy",
234 TEST(GenerateRbacPoliciesTest, IncorrectSourceType) {
235 const char* authz_policy =
237 " \"name\": \"authz\","
238 " \"allow_rules\": ["
240 " \"name\": \"allow_policy\","
247 EXPECT_EQ(rbac_policies.status().message(),
248 "allow_rules 0: \"source\" is not an object.");
251 TEST(GenerateRbacPoliciesTest, IncorrectPrincipalsType) {
252 const char* authz_policy =
254 " \"name\": \"authz\","
255 " \"allow_rules\": ["
257 " \"name\": \"allow_policy\","
269 EXPECT_EQ(rbac_policies.status().message(),
270 "allow_rules 0: \"principals\" 1: is not a string.");
273 TEST(GenerateRbacPoliciesTest, ParseSourceSuccess) {
274 const char* authz_policy =
276 " \"name\": \"authz\","
277 " \"allow_rules\": ["
279 " \"name\": \"allow_policy\","
282 " \"spiffe://foo.abc\","
283 " \"spiffe://bar*\","
285 " \"spiffe://abc.*.com\""
292 " \"name\": \"deny_policy\","
304 EXPECT_THAT(rbac_policies.value().allow_policy.policies,
306 "authz_allow_policy",
328 "spiffe://foo.abc",
false),
331 "spiffe://bar",
false),
337 "spiffe://abc.*.com",
341 rbac_policies.value().deny_policy.policies,
367 TEST(GenerateRbacPoliciesTest, IncorrectRequestType) {
368 const char* authz_policy =
370 " \"name\": \"authz\","
373 " \"name\": \"deny_policy\","
380 EXPECT_EQ(rbac_policies.status().message(),
381 "deny_rules 0: \"request\" is not an object.");
384 TEST(GenerateRbacPoliciesTest, IncorrectPathType) {
385 const char* authz_policy =
387 " \"name\": \"authz\","
390 " \"name\": \"allow_policy\","
402 EXPECT_EQ(rbac_policies.status().message(),
403 "deny_rules 0: \"paths\" 1: is not a string.");
406 TEST(GenerateRbacPoliciesTest, ParseRequestPathsSuccess) {
407 const char* authz_policy =
409 " \"name\": \"authz\","
410 " \"allow_rules\": ["
412 " \"name\": \"allow_policy\","
422 " \"name\": \"deny_policy\","
437 rbac_policies.value().deny_policy.policies,
464 "baz",
false)))))))))))));
467 rbac_policies.value().allow_policy.policies,
469 "authz_allow_policy",
493 TEST(GenerateRbacPoliciesTest, IncorrectHeaderType) {
494 const char* authz_policy =
496 " \"name\": \"authz\","
499 " \"name\": \"allow_policy\","
510 EXPECT_EQ(rbac_policies.status().message(),
511 "deny_rules 0: \"headers\" 0: is not an object.");
514 TEST(GenerateRbacPoliciesTest, UnsupportedGrpcHeaders) {
515 const char* authz_policy =
517 " \"name\": \"authz\","
520 " \"name\": \"policy\","
524 " \"key\": \"grpc-xxx\","
536 EXPECT_EQ(rbac_policies.status().message(),
537 "deny_rules 0: \"headers\" 0: Unsupported \"key\" grpc-xxx.");
540 TEST(GenerateRbacPoliciesTest, UnsupportedPseudoHeaders) {
541 const char* authz_policy =
543 " \"name\": \"authz\","
544 " \"allow_rules\": ["
546 " \"name\": \"policy\","
550 " \"key\": \":method\","
562 EXPECT_EQ(rbac_policies.status().message(),
563 "allow_rules 0: \"headers\" 0: Unsupported \"key\" :method.");
566 TEST(GenerateRbacPoliciesTest, UnsupportedHostHeader) {
567 const char* authz_policy =
569 " \"name\": \"authz\","
570 " \"allow_rules\": ["
572 " \"name\": \"policy\","
576 " \"key\": \"Host\","
588 EXPECT_EQ(rbac_policies.status().message(),
589 "allow_rules 0: \"headers\" 0: Unsupported \"key\" Host.");
592 TEST(GenerateRbacPoliciesTest, EmptyHeaderValuesList) {
593 const char* authz_policy =
595 " \"name\": \"authz\","
596 " \"allow_rules\": ["
598 " \"name\": \"allow_policy_1\","
602 " \"key\": \"key-a\","
613 EXPECT_EQ(rbac_policies.status().message(),
614 "allow_rules 0: \"headers\" 0: \"values\" list is empty.");
617 TEST(GenerateRbacPoliciesTest, ParseRequestHeadersSuccess) {
618 const char* authz_policy =
620 " \"name\": \"authz\","
621 " \"allow_rules\": ["
623 " \"name\": \"allow_policy\","
627 " \"key\": \"key-1\","
633 " \"key\": \"key-2\","
648 EXPECT_TRUE(rbac_policies.value().deny_policy.policies.empty());
651 rbac_policies.value().allow_policy.policies,
653 "authz_allow_policy",
692 EqualsHeader(
"key-2",
706 false)))))))))))))))));
709 TEST(GenerateRbacPoliciesTest, ParseRulesArraySuccess) {
710 const char* authz_policy =
712 " \"name\": \"authz\","
713 " \"allow_rules\": ["
715 " \"name\": \"allow_policy_1\","
718 " \"spiffe://foo.abc\""
728 " \"name\": \"allow_policy_2\""
735 EXPECT_TRUE(rbac_policies.value().deny_policy.policies.empty());
738 rbac_policies.value().allow_policy.policies,
741 "authz_allow_policy_1",
778 "authz_allow_policy_2",
792 int main(
int argc,
char** argv) {