pallet_registrar_relay/
benchmarking.rs1use super::*;
21use frame_benchmarking::v2::*;
22use frame_support::traits::Get;
23use frame_system::RawOrigin;
24use registrar_primitives::{MessageToRelay, MessageToRelayV1};
25use sp_runtime::traits::{BlakeTwo256, Hash};
26
27const PARA_ID: ParaId = 4_242;
29
30fn code_of(len: u32) -> Vec<u8> {
31 alloc::vec![1u8; len as usize]
32}
33
34fn park<T: Config>(code: &[u8]) -> Result<(), BenchmarkError> {
40 let genesis_head = alloc::vec![2u8; T::MaxHeadDataSize::get() as usize];
41 let pending = PendingRegistration {
42 message_id: 0,
43 manager: account("manager", 0, 0),
44 genesis_head: genesis_head.try_into().map_err(|_| "head data exceeds its own bound")?,
45 code_hash: BlakeTwo256::hash(code),
46 code_len: code.len() as u32,
47 };
48
49 PendingRegistrations::<T>::insert(PARA_ID, pending);
50 Ok(())
51}
52
53#[benchmarks]
54mod benchmarks {
55 use super::*;
56
57 #[benchmark]
59 fn receive_register(h: Linear<0, { T::MaxHeadDataSize::get() }>) -> Result<(), BenchmarkError> {
60 let manager: T::AccountId = account("manager", 0, 0);
61 let code = code_of(T::MaxCodeSize::get());
62 let message = MessageToRelay::V1(MessageToRelayV1::Register {
63 para_id: PARA_ID,
64 message_id: 0,
65 manager,
66 genesis_head: alloc::vec![2u8; h as usize],
67 code_hash: BlakeTwo256::hash(&code),
68 code_len: code.len() as u32,
69 });
70
71 #[extrinsic_call]
72 receive(RawOrigin::Root, message);
73
74 assert!(PendingRegistrations::<T>::contains_key(PARA_ID));
75 Ok(())
76 }
77
78 #[benchmark]
80 fn apply_authorized_code(
81 c: Linear<0, { T::MaxCodeSize::get() }>,
82 ) -> Result<(), BenchmarkError> {
83 let code = code_of(c);
84 park::<T>(&code)?;
85
86 #[extrinsic_call]
87 _(RawOrigin::Authorized, PARA_ID, code);
88
89 assert!(!PendingRegistrations::<T>::contains_key(PARA_ID));
90 Ok(())
91 }
92
93 #[benchmark]
98 fn authorize_apply_authorized_code(
99 c: Linear<0, { T::MaxCodeSize::get() }>,
100 ) -> Result<(), BenchmarkError> {
101 let code = code_of(c);
102 park::<T>(&code)?;
103 let call = Call::<T>::apply_authorized_code { para_id: PARA_ID, validation_code: code };
104
105 #[block]
106 {
107 use frame_support::pallet_prelude::Authorize;
108 call.authorize(sp_runtime::transaction_validity::TransactionSource::External)
109 .ok_or("call must give some authorization")??;
110 }
111
112 Ok(())
113 }
114
115 #[benchmark]
118 fn receive_cancel_registration() -> Result<(), BenchmarkError> {
119 park::<T>(&code_of(T::MaxCodeSize::get()))?;
120 let message = MessageToRelay::V1(MessageToRelayV1::CancelRegistration {
121 para_id: PARA_ID,
122 message_id: 0,
123 });
124
125 #[extrinsic_call]
126 receive(RawOrigin::Root, message);
127
128 assert!(!PendingRegistrations::<T>::contains_key(PARA_ID));
129 Ok(())
130 }
131
132 #[benchmark]
134 fn on_new_head() {
135 AwaitingFirstHead::<T>::insert(PARA_ID, ());
136
137 #[block]
138 {
139 <Pallet<T> as OnNewHead>::on_new_head(PARA_ID.into(), &HeadData(alloc::vec![]));
140 }
141
142 assert!(!AwaitingFirstHead::<T>::contains_key(PARA_ID));
143 }
144
145 #[benchmark]
147 fn on_new_head_already_noted() {
148 #[block]
149 {
150 <Pallet<T> as OnNewHead>::on_new_head(PARA_ID.into(), &HeadData(alloc::vec![]));
151 }
152 }
153
154 impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test);
155}