Skip to content

Commit dc53fc4

Browse files
committed
feat: add benchmarks
1 parent d086457 commit dc53fc4

13 files changed

+26810
-0
lines changed
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
import * as benchmark from 'benchmark';
2+
import * as path from 'path';
3+
import { CachedEnforcer, newCachedEnforcer } from '../src';
4+
5+
// Helper to resolve paths
6+
const resolve = (p: string): string => path.join(__dirname, '..', p);
7+
8+
// Helper to generate RBAC policies (Short names: group%d)
9+
async function generateRBAC(e: CachedEnforcer, roles: number, users: number): Promise<void> {
10+
const pPolicies = [];
11+
for (let i = 0; i < roles; i++) {
12+
pPolicies.push([`group${i}`, `data${Math.floor(i / 10)}`, 'read']);
13+
}
14+
if (pPolicies.length > 0) {
15+
await e.addPolicies(pPolicies);
16+
}
17+
18+
const gPolicies = [];
19+
for (let i = 0; i < users; i++) {
20+
gPolicies.push([`user${i}`, `group${Math.floor(i / 10)}`]);
21+
}
22+
if (gPolicies.length > 0) {
23+
await e.addGroupingPolicies(gPolicies);
24+
}
25+
}
26+
27+
export async function addCachedEnforcerBenchmarks(suite: benchmark.Suite): Promise<void> {
28+
// BenchmarkCachedBasicModel
29+
const eBasic = await newCachedEnforcer(resolve('examples/basic_model.conf'), resolve('examples/basic_policy.csv'));
30+
eBasic.enableLog(false);
31+
suite.add('BenchmarkCachedBasicModel', {
32+
defer: true,
33+
fn: async (deferred: any) => {
34+
await eBasic.enforce('alice', 'data1', 'read');
35+
deferred.resolve();
36+
},
37+
});
38+
39+
// BenchmarkCachedRBACModel
40+
const eRBAC = await newCachedEnforcer(resolve('examples/rbac_model.conf'), resolve('examples/rbac_policy.csv'));
41+
eRBAC.enableLog(false);
42+
suite.add('BenchmarkCachedRBACModel', {
43+
defer: true,
44+
fn: async (deferred: any) => {
45+
await eRBAC.enforce('alice', 'data2', 'read');
46+
deferred.resolve();
47+
},
48+
});
49+
50+
// BenchmarkCachedRBACModelSmall
51+
const eSmall = await newCachedEnforcer(resolve('examples/rbac_model.conf'));
52+
eSmall.enableLog(false);
53+
await generateRBAC(eSmall, 100, 1000);
54+
suite.add('BenchmarkCachedRBACModelSmall', {
55+
defer: true,
56+
fn: async (deferred: any) => {
57+
await eSmall.enforce('user501', 'data9', 'read');
58+
deferred.resolve();
59+
},
60+
});
61+
62+
// BenchmarkCachedRBACModelMedium
63+
const eMedium = await newCachedEnforcer(resolve('examples/rbac_model.conf'));
64+
eMedium.enableLog(false);
65+
await generateRBAC(eMedium, 1000, 10000);
66+
suite.add('BenchmarkCachedRBACModelMedium', {
67+
defer: true,
68+
fn: async (deferred: any) => {
69+
await eMedium.enforce('user5001', 'data150', 'read');
70+
deferred.resolve();
71+
},
72+
});
73+
74+
// BenchmarkCachedRBACModelLarge
75+
const eLarge = await newCachedEnforcer(resolve('examples/rbac_model.conf'));
76+
eLarge.enableLog(false);
77+
await generateRBAC(eLarge, 10000, 100000);
78+
suite.add('BenchmarkCachedRBACModelLarge', {
79+
defer: true,
80+
fn: async (deferred: any) => {
81+
await eLarge.enforce('user50001', 'data1500', 'read');
82+
deferred.resolve();
83+
},
84+
});
85+
86+
// BenchmarkCachedRBACModelWithResourceRoles
87+
const eResRoles = await newCachedEnforcer(
88+
resolve('examples/rbac_with_resource_roles_model.conf'),
89+
resolve('examples/rbac_with_resource_roles_policy.csv')
90+
);
91+
eResRoles.enableLog(false);
92+
suite.add('BenchmarkCachedRBACModelWithResourceRoles', {
93+
defer: true,
94+
fn: async (deferred: any) => {
95+
await eResRoles.enforce('alice', 'data1', 'read');
96+
deferred.resolve();
97+
},
98+
});
99+
100+
// BenchmarkCachedRBACModelWithDomains
101+
const eDomains = await newCachedEnforcer(
102+
resolve('examples/rbac_with_domains_model.conf'),
103+
resolve('examples/rbac_with_domains_policy.csv')
104+
);
105+
eDomains.enableLog(false);
106+
suite.add('BenchmarkCachedRBACModelWithDomains', {
107+
defer: true,
108+
fn: async (deferred: any) => {
109+
await eDomains.enforce('alice', 'domain1', 'data1', 'read');
110+
deferred.resolve();
111+
},
112+
});
113+
114+
// BenchmarkCachedABACModel
115+
const eABAC = await newCachedEnforcer(resolve('examples/abac_model.conf'));
116+
eABAC.enableLog(false);
117+
const abacData1 = { Name: 'data1', Owner: 'alice' };
118+
suite.add('BenchmarkCachedABACModel', {
119+
defer: true,
120+
fn: async (deferred: any) => {
121+
await eABAC.enforce('alice', abacData1, 'read');
122+
deferred.resolve();
123+
},
124+
});
125+
126+
// BenchmarkCachedKeyMatchModel
127+
const eKeyMatch = await newCachedEnforcer(resolve('examples/keymatch_model.conf'), resolve('examples/keymatch_policy.csv'));
128+
eKeyMatch.enableLog(false);
129+
suite.add('BenchmarkCachedKeyMatchModel', {
130+
defer: true,
131+
fn: async (deferred: any) => {
132+
await eKeyMatch.enforce('alice', '/alice_data/resource1', 'GET');
133+
deferred.resolve();
134+
},
135+
});
136+
137+
// BenchmarkCachedRBACModelWithDeny
138+
const eDeny = await newCachedEnforcer(resolve('examples/rbac_with_deny_model.conf'), resolve('examples/rbac_with_deny_policy.csv'));
139+
eDeny.enableLog(false);
140+
suite.add('BenchmarkCachedRBACModelWithDeny', {
141+
defer: true,
142+
fn: async (deferred: any) => {
143+
await eDeny.enforce('alice', 'data1', 'read');
144+
deferred.resolve();
145+
},
146+
});
147+
148+
// BenchmarkCachedPriorityModel
149+
const ePriority = await newCachedEnforcer(resolve('examples/priority_model.conf'), resolve('examples/priority_policy.csv'));
150+
ePriority.enableLog(false);
151+
suite.add('BenchmarkCachedPriorityModel', {
152+
defer: true,
153+
fn: async (deferred: any) => {
154+
await ePriority.enforce('alice', 'data1', 'read');
155+
deferred.resolve();
156+
},
157+
});
158+
}

0 commit comments

Comments
 (0)