referrerpolicy=no-referrer-when-downgrade

polkadot_runtime_common/assigned_slots/
benchmarking.rs

1// Copyright (C) Parity Technologies (UK) Ltd.
2// This file is part of Polkadot.
3
4// Polkadot is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8
9// Polkadot is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License
15// along with Polkadot.  If not, see <http://www.gnu.org/licenses/>.
16
17//! Benchmarking for assigned_slots pallet
18
19#![cfg(feature = "runtime-benchmarks")]
20use super::*;
21
22use frame_benchmarking::v2::*;
23use frame_support::assert_ok;
24use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin};
25use polkadot_primitives::Id as ParaId;
26use sp_runtime::traits::Bounded;
27
28type CurrencyOf<T> = <<T as Config>::Leaser as Leaser<BlockNumberFor<T>>>::Currency;
29type BalanceOf<T> = <<<T as Config>::Leaser as Leaser<BlockNumberFor<T>>>::Currency as Currency<
30	<T as frame_system::Config>::AccountId,
31>>::Balance;
32#[benchmarks(where T: Config)]
33mod benchmarks {
34	use super::*;
35
36	use crate::assigned_slots::Pallet as AssignedSlots;
37
38	fn register_parachain<T: Config>(para_id: ParaId) {
39		let who: T::AccountId = whitelisted_caller();
40		let worst_validation_code = T::Registrar::worst_validation_code();
41		let worst_head_data = T::Registrar::worst_head_data();
42
43		CurrencyOf::<T>::make_free_balance_be(&who, BalanceOf::<T>::max_value());
44
45		assert_ok!(T::Registrar::register(
46			who,
47			para_id,
48			worst_head_data,
49			worst_validation_code.clone()
50		));
51		assert_ok!(paras::Pallet::<T>::add_trusted_validation_code(
52			frame_system::Origin::<T>::Root.into(),
53			worst_validation_code,
54		));
55		T::Registrar::execute_pending_transitions();
56	}
57
58	#[benchmark]
59	fn assign_perm_parachain_slot() {
60		let para_id = ParaId::from(1_u32);
61		let caller = RawOrigin::Root;
62
63		let _ =
64			AssignedSlots::<T>::set_max_permanent_slots(frame_system::Origin::<T>::Root.into(), 10);
65		register_parachain::<T>(para_id);
66
67		let counter = PermanentSlotCount::<T>::get();
68		let current_lease_period: BlockNumberFor<T> =
69			T::Leaser::lease_period_index(frame_system::Pallet::<T>::block_number())
70				.and_then(|x| Some(x.0))
71				.unwrap();
72		#[extrinsic_call]
73		assign_perm_parachain_slot(caller, para_id);
74
75		assert_eq!(
76			PermanentSlots::<T>::get(para_id),
77			Some((
78				current_lease_period,
79				LeasePeriodOf::<T>::from(T::PermanentSlotLeasePeriodLength::get()),
80			))
81		);
82		assert_eq!(PermanentSlotCount::<T>::get(), counter + 1);
83	}
84
85	#[benchmark]
86	fn assign_temp_parachain_slot() {
87		let para_id = ParaId::from(2_u32);
88		let caller = RawOrigin::Root;
89
90		let _ =
91			AssignedSlots::<T>::set_max_temporary_slots(frame_system::Origin::<T>::Root.into(), 10);
92		register_parachain::<T>(para_id);
93
94		let current_lease_period: BlockNumberFor<T> =
95			T::Leaser::lease_period_index(frame_system::Pallet::<T>::block_number())
96				.and_then(|x| Some(x.0))
97				.unwrap();
98
99		let counter = TemporarySlotCount::<T>::get();
100		#[extrinsic_call]
101		assign_temp_parachain_slot(caller, para_id, SlotLeasePeriodStart::Current);
102
103		let tmp = ParachainTemporarySlot {
104			manager: whitelisted_caller(),
105			period_begin: current_lease_period,
106			period_count: LeasePeriodOf::<T>::from(T::TemporarySlotLeasePeriodLength::get()),
107			last_lease: Some(BlockNumberFor::<T>::zero()),
108			lease_count: 1,
109		};
110		assert_eq!(TemporarySlots::<T>::get(para_id), Some(tmp));
111		assert_eq!(TemporarySlotCount::<T>::get(), counter + 1);
112	}
113
114	#[benchmark]
115	fn unassign_parachain_slot() {
116		let para_id = ParaId::from(3_u32);
117		let caller = RawOrigin::Root;
118
119		let _ =
120			AssignedSlots::<T>::set_max_temporary_slots(frame_system::Origin::<T>::Root.into(), 10);
121		register_parachain::<T>(para_id);
122
123		let _ = AssignedSlots::<T>::assign_temp_parachain_slot(
124			caller.clone().into(),
125			para_id,
126			SlotLeasePeriodStart::Current,
127		);
128
129		let counter = TemporarySlotCount::<T>::get();
130		#[extrinsic_call]
131		unassign_parachain_slot(caller, para_id);
132
133		assert_eq!(TemporarySlots::<T>::get(para_id), None);
134		assert_eq!(TemporarySlotCount::<T>::get(), counter - 1);
135	}
136
137	#[benchmark]
138	fn set_max_permanent_slots() {
139		let caller = RawOrigin::Root;
140		#[extrinsic_call]
141		set_max_permanent_slots(caller, u32::MAX);
142
143		assert_eq!(MaxPermanentSlots::<T>::get(), u32::MAX);
144	}
145
146	#[benchmark]
147	fn set_max_temporary_slots() {
148		let caller = RawOrigin::Root;
149		#[extrinsic_call]
150		set_max_temporary_slots(caller, u32::MAX);
151
152		assert_eq!(MaxTemporarySlots::<T>::get(), u32::MAX);
153	}
154
155	impl_benchmark_test_suite!(
156		AssignedSlots,
157		crate::assigned_slots::tests::new_test_ext(),
158		crate::assigned_slots::tests::Test,
159	);
160}