diff --git a/casbin/enforcer.cpp b/casbin/enforcer.cpp index 0fcd8cea..a04308cd 100644 --- a/casbin/enforcer.cpp +++ b/casbin/enforcer.cpp @@ -389,12 +389,13 @@ void Enforcer::ClearPolicy() { // LoadPolicy reloads the policy from file/database. void Enforcer::LoadPolicy() { - this->ClearPolicy(); + // must use base's LoadPolicy to avoid dead lock + Enforcer::ClearPolicy(); m_adapter->LoadPolicy(m_model); m_model->PrintPolicy(); if(m_auto_build_role_links) { - this->BuildRoleLinks(); + Enforcer::BuildRoleLinks(); } } diff --git a/tests/enforcer_synced_test.cpp b/tests/enforcer_synced_test.cpp index 6f47f3c4..78dabaeb 100644 --- a/tests/enforcer_synced_test.cpp +++ b/tests/enforcer_synced_test.cpp @@ -18,57 +18,58 @@ #include #include +#include "config_path.h" namespace { -// void TestSyncFn(casbin::SyncedEnforcer& e, const std::string& sub, const std::string& obj, const std::string& act, bool control) { -// bool response = e.Enforce({ sub, obj, act }); -// ASSERT_EQ(response, control); -// } +void TestSyncFn(casbin::SyncedEnforcer& e, const std::string& sub, const std::string& obj, const std::string& act, bool control) { + bool response = e.Enforce({ sub, obj, act }); + ASSERT_EQ(response, control); +} -// TEST(TestEnforcerSynced, TestSync) { -// casbin::SyncedEnforcer e(basic_model_path, basic_policy_path); +TEST(TestEnforcerSynced, TestSync) { + casbin::SyncedEnforcer e(basic_model_path, basic_policy_path); -// using namespace std::literals::chrono_literals; -// auto time1 = 200ms; -// e.StartAutoLoadPolicy(time1); + using namespace std::literals::chrono_literals; + auto time1 = 200ms; + e.StartAutoLoadPolicy(time1); -// TestSyncFn(e, "alice", "data1", "read", true); -// TestSyncFn(e, "alice", "data1", "write", false); -// TestSyncFn(e, "alice", "data2", "read", false); -// TestSyncFn(e, "alice", "data2", "write", false); -// TestSyncFn(e, "bob", "data1", "read", false); -// TestSyncFn(e, "bob", "data1", "write", false); -// TestSyncFn(e, "bob", "data2", "read", false); -// TestSyncFn(e, "bob", "data2", "write", true); + TestSyncFn(e, "alice", "data1", "read", true); + TestSyncFn(e, "alice", "data1", "write", false); + TestSyncFn(e, "alice", "data2", "read", false); + TestSyncFn(e, "alice", "data2", "write", false); + TestSyncFn(e, "bob", "data1", "read", false); + TestSyncFn(e, "bob", "data1", "write", false); + TestSyncFn(e, "bob", "data2", "read", false); + TestSyncFn(e, "bob", "data2", "write", true); -// std::this_thread::sleep_for(200ms); -// e.StopAutoLoadPolicy(); -// } + std::this_thread::sleep_for(200ms); + e.StopAutoLoadPolicy(); +} -// TEST(TestEnforcerSynced, TestStopLoadPolicy) { -// casbin::SyncedEnforcer e(basic_model_path, basic_policy_path); +TEST(TestEnforcerSynced, TestStopLoadPolicy) { + casbin::SyncedEnforcer e(basic_model_path, basic_policy_path); -// using namespace std::literals::chrono_literals; -// std::chrono::duration t = 5ms; + using namespace std::literals::chrono_literals; + std::chrono::duration t = 5ms; -// e.StartAutoLoadPolicy(t); + e.StartAutoLoadPolicy(t); -// EXPECT_EQ(e.IsAutoLoadingRunning(), true); + EXPECT_EQ(e.IsAutoLoadingRunning(), true); -// TestSyncFn(e , "alice", "data1", "read", true); -// TestSyncFn(e , "alice", "data1", "write", false); -// TestSyncFn(e , "alice", "data2", "read", false); -// TestSyncFn(e , "alice", "data2", "write", false); -// TestSyncFn(e , "bob", "data1", "read", false); -// TestSyncFn(e , "bob", "data1", "write", false); -// TestSyncFn(e , "bob", "data2", "read", false); -// TestSyncFn(e , "bob", "data2", "write", true); + TestSyncFn(e , "alice", "data1", "read", true); + TestSyncFn(e , "alice", "data1", "write", false); + TestSyncFn(e , "alice", "data2", "read", false); + TestSyncFn(e , "alice", "data2", "write", false); + TestSyncFn(e , "bob", "data1", "read", false); + TestSyncFn(e , "bob", "data1", "write", false); + TestSyncFn(e , "bob", "data2", "read", false); + TestSyncFn(e , "bob", "data2", "write", true); -// e.StopAutoLoadPolicy(); -// std::this_thread::sleep_for(10ms); + e.StopAutoLoadPolicy(); + std::this_thread::sleep_for(10ms); -// EXPECT_EQ(e.IsAutoLoadingRunning(), false); -// } + EXPECT_EQ(e.IsAutoLoadingRunning(), false); +} } // namespace