referrerpolicy=no-referrer-when-downgrade

pallet_salary/
benchmarking.rs

1// This file is part of Substrate.
2
3// Copyright (C) Parity Technologies (UK) Ltd.
4// SPDX-License-Identifier: Apache-2.0
5
6// Licensed under the Apache License, Version 2.0 (the "License");
7// you may not use this file except in compliance with the License.
8// You may obtain a copy of the License at
9//
10// 	http://www.apache.org/licenses/LICENSE-2.0
11//
12// Unless required by applicable law or agreed to in writing, software
13// distributed under the License is distributed on an "AS IS" BASIS,
14// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15// See the License for the specific language governing permissions and
16// limitations under the License.
17
18//! Salary pallet benchmarking.
19
20#![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	// induct if not a member.
30	if T::Members::rank_of(who).is_none() {
31		T::Members::induct(who).unwrap();
32	}
33	// promote until they have a salary.
34	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}