1+ #pragma once
2+
3+ #include " pch.h"
4+
5+ #include < enforcer.h>
6+ #include < exception.h>
7+ #include < rbac.h>
8+ #include < util.h>
9+
10+ using namespace std ;
11+
12+ namespace test_rbac_api_with_domains
13+ {
14+ TEST_CLASS (TestRBACAPIWithDomains)
15+ {
16+ public:
17+
18+ TEST_METHOD (TestGetImplicitRolesForDomainUser) {
19+ Enforcer* e = Enforcer::NewEnforcer (" ../../examples/rbac_with_domains_model.conf" , " ../../examples/rbac_with_hierarchy_with_domains_policy.csv" );
20+
21+ // This is only able to retrieve the first level of roles.
22+ Assert::IsTrue (ArrayEquals ({ " role:global_admin" }, e->GetRolesForUserInDomain (" alice" , { " domain1" })));
23+
24+ // Retrieve all inherit roles. It supports domains as well.
25+ Assert::IsTrue (ArrayEquals (vector<string>{" role:global_admin" , " role:reader" , " role:writer" }, e->GetImplicitRolesForUser (" alice" , {" domain1" })));
26+ }
27+
28+ // TestUserAPIWithDomains: Add by Gordon
29+ TEST_METHOD (TestUserAPIWithDomains) {
30+ Enforcer* e = Enforcer::NewEnforcer (" ../../examples/rbac_with_domains_model.conf" , " ../../examples/rbac_with_domains_policy.csv" );
31+
32+ Assert::IsTrue (ArrayEquals ({ " alice" }, e->GetUsersForRole (" admin" , { " domain1" })));
33+ Assert::IsTrue (ArrayEquals ({ " alice" }, e->GetUsersForRoleInDomain (" admin" , { " domain1" })));
34+
35+ try {
36+ e->GetUsersForRole (" non_exist" , { " domain1" });
37+ }
38+ catch (CasbinRBACException e) {
39+ Assert::IsTrue (true );
40+ }
41+ try {
42+ e->GetUsersForRoleInDomain (" non_exist" , { " domain1" });
43+ }
44+ catch (CasbinRBACException e) {
45+ Assert::IsTrue (true );
46+ }
47+
48+ Assert::IsTrue (ArrayEquals ({ " bob" }, e->GetUsersForRole (" admin" , { " domain2" })));
49+ Assert::IsTrue (ArrayEquals ({ " bob" }, e->GetUsersForRoleInDomain (" admin" , { " domain2" })));
50+
51+ try {
52+ e->GetUsersForRole (" non_exist" , { " domain2" });
53+ }
54+ catch (CasbinRBACException e) {
55+ Assert::IsTrue (true );
56+ }
57+ try {
58+ e->GetUsersForRoleInDomain (" non_exist" , { " domain2" });
59+ }
60+ catch (CasbinRBACException e) {
61+ Assert::IsTrue (true );
62+ }
63+
64+ e->DeleteRoleForUserInDomain (" alice" , " admin" , " domain1" );
65+ e->AddRoleForUserInDomain (" bob" , " admin" , " domain1" );
66+
67+ Assert::IsTrue (ArrayEquals ({ " bob" }, e->GetUsersForRole (" admin" , { " domain1" })));
68+ Assert::IsTrue (ArrayEquals ({ " bob" }, e->GetUsersForRoleInDomain (" admin" , { " domain1" })));
69+
70+ try {
71+ e->GetUsersForRole (" non_exist" , { " domain1" });
72+ }
73+ catch (CasbinRBACException e) {
74+ Assert::IsTrue (true );
75+ }
76+ try {
77+ e->GetUsersForRoleInDomain (" non_exist" , { " domain1" });
78+ }
79+ catch (CasbinRBACException e) {
80+ Assert::IsTrue (true );
81+ }
82+
83+ Assert::IsTrue (ArrayEquals ({ " bob" }, e->GetUsersForRole (" admin" , { " domain2" })));
84+ Assert::IsTrue (ArrayEquals ({ " bob" }, e->GetUsersForRoleInDomain (" admin" , { " domain2" })));
85+
86+ try {
87+ e->GetUsersForRole (" non_exist" , { " domain2" });
88+ }
89+ catch (CasbinRBACException e) {
90+ Assert::IsTrue (true );
91+ }
92+ try {
93+ e->GetUsersForRoleInDomain (" non_exist" , { " domain2" });
94+ }
95+ catch (CasbinRBACException e) {
96+ Assert::IsTrue (true );
97+ }
98+ }
99+
100+ TEST_METHOD (TestRoleAPIWithDomains) {
101+ Enforcer* e = Enforcer::NewEnforcer (" ../../examples/rbac_with_domains_model.conf" , " ../../examples/rbac_with_domains_policy.csv" );
102+
103+ Assert::IsTrue (ArrayEquals ({ " admin" }, e->GetRolesForUser (" alice" , { " domain1" })));
104+ Assert::IsTrue (ArrayEquals ({ " admin" }, e->GetRolesForUserInDomain (" alice" , { " domain1" })));
105+
106+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUser (" bob" , { " domain1" })));
107+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUserInDomain (" bob" , { " domain1" })));
108+
109+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUser (" admin" , { " domain1" })));
110+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUserInDomain (" admin" , { " domain1" })));
111+
112+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUser (" non_exist" , { " domain1" })));
113+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUserInDomain (" non_exist" , { " domain1" })));
114+
115+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUser (" alice" , { " domain2" })));
116+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUserInDomain (" alice" , { " domain2" })));
117+
118+ Assert::IsTrue (ArrayEquals ({ " admin" }, e->GetRolesForUser (" bob" , { " domain2" })));
119+ Assert::IsTrue (ArrayEquals ({ " admin" }, e->GetRolesForUserInDomain (" bob" , { " domain2" })));
120+
121+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUser (" admin" , { " domain2" })));
122+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUserInDomain (" admin" , { " domain2" })));
123+
124+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUser (" non_exist" , { " domain2" })));
125+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUserInDomain (" non_exist" , { " domain2" })));
126+
127+ e->DeleteRoleForUserInDomain (" alice" , " admin" , " domain1" );
128+ e->AddRoleForUserInDomain (" bob" , " admin" , " domain1" );
129+
130+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUser (" alice" , { " domain1" })));
131+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUserInDomain (" alice" , { " domain1" })));
132+
133+ Assert::IsTrue (ArrayEquals ({ " admin" }, e->GetRolesForUser (" bob" , { " domain1" })));
134+ Assert::IsTrue (ArrayEquals ({ " admin" }, e->GetRolesForUserInDomain (" bob" , { " domain1" })));
135+
136+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUser (" admin" , { " domain1" })));
137+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUserInDomain (" admin" , { " domain1" })));
138+
139+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUser (" non_exist" , { " domain1" })));
140+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUserInDomain (" non_exist" , { " domain1" })));
141+
142+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUser (" alice" , { " domain2" })));
143+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUserInDomain (" alice" , { " domain2" })));
144+
145+ Assert::IsTrue (ArrayEquals ({ " admin" }, e->GetRolesForUser (" bob" , { " domain2" })));
146+ Assert::IsTrue (ArrayEquals ({ " admin" }, e->GetRolesForUserInDomain (" bob" , { " domain2" })));
147+
148+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUser (" admin" , { " domain2" })));
149+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUserInDomain (" admin" , { " domain2" })));
150+
151+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUser (" non_exist" , { " domain2" })));
152+ Assert::IsTrue (ArrayEquals ({ }, e->GetRolesForUserInDomain (" non_exist" , { " domain2" })));
153+ }
154+
155+ void TestGetPermissionsInDomain (Enforcer* e, string name, string domain, vector<vector<string>> res) {
156+ vector<vector<string>> my_res = e->GetPermissionsForUserInDomain (name, { domain });
157+
158+ int count = 0 ;
159+ for (int i = 0 ; i < my_res.size (); i++) {
160+ for (int j = 0 ; j < res.size (); j++) {
161+ if (ArrayEquals (res[j], my_res[i])) {
162+ count += 1 ;
163+ break ;
164+ }
165+ }
166+ }
167+
168+ Assert::AreEqual (int (res.size ()), count);
169+ }
170+
171+ TEST_METHOD (TestPermissionAPIInDomain) {
172+ Enforcer* e = Enforcer::NewEnforcer (" ../../examples/rbac_with_domains_model.conf" , " ../../examples/rbac_with_domains_policy.csv" );
173+
174+ TestGetPermissionsInDomain (e, " alice" , " domain1" , {});
175+ TestGetPermissionsInDomain (e, " bob" , " domain1" , {});
176+ TestGetPermissionsInDomain (e, " admin" , " domain1" , { {" admin" , " domain1" , " data1" , " read" }, {" admin" , " domain1" , " data1" , " write" } });
177+ TestGetPermissionsInDomain (e, " non_exist" , " domain1" , {});
178+
179+ TestGetPermissionsInDomain (e, " alice" , " domain2" , {});
180+ TestGetPermissionsInDomain (e, " bob" , " domain2" , {});
181+ TestGetPermissionsInDomain (e, " admin" , " domain2" , { {" admin" , " domain2" , " data2" , " read" }, {" admin" , " domain2" , " data2" , " write" } });
182+ TestGetPermissionsInDomain (e, " non_exist" , " domain2" , {});
183+ }
184+ };
185+ }
0 commit comments