pallet_whitelist/
benchmarking.rs1#![cfg(feature = "runtime-benchmarks")]
21
22use super::*;
23#[cfg(test)]
24use crate::Pallet as Whitelist;
25use frame::benchmarking::prelude::*;
26
27#[benchmarks]
28mod benchmarks {
29 use super::*;
30
31 #[benchmark]
32 fn whitelist_call() -> Result<(), BenchmarkError> {
33 let origin =
34 T::WhitelistOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
35 let call_hash = Default::default();
36
37 #[extrinsic_call]
38 _(origin as T::RuntimeOrigin, call_hash);
39
40 ensure!(WhitelistedCall::<T>::contains_key(call_hash), "call not whitelisted");
41 ensure!(T::Preimages::is_requested(&call_hash), "preimage not requested");
42 Ok(())
43 }
44
45 #[benchmark]
46 fn remove_whitelisted_call() -> Result<(), BenchmarkError> {
47 let origin =
48 T::WhitelistOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?;
49 let call_hash = Default::default();
50 Pallet::<T>::whitelist_call(origin.clone(), call_hash)
51 .expect("whitelisting call must be successful");
52
53 #[extrinsic_call]
54 _(origin as T::RuntimeOrigin, call_hash);
55
56 ensure!(!WhitelistedCall::<T>::contains_key(call_hash), "whitelist not removed");
57 ensure!(!T::Preimages::is_requested(&call_hash), "preimage still requested");
58 Ok(())
59 }
60
61 #[benchmark(pov_mode = MaxEncodedLen {
65 Preimage::PreimageFor: Measured
67 })]
68 fn dispatch_whitelisted_call(
70 n: Linear<1, { T::Preimages::MAX_LENGTH as u32 - 10 }>,
71 ) -> Result<(), BenchmarkError> {
72 let origin = T::DispatchWhitelistedOrigin::try_successful_origin()
73 .map_err(|_| BenchmarkError::Weightless)?;
74 let remark = alloc::vec![1u8; n as usize];
75 let call: <T as Config>::RuntimeCall = frame_system::Call::remark { remark }.into();
76 let call_weight = call.get_dispatch_info().call_weight;
77 let encoded_call = call.encode();
78 let call_encoded_len = encoded_call.len() as u32;
79 let call_hash = T::Hashing::hash_of(&call);
80
81 Pallet::<T>::whitelist_call(origin.clone(), call_hash)
82 .expect("whitelisting call must be successful");
83
84 T::Preimages::note(encoded_call.into()).unwrap();
85
86 #[extrinsic_call]
87 _(origin as T::RuntimeOrigin, call_hash, call_encoded_len, call_weight);
88
89 ensure!(!WhitelistedCall::<T>::contains_key(call_hash), "whitelist not removed");
90 ensure!(!T::Preimages::is_requested(&call_hash), "preimage still requested");
91 Ok(())
92 }
93
94 #[benchmark]
95 fn dispatch_whitelisted_call_with_preimage(n: Linear<1, 10_000>) -> Result<(), BenchmarkError> {
96 let origin = T::DispatchWhitelistedOrigin::try_successful_origin()
97 .map_err(|_| BenchmarkError::Weightless)?;
98 let remark = alloc::vec![1u8; n as usize];
99
100 let call: <T as Config>::RuntimeCall = frame_system::Call::remark { remark }.into();
101 let call_hash = T::Hashing::hash_of(&call);
102
103 Pallet::<T>::whitelist_call(origin.clone(), call_hash)
104 .expect("whitelisting call must be successful");
105
106 #[extrinsic_call]
107 _(origin as T::RuntimeOrigin, Box::new(call));
108
109 ensure!(!WhitelistedCall::<T>::contains_key(call_hash), "whitelist not removed");
110 ensure!(!T::Preimages::is_requested(&call_hash), "preimage still requested");
111 Ok(())
112 }
113
114 impl_benchmark_test_suite!(Whitelist, crate::mock::new_test_ext(), crate::mock::Test);
115}