diff --git a/prdoc/pr_5713.prdoc b/prdoc/pr_5713.prdoc new file mode 100644 index 0000000000000000000000000000000000000000..54d3619cdcaff17dbd8795ad9ab05491ce72c99f --- /dev/null +++ b/prdoc/pr_5713.prdoc @@ -0,0 +1,10 @@ +title: "pallet-treasury: Improve `remove_approval` benchmark" + +doc: + - audience: Runtime Dev + description: | + Fix the `remove_approval` benchmark when `SpendOrigin` doesn't return any `succesful_origin`. + +crates: + - name: pallet-treasury + bump: patch diff --git a/substrate/frame/treasury/src/benchmarking.rs b/substrate/frame/treasury/src/benchmarking.rs index 63978c94e682f8cca84146e69c4b2e17d06ae637..95bf63299049afa62e332227bee8bf65fafc7ec8 100644 --- a/substrate/frame/treasury/src/benchmarking.rs +++ b/substrate/frame/treasury/src/benchmarking.rs @@ -26,7 +26,7 @@ use frame_benchmarking::{ v2::*, }; use frame_support::{ - ensure, + assert_err, assert_ok, ensure, traits::{ tokens::{ConversionFromAssetBalance, PaymentStatus}, EnsureOrigin, OnInitialize, @@ -126,16 +126,31 @@ mod benchmarks { #[benchmark] fn remove_approval() -> Result<(), BenchmarkError> { - let origin = - T::SpendOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - let (_, value, beneficiary_lookup) = setup_proposal::<T, _>(SEED); - Treasury::<T, _>::spend_local(origin, value, beneficiary_lookup)?; - let proposal_id = Treasury::<T, _>::proposal_count() - 1; + let (spend_exists, proposal_id) = + if let Ok(origin) = T::SpendOrigin::try_successful_origin() { + let (_, value, beneficiary_lookup) = setup_proposal::<T, _>(SEED); + Treasury::<T, _>::spend_local(origin, value, beneficiary_lookup)?; + let proposal_id = Treasury::<T, _>::proposal_count() - 1; + + (true, proposal_id) + } else { + (false, 0) + }; + let reject_origin = T::RejectOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; - #[extrinsic_call] - _(reject_origin as T::RuntimeOrigin, proposal_id); + #[block] + { + let res = + Treasury::<T, _>::remove_approval(reject_origin as T::RuntimeOrigin, proposal_id); + + if spend_exists { + assert_ok!(res); + } else { + assert_err!(res, Error::<T, _>::ProposalNotApproved); + } + } Ok(()) }