12345678910111213141516171819202122232425262728293031323334353637#![cfg(feature = "runtime-benchmarks")]3839use super::*;40use sp_std::{vec, prelude::*};41use frame_system::RawOrigin;42use frame_support::{ensure, traits::OnInitialize};43use frame_benchmarking::{benchmarks, impl_benchmark_test_suite};4445use crate::Module as Scheduler;46use frame_system::Pallet as System;4748const BLOCK_NUMBER: u32 = 2;495051fn fill_schedule<T: Config>(when: T::BlockNumber, n: u32) -> Result<(), &'static str> {52 53 let call = frame_system::Call::set_storage { items: vec![] };54 for i in 0..n {55 56 Scheduler::<T>::do_schedule_named(57 i.encode(),58 DispatchTime::At(when),59 60 Some((T::BlockNumber::one(), 100)),61 62 0,63 frame_system::RawOrigin::Root.into(),64 call.clone().into(),65 )?;66 }67 ensure!(68 Agenda::<T>::get(when).len() == n as usize,69 "didn't fill schedule"70 );71 Ok(())72}7374benchmarks! {75 schedule {76 let s in 0 .. T::MaxScheduledPerBlock::get();77 let when = BLOCK_NUMBER.into();78 let periodic = Some((T::BlockNumber::one(), 100));79 let priority = 0;80 81 let call = Box::new(frame_system::Call::set_storage { items: vec![] }.into());8283 fill_schedule::<T>(when, s)?;84 }: _(RawOrigin::Root, when, periodic, priority, call)85 verify {86 ensure!(87 Agenda::<T>::get(when).len() == (s + 1) as usize,88 "didn't add to schedule"89 );90 }9192 cancel {93 let s in 1 .. T::MaxScheduledPerBlock::get();94 let when = BLOCK_NUMBER.into();9596 fill_schedule::<T>(when, s)?;97 assert_eq!(Agenda::<T>::get(when).len(), s as usize);98 }: _(RawOrigin::Root, when, 0)99 verify {100 ensure!(101 Lookup::<T>::get(0.encode()).is_none(),102 "didn't remove from lookup"103 );104 105 ensure!(106 Agenda::<T>::get(when)[0].is_none(),107 "didn't remove from schedule"108 );109 }110111 schedule_named {112 let s in 0 .. T::MaxScheduledPerBlock::get();113 let id = s.encode();114 let when = BLOCK_NUMBER.into();115 let periodic = Some((T::BlockNumber::one(), 100));116 let priority = 0;117 118 let call = Box::new(frame_system::Call::set_storage { items: vec![] }.into());119120 fill_schedule::<T>(when, s)?;121 }: _(RawOrigin::Root, id, when, periodic, priority, call)122 verify {123 ensure!(124 Agenda::<T>::get(when).len() == (s + 1) as usize,125 "didn't add to schedule"126 );127 }128129 cancel_named {130 let s in 1 .. T::MaxScheduledPerBlock::get();131 let when = BLOCK_NUMBER.into();132133 fill_schedule::<T>(when, s)?;134 }: _(RawOrigin::Root, 0.encode())135 verify {136 ensure!(137 Lookup::<T>::get(0.encode()).is_none(),138 "didn't remove from lookup"139 );140 141 ensure!(142 Agenda::<T>::get(when)[0].is_none(),143 "didn't remove from schedule"144 );145 }146147 148 #[extra]149 on_initialize {150 let s in 0 .. T::MaxScheduledPerBlock::get();151 let when = BLOCK_NUMBER.into();152 fill_schedule::<T>(when, s)?;153 }: { Scheduler::<T>::on_initialize(BLOCK_NUMBER.into()); }154 verify {155 assert_eq!(System::<T>::event_count(), s);156 157 ensure!(158 Agenda::<T>::get(when + T::BlockNumber::one()).len() == s as usize,159 "didn't append schedule"160 );161 }162}163164impl_benchmark_test_suite!(Scheduler, crate::tests::new_test_ext(), crate::tests::Test,);