From 38e19c12e3ce852c837432436e44ed023679fbf4 Mon Sep 17 00:00:00 2001 From: wangjj9219 <183318287@qq.com> Date: Tue, 9 Jun 2020 23:42:03 +0800 Subject: [PATCH] Add tests for schedule update (#209) * add unit tests for schedule update * use WEIGHT_PER_MICROS in weight calculation --- auction/src/lib.rs | 5 +-- currencies/src/lib.rs | 7 +++-- schedule-update/src/mock.rs | 58 ++++++++++++++++++++++++++++++++--- schedule-update/src/tests.rs | 59 ++++++++++++++++++++++-------------- tokens/src/lib.rs | 9 ++++-- vesting/src/lib.rs | 7 +++-- 6 files changed, 107 insertions(+), 38 deletions(-) diff --git a/auction/src/lib.rs b/auction/src/lib.rs index 4f49ce7..de9d6ad 100644 --- a/auction/src/lib.rs +++ b/auction/src/lib.rs @@ -3,7 +3,8 @@ #![allow(clippy::string_lit_as_bytes)] use frame_support::{ - decl_error, decl_event, decl_module, decl_storage, ensure, traits::Get, IterableStorageDoubleMap, Parameter, + decl_error, decl_event, decl_module, decl_storage, ensure, traits::Get, weights::constants::WEIGHT_PER_MICROS, + IterableStorageDoubleMap, Parameter, }; use frame_system::{self as system, ensure_signed}; use orml_traits::{Auction, AuctionHandler, AuctionInfo, Change}; @@ -65,7 +66,7 @@ decl_module! { /// - best cases: 45.96 µs /// - worst cases: 48.55 µs /// # </weight> - #[weight = 84_000_000 + T::DbWeight::get().reads_writes(9, 9)] + #[weight = 84 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(9, 9)] pub fn bid(origin, id: T::AuctionId, #[compact] value: T::Balance) { let from = ensure_signed(origin)?; diff --git a/currencies/src/lib.rs b/currencies/src/lib.rs index 67b5f62..ca8df25 100644 --- a/currencies/src/lib.rs +++ b/currencies/src/lib.rs @@ -37,6 +37,7 @@ use frame_support::{ Currency as PalletCurrency, ExistenceRequirement, Get, LockableCurrency as PalletLockableCurrency, ReservableCurrency as PalletReservableCurrency, WithdrawReasons, }, + weights::constants::WEIGHT_PER_MICROS, }; use sp_runtime::{ traits::{CheckedSub, StaticLookup, Zero}, @@ -129,7 +130,7 @@ decl_module! { /// - non-native currency: 26.72 µs /// - native currency in worst case: 29.9 µs /// # </weight> - #[weight = 30_000_000 + T::DbWeight::get().reads_writes(2, 2)] + #[weight = 30 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(2, 2)] pub fn transfer( origin, dest: <T::Lookup as StaticLookup>::Source, @@ -155,7 +156,7 @@ decl_module! { /// ------------------- /// Base Weight: 29.53 µs /// # </weight> - #[weight = 30_000_000 + T::DbWeight::get().reads_writes(2, 2)] + #[weight = 30 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(2, 2)] pub fn transfer_native_currency( origin, dest: <T::Lookup as StaticLookup>::Source, @@ -185,7 +186,7 @@ decl_module! { /// - native currency and killing account: 26.33 µs /// - native currency and create account: 27.39 µs /// # </weight> - #[weight = 27_000_000 + T::DbWeight::get().reads_writes(1, 1)] + #[weight = 27 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(1, 1)] pub fn update_balance( origin, who: <T::Lookup as StaticLookup>::Source, diff --git a/schedule-update/src/mock.rs b/schedule-update/src/mock.rs index 9edb9dc..484fcde 100644 --- a/schedule-update/src/mock.rs +++ b/schedule-update/src/mock.rs @@ -2,13 +2,55 @@ #![cfg(test)] -use frame_support::{impl_outer_dispatch, impl_outer_event, impl_outer_origin, parameter_types}; -use frame_system::{self as system, ensure_signed}; +use frame_support::{ + impl_outer_dispatch, impl_outer_event, impl_outer_origin, parameter_types, + weights::{FunctionOf, Pays}, +}; use sp_core::H256; use sp_runtime::{testing::Header, traits::IdentityLookup, Perbill}; use super::*; +mod logger { + use super::*; + use frame_system::ensure_root; + use std::cell::RefCell; + + thread_local! { + static LOG: RefCell<Vec<u32>> = RefCell::new(Vec::new()); + } + pub trait Trait: system::Trait { + type Event: From<Event> + Into<<Self as system::Trait>::Event>; + } + decl_storage! { + trait Store for Module<T: Trait> as Logger { + } + } + decl_event! { + pub enum Event { + Logged(u32, Weight), + } + } + decl_module! { + pub struct Module<T: Trait> for enum Call where origin: <T as system::Trait>::Origin { + fn deposit_event() = default; + + #[weight = FunctionOf( + |args: (&u32, &Weight)| *args.1, + |_: (&u32, &Weight)| DispatchClass::Normal, + Pays::Yes, + )] + fn log(origin, i: u32, weight: Weight) { + ensure_root(origin)?; + Self::deposit_event(Event::Logged(i, weight)); + LOG.with(|log| { + log.borrow_mut().push(i); + }) + } + } + } +} + impl_outer_origin! { pub enum Origin for Runtime {} } @@ -22,12 +64,15 @@ impl_outer_event! { frame_system<T>, schedule_update<T>, pallet_balances<T>, + logger, } } impl_outer_dispatch! { pub enum Call for Runtime where origin: Origin { + system::System, pallet_balances::Balances, + logger::Logger, } } @@ -82,10 +127,16 @@ impl pallet_balances::Trait for Runtime { type ExistentialDeposit = ExistentialDeposit; type AccountStore = System; } +pub type Balances = pallet_balances::Module<Runtime>; pub const ALICE: AccountId = 1; pub const BOB: AccountId = 2; +impl logger::Trait for Runtime { + type Event = TestEvent; +} +type Logger = logger::Module<Runtime>; + // A mock schedule origin where only `ALICE` has permission. pub struct MockScheduleOrigin; @@ -114,9 +165,8 @@ impl Trait for Runtime { } pub type ScheduleUpdateModule = Module<Runtime>; -pub type Balances = pallet_balances::Module<Runtime>; - pub type BalancesCall = pallet_balances::Call<Runtime>; +pub type LoggerCall = logger::Call<Runtime>; pub struct ExtBuilder; diff --git a/schedule-update/src/tests.rs b/schedule-update/src/tests.rs index ff263ab..ba328b7 100644 --- a/schedule-update/src/tests.rs +++ b/schedule-update/src/tests.rs @@ -4,7 +4,10 @@ use super::*; use frame_support::{assert_noop, assert_ok, traits::OnInitialize}; -use mock::{BalancesCall, Call, ExtBuilder, Origin, Runtime, ScheduleUpdateModule, System, TestEvent, ALICE, BOB}; +use mock::{ + BalancesCall, Call, ExtBuilder, LoggerCall, MaxScheduleDispatchWeight, Origin, Runtime, ScheduleUpdateModule, + System, TestEvent, ALICE, BOB, +}; #[test] fn schedule_dispatch_should_work() { @@ -217,7 +220,6 @@ fn on_initialize_should_work() { assert_eq!(System::events().len(), 2); ScheduleUpdateModule::on_initialize(2); - println!("{:?}", System::events()); assert_eq!(System::events().len(), 4); let schedule_dispatch_event = TestEvent::schedule_update(RawEvent::ScheduleDispatchSuccess(2, 0)); assert!(System::events() @@ -261,7 +263,6 @@ fn on_initialize_should_work() { assert_eq!(System::events().len(), 8); ScheduleUpdateModule::on_initialize(11); - println!("{:?}", System::events()); assert_eq!(System::events().len(), 10); let schedule_dispatch_event = TestEvent::schedule_update(RawEvent::ScheduleDispatchSuccess(11, 2)); assert!(System::events() @@ -295,7 +296,6 @@ fn on_initialize_should_fail() { assert_eq!(System::events().len(), 1); ScheduleUpdateModule::on_initialize(2); - println!("{:?}", System::events()); assert_eq!(System::events().len(), 2); //TODO hold the error let schedule_dispatch_event = TestEvent::schedule_update(RawEvent::ScheduleDispatchFail( @@ -323,7 +323,6 @@ fn on_initialize_should_fail() { assert_eq!(System::events().len(), 3); ScheduleUpdateModule::on_initialize(11); - println!("{:?}", System::events()); assert_eq!(System::events().len(), 4); let schedule_dispatch_event = TestEvent::schedule_update(RawEvent::ScheduleDispatchFail(1, DispatchError::BadOrigin)); @@ -339,24 +338,24 @@ fn on_initialize_weight_exceed() { System::set_block_number(1); // NormalDispatches - let call = Call::Balances(BalancesCall::transfer(2, 11)); + let half_max_weight_call = Call::Logger(LoggerCall::log(1, MaxScheduleDispatchWeight::get() / 2)); assert_ok!(ScheduleUpdateModule::schedule_dispatch( - Origin::signed(ALICE), - Box::new(call), + Origin::ROOT, + Box::new(half_max_weight_call), DelayedDispatchTime::At(2) )); - let call = Call::Balances(BalancesCall::transfer(2, 12)); + let half_max_weight_call = Call::Logger(LoggerCall::log(2, MaxScheduleDispatchWeight::get() / 2)); assert_ok!(ScheduleUpdateModule::schedule_dispatch( - Origin::signed(ALICE), - Box::new(call), + Origin::ROOT, + Box::new(half_max_weight_call), DelayedDispatchTime::At(2) )); - let call = Call::Balances(BalancesCall::transfer(2, 13)); + let half_max_weight_call = Call::Logger(LoggerCall::log(3, MaxScheduleDispatchWeight::get() / 2)); assert_ok!(ScheduleUpdateModule::schedule_dispatch( - Origin::signed(ALICE), - Box::new(call), + Origin::ROOT, + Box::new(half_max_weight_call), DelayedDispatchTime::At(2) )); @@ -364,19 +363,33 @@ fn on_initialize_weight_exceed() { ScheduleUpdateModule::on_initialize(1); assert_eq!(System::events().len(), 3); + // execute 2 task ScheduleUpdateModule::on_initialize(2); - println!("{:?}", System::events()); assert_eq!(System::events().len(), 7); - // TODO on_initialize should be sorted - //let schedule_dispatch_event = TestEvent::schedule_update(RawEvent::ScheduleDispatchSuccess(0, 2)); - //assert!(System::events().iter().any(|record| record.event == schedule_dispatch_event)); - - //let schedule_dispatch_event = TestEvent::schedule_update(RawEvent::ScheduleDispatchSuccess(2, 2)); - //assert!(System::events().iter().any(|record| record.event == schedule_dispatch_event)); + // execute last task ScheduleUpdateModule::on_initialize(3); assert_eq!(System::events().len(), 9); - //let schedule_dispatch_event = TestEvent::schedule_update(RawEvent::ScheduleDispatchSuccess(1, 3)); - //assert!(System::events().iter().any(|record| record.event == schedule_dispatch_event)); + }); +} + +#[test] +fn execute_at_least_one_task() { + ExtBuilder::default().build().execute_with(|| { + System::set_block_number(1); + + let large_weight_call = Call::Logger(LoggerCall::log(42, MaxScheduleDispatchWeight::get() + 1)); + assert_ok!(ScheduleUpdateModule::schedule_dispatch( + Origin::ROOT, + Box::new(large_weight_call), + DelayedDispatchTime::At(2) + )); + + ScheduleUpdateModule::on_initialize(2); + + let schedule_dispatch_event = TestEvent::schedule_update(RawEvent::ScheduleDispatchSuccess(2, 0)); + assert!(System::events() + .iter() + .any(|record| record.event == schedule_dispatch_event)); }); } diff --git a/tokens/src/lib.rs b/tokens/src/lib.rs index 48a380e..7e5d0ce 100644 --- a/tokens/src/lib.rs +++ b/tokens/src/lib.rs @@ -34,7 +34,10 @@ #![cfg_attr(not(feature = "std"), no_std)] use codec::{Decode, Encode}; -use frame_support::{decl_error, decl_event, decl_module, decl_storage, ensure, traits::Get, Parameter}; +use frame_support::{ + decl_error, decl_event, decl_module, decl_storage, ensure, traits::Get, weights::constants::WEIGHT_PER_MICROS, + Parameter, +}; use sp_runtime::{ traits::{AtLeast32Bit, CheckedAdd, CheckedSub, MaybeSerializeDeserialize, Member, Saturating, StaticLookup, Zero}, DispatchError, DispatchResult, RuntimeDebug, @@ -188,7 +191,7 @@ decl_module! { /// ------------------- /// Base Weight: 26.65 µs /// # </weight> - #[weight = 27_000_000 + T::DbWeight::get().reads_writes(2, 2)] + #[weight = 27 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(2, 2)] pub fn transfer( origin, dest: <T::Lookup as StaticLookup>::Source, @@ -213,7 +216,7 @@ decl_module! { /// ------------------- /// Base Weight: 26.99 µs /// # </weight> - #[weight = 27_000_000 + T::DbWeight::get().reads_writes(2, 2)] + #[weight = 27 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(2, 2)] pub fn transfer_all( origin, dest: <T::Lookup as StaticLookup>::Source, diff --git a/vesting/src/lib.rs b/vesting/src/lib.rs index 8fdbbea..69d2748 100644 --- a/vesting/src/lib.rs +++ b/vesting/src/lib.rs @@ -26,6 +26,7 @@ use codec::{Decode, Encode, HasCompact}; use frame_support::{ decl_error, decl_event, decl_module, decl_storage, ensure, traits::{Currency, ExistenceRequirement, Get, LockIdentifier, LockableCurrency, WithdrawReasons}, + weights::constants::WEIGHT_PER_MICROS, }; use sp_std::{ cmp::{Eq, PartialEq}, @@ -157,7 +158,7 @@ decl_module! { /// ------------------- /// Base Weight: 29.86 µs /// # </weight> - #[weight = 30_000_000 + T::DbWeight::get().reads_writes(2, 2)] + #[weight = 30 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(2, 2)] pub fn claim(origin) { let who = ensure_signed(origin)?; let locked_amount = Self::do_claim(&who); @@ -174,7 +175,7 @@ decl_module! { /// ------------------- /// Base Weight: 47.26 µs /// # </weight> - #[weight = 48_000_000 + T::DbWeight::get().reads_writes(4, 4)] + #[weight = 48 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(4, 4)] pub fn add_vesting_schedule( origin, dest: <T::Lookup as StaticLookup>::Source, @@ -196,7 +197,7 @@ decl_module! { /// ------------------- /// Base Weight: 27.96 µs /// # </weight> - #[weight = 28_000_000 + T::DbWeight::get().reads_writes(4, 4)] + #[weight = 28 * WEIGHT_PER_MICROS + T::DbWeight::get().reads_writes(4, 4)] pub fn update_vesting_schedules( origin, who: <T::Lookup as StaticLookup>::Source, -- GitLab