Alliance pallet: add force_set_members instead of init_members function (#11997)

* Alliance pallet: add force_set_members instead of init_members function

* benchmark with witness data

* remove invalid limit for clear

* Apply suggestions from code review

Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>

* Revert "remove invalid limit for clear"

This reverts commit dba54e3071b63bfea908087aef213f4640e3ccbf.

* compile constructor only for test

* Update comments for force_set_members

Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>

* ".git/.scripts/bench-bot.sh" pallet dev pallet_alliance

* benchmark - founders count range

* Revert "benchmark - founders count range"

This reverts commit aad16796f8dfed48079fb7f587b8f5b59382cda6.

* witness members count instead votable members count

* update the doc

* use decode_len for witness data checks

* change witness data member count to voting member count; update clear limits

* ".git/.scripts/bench-bot.sh" pallet dev pallet_alliance

* merge master

* fixes after merge master

* revert to cb3e63

* disband alliance and return deposits

* revert debug changes

* weights

* update docs

* update test comments

* Apply Joe suggestions from code review

Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>

* rename event from AllianceDisband to AllianceDisbanded

* ".git/.scripts/bench-bot.sh" pallet dev pallet_alliance

Co-authored-by: joe petrowski <25483142+joepetrowski@users.noreply.github.com>
Co-authored-by: command-bot <>
This commit is contained in:
Muharem Ismailov
2022-09-01 12:31:32 +02:00
committed by GitHub
parent 7f1b9a937a
commit d8e951758c
8 changed files with 711 additions and 181 deletions
+163 -20
View File
@@ -17,9 +17,7 @@
//! Tests for the alliance pallet.
use sp_runtime::traits::Hash;
use frame_support::{assert_noop, assert_ok, error::BadOrigin, Hashable};
use frame_support::{assert_noop, assert_ok, error::BadOrigin};
use frame_system::{EventRecord, Phase};
use super::*;
@@ -27,12 +25,156 @@ use crate::mock::*;
type AllianceMotionEvent = pallet_collective::Event<Test, pallet_collective::Instance1>;
#[test]
fn force_set_members_works() {
new_test_ext().execute_with(|| {
// ensure alliance is set
assert_eq!(Alliance::votable_members_sorted(), vec![1, 2, 3]);
// creating and proposing proposals
let (proposal, proposal_len, hash) = make_remark_proposal(42);
assert_ok!(Alliance::propose(Origin::signed(1), 3, Box::new(proposal), proposal_len));
let (k_proposal, k_proposal_len, k_hash) = make_kick_member_proposal(2);
assert_ok!(Alliance::propose(Origin::signed(1), 3, Box::new(k_proposal), k_proposal_len));
let mut proposals = vec![hash, k_hash];
// give a retirement notice to check later a retiring member not removed
assert_ok!(Alliance::give_retirement_notice(Origin::signed(2)));
assert!(Alliance::is_member_of(&2, MemberRole::Retiring));
// join alliance and reserve funds
assert_eq!(Balances::free_balance(9), 40);
assert_ok!(Alliance::join_alliance(Origin::signed(9)));
assert_eq!(Alliance::deposit_of(9), Some(25));
assert_eq!(Balances::free_balance(9), 15);
assert!(Alliance::is_member_of(&9, MemberRole::Ally));
// ensure proposal is listed as active proposal
assert_eq!(<Test as Config>::ProposalProvider::proposals(), proposals);
assert_eq!(<Test as Config>::ProposalProvider::proposals_count(), 2);
// fails without root
assert_noop!(
Alliance::force_set_members(
Origin::signed(1),
vec![],
vec![],
vec![],
Default::default()
),
BadOrigin
);
// nothing to do, witness data is default, new members not provided.
assert_ok!(Alliance::force_set_members(
Origin::root(),
vec![],
vec![],
vec![],
Default::default()
));
// alliance must be reset first, no witness data.
assert_noop!(
Alliance::force_set_members(
Origin::root(),
vec![8],
vec![],
vec![],
Default::default()
),
Error::<Test, ()>::AllianceAlreadyInitialized,
);
// wrong witness data checks
assert_noop!(
Alliance::force_set_members(
Origin::root(),
vec![],
vec![],
vec![],
ForceSetWitness::new(1, 3, 1)
),
Error::<Test, ()>::BadWitness,
);
assert_noop!(
Alliance::force_set_members(
Origin::root(),
vec![],
vec![],
vec![],
ForceSetWitness::new(2, 1, 1)
),
Error::<Test, ()>::BadWitness,
);
assert_noop!(
Alliance::force_set_members(
Origin::root(),
vec![],
vec![],
vec![],
ForceSetWitness::new(1, 3, 0)
),
Error::<Test, ()>::BadWitness,
);
// founders missing, other members given
assert_noop!(
Alliance::force_set_members(
Origin::root(),
vec![],
vec![4],
vec![2],
ForceSetWitness::new(2, 3, 1)
),
Error::<Test, ()>::FoundersMissing,
);
// success call
assert_ok!(Alliance::force_set_members(
Origin::root(),
vec![8, 5],
vec![4],
vec![2],
ForceSetWitness::new(2, 3, 1)
));
// assert new set of voting members
assert_eq!(Alliance::votable_members_sorted(), vec![4, 5, 8]);
// assert new ally member
assert!(Alliance::is_ally(&2));
// assert a retiring member from previous Alliance not removed
assert!(Alliance::is_member_of(&2, MemberRole::Retiring));
// assert old alliance disband.
assert!(!Alliance::is_member(&1));
assert!(!Alliance::is_member(&3));
assert!(!Alliance::is_member(&9));
// deposit unreserved
assert_eq!(Balances::free_balance(9), 40);
// all proposals are removed
assert_eq!(<Test as Config>::ProposalProvider::proposals(), vec![]);
assert_eq!(<Test as Config>::ProposalProvider::proposals_count(), 0);
// assert events
proposals.sort();
assert_prev_event(mock::Event::Alliance(crate::Event::AllianceDisbanded {
members: vec![1, 3, 9],
proposals,
}));
System::assert_last_event(mock::Event::Alliance(crate::Event::MembersInitialized {
founders: vec![5, 8],
fellows: vec![4],
allies: vec![2],
}));
})
}
#[test]
fn propose_works() {
new_test_ext().execute_with(|| {
let proposal = make_proposal(42);
let proposal_len: u32 = proposal.using_encoded(|p| p.len() as u32);
let hash: H256 = proposal.blake2_256().into();
let (proposal, proposal_len, hash) = make_remark_proposal(42);
// only votable member can propose proposal, 4 is ally not have vote rights
assert_noop!(
@@ -67,9 +209,7 @@ fn propose_works() {
#[test]
fn vote_works() {
new_test_ext().execute_with(|| {
let proposal = make_proposal(42);
let proposal_len: u32 = proposal.using_encoded(|p| p.len() as u32);
let hash: H256 = proposal.blake2_256().into();
let (proposal, proposal_len, hash) = make_remark_proposal(42);
assert_ok!(Alliance::propose(
Origin::signed(1),
3,
@@ -103,9 +243,7 @@ fn vote_works() {
#[test]
fn veto_works() {
new_test_ext().execute_with(|| {
let proposal = make_proposal(42);
let proposal_len: u32 = proposal.using_encoded(|p| p.len() as u32);
let hash: H256 = proposal.blake2_256().into();
let (proposal, proposal_len, hash) = make_remark_proposal(42);
assert_ok!(Alliance::propose(
Origin::signed(1),
3,
@@ -119,9 +257,7 @@ fn veto_works() {
);
let cid = test_cid();
let vetoable_proposal = make_set_rule_proposal(cid);
let vetoable_proposal_len: u32 = vetoable_proposal.using_encoded(|p| p.len() as u32);
let vetoable_hash: H256 = vetoable_proposal.blake2_256().into();
let (vetoable_proposal, vetoable_proposal_len, vetoable_hash) = make_set_rule_proposal(cid);
assert_ok!(Alliance::propose(
Origin::signed(1),
3,
@@ -163,10 +299,8 @@ fn veto_works() {
#[test]
fn close_works() {
new_test_ext().execute_with(|| {
let proposal = make_proposal(42);
let proposal_len: u32 = proposal.using_encoded(|p| p.len() as u32);
let (proposal, proposal_len, hash) = make_remark_proposal(42);
let proposal_weight = proposal.get_dispatch_info().weight;
let hash = BlakeTwo256::hash_of(&proposal);
assert_ok!(Alliance::propose(
Origin::signed(1),
3,
@@ -452,9 +586,18 @@ fn retire_works() {
fn assert_powerless(user: Origin) {
//vote / veto with a valid propsal
let cid = test_cid();
let proposal = make_proposal(42);
let (proposal, _, _) = make_kick_member_proposal(42);
assert_noop!(Alliance::init_members(user.clone(), vec![], vec![], vec![]), BadOrigin);
assert_noop!(
Alliance::force_set_members(
user.clone(),
vec![],
vec![],
vec![],
ForceSetWitness { voting_members: 3, ..Default::default() }
),
BadOrigin
);
assert_noop!(Alliance::set_rule(user.clone(), cid.clone()), BadOrigin);