blob: b315edb6c78364b038ad2a512e4ed8ff0ee55641 [file] [log] [blame]
local socket = require("socket")
local Enforcer = require("src.main.Enforcer")
local path = os.getenv("PWD") or io.popen("cd"):read()
local function rawEnforce(sub, obj, act)
local policy = {{"alice", "data1", "read"}, {"bob", "data2", "write"}}
for _, rule in pairs(policy) do
if rule[1] == sub and rule[2] == obj and rule[3] == act then
return true
end
end
return false
end
local function benchmarkRaw()
local x = socket.gettime()*1000
for i = 1, 10000 do
rawEnforce("alice", "data1", "read")
end
x = socket.gettime()*1000 - x
return x, 10000
end
local function benchmarkBasicModel()
local e = Enforcer:new(path .. "/examples/basic_model.conf", path .. "/examples/basic_policy.csv")
e:enableLog(false)
local x = socket.gettime()*1000
for i = 1, 10000 do
_ = e:enforce("alice", "data1", "read")
end
x = socket.gettime()*1000 - x
return x, 10000
end
local function benchmarkRBACModel()
local e = Enforcer:new(path .. "/examples/rbac_model.conf", path .. "/examples/rbac_policy.csv")
e:enableLog(false)
local x = socket.gettime()*1000
for i = 1, 10000 do
_ = e:enforce("alice", "data2", "read")
end
x = socket.gettime()*1000 - x
return x, 10000
end
local function benchmarkRBACModelSmall()
local e = Enforcer:new(path .. "/examples/rbac_model.conf", path .. "/examples/empty_policy.csv")
e:enableLog(false)
local pPolicies = {}
-- 100 roles, 10 resources.
for i = 1, 100 do
table.insert(pPolicies, {"group"..tostring(i), "data"..tostring(i%10), "read"})
end
e:AddPolicies(pPolicies)
-- 1000 users.
local gPolicies = {}
for i = 1, 1000 do
table.insert(gPolicies, {"user"..tostring(i), "group"..tostring(i%10)})
end
e:AddGroupingPolicies(gPolicies)
local x = socket.gettime()*1000
for i = 1, 1000 do
_ = e:enforce("user501", "data9", "read")
end
x = socket.gettime()*1000 - x
return x, 1000
end
local function benchmarkRBACModelMedium()
local e = Enforcer:new(path .. "/examples/rbac_model.conf", path .. "/examples/empty_policy.csv")
e:enableLog(false)
local pPolicies = {}
-- 1000 roles, 100 resources.
for i = 1, 1000 do
table.insert(pPolicies, {"group"..tostring(i), "data"..tostring(i%100), "read"})
end
e:AddPolicies(pPolicies)
local gPolicies = {}
-- 10000 users.
for i = 1, 10000 do
table.insert(gPolicies, {"user"..tostring(i), "group"..tostring(i%10)})
end
e:AddGroupingPolicies(gPolicies)
local x = socket.gettime()*1000
for i = 1, 100 do
_ = e:enforce("user5001", "data99", "read")
end
x = socket.gettime()*1000 - x
return x, 100
end
local function benchmarkRBACModelLarge()
local e = Enforcer:new(path .. "/examples/rbac_model.conf", path .. "/examples/empty_policy.csv")
e:enableLog(false)
local pPolicies = {}
-- 10000 roles, 1000 resources.
for i = 1, 10000 do
table.insert(pPolicies, {"group"..tostring(i), "data"..tostring(i%1000), "read"})
end
e:AddPolicies(pPolicies)
local gPolicies = {}
-- 100000 users.
for i = 1, 100000 do
table.insert(gPolicies, {"user"..tostring(i), "group"..tostring(i%10)})
end
e:AddGroupingPolicies(gPolicies)
local x = socket.gettime()*1000
for i = 1, 10 do
_ = e:enforce("user50001", "data999", "read")
end
x = socket.gettime()*1000 - x
return x, 10
end
local function benchmarkRBACModelWithResourceRoles()
local e = Enforcer:new(path .. "/examples/rbac_with_resource_roles_model.conf", path .. "/examples/rbac_with_resource_roles_policy.csv")
e:enableLog(false)
local x = socket.gettime()*1000
for i = 1, 1000 do
_ = e:enforce("alice", "data1", "read")
end
x = socket.gettime()*1000 - x
return x, 1000
end
local function benchmarkRBACModelWithDomains()
local e = Enforcer:new(path .. "/examples/rbac_with_domains_model.conf", path .. "/examples/rbac_with_domains_policy.csv")
e:enableLog(false)
local x = socket.gettime()*1000
for i = 1, 1000 do
_ = e:enforce("alice", "domain1", "data1", "read")
end
x = socket.gettime()*1000 - x
return x, 1000
end
local function benchmarkABACModel()
local e = Enforcer:new(path .. "/examples/abac_model.conf", path .. "/examples/empty_policy.csv")
e:enableLog(false)
local data1 = {["Name"] = "data1", ["Owner"] = "alice"}
local x = socket.gettime()*1000
for i = 1, 1000 do
_ = e:enforce("alice", data1, "read")
end
x = socket.gettime()*1000 - x
return x, 1000
end
local function benchmarkKeyMatchModel()
local e = Enforcer:new(path .. "/examples/keymatch_model.conf", path .. "/examples/keymatch_policy.csv")
e:enableLog(false)
local x = socket.gettime()*1000
for i = 1, 1000 do
_ = e:enforce("alice", "/alice_data/resource1", "GET")
end
x = socket.gettime()*1000 - x
return x, 1000
end
local function benchmarkRBACModelWithDeny()
local e = Enforcer:new(path .. "/examples/rbac_with_deny_model.conf", path .. "/examples/rbac_with_deny_policy.csv")
e:enableLog(false)
local x = socket.gettime()*1000
for i = 1, 1000 do
_ = e:enforce("alice", "data1", "read")
end
x = socket.gettime()*1000 - x
return x, 1000
end
local function benchmarkPriorityModel()
local e = Enforcer:new(path .. "/examples/priority_model.conf", path .. "/examples/priority_policy.csv")
e:enableLog(false)
local x = socket.gettime()*1000
for i = 1, 1000 do
_ = e:enforce("alice", "data1", "read")
end
x = socket.gettime()*1000 - x
return x, 1000
end
local function runBenchmark()
local t, o
local time = {}
local ops = {}
local benchName = {}
t, o = benchmarkRaw()
table.insert(time, t)
table.insert(ops, o)
table.insert(benchName, "Raw")
t, o = benchmarkBasicModel()
table.insert(time, t)
table.insert(ops, o)
table.insert(benchName, "Basic Model")
t, o = benchmarkRBACModel()
table.insert(time, t)
table.insert(ops, o)
table.insert(benchName, "RBAC Model")
t, o = benchmarkRBACModelSmall()
table.insert(time, t)
table.insert(ops, o)
table.insert(benchName, "RBAC Model Small")
t, o = benchmarkRBACModelMedium()
table.insert(time, t)
table.insert(ops, o)
table.insert(benchName, "RBAC Model Medium")
t, o = benchmarkRBACModelLarge()
table.insert(time, t)
table.insert(ops, o)
table.insert(benchName, "RBAC Model Large")
t, o = benchmarkRBACModelWithResourceRoles()
table.insert(time, t)
table.insert(ops, o)
table.insert(benchName, "RBAC Model with Resources")
t, o = benchmarkRBACModelWithDomains()
table.insert(time, t)
table.insert(ops, o)
table.insert(benchName, "RBAC Model with Domains")
t, o = benchmarkABACModel()
table.insert(time, t)
table.insert(ops, o)
table.insert(benchName, "ABAC Model")
t, o = benchmarkKeyMatchModel()
table.insert(time, t)
table.insert(ops, o)
table.insert(benchName, "KeyMatch Model")
t, o = benchmarkRBACModelWithDeny()
table.insert(time, t)
table.insert(ops, o)
table.insert(benchName, "RBAC Model with Deny")
t, o = benchmarkPriorityModel()
table.insert(time, t)
table.insert(ops, o)
table.insert(benchName, "Priority Model")
print("Benchmark:")
for k, v in pairs(benchName) do
print(v .. ":", "\tTotal ops = " .. tostring(ops[k]), "\tTime per op = " .. string.format("%.4f ms", time[k]/ops[k]))
end
end
runBenchmark()