Skip to content

Commit

Permalink
perf: add pytest-benchmark and judge whether use regex in rabc (#228)
Browse files Browse the repository at this point in the history
Signed-off-by: stonex <[email protected]>
  • Loading branch information
sheny1xuan authored Dec 13, 2021
1 parent 1cef413 commit 252c288
Show file tree
Hide file tree
Showing 5 changed files with 175 additions and 65 deletions.
8 changes: 8 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,18 @@ jobs:
pip install -r requirements.txt
pip install -r requirements_dev.txt
pip install coveralls
pip install pytest
pip install pytest-benchmark
- name: Run tests
run: coverage run -m unittest discover -s tests -t tests

- name: Run benchmark
run: python3 -m pytest
--benchmark-verbose
--benchmark-columns=mean,stddev,iqr,ops,rounds
tests/benchmarks/benchmark_model.py

- name: Upload coverage data to coveralls.io
run: coveralls --service=github
env:
Expand Down
26 changes: 14 additions & 12 deletions casbin/rbac/default_role_manager/role_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ class RoleManager(RM):
def __init__(self, max_hierarchy_level=10):
self.logger = logging.getLogger(__name__)
self.max_hierarchy_level = max_hierarchy_level
self.matching_func = lambda name1, name2: name1 == name2
self.matching_func = None
self.all_links = list()
self.all_roles = dict()

Expand Down Expand Up @@ -100,8 +100,9 @@ def _matching_roles(self, name, match_order=MatchOrder.STR_PATTERN):
def _get_role(self, name):
if name not in self.all_roles:
role = Role(name)
for pattern_role in self._matching_roles(name):
role.copy_from(pattern_role)
if self.matching_func != None:
for pattern_role in self._matching_roles(name):
role.copy_from(pattern_role)
self.all_roles[name] = role
return self.all_roles[name]

Expand All @@ -124,15 +125,16 @@ def add_link(self, name1, name2, *domain):

user.add_role(role)

for r in self.all_roles.values():
if r.name != user.name and self._matching_fn(
user.name, r.name, MatchOrder.PATTERN_STR
):
r.add_role(role)
if r.name != role.name and self._matching_fn(
role.name, r.name, MatchOrder.PATTERN_STR
):
role.add_role(r)
if self.matching_func != None:
for r in self.all_roles.values():
if r.name != user.name and self._matching_fn(
user.name, r.name, MatchOrder.PATTERN_STR
):
r.add_role(role)
if r.name != role.name and self._matching_fn(
role.name, r.name, MatchOrder.PATTERN_STR
):
role.add_role(r)

def delete_link(self, name1, name2, *domain):
if Link(name1, name2) not in self.all_links:
Expand Down
Empty file added tests/benchmarks/__init__.py
Empty file.
153 changes: 153 additions & 0 deletions tests/benchmarks/benchmark_model.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
import os
import casbin


def raw_enforce(sub, obj, act):
policy = [["alice", "data1", "read"], ["bob", "data2", "write"]]
for rule in policy:
if sub == rule[0] and obj == rule[1] and act == rule[2]:
return True

return False


def get_examples(path):
examples_path = os.path.split(os.path.realpath(__file__))[0] + "/../../examples/"
return os.path.abspath(examples_path + path)


def get_enforcer(model=None, adapter=None):
return casbin.Enforcer(
model,
adapter,
)


def test_benchmark_raw(benchmark):
@benchmark
def benchmark_raw():
raw_enforce("alice", "data1", "read")


def test_benchmark_basic_model(benchmark):
e = get_enforcer(get_examples("basic_model.conf"), get_examples("basic_policy.csv"))

@benchmark
def benchmark_basic_model():
e.enforce("alice", "data1", "read")


def test_benchmark_rbac_model(benchmark):
e = get_enforcer(get_examples("rbac_model.conf"), get_examples("rbac_policy.csv"))

@benchmark
def benchmark_rbac_model():
e.enforce("alice", "data1", "read")


def test_benchmark_rbac_model_small(benchmark):
e = get_enforcer(get_examples("rbac_model.conf"))

e.add_policies(
{("group" + str(i), "data" + str(int(i / 10)), "read") for i in range(100)}
)
e.add_grouping_policies(
{("user" + str(i), "group" + str(int(i / 10))) for i in range(1000)}
)

@benchmark
def benchmark_rbac_model():
e.enforce("user501", "data9", "read")


def test_benchmark_rbac_model_medium(benchmark):
e = get_enforcer(get_examples("rbac_model.conf"))

e.add_policies(
{("group" + str(i), "data" + str(int(i / 10)), "read") for i in range(1000)}
)
e.add_grouping_policies(
{("user" + str(i), "group" + str(int(i / 10))) for i in range(10000)}
)

@benchmark
def benchmark_rbac_model():
e.enforce("user501", "data9", "read")


def test_benchmark_rbac_model_large(benchmark):
e = get_enforcer(get_examples("rbac_model.conf"))

e.add_policies(
{("group" + str(i), "data" + str(int(i / 10)), "read") for i in range(10000)}
)
e.add_grouping_policies(
{("user" + str(i), "group" + str(int(i / 10))) for i in range(100000)}
)

@benchmark
def benchmark_rbac_model():
e.enforce("user501", "data9", "read")


def test_benchmark_rbac_model_with_resource_roles(benchmark):
e = get_enforcer(
get_examples("rbac_with_resource_roles_model.conf"),
get_examples("rbac_with_resource_roles_policy.csv"),
)

@benchmark
def benchmark_rbac_model_with_resource_roles():
e.enforce("alice", "data1", "read")


def test_benchmark_rbac_model_with_domains(benchmark):
e = get_enforcer(
get_examples("rbac_with_domains_model.conf"),
get_examples("rbac_with_domains_policy.csv"),
)

@benchmark
def benchmark_rbac_model_with_domains():
e.enforce("alice", "domain1", "data1", "read")


def test_benchmark_abac_model(benchmark):
e = get_enforcer(get_examples("abac_model.conf"))
sub = "alice"
obj = {"Owner": "alice", "id": "data1"}

@benchmark
def benchmark_abac_model():
e.enforce(sub, obj, "read")


def test_benchmark_rbac_with_deny(benchmark):
e = get_enforcer(
get_examples("rbac_with_deny_model.conf"),
get_examples("rbac_with_deny_policy.csv"),
)

@benchmark
def benchmark_rbac_with_deny():
e.enforce("alice", "data1", "read")


def test_benchmark_prioriry(benchmark):
e = get_enforcer(
get_examples("priority_model.conf"), get_examples("priority_policy.csv")
)

@benchmark
def benchmark_rbac_with_deny():
e.enforce("alice", "data1", "read")


def test_benchmark_keymatch(benchmark):
e = get_enforcer(
get_examples("keymatch_model.conf"), get_examples("keymatch_policy.csv")
)

@benchmark
def benchmark_keymatch():
e.enforce("alice", "/alice_data/resource1", "GET")
53 changes: 0 additions & 53 deletions tests/test_model_benchmark.py

This file was deleted.

0 comments on commit 252c288

Please sign in to comment.