Skip to content

Commit 5c684ce

Browse files
committed
feat: added tests for UpdatePolicy
Signed-off-by: EmperorYP7 <[email protected]>
1 parent ae0f347 commit 5c684ce

File tree

6 files changed

+122
-73
lines changed

6 files changed

+122
-73
lines changed

casbin/casbin.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@
273273
<ClInclude Include="model\model.h" />
274274
<ClInclude Include="model\pch.h" />
275275
<ClInclude Include="model\scope_config.h" />
276+
<ClInclude Include="pch.h" />
276277
<ClInclude Include="persist.h" />
277278
<ClInclude Include="persist\adapter.h" />
278279
<ClInclude Include="persist\batch_adapter.h" />
@@ -286,6 +287,7 @@
286287
<ClInclude Include="persist\pch.h" />
287288
<ClInclude Include="persist\watcher.h" />
288289
<ClInclude Include="persist\watcher_ex.h" />
290+
<ClInclude Include="persist\watcher_update.h" />
289291
<ClInclude Include="rbac.h" />
290292
<ClInclude Include="rbac\default_role_manager.h" />
291293
<ClInclude Include="rbac\pch.h" />

casbin/casbin.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,12 @@
494494
<ClInclude Include="log\Logger.h">
495495
<Filter>Header Files</Filter>
496496
</ClInclude>
497+
<ClInclude Include="pch.h">
498+
<Filter>Header Files</Filter>
499+
</ClInclude>
500+
<ClInclude Include="persist\watcher_update.h">
501+
<Filter>Header Files</Filter>
502+
</ClInclude>
497503
</ItemGroup>
498504
<ItemGroup>
499505
<None Include=".clang-format" />

casbin/log/logger.cpp renamed to casbin/logger.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
#ifndef LOGGER_CPP
44
#define LOGGER_CPP
55

6-
#include "Logger.h"
7-
#include "log_util.h"
6+
#include "./log/Logger.h"
7+
#include "./log/log_util.h"
88

99
namespace casbin {
1010

casbin/util/is_instance_of.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#include "./util.h"
2424
#include "../persist/watcher_ex.h"
25+
#include "../persist/watcher_update.h"
2526

2627
namespace casbin {
2728

@@ -31,6 +32,7 @@ bool IsInstanceOf(const T*) {
3132
}
3233

3334
template bool IsInstanceOf<class WatcherEx, class Watcher>(class Watcher const*);
35+
template bool IsInstanceOf<class WatcherUpdatable, class Watcher>(class Watcher const*);
3436

3537
} // namespace casbin
3638

casbin/util/ticker.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,15 @@
1414
* limitations under the License.
1515
*/
1616

17+
#include "pch.h"
18+
1719
#ifndef TICKER_H
1820
#define TICKER_H
1921

22+
#include <functional>
23+
#include <mutex>
24+
#include <chrono>
25+
#include <future>
2026

2127
namespace casbin {
2228

test/test_management_api.cpp

Lines changed: 104 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ namespace test_management_api
2323
std::string policy = "../../examples/rbac_policy.csv";
2424
Enforcer e = Enforcer(model, policy);
2525

26-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{ "alice", "bob", "data2_admin" }, e.GetAllSubjects()));
27-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{ "data1", "data2" }, e.GetAllObjects()));
28-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{ "read", "write" }, e.GetAllActions()));
29-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{ "data2_admin" }, e.GetAllRoles()));
26+
Assert::IsTrue(ArrayEquals({ "alice", "bob", "data2_admin" }, e.GetAllSubjects()));
27+
Assert::IsTrue(ArrayEquals({ "data1", "data2" }, e.GetAllObjects()));
28+
Assert::IsTrue(ArrayEquals({ "read", "write" }, e.GetAllActions()));
29+
Assert::IsTrue(ArrayEquals({ "data2_admin" }, e.GetAllRoles()));
3030
}
3131

3232
void TestGetPolicy(Enforcer e, std::vector<std::vector<std::string>> res) {
@@ -89,35 +89,35 @@ namespace test_management_api
8989
{ "data2_admin", "data2", "read" },
9090
{ "data2_admin", "data2", "write" }});
9191

92-
TestGetFilteredPolicy(e, 0, std::vector<std::vector<std::string>>{ {"alice", "data1", "read"} }, std::vector<std::string>{"alice"});
93-
TestGetFilteredPolicy(e, 0, std::vector<std::vector<std::string>>{ {"bob", "data2", "write"}}, std::vector<std::string>{"bob"});
94-
TestGetFilteredPolicy(e, 0, std::vector<std::vector<std::string>>{ {"data2_admin", "data2", "read"}, { "data2_admin", "data2", "write" }}, std::vector<std::string>{"data2_admin"});
95-
TestGetFilteredPolicy(e, 1, std::vector<std::vector<std::string>>{ {"alice", "data1", "read"}}, std::vector<std::string>{"data1"});
96-
TestGetFilteredPolicy(e, 1, std::vector<std::vector<std::string>>{ {"bob", "data2", "write"}, { "data2_admin", "data2", "read" }, { "data2_admin", "data2", "write" }}, std::vector<std::string>{"data2"});
97-
TestGetFilteredPolicy(e, 2, std::vector<std::vector<std::string>>{ {"alice", "data1", "read"}, { "data2_admin", "data2", "read" }}, std::vector<std::string>{"read"});
98-
TestGetFilteredPolicy(e, 2, std::vector<std::vector<std::string>>{ {"bob", "data2", "write"}, { "data2_admin", "data2", "write" }}, std::vector<std::string>{"write"});
92+
TestGetFilteredPolicy(e, 0, { {"alice", "data1", "read"} }, {"alice"});
93+
TestGetFilteredPolicy(e, 0, { {"bob", "data2", "write"}}, {"bob"});
94+
TestGetFilteredPolicy(e, 0, { {"data2_admin", "data2", "read"}, { "data2_admin", "data2", "write" }}, {"data2_admin"});
95+
TestGetFilteredPolicy(e, 1, { {"alice", "data1", "read"}}, {"data1"});
96+
TestGetFilteredPolicy(e, 1, { {"bob", "data2", "write"}, { "data2_admin", "data2", "read" }, { "data2_admin", "data2", "write" }}, {"data2"});
97+
TestGetFilteredPolicy(e, 2, { {"alice", "data1", "read"}, { "data2_admin", "data2", "read" }}, {"read"});
98+
TestGetFilteredPolicy(e, 2, { {"bob", "data2", "write"}, { "data2_admin", "data2", "write" }}, {"write"});
9999

100-
TestGetFilteredPolicy(e, 0, std::vector<std::vector<std::string>>{ {"data2_admin", "data2", "read"}, { "data2_admin", "data2", "write" }}, std::vector<std::string>{"data2_admin", "data2"});
100+
TestGetFilteredPolicy(e, 0, { {"data2_admin", "data2", "read"}, { "data2_admin", "data2", "write" }}, {"data2_admin", "data2"});
101101
// Note: "" (empty string) in fieldValues means matching all values.
102-
TestGetFilteredPolicy(e, 0, std::vector<std::vector<std::string>>{ {"data2_admin", "data2", "read"}}, std::vector<std::string>{"data2_admin", "", "read"});
103-
TestGetFilteredPolicy(e, 1, std::vector<std::vector<std::string>>{ {"bob", "data2", "write"}, { "data2_admin", "data2", "write" }}, std::vector<std::string>{"data2", "write"});
102+
TestGetFilteredPolicy(e, 0, { {"data2_admin", "data2", "read"}}, {"data2_admin", "", "read"});
103+
TestGetFilteredPolicy(e, 1, { {"bob", "data2", "write"}, { "data2_admin", "data2", "write" }}, {"data2", "write"});
104104

105-
TestHasPolicy(e, std::vector<std::string>{"alice", "data1", "read"}, true);
106-
TestHasPolicy(e, std::vector<std::string>{"bob", "data2", "write"}, true);
107-
TestHasPolicy(e, std::vector<std::string>{"alice", "data2", "read"}, false);
108-
TestHasPolicy(e, std::vector<std::string>{"bob", "data3", "write"}, false);
105+
TestHasPolicy(e, {"alice", "data1", "read"}, true);
106+
TestHasPolicy(e, {"bob", "data2", "write"}, true);
107+
TestHasPolicy(e, {"alice", "data2", "read"}, false);
108+
TestHasPolicy(e, {"bob", "data3", "write"}, false);
109109

110110
TestGetGroupingPolicy(e, std::vector<std::vector<std::string>>{ {"alice", "data2_admin"}});
111111

112-
TestGetFilteredGroupingPolicy(e, 0, std::vector<std::vector<std::string>>{{"alice", "data2_admin"}}, std::vector<std::string>{"alice"});
113-
TestGetFilteredGroupingPolicy(e, 0, std::vector<std::vector<std::string>>{}, std::vector<std::string>{"bob"});
114-
TestGetFilteredGroupingPolicy(e, 1, std::vector<std::vector<std::string>>{}, std::vector<std::string>{"data1_admin"});
115-
TestGetFilteredGroupingPolicy(e, 1, std::vector<std::vector<std::string>>{ {"alice", "data2_admin"}}, std::vector<std::string>{"data2_admin"});
112+
TestGetFilteredGroupingPolicy(e, 0, {{"alice", "data2_admin"}}, {"alice"});
113+
TestGetFilteredGroupingPolicy(e, 0, {}, {"bob"});
114+
TestGetFilteredGroupingPolicy(e, 1, {}, {"data1_admin"});
115+
TestGetFilteredGroupingPolicy(e, 1, { {"alice", "data2_admin"}}, {"data2_admin"});
116116
// Note: "" (empty string) in fieldValues means matching all values.
117-
TestGetFilteredGroupingPolicy(e, 0, std::vector<std::vector<std::string>>{ {"alice", "data2_admin"}}, std::vector<std::string>{"", "data2_admin"});
117+
TestGetFilteredGroupingPolicy(e, 0, { {"alice", "data2_admin"}}, {"", "data2_admin"});
118118

119-
TestHasGroupingPolicy(e, std::vector<std::string>{"alice", "data2_admin"}, true);
120-
TestHasGroupingPolicy(e, std::vector<std::string>{"bob", "data2_admin"}, false);
119+
TestHasGroupingPolicy(e, {"alice", "data2_admin"}, true);
120+
TestHasGroupingPolicy(e, {"bob", "data2_admin"}, false);
121121
}
122122

123123

@@ -127,19 +127,20 @@ namespace test_management_api
127127
std::shared_ptr<Adapter> adapter = std::shared_ptr<Adapter>(new BatchFileAdapter(policy));
128128
Enforcer e = Enforcer(model, adapter);
129129

130-
TestGetPolicy(e, std::vector<std::vector<std::string>>{
130+
TestGetPolicy(e, {
131131
{"alice", "data1", "read"},
132-
{ "bob", "data2", "write" },
133-
{ "data2_admin", "data2", "read" },
134-
{ "data2_admin", "data2", "write" }});
132+
{"bob", "data2", "write"},
133+
{"data2_admin", "data2", "read"},
134+
{"data2_admin", "data2", "write"}
135+
});
135136

136-
e.RemovePolicy(std::vector<std::string>{"alice", "data1", "read"});
137-
e.RemovePolicy(std::vector<std::string>{"bob", "data2", "write"});
138-
e.RemovePolicy(std::vector<std::string>{"alice", "data1", "read"});
139-
e.AddPolicy(std::vector<std::string>{"eve", "data3", "read"});
140-
e.AddPolicy(std::vector<std::string>{"eve", "data3", "read"});
137+
e.RemovePolicy({"alice", "data1", "read"});
138+
e.RemovePolicy({"bob", "data2", "write"});
139+
e.RemovePolicy({"alice", "data1", "read"});
140+
e.AddPolicy({"eve", "data3", "read"});
141+
e.AddPolicy({"eve", "data3", "read"});
141142

142-
std::vector<std::vector<std::string>>rules{
143+
std::vector<std::vector<std::string>> rules {
143144
{"jack", "data4", "read"},
144145
{"katy", "data4", "write"},
145146
{"leyo", "data4", "read"},
@@ -149,91 +150,113 @@ namespace test_management_api
149150
e.AddPolicies(rules);
150151
e.AddPolicies(rules);
151152

152-
TestGetPolicy(e, std::vector<std::vector<std::string>>{
153+
TestGetPolicy(e, {
153154
{"data2_admin", "data2", "read"},
154155
{ "data2_admin", "data2", "write" },
155156
{ "eve", "data3", "read" },
156157
{ "jack", "data4", "read" },
157158
{ "katy", "data4", "write" },
158159
{ "leyo", "data4", "read" },
159-
{ "ham", "data4", "write" }});
160+
{ "ham", "data4", "write" }
161+
});
160162

161163
e.RemovePolicies(rules);
162164
e.RemovePolicies(rules);
163165

164-
std::vector<std::string>named_policy{ "eve", "data3", "read" };
166+
std::vector<std::string> named_policy{ "eve", "data3", "read" };
165167
e.RemoveNamedPolicy("p", named_policy);
166168
e.AddNamedPolicy("p", named_policy);
167169

168-
TestGetPolicy(e, std::vector<std::vector<std::string>>{
170+
TestGetPolicy(e, {
169171
{"data2_admin", "data2", "read"},
170172
{ "data2_admin", "data2", "write" },
171-
{ "eve", "data3", "read" }});
173+
{ "eve", "data3", "read" }
174+
});
172175

173-
e.RemoveFilteredPolicy(1, std::vector<std::string>{"data2"});
176+
e.RemoveFilteredPolicy(1, {"data2"});
174177

175-
TestGetPolicy(e, std::vector<std::vector<std::string>>{ {"eve", "data3", "read"}});
178+
TestGetPolicy(e, { {"eve", "data3", "read"}});
179+
180+
e.UpdatePolicy({"eve", "data3", "read"}, {"eve", "data3", "write"});
181+
TestGetPolicy(e, {{"eve", "data3", "write"}});
182+
183+
e.AddPolicies(rules);
184+
e.UpdatePolicies({
185+
{"eve", "data3", "write"},
186+
{"leyo", "data4", "read"},
187+
{"katy", "data4", "write"}
188+
}, {
189+
{"eve", "data3", "read"},
190+
{"leyo", "data4", "write"},
191+
{"katy", "data1", "write"}
192+
});
193+
194+
TestGetPolicy(e, {
195+
{"eve", "data3", "read"},
196+
{"leyo", "data4", "write"},
197+
{"katy", "data1", "write"}
198+
});
176199
}
177200

178201
TEST_METHOD(TestModifyGroupingPolicyAPI) {
179202
std::string model = "../../examples/rbac_model.conf";
180203
std::string policy = "../../examples/rbac_policy.csv";
181-
std::shared_ptr<Adapter> adapter = std::shared_ptr<Adapter>(new BatchFileAdapter(policy));
204+
std::shared_ptr<Adapter> adapter = std::make_shared<BatchFileAdapter>(policy);
182205
Enforcer e = Enforcer(model, adapter);
183206

184-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{"data2_admin"}, e.GetRolesForUser("alice")));
185-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{}, e.GetRolesForUser("bob")));
186-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{}, e.GetRolesForUser("eve")));
187-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{}, e.GetRolesForUser("non_exist")));
207+
Assert::IsTrue(ArrayEquals({"data2_admin"}, e.GetRolesForUser("alice")));
208+
Assert::IsTrue(ArrayEquals({}, e.GetRolesForUser("bob")));
209+
Assert::IsTrue(ArrayEquals({}, e.GetRolesForUser("eve")));
210+
Assert::IsTrue(ArrayEquals({}, e.GetRolesForUser("non_exist")));
188211

189-
e.RemoveGroupingPolicy(std::vector<std::string>{"alice", "data2_admin"});
190-
e.AddGroupingPolicy(std::vector<std::string>{"bob", "data1_admin"});
191-
e.AddGroupingPolicy(std::vector<std::string>{"eve", "data3_admin"});
212+
e.RemoveGroupingPolicy({"alice", "data2_admin"});
213+
e.AddGroupingPolicy({"bob", "data1_admin"});
214+
e.AddGroupingPolicy({"eve", "data3_admin"});
192215

193-
std::vector<std::vector<std::string>> grouping_rules{
216+
std::vector<std::vector<std::string>> grouping_rules {
194217
{"ham", "data4_admin"},
195218
{"jack", "data5_admin"},
196219
};
197220

198221
e.AddGroupingPolicies(grouping_rules);
199-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{"data4_admin"}, e.GetRolesForUser("ham")));
200-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{"data5_admin"}, e.GetRolesForUser("jack")));
222+
Assert::IsTrue(ArrayEquals({"data4_admin"}, e.GetRolesForUser("ham")));
223+
Assert::IsTrue(ArrayEquals({"data5_admin"}, e.GetRolesForUser("jack")));
201224
e.RemoveGroupingPolicies(grouping_rules);
202225

203-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{}, e.GetRolesForUser("alice")));
226+
Assert::IsTrue(ArrayEquals({}, e.GetRolesForUser("alice")));
204227
std::vector<std::string> named_grouping_policy{ "alice", "data2_admin" };
205-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{}, e.GetRolesForUser("alice")));
228+
Assert::IsTrue(ArrayEquals({}, e.GetRolesForUser("alice")));
206229
e.AddNamedGroupingPolicy("g", named_grouping_policy);
207-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{"data2_admin"}, e.GetRolesForUser("alice")));
230+
Assert::IsTrue(ArrayEquals({"data2_admin"}, e.GetRolesForUser("alice")));
208231
e.RemoveNamedGroupingPolicy("g", named_grouping_policy);
209232

210233
e.AddNamedGroupingPolicies("g", grouping_rules);
211234
e.AddNamedGroupingPolicies("g", grouping_rules);
212-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{"data4_admin"}, e.GetRolesForUser("ham")));
213-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{"data5_admin"}, e.GetRolesForUser("jack")));
235+
Assert::IsTrue(ArrayEquals({"data4_admin"}, e.GetRolesForUser("ham")));
236+
Assert::IsTrue(ArrayEquals({"data5_admin"}, e.GetRolesForUser("jack")));
214237
e.RemoveNamedGroupingPolicies("g", grouping_rules);
215238
e.RemoveNamedGroupingPolicies("g", grouping_rules);
216239

217-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{}, e.GetRolesForUser("alice")));
218-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{"data1_admin"}, e.GetRolesForUser("bob")));
219-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{"data3_admin"}, e.GetRolesForUser("eve")));
220-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{}, e.GetRolesForUser("non_exist")));
240+
Assert::IsTrue(ArrayEquals({}, e.GetRolesForUser("alice")));
241+
Assert::IsTrue(ArrayEquals({"data1_admin"}, e.GetRolesForUser("bob")));
242+
Assert::IsTrue(ArrayEquals({"data3_admin"}, e.GetRolesForUser("eve")));
243+
Assert::IsTrue(ArrayEquals({}, e.GetRolesForUser("non_exist")));
221244

222-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{"bob"}, e.GetUsersForRole("data1_admin")));
245+
Assert::IsTrue(ArrayEquals({"bob"}, e.GetUsersForRole("data1_admin")));
223246
try {
224-
e.GetUsersForRole("data2_admin", std::vector<std::string>{});
247+
e.GetUsersForRole("data2_admin", {});
225248
}
226249
catch (CasbinRBACException e) {
227250
Assert::IsTrue(true);
228251
}
229-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{"eve"}, e.GetUsersForRole("data3_admin")));
252+
Assert::IsTrue(ArrayEquals({"eve"}, e.GetUsersForRole("data3_admin")));
230253

231-
e.RemoveFilteredGroupingPolicy(0, std::vector<std::string>{"bob"});
254+
e.RemoveFilteredGroupingPolicy(0, {"bob"});
232255

233-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{}, e.GetRolesForUser("alice")));
234-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{}, e.GetRolesForUser("bob")));
235-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{"data3_admin"}, e.GetRolesForUser("eve")));
236-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{}, e.GetRolesForUser("non_exist")));
256+
Assert::IsTrue(ArrayEquals({}, e.GetRolesForUser("alice")));
257+
Assert::IsTrue(ArrayEquals({}, e.GetRolesForUser("bob")));
258+
Assert::IsTrue(ArrayEquals({"data3_admin"}, e.GetRolesForUser("eve")));
259+
Assert::IsTrue(ArrayEquals({}, e.GetRolesForUser("non_exist")));
237260

238261
try {
239262
e.GetUsersForRole("data1_admin");
@@ -247,7 +270,17 @@ namespace test_management_api
247270
catch (CasbinRBACException e) {
248271
Assert::IsTrue(true);
249272
}
250-
Assert::IsTrue(ArrayEquals(std::vector<std::string>{"eve"}, e.GetUsersForRole("data3_admin")));
273+
Assert::IsTrue(ArrayEquals({"eve"}, e.GetUsersForRole("data3_admin")));
274+
275+
Assert::IsTrue(e.AddGroupingPolicy({"data3_admin", "data4_admin"}));
276+
e.UpdateGroupingPolicy({"eve", "data3_admin"}, {"eve", "admin"});
277+
e.UpdateGroupingPolicy({"data3_admin", "data4_admin"}, {"admin", "data4_admin"});
278+
279+
// Assert::IsTrue(ArrayEquals({"admin"}, e.GetUsersForRole("data4_admin")));
280+
Assert::IsTrue(ArrayEquals({"eve"}, e.GetUsersForRole("admin")));
281+
282+
Assert::IsTrue(ArrayEquals({"admin"}, e.GetRolesForUser("eve")));
283+
Assert::IsTrue(ArrayEquals({"data4_admin"}, e.GetRolesForUser("admin")));
251284
}
252285
};
253286
}

0 commit comments

Comments
 (0)