Skip to content

Commit 7ef8f8a

Browse files
Developed assign_roles_to_users method of the rbac pallet benchmarking module to enable the specification of multiple scopes. Developed setup_permissions_sized method of the rbac pallet benchmarking module to enable the specification of multiple roles. Developed the pallet rbac benchmark for the remove_permission_from_pallet extrinsic. Developed the pallet rbac benchmark for the remove_pallet_permissions extrinsic.
1 parent b1434e8 commit 7ef8f8a

File tree

1 file changed

+58
-15
lines changed

1 file changed

+58
-15
lines changed

pallets/rbac/src/benchmarking.rs

Lines changed: 58 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,14 @@ pub fn setup_roles_sized<T: Config>(pallet_id: IdOrVec, num_roles: u32, size: u3
4848
}
4949

5050
pub fn setup_scopes_sized<T: Config>(pallet_id: IdOrVec, num_scopes: u32) -> Vec<ScopeId> {
51-
let mut scopes = Vec::new();
51+
let mut scope_ids = Vec::new();
5252
for s in 0..num_scopes {
5353
let scope = generate_scope_sized(s as u8, 10);
5454
let scope_id = generate_id(scope);
5555
assert_ok!(RBAC::<T>::create_scope(pallet_id.clone(), scope_id));
56-
scopes.push(scope_id);
56+
scope_ids.push(scope_id);
5757
}
58-
scopes
58+
scope_ids
5959
}
6060

6161
pub fn assign_roles_to_user<T: Config>(
@@ -78,13 +78,15 @@ pub fn assign_roles_to_user<T: Config>(
7878
pub fn assign_roles_to_users<T: Config>(
7979
num_users: u32,
8080
pallet_id: IdOrVec,
81-
scope_id: ScopeId,
81+
scope_ids: Vec<ScopeId>,
8282
role_ids: &[RoleId],
8383
) -> Vec<T::AccountId> {
8484
let mut users = Vec::new();
8585
for u in 0..num_users {
8686
let user: T::AccountId = account("user", u, SEED);
87-
assign_roles_to_user::<T>(user.clone(), pallet_id.clone(), scope_id, role_ids);
87+
for scope_id in scope_ids.clone() {
88+
assign_roles_to_user::<T>(user.clone(), pallet_id.clone(), scope_id, role_ids);
89+
}
8890
users.push(user);
8991
}
9092
users
@@ -104,17 +106,19 @@ pub fn generate_permissions_sized(num_permissions: u32, size: u32) -> Vec<Vec<u8
104106

105107
pub fn setup_permissions_sized<T: Config>(
106108
pallet_id: IdOrVec,
107-
role_id: RoleId,
109+
role_ids: Vec<RoleId>,
108110
num_permissions: u32,
109111
size: u32,
110112
) -> Vec<PermissionId> {
111113
let permissions = generate_permissions_sized(num_permissions, size);
112-
assert_ok!(RBAC::<T>::tx_create_and_set_permissions(
113-
RawOrigin::Root.into(),
114-
pallet_id.clone(),
115-
role_id.clone(),
116-
permissions.clone()
117-
));
114+
for role_id in role_ids {
115+
assert_ok!(RBAC::<T>::tx_create_and_set_permissions(
116+
RawOrigin::Root.into(),
117+
pallet_id.clone(),
118+
role_id.clone(),
119+
permissions.clone()
120+
));
121+
}
118122
permissions.into_iter().map(|permission| generate_id(permission)).collect()
119123
}
120124

@@ -158,7 +162,8 @@ mod benchmarks {
158162
);
159163
let ru = r as usize;
160164
let user =
161-
assign_roles_to_users::<T>(u, pallet_id.clone(), scope_id, &role_ids[0..ru])[0].clone();
165+
assign_roles_to_users::<T>(u, pallet_id.clone(), vec![scope_id], &role_ids[0..ru])[0]
166+
.clone();
162167
let role_id = role_ids[ru - 1];
163168
#[extrinsic_call]
164169
_(RawOrigin::Root, user.clone(), pallet_id.clone(), scope_id, role_id);
@@ -199,7 +204,7 @@ mod benchmarks {
199204
T::RoleMaxLen::get(),
200205
);
201206
let ru = r as usize;
202-
assign_roles_to_users::<T>(u, pallet_id.clone(), scope_id, &role_ids[0..ru]);
207+
assign_roles_to_users::<T>(u, pallet_id.clone(), vec![scope_id], &role_ids[0..ru]);
203208
assign_roles_to_user::<T>(
204209
user.clone(),
205210
pallet_id.clone(),
@@ -228,14 +233,52 @@ mod benchmarks {
228233
T::MaxRolesPerPallet::get(),
229234
T::RoleMaxLen::get(),
230235
)[0];
231-
let permission_id = setup_permissions_sized::<T>(pallet_id.clone(), role_id, p, l)[0];
236+
let permission_id = setup_permissions_sized::<T>(pallet_id.clone(), vec![role_id], p, l)[0];
232237
#[extrinsic_call]
233238
_(RawOrigin::Root, pallet_id.clone(), role_id, permission_id);
234239
assert!(
235240
!RBAC::<T>::permissions_by_role(pallet_id.to_id(), role_id).contains(&permission_id)
236241
);
237242
}
238243

244+
#[benchmark]
245+
fn remove_permission_from_pallet(
246+
i: Linear<1, 400>,
247+
l: Linear<2, { T::PermissionMaxLen::get() }>,
248+
p: Linear<1, { T::MaxPermissionsPerRole::get() }>,
249+
m: Linear<2, { T::RoleMaxLen::get() }>,
250+
r: Linear<1, { T::MaxRolesPerPallet::get() }>,
251+
) {
252+
let pallet_id = generate_pallet_id_sized(0, i);
253+
let role_ids = setup_roles_sized::<T>(pallet_id.clone(), r, m);
254+
let permission_id = setup_permissions_sized::<T>(pallet_id.clone(), role_ids, p, l)[0];
255+
#[extrinsic_call]
256+
_(RawOrigin::Root, pallet_id.clone(), permission_id);
257+
assert_eq!(RBAC::<T>::permissions(pallet_id.to_id(), permission_id).len(), 0);
258+
}
259+
260+
#[benchmark]
261+
fn remove_pallet_permissions(
262+
i: Linear<1, 400>,
263+
l: Linear<2, { T::PermissionMaxLen::get() }>,
264+
s: Linear<1, { T::MaxScopesPerPallet::get() }>,
265+
p: Linear<1, { T::MaxPermissionsPerRole::get() }>,
266+
u: Linear<1, { T::MaxUsersPerRole::get() }>,
267+
m: Linear<2, { T::RoleMaxLen::get() }>,
268+
r: Linear<1, { T::MaxRolesPerPallet::get() }>,
269+
) {
270+
let pallet_id = generate_pallet_id_sized(0, i);
271+
let scope_ids = setup_scopes_sized::<T>(pallet_id.clone(), s);
272+
let role_ids = setup_roles_sized::<T>(pallet_id.clone(), r, m);
273+
setup_permissions_sized::<T>(pallet_id.clone(), role_ids.clone(), p, l);
274+
let ru = cmp::min(r, T::MaxRolesPerUser::get()) as usize;
275+
assign_roles_to_users::<T>(u, pallet_id.clone(), scope_ids, &role_ids[0..ru]);
276+
277+
#[extrinsic_call]
278+
_(RawOrigin::Root, pallet_id.clone());
279+
assert_eq!(<Permissions<T>>::iter_prefix(pallet_id.to_id()).count(), 0);
280+
}
281+
239282
impl_benchmark_test_suite! {
240283
RBAC,
241284
crate::mock::new_test_ext(),

0 commit comments

Comments
 (0)