123456789101112131415161718192021222324252627282930313233use super::*;34use crate as collator_selection;35use frame_support::{36 ord_parameter_types, parameter_types,37 traits::{FindAuthor, GenesisBuild, ValidatorRegistration},38 PalletId,39};40use frame_system as system;41use frame_system::EnsureSignedBy;42use sp_core::H256;43use sp_runtime::{44 testing::{Header, UintAuthorityId},45 traits::{BlakeTwo256, IdentityLookup, OpaqueKeys},46 Perbill, RuntimeAppPublic,47};4849type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Test>;50type Block = frame_system::mocking::MockBlock<Test>;515253frame_support::construct_runtime!(54 pub enum Test where55 Block = Block,56 NodeBlock = Block,57 UncheckedExtrinsic = UncheckedExtrinsic,58 {59 System: frame_system::{Pallet, Call, Config, Storage, Event<T>},60 Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent},61 Session: pallet_session::{Pallet, Call, Storage, Event, Config<T>},62 Aura: pallet_aura::{Pallet, Storage, Config<T>},63 Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>},64 CollatorSelection: collator_selection::{Pallet, Call, Storage, Event<T>},65 Authorship: pallet_authorship::{Pallet, Call, Storage, Inherent},66 }67);6869parameter_types! {70 pub const BlockHashCount: u64 = 250;71 pub const SS58Prefix: u8 = 42;72}7374impl system::Config for Test {75 type BaseCallFilter = frame_support::traits::Everything;76 type BlockWeights = ();77 type BlockLength = ();78 type DbWeight = ();79 type RuntimeOrigin = RuntimeOrigin;80 type RuntimeCall = RuntimeCall;81 type Index = u64;82 type BlockNumber = u64;83 type Hash = H256;84 type Hashing = BlakeTwo256;85 type AccountId = u64;86 type Lookup = IdentityLookup<Self::AccountId>;87 type Header = Header;88 type RuntimeEvent = RuntimeEvent;89 type BlockHashCount = BlockHashCount;90 type Version = ();91 type PalletInfo = PalletInfo;92 type AccountData = pallet_balances::AccountData<u64>;93 type OnNewAccount = ();94 type OnKilledAccount = ();95 type SystemWeightInfo = ();96 type SS58Prefix = SS58Prefix;97 type OnSetCode = ();98 type MaxConsumers = frame_support::traits::ConstU32<16>;99}100101parameter_types! {102 pub const ExistentialDeposit: u64 = 5;103 pub const MaxReserves: u32 = 50;104}105106impl pallet_balances::Config for Test {107 type Balance = u64;108 type RuntimeEvent = RuntimeEvent;109 type DustRemoval = ();110 type ExistentialDeposit = ExistentialDeposit;111 type AccountStore = System;112 type WeightInfo = ();113 type MaxLocks = ();114 type MaxReserves = MaxReserves;115 type ReserveIdentifier = [u8; 8];116}117118pub struct Author4;119impl FindAuthor<u64> for Author4 {120 fn find_author<'a, I>(_digests: I) -> Option<u64>121 where122 I: 'a + IntoIterator<Item = (frame_support::ConsensusEngineId, &'a [u8])>,123 {124 Some(4)125 }126}127128impl pallet_authorship::Config for Test {129 type FindAuthor = Author4;130 type UncleGenerations = ();131 type FilterUncle = ();132 type EventHandler = CollatorSelection;133}134135parameter_types! {136 pub const MinimumPeriod: u64 = 1;137}138139impl pallet_timestamp::Config for Test {140 type Moment = u64;141 type OnTimestampSet = Aura;142 type MinimumPeriod = MinimumPeriod;143 type WeightInfo = ();144}145146impl pallet_aura::Config for Test {147 type AuthorityId = sp_consensus_aura::sr25519::AuthorityId;148 type MaxAuthorities = MaxAuthorities;149 type DisabledValidators = ();150}151152sp_runtime::impl_opaque_keys! {153 pub struct MockSessionKeys {154 155 pub aura: UintAuthorityId,156 }157}158159impl From<UintAuthorityId> for MockSessionKeys {160 fn from(aura: sp_runtime::testing::UintAuthorityId) -> Self {161 Self { aura }162 }163}164165parameter_types! {166 pub static SessionHandlerCollators: Vec<u64> = Vec::new();167 pub static SessionChangeBlock: u64 = 0;168}169170pub struct TestSessionHandler;171impl pallet_session::SessionHandler<u64> for TestSessionHandler {172 const KEY_TYPE_IDS: &'static [sp_runtime::KeyTypeId] = &[UintAuthorityId::ID];173 fn on_genesis_session<Ks: OpaqueKeys>(keys: &[(u64, Ks)]) {174 SessionHandlerCollators::set(keys.into_iter().map(|(a, _)| *a).collect::<Vec<_>>())175 }176 fn on_new_session<Ks: OpaqueKeys>(_: bool, keys: &[(u64, Ks)], _: &[(u64, Ks)]) {177 SessionChangeBlock::set(System::block_number());178 dbg!(keys.len());179 SessionHandlerCollators::set(keys.into_iter().map(|(a, _)| *a).collect::<Vec<_>>())180 }181 fn on_before_session_ending() {}182 fn on_disabled(_: u32) {}183}184185parameter_types! {186 pub const Offset: u64 = 0;187 pub const Period: u64 = 10;188}189190impl pallet_session::Config for Test {191 type RuntimeEvent = RuntimeEvent;192 type ValidatorId = <Self as frame_system::Config>::AccountId;193 194 type ValidatorIdOf = IdentityCollator;195 type ShouldEndSession = pallet_session::PeriodicSessions<Period, Offset>;196 type NextSessionRotation = pallet_session::PeriodicSessions<Period, Offset>;197 type SessionManager = CollatorSelection;198 type SessionHandler = TestSessionHandler;199 type Keys = MockSessionKeys;200 type WeightInfo = ();201}202203ord_parameter_types! {204 pub const RootAccount: u64 = 777;205}206207parameter_types! {208 pub const PotId: PalletId = PalletId(*b"PotStake");209 pub const MaxCollators: u32 = 20;210 pub const MaxAuthorities: u32 = 100_000;211 pub const SlashRatio: Perbill = Perbill::one();212}213214pub struct IsRegistered;215impl ValidatorRegistration<u64> for IsRegistered {216 fn is_registered(id: &u64) -> bool {217 if *id == 7u64 {218 false219 } else {220 true221 }222 }223}224225impl Config for Test {226 227 type RuntimeEvent = RuntimeEvent;228 type Currency = Balances;229 type UpdateOrigin = EnsureSignedBy<RootAccount, u64>;230 type PotId = PotId;231 type MaxCollators = MaxCollators;232 233 type SlashRatio = SlashRatio;234 type TreasuryAccountId = ();235 type ValidatorId = <Self as frame_system::Config>::AccountId;236 type ValidatorIdOf = IdentityCollator;237 type ValidatorRegistration = IsRegistered;238 type WeightInfo = ();239}240241pub fn new_test_ext() -> sp_io::TestExternalities {242 sp_tracing::try_init_simple();243 let mut t = frame_system::GenesisConfig::default()244 .build_storage::<Test>()245 .unwrap();246 let invulnerables = vec![1, 2];247248 let balances = vec![(1, 100), (2, 100), (3, 100), (4, 100), (5, 100)];249 let keys = balances250 .iter()251 .map(|&(i, _)| {252 (253 i,254 i,255 MockSessionKeys {256 aura: UintAuthorityId(i),257 },258 )259 })260 .collect::<Vec<_>>();261 let collator_selection = collator_selection::GenesisConfig::<Test> {262 desired_collators: 5,263 license_bond: 10,264 kick_threshold: 10,265 invulnerables,266 };267 let session = pallet_session::GenesisConfig::<Test> { keys };268 pallet_balances::GenesisConfig::<Test> { balances }269 .assimilate_storage(&mut t)270 .unwrap();271 272 collator_selection.assimilate_storage(&mut t).unwrap();273 session.assimilate_storage(&mut t).unwrap();274275 t.into()276}277278pub fn initialize_to_block(n: u64) {279 for i in System::block_number() + 1..=n {280 System::set_block_number(i);281 <AllPalletsWithSystem as frame_support::traits::OnInitialize<u64>>::on_initialize(i);282 }283}