1+ #pragma once
2+
3+ #include " pch.h"
4+
5+ #include < direct.h>
6+ #include < algorithm>
7+ #include < fstream>
8+
9+ #include < enforcer.h>
10+ #include < persist.h>
11+ #include < config.h>
12+ #include < util.h>
13+ #include < exception.h>
14+
15+ using namespace std ;
16+
17+ namespace test_management_api
18+ {
19+ TEST_CLASS (TestManagementAPI)
20+ {
21+ public:
22+
23+ string basic_example;
24+ Config* basic_config;
25+
26+ TEST_METHOD_INITIALIZE (InitializeBasicConfig) {
27+ basic_example = filePath (" ../examples/basic_model.conf" );
28+ basic_config = Config::NewConfig (basic_example);
29+ }
30+
31+ string filePath (string filepath) {
32+ char * root = _getcwd (NULL , 0 );
33+ string rootStr = string (root);
34+
35+ vector <string> directories = Split (rootStr, " \\ " , -1 );
36+ vector<string>::iterator it = find (directories.begin (), directories.end (), " x64" );
37+ vector <string> left{ *(it - 1 ) };
38+ it = find_end (directories.begin (), directories.end (), left.begin (), left.end ());
39+ int index = int (directories.size () + (it - directories.end ()));
40+
41+ vector <string> finalDirectories (directories.begin (), directories.begin () + index + 1 );
42+
43+ vector<string> userD = Split (filepath, " /" , -1 );
44+ for (int i = 1 ; i < userD.size (); i++)
45+ finalDirectories.push_back (userD[i]);
46+
47+ string filepath1 = finalDirectories[0 ];
48+ for (int i = 1 ; i < finalDirectories.size (); i++)
49+ filepath1 = filepath1 + " /" + finalDirectories[i];
50+ return filepath1;
51+ }
52+
53+ TEST_METHOD (TestGetList) {
54+ string model = filePath (" ../examples/rbac_model.conf" );
55+ string policy = filePath (" ../examples/rbac_policy.csv" );
56+ Enforcer* e = Enforcer :: NewEnforcer (model, policy);
57+
58+ Assert::IsTrue (ArrayEquals (vector<string>{ " alice" , " bob" , " data2_admin" }, e->GetAllSubjects ()));
59+ Assert::IsTrue (ArrayEquals (vector<string>{ " data1" , " data2" }, e->GetAllObjects ()));
60+ Assert::IsTrue (ArrayEquals (vector<string>{ " read" , " write" }, e->GetAllActions ()));
61+ Assert::IsTrue (ArrayEquals (vector<string>{ " data2_admin" }, e->GetAllRoles ()));
62+ }
63+
64+ void TestGetPolicy (Enforcer* e, vector<vector<string>> res) {
65+ vector<vector<string>> my_res;
66+ my_res = e->GetPolicy ();
67+
68+ int count = 0 ;
69+ for (int i = 0 ; i < my_res.size (); i++) {
70+ for (int j = 0 ; j < res.size (); j++) {
71+ if (ArrayEquals (my_res[i], res[j]))
72+ count++;
73+ }
74+ }
75+
76+ if (count == res.size ())
77+ Assert::IsTrue (true );
78+ }
79+
80+ void TestGetFilteredPolicy (Enforcer* e, int field_index, vector<vector<string>> res, vector<string> field_values) {
81+ vector<vector<string>> my_res = e->GetFilteredPolicy (field_index, field_values);
82+ for (int i = 0 ; i < res.size (); i++) {
83+ Assert::IsTrue (ArrayEquals (my_res[i], res[i]));
84+ }
85+ }
86+
87+ void TestGetGroupingPolicy (Enforcer* e, vector<vector<string>> res) {
88+ vector<vector<string>> my_res = e->GetGroupingPolicy ();
89+
90+ for (int i = 0 ; i < my_res.size (); i++) {
91+ Assert::IsTrue (ArrayEquals (my_res[i], res[i]));
92+ }
93+ }
94+
95+ void TestGetFilteredGroupingPolicy (Enforcer* e, int field_index, vector<vector<string>> res, vector<string> field_values) {
96+ vector<vector<string>> my_res = e->GetFilteredGroupingPolicy (field_index, field_values);
97+
98+ for (int i = 0 ; i < my_res.size (); i++) {
99+ Assert::IsTrue (ArrayEquals (my_res[i], res[i]));
100+ }
101+ }
102+
103+ void TestHasPolicy (Enforcer* e, vector<string> policy, bool res) {
104+ bool my_res = e->HasPolicy (policy);
105+ Assert::AreEqual (res, my_res);
106+ }
107+
108+ void TestHasGroupingPolicy (Enforcer* e, vector<string> policy, bool res) {
109+ bool my_res = e->HasGroupingPolicy (policy);
110+ Assert::AreEqual (res, my_res);
111+ }
112+
113+ TEST_METHOD (TestGetPolicyAPI) {
114+ string model = filePath (" ../examples/rbac_model.conf" );
115+ string policy = filePath (" ../examples/rbac_policy.csv" );
116+ Enforcer* e = Enforcer::NewEnforcer (model, policy);
117+
118+ TestGetPolicy (e, vector<vector<string>>{
119+ {" alice" , " data1" , " read" },
120+ { " bob" , " data2" , " write" },
121+ { " data2_admin" , " data2" , " read" },
122+ { " data2_admin" , " data2" , " write" }});
123+
124+ TestGetFilteredPolicy (e, 0 , vector<vector<string>>{ {" alice" , " data1" , " read" } }, vector<string>{" alice" });
125+ TestGetFilteredPolicy (e, 0 , vector<vector<string>>{ {" bob" , " data2" , " write" }}, vector<string>{" bob" });
126+ TestGetFilteredPolicy (e, 0 , vector<vector<string>>{ {" data2_admin" , " data2" , " read" }, { " data2_admin" , " data2" , " write" }}, vector<string>{" data2_admin" });
127+ TestGetFilteredPolicy (e, 1 , vector<vector<string>>{ {" alice" , " data1" , " read" }}, vector<string>{" data1" });
128+ TestGetFilteredPolicy (e, 1 , vector<vector<string>>{ {" bob" , " data2" , " write" }, { " data2_admin" , " data2" , " read" }, { " data2_admin" , " data2" , " write" }}, vector<string>{" data2" });
129+ TestGetFilteredPolicy (e, 2 , vector<vector<string>>{ {" alice" , " data1" , " read" }, { " data2_admin" , " data2" , " read" }}, vector<string>{" read" });
130+ TestGetFilteredPolicy (e, 2 , vector<vector<string>>{ {" bob" , " data2" , " write" }, { " data2_admin" , " data2" , " write" }}, vector<string>{" write" });
131+
132+ TestGetFilteredPolicy (e, 0 , vector<vector<string>>{ {" data2_admin" , " data2" , " read" }, { " data2_admin" , " data2" , " write" }}, vector<string>{" data2_admin" , " data2" });
133+ // Note: "" (empty string) in fieldValues means matching all values.
134+ TestGetFilteredPolicy (e, 0 , vector<vector<string>>{ {" data2_admin" , " data2" , " read" }}, vector<string>{" data2_admin" , " " , " read" });
135+ TestGetFilteredPolicy (e, 1 , vector<vector<string>>{ {" bob" , " data2" , " write" }, { " data2_admin" , " data2" , " write" }}, vector<string>{" data2" , " write" });
136+
137+ TestHasPolicy (e, vector<string>{" alice" , " data1" , " read" }, true );
138+ TestHasPolicy (e, vector<string>{" bob" , " data2" , " write" }, true );
139+ TestHasPolicy (e, vector<string>{" alice" , " data2" , " read" }, false );
140+ TestHasPolicy (e, vector<string>{" bob" , " data3" , " write" }, false );
141+
142+ TestGetGroupingPolicy (e, vector<vector<string>>{ {" alice" , " data2_admin" }});
143+
144+ TestGetFilteredGroupingPolicy (e, 0 , vector<vector<string>>{ {" alice" , " data2_admin" }}, vector < string>{" alice" });
145+ TestGetFilteredGroupingPolicy (e, 0 , vector<vector<string>>{}, vector < string>{" bob" });
146+ TestGetFilteredGroupingPolicy (e, 1 , vector<vector<string>>{}, vector<string>{" data1_admin" });
147+ TestGetFilteredGroupingPolicy (e, 1 , vector<vector<string>>{ {" alice" , " data2_admin" }}, vector<string>{" data2_admin" });
148+ // Note: "" (empty string) in fieldValues means matching all values.
149+ TestGetFilteredGroupingPolicy (e, 0 , vector<vector<string>>{ {" alice" , " data2_admin" }}, vector<string>{" " , " data2_admin" });
150+
151+ TestHasGroupingPolicy (e, vector<string>{" alice" , " data2_admin" }, true );
152+ TestHasGroupingPolicy (e, vector<string>{" bob" , " data2_admin" }, false );
153+ }
154+
155+
156+ TEST_METHOD (TestModifyPolicyAPI) {
157+ string model = filePath (" ../examples/rbac_model.conf" );
158+ string policy = filePath (" ../examples/rbac_policy.csv" );
159+ Adapter* adapter = BatchFileAdapter::NewAdapter (policy);
160+ Enforcer* e = Enforcer::NewEnforcer (model, adapter);
161+
162+ TestGetPolicy (e, vector<vector<string>>{
163+ {" alice" , " data1" , " read" },
164+ { " bob" , " data2" , " write" },
165+ { " data2_admin" , " data2" , " read" },
166+ { " data2_admin" , " data2" , " write" }});
167+
168+ e->RemovePolicy (vector<string>{" alice" , " data1" , " read" });
169+ e->RemovePolicy (vector<string>{" bob" , " data2" , " write" });
170+ e->RemovePolicy (vector<string>{" alice" , " data1" , " read" });
171+ e->AddPolicy (vector<string>{" eve" , " data3" , " read" });
172+ e->AddPolicy (vector<string>{" eve" , " data3" , " read" });
173+
174+ vector<vector<string>>rules{
175+ {" jack" , " data4" , " read" },
176+ {" katy" , " data4" , " write" },
177+ {" leyo" , " data4" , " read" },
178+ {" ham" , " data4" , " write" },
179+ };
180+
181+ e->AddPolicies (rules);
182+ e->AddPolicies (rules);
183+
184+ TestGetPolicy (e, vector<vector<string>>{
185+ {" data2_admin" , " data2" , " read" },
186+ { " data2_admin" , " data2" , " write" },
187+ { " eve" , " data3" , " read" },
188+ { " jack" , " data4" , " read" },
189+ { " katy" , " data4" , " write" },
190+ { " leyo" , " data4" , " read" },
191+ { " ham" , " data4" , " write" }});
192+
193+ e->RemovePolicies (rules);
194+ e->RemovePolicies (rules);
195+
196+ vector<string>named_policy{ " eve" , " data3" , " read" };
197+ e->RemoveNamedPolicy (" p" , named_policy);
198+ e->AddNamedPolicy (" p" , named_policy);
199+
200+ TestGetPolicy (e, vector<vector<string>>{
201+ {" data2_admin" , " data2" , " read" },
202+ { " data2_admin" , " data2" , " write" },
203+ { " eve" , " data3" , " read" }});
204+
205+ e->RemoveFilteredPolicy (1 , vector<string>{" data2" });
206+
207+ TestGetPolicy (e, vector<vector<string>>{ {" eve" , " data3" , " read" }});
208+ }
209+
210+ TEST_METHOD (TestModifyGroupingPolicyAPI) {
211+ string model = filePath (" ../examples/rbac_model.conf" );
212+ string policy = filePath (" ../examples/rbac_policy.csv" );
213+ Adapter* adapter = BatchFileAdapter::NewAdapter (policy);
214+ Enforcer* e = Enforcer::NewEnforcer (model, adapter);
215+
216+ Assert::IsTrue (ArrayEquals (vector<string>{" data2_admin" }, e->GetRolesForUser (" alice" , vector<string>{})));
217+ Assert::IsTrue (ArrayEquals (vector<string>{}, e->GetRolesForUser (" bob" , vector<string>{})));
218+ Assert::IsTrue (ArrayEquals (vector<string>{}, e->GetRolesForUser (" eve" , vector<string>{})));
219+ Assert::IsTrue (ArrayEquals (vector<string>{}, e->GetRolesForUser (" non_exist" , vector<string>{})));
220+
221+ e->RemoveGroupingPolicy (vector<string>{" alice" , " data2_admin" });
222+ e->AddGroupingPolicy (vector<string>{" bob" , " data1_admin" });
223+ e->AddGroupingPolicy (vector<string>{" eve" , " data3_admin" });
224+
225+ vector<vector<string>> grouping_rules{
226+ {" ham" , " data4_admin" },
227+ {" jack" , " data5_admin" },
228+ };
229+
230+ e->AddGroupingPolicies (grouping_rules);
231+ Assert::IsTrue (ArrayEquals (vector<string>{" data4_admin" }, e->GetRolesForUser (" ham" , vector<string>{})));
232+ Assert::IsTrue (ArrayEquals (vector<string>{" data5_admin" }, e->GetRolesForUser (" jack" , vector<string>{})));
233+ e->RemoveGroupingPolicies (grouping_rules);
234+
235+ Assert::IsTrue (ArrayEquals (vector<string>{}, e->GetRolesForUser (" alice" , vector<string>{})));
236+ vector<string> named_grouping_policy{ " alice" , " data2_admin" };
237+ Assert::IsTrue (ArrayEquals (vector<string>{}, e->GetRolesForUser (" alice" , vector<string>{})));
238+ e->AddNamedGroupingPolicy (" g" , named_grouping_policy);
239+ Assert::IsTrue (ArrayEquals (vector<string>{" data2_admin" }, e->GetRolesForUser (" alice" , vector<string>{})));
240+ e->RemoveNamedGroupingPolicy (" g" , named_grouping_policy);
241+
242+ e->AddNamedGroupingPolicies (" g" , grouping_rules);
243+ e->AddNamedGroupingPolicies (" g" , grouping_rules);
244+ Assert::IsTrue (ArrayEquals (vector<string>{" data4_admin" }, e->GetRolesForUser (" ham" , vector<string>{})));
245+ Assert::IsTrue (ArrayEquals (vector<string>{" data5_admin" }, e->GetRolesForUser (" jack" , vector<string>{})));
246+ e->RemoveNamedGroupingPolicies (" g" , grouping_rules);
247+ e->RemoveNamedGroupingPolicies (" g" , grouping_rules);
248+
249+ Assert::IsTrue (ArrayEquals (vector<string>{}, e->GetRolesForUser (" alice" , vector<string>{})));
250+ Assert::IsTrue (ArrayEquals (vector<string>{" data1_admin" }, e->GetRolesForUser (" bob" , vector<string>{})));
251+ Assert::IsTrue (ArrayEquals (vector<string>{" data3_admin" }, e->GetRolesForUser (" eve" , vector<string>{})));
252+ Assert::IsTrue (ArrayEquals (vector<string>{}, e->GetRolesForUser (" non_exist" , vector<string>{})));
253+
254+ Assert::IsTrue (ArrayEquals (vector<string>{" bob" }, e->GetUsersForRole (" data1_admin" , vector<string>{})));
255+ try {
256+ e->GetUsersForRole (" data2_admin" , vector<string>{});
257+ }
258+ catch (CasbinRBACException e) {
259+ Assert::IsTrue (true );
260+ }
261+ Assert::IsTrue (ArrayEquals (vector<string>{" eve" }, e->GetUsersForRole (" data3_admin" , vector<string>{})));
262+
263+ e->RemoveFilteredGroupingPolicy (0 , vector<string>{" bob" });
264+
265+ Assert::IsTrue (ArrayEquals (vector<string>{}, e->GetRolesForUser (" alice" , vector<string>{})));
266+ Assert::IsTrue (ArrayEquals (vector<string>{}, e->GetRolesForUser (" bob" , vector<string>{})));
267+ Assert::IsTrue (ArrayEquals (vector<string>{" data3_admin" }, e->GetRolesForUser (" eve" , vector<string>{})));
268+ Assert::IsTrue (ArrayEquals (vector<string>{}, e->GetRolesForUser (" non_exist" , vector<string>{})));
269+
270+ try {
271+ e->GetUsersForRole (" data1_admin" , vector<string>{});
272+ }
273+ catch (CasbinRBACException e) {
274+ Assert::IsTrue (true );
275+ }
276+ try {
277+ e->GetUsersForRole (" data2_admin" , vector<string>{});
278+ }
279+ catch (CasbinRBACException e) {
280+ Assert::IsTrue (true );
281+ }
282+ Assert::IsTrue (ArrayEquals (vector<string>{" eve" }, e->GetUsersForRole (" data3_admin" , vector<string>{})));
283+ }
284+ };
285+ }
0 commit comments