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