pallet_salary/
benchmarking.rs1#![cfg(feature = "runtime-benchmarks")]
21
22use super::*;
23use crate::Pallet as Salary;
24
25use frame::benchmarking::prelude::*;
26const SEED: u32 = 0;
27
28fn ensure_member_with_salary<T: Config<I>, I: 'static>(who: &T::AccountId) {
29 if T::Members::rank_of(who).is_none() {
31 T::Members::induct(who).unwrap();
32 }
33 for _ in 0..255 {
35 let r = T::Members::rank_of(who).expect("prior guard ensures `who` is a member; qed");
36 if !T::Salary::get_salary(r, &who).is_zero() {
37 break;
38 }
39 T::Members::promote(who).unwrap();
40 }
41}
42
43#[instance_benchmarks]
44mod benchmarks {
45 use super::*;
46
47 #[benchmark]
48 fn init() {
49 let caller: T::AccountId = whitelisted_caller();
50
51 #[extrinsic_call]
52 _(RawOrigin::Signed(caller.clone()));
53
54 assert!(Salary::<T, I>::status().is_some());
55 }
56
57 #[benchmark]
58 fn bump() {
59 let caller: T::AccountId = whitelisted_caller();
60 Salary::<T, I>::init(RawOrigin::Signed(caller.clone()).into()).unwrap();
61 System::<T>::set_block_number(System::<T>::block_number() + Salary::<T, I>::cycle_period());
62
63 #[extrinsic_call]
64 _(RawOrigin::Signed(caller.clone()));
65
66 assert_eq!(Salary::<T, I>::status().unwrap().cycle_index, 1u32.into());
67 }
68
69 #[benchmark]
70 fn induct() {
71 let caller = whitelisted_caller();
72 ensure_member_with_salary::<T, I>(&caller);
73 Salary::<T, I>::init(RawOrigin::Signed(caller.clone()).into()).unwrap();
74
75 #[extrinsic_call]
76 _(RawOrigin::Signed(caller.clone()));
77
78 assert!(Salary::<T, I>::last_active(&caller).is_ok());
79 }
80
81 #[benchmark]
82 fn register() {
83 let caller = whitelisted_caller();
84 ensure_member_with_salary::<T, I>(&caller);
85 Salary::<T, I>::init(RawOrigin::Signed(caller.clone()).into()).unwrap();
86 Salary::<T, I>::induct(RawOrigin::Signed(caller.clone()).into()).unwrap();
87 System::<T>::set_block_number(System::<T>::block_number() + Salary::<T, I>::cycle_period());
88 Salary::<T, I>::bump(RawOrigin::Signed(caller.clone()).into()).unwrap();
89
90 #[extrinsic_call]
91 _(RawOrigin::Signed(caller.clone()));
92
93 assert_eq!(Salary::<T, I>::last_active(&caller).unwrap(), 1u32.into());
94 }
95
96 #[benchmark]
97 fn payout() {
98 let caller = whitelisted_caller();
99 ensure_member_with_salary::<T, I>(&caller);
100 Salary::<T, I>::init(RawOrigin::Signed(caller.clone()).into()).unwrap();
101 Salary::<T, I>::induct(RawOrigin::Signed(caller.clone()).into()).unwrap();
102 System::<T>::set_block_number(System::<T>::block_number() + Salary::<T, I>::cycle_period());
103 Salary::<T, I>::bump(RawOrigin::Signed(caller.clone()).into()).unwrap();
104 System::<T>::set_block_number(System::<T>::block_number() + T::RegistrationPeriod::get());
105
106 let salary = T::Salary::get_salary(T::Members::rank_of(&caller).unwrap(), &caller);
107 T::Paymaster::ensure_successful(&caller, (), salary);
108
109 #[extrinsic_call]
110 _(RawOrigin::Signed(caller.clone()));
111
112 match Claimant::<T, I>::get(&caller) {
113 Some(ClaimantStatus { last_active, status: Attempted { id, .. } }) => {
114 assert_eq!(last_active, 1u32.into());
115 assert_ne!(T::Paymaster::check_payment(id), PaymentStatus::Failure);
116 },
117 _ => panic!("No claim made"),
118 }
119 assert!(Salary::<T, I>::payout(RawOrigin::Signed(caller.clone()).into()).is_err());
120 }
121
122 #[benchmark]
123 fn payout_other() {
124 let caller = whitelisted_caller();
125 ensure_member_with_salary::<T, I>(&caller);
126 Salary::<T, I>::init(RawOrigin::Signed(caller.clone()).into()).unwrap();
127 Salary::<T, I>::induct(RawOrigin::Signed(caller.clone()).into()).unwrap();
128 System::<T>::set_block_number(System::<T>::block_number() + Salary::<T, I>::cycle_period());
129 Salary::<T, I>::bump(RawOrigin::Signed(caller.clone()).into()).unwrap();
130 System::<T>::set_block_number(System::<T>::block_number() + T::RegistrationPeriod::get());
131
132 let salary = T::Salary::get_salary(T::Members::rank_of(&caller).unwrap(), &caller);
133 let recipient: T::AccountId = account("recipient", 0, SEED);
134 T::Paymaster::ensure_successful(&recipient, (), salary);
135
136 #[extrinsic_call]
137 _(RawOrigin::Signed(caller.clone()), recipient.clone());
138
139 match Claimant::<T, I>::get(&caller) {
140 Some(ClaimantStatus { last_active, status: Attempted { id, .. } }) => {
141 assert_eq!(last_active, 1u32.into());
142 assert_ne!(T::Paymaster::check_payment(id), PaymentStatus::Failure);
143 },
144 _ => panic!("No claim made"),
145 }
146 assert!(Salary::<T, I>::payout(RawOrigin::Signed(caller.clone()).into()).is_err());
147 }
148
149 #[benchmark]
150 fn check_payment() {
151 let caller = whitelisted_caller();
152 ensure_member_with_salary::<T, I>(&caller);
153 Salary::<T, I>::init(RawOrigin::Signed(caller.clone()).into()).unwrap();
154 Salary::<T, I>::induct(RawOrigin::Signed(caller.clone()).into()).unwrap();
155 System::<T>::set_block_number(System::<T>::block_number() + Salary::<T, I>::cycle_period());
156 Salary::<T, I>::bump(RawOrigin::Signed(caller.clone()).into()).unwrap();
157 System::<T>::set_block_number(System::<T>::block_number() + T::RegistrationPeriod::get());
158
159 let salary = T::Salary::get_salary(T::Members::rank_of(&caller).unwrap(), &caller);
160 let recipient: T::AccountId = account("recipient", 0, SEED);
161 T::Paymaster::ensure_successful(&recipient, (), salary);
162 Salary::<T, I>::payout(RawOrigin::Signed(caller.clone()).into()).unwrap();
163 let id = match Claimant::<T, I>::get(&caller).unwrap().status {
164 Attempted { id, .. } => id,
165 _ => panic!("No claim made"),
166 };
167 T::Paymaster::ensure_concluded(id);
168
169 #[extrinsic_call]
170 _(RawOrigin::Signed(caller.clone()));
171
172 assert!(!matches!(Claimant::<T, I>::get(&caller).unwrap().status, Attempted { .. }));
173 }
174
175 impl_benchmark_test_suite! {
176 Salary,
177 crate::tests::unit::new_test_ext(),
178 crate::tests::unit::Test,
179 }
180}