Migrate pallet-tips to the new pallet attribute macro (#9711)

* Migrate pallet-tips to the new pallet attribute macro

Signed-off-by: koushiro <koushiro.cqx@gmail.com>

* Fix migration

Signed-off-by: koushiro <koushiro.cqx@gmail.com>
This commit is contained in:
Qinxuan Chen
2021-09-14 08:04:09 +08:00
committed by GitHub
parent 0983d98cff
commit 7deed34d64
8 changed files with 523 additions and 239 deletions
+133 -94
View File
@@ -19,19 +19,23 @@
#![cfg(test)]
use super::*;
use crate as tips;
use frame_support::{
assert_noop, assert_ok, pallet_prelude::GenesisBuild, parameter_types, traits::SortedMembers,
weights::Weight, PalletId,
};
use std::cell::RefCell;
use sp_core::H256;
use sp_runtime::{
testing::Header,
traits::{BadOrigin, BlakeTwo256, IdentityLookup},
Perbill, Permill,
};
use std::cell::RefCell;
use sp_storage::Storage;
use frame_support::{
assert_noop, assert_ok, pallet_prelude::GenesisBuild, parameter_types,
storage::StoragePrefixedMap, traits::SortedMembers, weights::Weight, PalletId,
};
use super::*;
use crate::{self as pallet_tips, Event as TipEvent};
type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;
type Block = frame_system::mocking::MockBlock<Test>;
@@ -45,7 +49,7 @@ frame_support::construct_runtime!(
System: frame_system::{Pallet, Call, Config, Storage, Event<T>},
Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>},
Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event<T>},
TipsModTestInst: tips::{Pallet, Call, Storage, Event<T>},
Tips: pallet_tips::{Pallet, Call, Storage, Event<T>},
}
);
@@ -173,11 +177,11 @@ pub fn new_test_ext() -> sp_io::TestExternalities {
t.into()
}
fn last_event() -> RawEvent<u64, u128, H256> {
fn last_event() -> TipEvent<Test> {
System::events()
.into_iter()
.map(|r| r.event)
.filter_map(|e| if let Event::TipsModTestInst(inner) = e { Some(inner) } else { None })
.filter_map(|e| if let Event::Tips(inner) = e { Some(inner) } else { None })
.last()
.unwrap()
}
@@ -198,9 +202,9 @@ fn tip_hash() -> H256 {
fn tip_new_cannot_be_used_twice() {
new_test_ext().execute_with(|| {
Balances::make_free_balance_be(&Treasury::account_id(), 101);
assert_ok!(TipsModTestInst::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 10));
assert_ok!(Tips::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 10));
assert_noop!(
TipsModTestInst::tip_new(Origin::signed(11), b"awesome.dot".to_vec(), 3, 10),
Tips::tip_new(Origin::signed(11), b"awesome.dot".to_vec(), 3, 10),
Error::<Test>::AlreadyKnown
);
});
@@ -210,23 +214,23 @@ fn tip_new_cannot_be_used_twice() {
fn report_awesome_and_tip_works() {
new_test_ext().execute_with(|| {
Balances::make_free_balance_be(&Treasury::account_id(), 101);
assert_ok!(TipsModTestInst::report_awesome(Origin::signed(0), b"awesome.dot".to_vec(), 3));
assert_ok!(Tips::report_awesome(Origin::signed(0), b"awesome.dot".to_vec(), 3));
assert_eq!(Balances::reserved_balance(0), 12);
assert_eq!(Balances::free_balance(0), 88);
// other reports don't count.
assert_noop!(
TipsModTestInst::report_awesome(Origin::signed(1), b"awesome.dot".to_vec(), 3),
Tips::report_awesome(Origin::signed(1), b"awesome.dot".to_vec(), 3),
Error::<Test>::AlreadyKnown
);
let h = tip_hash();
assert_ok!(TipsModTestInst::tip(Origin::signed(10), h.clone(), 10));
assert_ok!(TipsModTestInst::tip(Origin::signed(11), h.clone(), 10));
assert_ok!(TipsModTestInst::tip(Origin::signed(12), h.clone(), 10));
assert_noop!(TipsModTestInst::tip(Origin::signed(9), h.clone(), 10), BadOrigin);
assert_ok!(Tips::tip(Origin::signed(10), h.clone(), 10));
assert_ok!(Tips::tip(Origin::signed(11), h.clone(), 10));
assert_ok!(Tips::tip(Origin::signed(12), h.clone(), 10));
assert_noop!(Tips::tip(Origin::signed(9), h.clone(), 10), BadOrigin);
System::set_block_number(2);
assert_ok!(TipsModTestInst::close_tip(Origin::signed(100), h.into()));
assert_ok!(Tips::close_tip(Origin::signed(100), h.into()));
assert_eq!(Balances::reserved_balance(0), 0);
assert_eq!(Balances::free_balance(0), 102);
assert_eq!(Balances::free_balance(3), 8);
@@ -237,15 +241,15 @@ fn report_awesome_and_tip_works() {
fn report_awesome_from_beneficiary_and_tip_works() {
new_test_ext().execute_with(|| {
Balances::make_free_balance_be(&Treasury::account_id(), 101);
assert_ok!(TipsModTestInst::report_awesome(Origin::signed(0), b"awesome.dot".to_vec(), 0));
assert_ok!(Tips::report_awesome(Origin::signed(0), b"awesome.dot".to_vec(), 0));
assert_eq!(Balances::reserved_balance(0), 12);
assert_eq!(Balances::free_balance(0), 88);
let h = BlakeTwo256::hash_of(&(BlakeTwo256::hash(b"awesome.dot"), 0u128));
assert_ok!(TipsModTestInst::tip(Origin::signed(10), h.clone(), 10));
assert_ok!(TipsModTestInst::tip(Origin::signed(11), h.clone(), 10));
assert_ok!(TipsModTestInst::tip(Origin::signed(12), h.clone(), 10));
assert_ok!(Tips::tip(Origin::signed(10), h.clone(), 10));
assert_ok!(Tips::tip(Origin::signed(11), h.clone(), 10));
assert_ok!(Tips::tip(Origin::signed(12), h.clone(), 10));
System::set_block_number(2);
assert_ok!(TipsModTestInst::close_tip(Origin::signed(100), h.into()));
assert_ok!(Tips::close_tip(Origin::signed(100), h.into()));
assert_eq!(Balances::reserved_balance(0), 0);
assert_eq!(Balances::free_balance(0), 110);
});
@@ -259,39 +263,30 @@ fn close_tip_works() {
Balances::make_free_balance_be(&Treasury::account_id(), 101);
assert_eq!(Treasury::pot(), 100);
assert_ok!(TipsModTestInst::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 10));
assert_ok!(Tips::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 10));
let h = tip_hash();
assert_eq!(last_event(), RawEvent::NewTip(h));
assert_eq!(last_event(), TipEvent::NewTip(h));
assert_ok!(TipsModTestInst::tip(Origin::signed(11), h.clone(), 10));
assert_ok!(Tips::tip(Origin::signed(11), h.clone(), 10));
assert_noop!(
TipsModTestInst::close_tip(Origin::signed(0), h.into()),
Error::<Test>::StillOpen
);
assert_noop!(Tips::close_tip(Origin::signed(0), h.into()), Error::<Test>::StillOpen);
assert_ok!(TipsModTestInst::tip(Origin::signed(12), h.clone(), 10));
assert_ok!(Tips::tip(Origin::signed(12), h.clone(), 10));
assert_eq!(last_event(), RawEvent::TipClosing(h));
assert_eq!(last_event(), TipEvent::TipClosing(h));
assert_noop!(
TipsModTestInst::close_tip(Origin::signed(0), h.into()),
Error::<Test>::Premature
);
assert_noop!(Tips::close_tip(Origin::signed(0), h.into()), Error::<Test>::Premature);
System::set_block_number(2);
assert_noop!(TipsModTestInst::close_tip(Origin::none(), h.into()), BadOrigin);
assert_ok!(TipsModTestInst::close_tip(Origin::signed(0), h.into()));
assert_noop!(Tips::close_tip(Origin::none(), h.into()), BadOrigin);
assert_ok!(Tips::close_tip(Origin::signed(0), h.into()));
assert_eq!(Balances::free_balance(3), 10);
assert_eq!(last_event(), RawEvent::TipClosed(h, 3, 10));
assert_eq!(last_event(), TipEvent::TipClosed(h, 3, 10));
assert_noop!(
TipsModTestInst::close_tip(Origin::signed(100), h.into()),
Error::<Test>::UnknownTip
);
assert_noop!(Tips::close_tip(Origin::signed(100), h.into()), Error::<Test>::UnknownTip);
});
}
@@ -305,20 +300,20 @@ fn slash_tip_works() {
assert_eq!(Balances::reserved_balance(0), 0);
assert_eq!(Balances::free_balance(0), 100);
assert_ok!(TipsModTestInst::report_awesome(Origin::signed(0), b"awesome.dot".to_vec(), 3));
assert_ok!(Tips::report_awesome(Origin::signed(0), b"awesome.dot".to_vec(), 3));
assert_eq!(Balances::reserved_balance(0), 12);
assert_eq!(Balances::free_balance(0), 88);
let h = tip_hash();
assert_eq!(last_event(), RawEvent::NewTip(h));
assert_eq!(last_event(), TipEvent::NewTip(h));
// can't remove from any origin
assert_noop!(TipsModTestInst::slash_tip(Origin::signed(0), h.clone()), BadOrigin);
assert_noop!(Tips::slash_tip(Origin::signed(0), h.clone()), BadOrigin);
// can remove from root.
assert_ok!(TipsModTestInst::slash_tip(Origin::root(), h.clone()));
assert_eq!(last_event(), RawEvent::TipSlashed(h, 0, 12));
assert_ok!(Tips::slash_tip(Origin::root(), h.clone()));
assert_eq!(last_event(), TipEvent::TipSlashed(h, 0, 12));
// tipper slashed
assert_eq!(Balances::reserved_balance(0), 0);
@@ -331,38 +326,26 @@ fn retract_tip_works() {
new_test_ext().execute_with(|| {
// with report awesome
Balances::make_free_balance_be(&Treasury::account_id(), 101);
assert_ok!(TipsModTestInst::report_awesome(Origin::signed(0), b"awesome.dot".to_vec(), 3));
assert_ok!(Tips::report_awesome(Origin::signed(0), b"awesome.dot".to_vec(), 3));
let h = tip_hash();
assert_ok!(TipsModTestInst::tip(Origin::signed(10), h.clone(), 10));
assert_ok!(TipsModTestInst::tip(Origin::signed(11), h.clone(), 10));
assert_ok!(TipsModTestInst::tip(Origin::signed(12), h.clone(), 10));
assert_noop!(
TipsModTestInst::retract_tip(Origin::signed(10), h.clone()),
Error::<Test>::NotFinder
);
assert_ok!(TipsModTestInst::retract_tip(Origin::signed(0), h.clone()));
assert_ok!(Tips::tip(Origin::signed(10), h.clone(), 10));
assert_ok!(Tips::tip(Origin::signed(11), h.clone(), 10));
assert_ok!(Tips::tip(Origin::signed(12), h.clone(), 10));
assert_noop!(Tips::retract_tip(Origin::signed(10), h.clone()), Error::<Test>::NotFinder);
assert_ok!(Tips::retract_tip(Origin::signed(0), h.clone()));
System::set_block_number(2);
assert_noop!(
TipsModTestInst::close_tip(Origin::signed(0), h.into()),
Error::<Test>::UnknownTip
);
assert_noop!(Tips::close_tip(Origin::signed(0), h.into()), Error::<Test>::UnknownTip);
// with tip new
Balances::make_free_balance_be(&Treasury::account_id(), 101);
assert_ok!(TipsModTestInst::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 10));
assert_ok!(Tips::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 10));
let h = tip_hash();
assert_ok!(TipsModTestInst::tip(Origin::signed(11), h.clone(), 10));
assert_ok!(TipsModTestInst::tip(Origin::signed(12), h.clone(), 10));
assert_noop!(
TipsModTestInst::retract_tip(Origin::signed(0), h.clone()),
Error::<Test>::NotFinder
);
assert_ok!(TipsModTestInst::retract_tip(Origin::signed(10), h.clone()));
assert_ok!(Tips::tip(Origin::signed(11), h.clone(), 10));
assert_ok!(Tips::tip(Origin::signed(12), h.clone(), 10));
assert_noop!(Tips::retract_tip(Origin::signed(0), h.clone()), Error::<Test>::NotFinder);
assert_ok!(Tips::retract_tip(Origin::signed(10), h.clone()));
System::set_block_number(2);
assert_noop!(
TipsModTestInst::close_tip(Origin::signed(10), h.into()),
Error::<Test>::UnknownTip
);
assert_noop!(Tips::close_tip(Origin::signed(10), h.into()), Error::<Test>::UnknownTip);
});
}
@@ -370,12 +353,12 @@ fn retract_tip_works() {
fn tip_median_calculation_works() {
new_test_ext().execute_with(|| {
Balances::make_free_balance_be(&Treasury::account_id(), 101);
assert_ok!(TipsModTestInst::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 0));
assert_ok!(Tips::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 0));
let h = tip_hash();
assert_ok!(TipsModTestInst::tip(Origin::signed(11), h.clone(), 10));
assert_ok!(TipsModTestInst::tip(Origin::signed(12), h.clone(), 1000000));
assert_ok!(Tips::tip(Origin::signed(11), h.clone(), 10));
assert_ok!(Tips::tip(Origin::signed(12), h.clone(), 1000000));
System::set_block_number(2);
assert_ok!(TipsModTestInst::close_tip(Origin::signed(0), h.into()));
assert_ok!(Tips::close_tip(Origin::signed(0), h.into()));
assert_eq!(Balances::free_balance(3), 10);
});
}
@@ -384,25 +367,23 @@ fn tip_median_calculation_works() {
fn tip_changing_works() {
new_test_ext().execute_with(|| {
Balances::make_free_balance_be(&Treasury::account_id(), 101);
assert_ok!(TipsModTestInst::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 10000));
assert_ok!(Tips::tip_new(Origin::signed(10), b"awesome.dot".to_vec(), 3, 10000));
let h = tip_hash();
assert_ok!(TipsModTestInst::tip(Origin::signed(11), h.clone(), 10000));
assert_ok!(TipsModTestInst::tip(Origin::signed(12), h.clone(), 10000));
assert_ok!(TipsModTestInst::tip(Origin::signed(13), h.clone(), 0));
assert_ok!(TipsModTestInst::tip(Origin::signed(14), h.clone(), 0));
assert_ok!(TipsModTestInst::tip(Origin::signed(12), h.clone(), 1000));
assert_ok!(TipsModTestInst::tip(Origin::signed(11), h.clone(), 100));
assert_ok!(TipsModTestInst::tip(Origin::signed(10), h.clone(), 10));
assert_ok!(Tips::tip(Origin::signed(11), h.clone(), 10000));
assert_ok!(Tips::tip(Origin::signed(12), h.clone(), 10000));
assert_ok!(Tips::tip(Origin::signed(13), h.clone(), 0));
assert_ok!(Tips::tip(Origin::signed(14), h.clone(), 0));
assert_ok!(Tips::tip(Origin::signed(12), h.clone(), 1000));
assert_ok!(Tips::tip(Origin::signed(11), h.clone(), 100));
assert_ok!(Tips::tip(Origin::signed(10), h.clone(), 10));
System::set_block_number(2);
assert_ok!(TipsModTestInst::close_tip(Origin::signed(0), h.into()));
assert_ok!(Tips::close_tip(Origin::signed(0), h.into()));
assert_eq!(Balances::free_balance(3), 10);
});
}
#[test]
fn test_last_reward_migration() {
use sp_storage::Storage;
let mut s = Storage::default();
#[derive(Clone, Eq, PartialEq, Encode, Decode, RuntimeDebug)]
@@ -449,18 +430,20 @@ fn test_last_reward_migration() {
};
let data = vec![
(Tips::<Test>::hashed_key_for(hash1), old_tip_finder.encode().to_vec()),
(Tips::<Test>::hashed_key_for(hash2), old_tip_no_finder.encode().to_vec()),
(pallet_tips::Tips::<Test>::hashed_key_for(hash1), old_tip_finder.encode().to_vec()),
(pallet_tips::Tips::<Test>::hashed_key_for(hash2), old_tip_no_finder.encode().to_vec()),
];
s.top = data.into_iter().collect();
sp_io::TestExternalities::new(s).execute_with(|| {
TipsModTestInst::migrate_retract_tip_for_tip_new();
let module = pallet_tips::Tips::<Test>::module_prefix();
let item = pallet_tips::Tips::<Test>::storage_prefix();
Tips::migrate_retract_tip_for_tip_new(module, item);
// Test w/ finder
assert_eq!(
Tips::<Test>::get(hash1),
pallet_tips::Tips::<Test>::get(hash1),
Some(OpenTip {
reason: reason1,
who: 10,
@@ -474,7 +457,7 @@ fn test_last_reward_migration() {
// Test w/o finder
assert_eq!(
Tips::<Test>::get(hash2),
pallet_tips::Tips::<Test>::get(hash2),
Some(OpenTip {
reason: reason2,
who: 20,
@@ -488,6 +471,62 @@ fn test_last_reward_migration() {
});
}
#[test]
fn test_migration_v4() {
let reason1 = BlakeTwo256::hash(b"reason1");
let hash1 = BlakeTwo256::hash_of(&(reason1, 10u64));
let tip = OpenTip::<u128, u64, u64, H256> {
reason: reason1,
who: 10,
finder: 20,
deposit: 30,
closes: Some(13),
tips: vec![(40, 50), (60, 70)],
finders_fee: true,
};
let data = vec![
(pallet_tips::Reasons::<Test>::hashed_key_for(hash1), reason1.encode().to_vec()),
(pallet_tips::Tips::<Test>::hashed_key_for(hash1), tip.encode().to_vec()),
];
let mut s = Storage::default();
s.top = data.into_iter().collect();
sp_io::TestExternalities::new(s).execute_with(|| {
use frame_support::traits::PalletInfoAccess;
let old_pallet = "Treasury";
let new_pallet = <Tips as PalletInfoAccess>::name();
frame_support::storage::migration::move_pallet(
new_pallet.as_bytes(),
old_pallet.as_bytes(),
);
StorageVersion::new(0).put::<Tips>();
crate::migrations::v4::pre_migrate::<Test, Tips, _>(old_pallet);
crate::migrations::v4::migrate::<Test, Tips, _>(old_pallet);
crate::migrations::v4::post_migrate::<Test, Tips, _>(old_pallet);
});
sp_io::TestExternalities::new(Storage::default()).execute_with(|| {
use frame_support::traits::PalletInfoAccess;
let old_pallet = "Treasury";
let new_pallet = <Tips as PalletInfoAccess>::name();
frame_support::storage::migration::move_pallet(
new_pallet.as_bytes(),
old_pallet.as_bytes(),
);
StorageVersion::new(0).put::<Tips>();
crate::migrations::v4::pre_migrate::<Test, Tips, _>(old_pallet);
crate::migrations::v4::migrate::<Test, Tips, _>(old_pallet);
crate::migrations::v4::post_migrate::<Test, Tips, _>(old_pallet);
});
}
#[test]
fn genesis_funding_works() {
let mut t = frame_system::GenesisConfig::default().build_storage::<Test>().unwrap();