pallet_elections/
benchmarking.rsuse super::*;
use crate::Pallet;
use pallet_members::MemberOnline;
use pallet_networks::{NetworkName, NetworkShardSize};
use polkadot_sdk::frame_benchmarking::benchmarks;
use polkadot_sdk::{frame_support::traits::Get, frame_system, sp_runtime};
use scale_codec::Encode;
use sp_runtime::{BoundedVec, Vec};
use time_primitives::{AccountId, ChainName, ElectionsInterface, NetworkId};
const ETHEREUM: NetworkId = 0;
const SHARD_SIZE: u16 = 3;
benchmarks! {
where_clause { where T: pallet_members::Config + pallet_networks::Config }
try_elect_shards {
let b in 1..T::MaxElectionsPerBlock::get();
let net_name =
ChainName(BoundedVec::truncate_from("ETHEREUM SEPOLIA".encode()));
NetworkName::<T>::insert(ETHEREUM, net_name);
let mut all_new_shard_members = Vec::new();
let account = |x, y| -> AccountId {
let mut acc = [0u8; 32];
acc[..16].copy_from_slice(&[x as u8; 16]);
acc[16..].copy_from_slice(&[y as u8; 16]);
Into::<AccountId>::into(acc)
};
for i in 0..b {
for j in 0..NetworkShardSize::<T>::get(ETHEREUM).unwrap_or(SHARD_SIZE) {
let member = account(i, j);
MemberOnline::<T>::insert(member.clone(), ());
Pallet::<T>::member_online(&member, ETHEREUM);
all_new_shard_members.push(member);
}
}
let pre_unassigned_count: u16 = Unassigned::<T>::get(ETHEREUM).len() as u16;
}: {
Pallet::<T>::try_elect_shards(ETHEREUM, b);
} verify {
let post_unassigned_count: u16 = Unassigned::<T>::get(ETHEREUM).len() as u16;
assert_eq!(
pre_unassigned_count - post_unassigned_count,
(b as u16).saturating_mul(NetworkShardSize::<T>::get(ETHEREUM).unwrap_or(SHARD_SIZE)),
);
let unassigned = Unassigned::<T>::get(ETHEREUM);
for m in all_new_shard_members {
assert!(!unassigned.contains(&m));
}
}
impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Test);
}