Skip to content

Commit 253ab24

Browse files
committed
feat: add management api tests and fix enforcer warnings.
Signed-off-by: DivyPatel9881 <[email protected]>
1 parent 3325cdb commit 253ab24

File tree

5 files changed

+292
-3
lines changed

5 files changed

+292
-3
lines changed

casbin/enforcer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -483,8 +483,8 @@ bool Enforcer::EnforceWithMatcher(string matcher, string sub, string dom, string
483483
bool Enforcer::EnforceWithMatcher(string matcher, vector<string> params) {
484484
vector <string> r_tokens = this->model->m["r"].assertion_map["r"]->tokens;
485485

486-
int r_cnt = r_tokens.size();
487-
int cnt = params.size();
486+
int r_cnt = int(r_tokens.size());
487+
int cnt = int(params.size());
488488

489489
if (cnt != r_cnt)
490490
return false;

casbin/model/assertion.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,5 +77,5 @@ void Assertion :: BuildRoleLinks(RoleManager* rm) {
7777

7878
// LogUtil :: LogPrint("Role links for: " + Key);
7979

80-
this->rm->PrintRoles();
80+
//this->rm->PrintRoles();
8181
}

test/test.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@
168168
<ClCompile Include="test_built_in_functions.cpp" />
169169
<ClCompile Include="test_config.cpp" />
170170
<ClCompile Include="test_enforcer.cpp" />
171+
<ClCompile Include="test_management_api.cpp" />
171172
<ClCompile Include="test_model.cpp" />
172173
<ClCompile Include="test_model_enforcer.cpp" />
173174
<ClCompile Include="test_role_manager.cpp" />

test/test.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@
3939
<ClCompile Include="test_enforcer.cpp">
4040
<Filter>Source Files</Filter>
4141
</ClCompile>
42+
<ClCompile Include="test_management_api.cpp">
43+
<Filter>Source Files</Filter>
44+
</ClCompile>
4245
</ItemGroup>
4346
<ItemGroup>
4447
<ClInclude Include="pch.h">

test/test_management_api.cpp

Lines changed: 285 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,285 @@
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

Comments
 (0)